⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 guidev_aa.c

📁 ucGUI3.90a没有MemDev这是从3.24向上移植的
💻 C
字号:
/*! @file GUIDEV_AA.c
 *  Memory device drawing with Antialiasing 
 *
 *  @author hiber
 *  @author Copyright (C) 1981-2006, All Rights Reserved
 *  @date 04/18/2006
 *  @version 
 *
 *  @note 
 *  @attention 
 *  @warning 
 *  @bug
 *
 *  @todo
 *  @example <file-name>
 *  @see
 */
#include "GUI_Private.h"
#include <string.h>

#if GUI_SUPPORT_MEMDEV

extern void * _GUI_ALLOC_h2p_Lock(GUI_HMEM hMem);
#define GUI_ALLOC_H2P(h)          _GUI_ALLOC_h2p_Lock(h)
#define GUI_ALLOC_FREE(handle)    GUI_ALLOC_Free(handle)
#define GUI_ALLOC_LOCK(handle)    _GUI_ALLOC_h2p_Lock(handle)
#define GUI_ALLOC_UNLOCK(handle)

#ifdef GUI_USAGE_H2P
    #undef GUI_USAGE_H2P
    #define GUI_USAGE_H2P(h) ((GUI_USAGE*)_GUI_ALLOC_h2p_Lock(h)) 
#endif

#ifdef GUI_MEMDEV_H2P
    #undef GUI_MEMDEV_H2P
    #define GUI_MEMDEV_H2P _GUI_ALLOC_h2p_Lock
#endif

//////////////////////////////////////////////////////////////////////////

#define SETPIXEL(x,y,colorindex) _SetPixel(x,y,colorindex);
#define BKCOLORINDEX GUI_Context.pDevData->aColorIndex[0]
#define   COLORINDEX GUI_Context.pDevData->aColorIndex[1]

//! 从存储区域拷贝存储设备的内容(反锯齿)到LCD
//! @param hMem 存储设备的句柄
//! @note 器件的数据处理为反锯齿数据。一个2×2 像素矩阵转换1 个像素。最终结果的像素强度
//!       取决于在多少像素在矩阵中调整。
void GUI_MEMDEV_CopyToLCDAA(GUI_MEMDEV_Handle hMem)
{
    if (hMem)
    {
        int x, y;
        static const tLCDDEV_APIList *pDevicePrev;
        GUI_MEMDEV *pDev = (GUI_MEMDEV*)GUI_ALLOC_LOCK(hMem); /* Convert to pointer */
        LCD_PIXELINDEX *pData0 = (LCD_PIXELINDEX*)(pDev + 1);
        int LineOff = pDev->XSize;
        int x0 = pDev->x0;
        int y0 = pDev->y0;
        int XMax = pDev->XSize / 2;
        int YMax = pDev->YSize / 2;

        pDevicePrev = GUI_Context.pDeviceAPI;// 暂存当前的API函数指针表

        // 3.90a中加入了多层,需要修改"GUI_Context.pDeviceAPI = &LCD_L0_APIList;"为如下代码:
        #if GUI_NUM_LAYERS == 1
                GUI_Context.pDeviceAPI = LCD_aAPI[0];// 如果只支持一层,层0的API
        #else
                GUI_Context.pDeviceAPI = LCD_aAPI[GUI_Context.SelLayer];// 选定层的LCD设备API
        #endif
        
        LCD_SetClipRectMax();

        for (y = 0; y < YMax; y++)
        {
            LCD_PIXELINDEX *pData = pData0;
            for (x = 0; x < XMax; x++)
            {
                LCD_PIXELINDEX PixelIndex;
                int ColorSep[3];
                U32 Color = LCD_Index2Color(*pData);

                ColorSep[0] = Color &255;
                ColorSep[1] = (Color >> 8) &255;
                ColorSep[2] = (Color >> 16) &255;
                Color = LCD_Index2Color(*(pData + 1));

                ColorSep[0] += Color &255;
                ColorSep[1] += (Color >> 8) &255;
                ColorSep[2] += (Color >> 16) &255;
                Color = LCD_Index2Color(*(pData + LineOff));

                ColorSep[0] += Color &255;
                ColorSep[1] += (Color >> 8) &255;
                ColorSep[2] += (Color >> 16) &255;
                Color = LCD_Index2Color(*(pData + LineOff + 1));

                ColorSep[0] += Color &255;
                ColorSep[1] += (Color >> 8) &255;
                ColorSep[2] += (Color >> 16) &255;

                Color = (ColorSep[0] + 2) >> 2;
                Color |= ((ColorSep[1] + 2) >> 2) << 8;
                Color |= ((U32)((ColorSep[2] + 2) >> 2)) << 16;

                PixelIndex = LCD_Color2Index(Color);
                LCD_SetPixelIndex(x + x0, y + y0, PixelIndex);
                pData += 2;
            }

            pData0 += 2 * LineOff;
        }

        GUI_Context.pDeviceAPI = pDevicePrev; /* Restore API list ptr */
    }
}

//!
//! @param hMem 存储设备的句柄
void GUI_MEMDEV_CopyFromLCDAA(GUI_MEMDEV_Handle hMem)
{
    /* Make sure memory handle is valid */
    if (!hMem)
    {
        hMem = GUI_Context.hDevData;
    }

    if (hMem)
    {
        int x, y;
        GUI_MEMDEV *pDevData = (GUI_MEMDEV*)GUI_ALLOC_LOCK(hMem); /* Convert to pointer */
        GUI_USAGE *pUsage = 0;
        int x0 = pDevData->x0;
        int y0 = pDevData->y0;
        int XMax = pDevData->XSize / 2;
        int YMax = pDevData->YSize / 2;
        LCD_PIXELINDEX *pData = (LCD_PIXELINDEX*)(pDevData + 1);
        int LineOff = pDevData->BytesPerLine;

        if (pDevData->hUsage)
        {
            pUsage = GUI_USAGE_H2P(pDevData->hUsage);
        }

        for (y = 0; y < YMax; y++)
        {
            if (pUsage)
            {
                GUI_USAGE_AddHLine(pUsage, 0, y *2, pDevData->XSize);
                GUI_USAGE_AddHLine(pUsage, 0, y *2+1, pDevData->XSize);
            }

            for (x = 0; x < XMax; x++)
            {
                *pData = *(pData + 1) = *(pData + LineOff) = *(pData + 
                            LineOff + 1) = LCD_GetPixelIndex(x + x0, y + y0);
                pData += 2;
            }
            pData += LineOff + (pDevData->XSize &1);
        }
    }

    GUI_ALLOC_UNLOCK(hMem);
}
#else

void GUIDEV_AA(void) 
{
    /* avoid empty object files */
} 

#endif /* GUI_MEMDEV_SUPPORT */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -