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

📄 guidev_usagebm.c

📁 ucGUI3.90a没有MemDev这是从3.24向上移植的
💻 C
字号:
/*! @file GUIDEV_UsageBM.c
 *  Implementation of memory devices 
 *
 *  @author hiber modified
 *  @author Copyleft (C) 1981-2006, All Rights Givenup
 *  @date 04/18/2006
 *  @version 
 *
 *  @note 
 *  @attention 
 *  @warning 
 *  @bug
 *
 *  @todo
 *  @example <file-name>
 *  @see
 */
#include <string.h>
#include "GUI_Protected.h"
#include "GUIDebug.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

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

typedef struct
{
    GUI_USAGE Public;
    struct
    {
        int BytesPerLine;
    } Private;
} GUI_USAGE_BM;

static void GUI_USAGE_BM_AddPixel(GUI_USAGE *p, int x, int y)
{
    U8 *pData;
    const GUI_USAGE_BM *pThis = (GUI_USAGE_BM*)p;

    #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL
        if ((x >= pThis->Public.x0 + pThis->Public.XSize) | (x < pThis->Public.x0) | 
                    (y >= pThis->Public.y0 + pThis->Public.YSize) | (y < pThis->Public.y0))
        {
            GUI_DEBUG_ERROROUT2("GUI_USAGE_BM_AddPixel: parameters out of bounds", x, y);
        }
    #endif

    x -= pThis->Public.x0;
    pData = (U8*)(pThis + 1);
    pData += (y - pThis->Public.y0) *pThis->Private.BytesPerLine;
    pData += x >> 3;
    *pData |= 0x80 >> (x &7);
}

static void GUI_USAGE_BM_AddHLine(GUI_USAGE *p, int x, int y, int len)
{
    #if 0   /* Enable for the slower, but smaller version ... xxx*/
        while (len-- > 0)
        {
            GUI_USAGE_BM_AddPixel(h, x++, y);
        }
    #else
        U8 *pData;
        const GUI_USAGE_BM *pThis = (GUI_USAGE_BM*)p;
        /* Asserts */
        GUI_DEBUG_ERROROUT3_IF(x < pThis->Public.x0, 
                                    "GUIDEV.c: MarkPixels: negative x offset, Act= %d, Border= %d, Clip= %d",
                                            x, pThis->Public.x0, GUI_Context.ClipRect.x0);
        
        /* Calculate pointers */
        x -= pThis->Public.x0;
        pData = (U8*)(pThis + 1);
        pData += (y - pThis->Public.y0) *pThis->Private.BytesPerLine;
        pData += x >> 3;
        /* Set bits */
        {
            int x1 = x + len - 1; /* last pixel */
            int NumBytes = (x1 >> 3) - (x >> 3);
            U8 Mask0 = 0xff >> (x &7);
            U8 Mask1 = 0xff << (7-(x1 &7));

            if (NumBytes == 0)
            {
                *pData |= (Mask0 &Mask1);
            }
            else
            {
                *pData++ |= Mask0; /* Mark first byte */
                /* Mark middle bytes */
                if (--NumBytes > 0)
                {
                    memset(pData, 0xff, NumBytes);
                    pData += NumBytes;
                }

                *pData |= Mask1; /* Mark last bytes */
            }
        }
    #endif
}

static void GUI_USAGE_BM_Clear(GUI_USAGE *p)
{
    GUI_USAGE_BM *pThis = (GUI_USAGE_BM*)p;
    memset(pThis + 1, 0, pThis->Public.YSize *pThis->Private.BytesPerLine);
}

static int GUI_USAGE_BM_GetNextDirty(GUI_USAGE *p, int *pxOff, int yOff)
{
    int x =  *pxOff;
    int xEnd;
    const GUI_USAGE_BM *pThis = (GUI_USAGE_BM*)p;
    int xSize = pThis->Public.XSize;
    U8 *pData = (U8*)(pThis + 1);

    pData += yOff * pThis->Private.BytesPerLine;
    pData += (x >> 3);
    if (x >= xSize)
    {
        return 0;
    }

    // 大括号...
    {
        /* Find first bit */
        int BytesLeft = ((xSize - 1) >> 3) - (x >> 3);
        /* Check first byte */
        U8 Data = (*pData++) << (x &7);

        while (Data == 0)
        {
            if (BytesLeft == 0)
            {
                return 0;
            }
            Data =  *pData++;
            BytesLeft--;
            x = (x + 8) &~7;
        }

        while ((Data &0x80) == 0)
        {
            Data <<= 1;
            x++;
        }

        /* Find last cleared byte */
        if (Data != 0xff)
        {
            /* This line is simply a speed-opt and may be eliminated */
            xEnd = x;
            while (Data &0x40)
            {
                Data <<= 1;
                xEnd++;
            }
        }
        else
        {
            xEnd = x + 7;
        }

        if ((xEnd &7) == 7)
        {
            while (--BytesLeft >= 0)
            {
                if ((Data =  *pData++) == 0xff)
                {
                    xEnd += 8;
                }
                else
                {
                    while (Data &0x80)
                    {
                        Data <<= 1;
                        xEnd++;
                    }

                    break;
                }
            }
        }

    }

    *pxOff = x;
    return xEnd - x + 1;
}

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

//! 
void GUI_USAGE_BM_Delete(GUI_MEMDEV_Handle hDevUsage)
{
    GUI_ALLOC_FREE(hDevUsage);
}

//! 存储设备使用功能(Dirty?)API函数指针表
static const tUSAGE_APIList API =
{
    GUI_USAGE_BM_AddPixel,  /* tUSAGE_AddPixel*         */
    GUI_USAGE_BM_AddHLine,  /* tUSAGE_AddHLine*         */
    GUI_USAGE_BM_Clear,  /* tUSAGE_Clear*            */
    0,  /* tUSAGE_CreateCompatible* */
    GUI_USAGE_BM_Delete,  /* tUSAGE_Delete*           */
    GUI_USAGE_BM_GetNextDirty /* tUSAGE_GetNextDirty*     */
};

//!
GUI_USAGE_Handle GUI_USAGE_BM_Create(int x0, int y0, int xsize, int ysize, int Flags)
{
    int MemSize;
    int BytesPerLine;
    GUI_USAGE_Handle hMem;
    GUI_USE_PARA(Flags);

    BytesPerLine = ((xsize + 15) >> 4) << 1; /* 2 byte alignment */
    MemSize = ysize * BytesPerLine + sizeof(GUI_USAGE_BM);
    hMem = GUI_ALLOC_AllocNoInit(MemSize);

    /* Check if we can alloc sufficient memory */
    if (!hMem)
    {
        GUI_DEBUG_ERROROUT("GUI_USAGE_BM_Create: Too little memory");
        return 0;
    }

    // 大括号...
    {
    GUI_USAGE_BM* pUsage = (GUI_USAGE_BM*)GUI_ALLOC_H2P(hMem);
        

        pUsage->Public.x0 = x0;
        pUsage->Public.y0 = y0;
        pUsage->Public.XSize = xsize;
        pUsage->Public.YSize = ysize;
        pUsage->Public.pAPI = &API;
        pUsage->Public.UseCnt = 1;
        pUsage->Private.BytesPerLine = BytesPerLine;
    }

    return hMem;
}

#else

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

#endif /* GUI_SUPPORT_MEMDEV */

⌨️ 快捷键说明

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