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

📄 guidev_banding.c

📁 ucGUI3.90a没有MemDev这是从3.24向上移植的
💻 C
字号:
/*! @file GUIDEV_Banding.c
 *  Implementation of banding memory devices 
 *
 *  @author hiber modified
 *  @author Copyleft (C) 1981-2006, All Rights Givenup
 *  @date 04/18/2006
 *  @version 
 *
 *  @note This routine uses a banding memory device to draw the given area flicker free. 
 *        It not only draws, but also automatically calculates the size of, creates, moves
 *        and then destroys the memory device.
 *  @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

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

static int Min(int v0, int v1)
{
    if (v0 <= v1)
    {
        return v0;
    }

    return v1;
}

//! 防止显示屏闪烁的基本函数
//! @param pRect 所使用的LCD 的一个GUI_RECT 结构的指针。
//! @param pfDraw 执行绘图操作的一个回调函数的指针。
//! @param pData 作为回调函数参数使用的一个数据结构的指针。
//! @param NumLines 0(推荐)或者是存储设备的分段数量。
//! @param Flags 0 或者 GUI_MEMDEV_HASTRANS。
//! @return 如果成功返回0,如果函数执行失败则返回1。
//! @note 如果参数NumLines 为0,则每段中的线段数量由函数自动计算。通过移动存储设备的原
//!       点,函数一段又一段地重复改写输出区域。
int GUI_MEMDEV_Draw(GUI_RECT *pRect, GUI_CALLBACK_VOID_P *pfDraw, 
                    void *pData, int NumLines, int Flags)
{
    int x0, y0, x1, y1, xsize, ysize;
    GUI_MEMDEV_Handle hMD;

    if (pRect)
    {
        x0 = (pRect->x0 < 0) ? 0 : pRect->x0;
        y0 = (pRect->y0 < 0) ? 0 : pRect->y0;

        x1 = Min(pRect->x1, LCD_GET_XSIZE() - 1);
        y1 = Min(pRect->y1, LCD_GET_YSIZE() - 1);

        xsize = x1 - x0 + 1;
        ysize = y1 - y0 + 1;
    }
    else
    {
        x0 = 0;
        y0 = 0;

        xsize = LCD_GET_XSIZE();
        ysize = LCD_GET_YSIZE();
    }

    if (NumLines == 0)
    {
        NumLines =  - ysize; /* Request <ysize> lines ... Less is o.k. */
    }

    if ((xsize <= 0) || (ysize <= 0))
    {
        return 0;
    }

     /* Nothing to do ... */
    /* Create memory device */
    hMD = GUI_MEMDEV_CreateEx(x0, y0, xsize, NumLines, Flags);
    if (!hMD)
    {
        GUI_DEBUG_ERROROUT("GUI_MEMDEV_Draw() Not enough memory ..."); /* Not enough memory ! */
        pfDraw(pData);
        return 1;
    }

    NumLines = GUI_MEMDEV_GetYSize(hMD);
    GUI_MEMDEV_Select(hMD);

    /* Start drawing ... */
    {
        int i;
        for (i = 0; i < ysize; i += NumLines)
        {
            int RemLines = ysize - i;

            if (RemLines < NumLines)
            {
                GUI_MEMDEV_ReduceYSize(hMD, RemLines);
            }

            if (i)
            {
                GUI_MEMDEV_SetOrg(hMD, x0, y0 + i);
                GUI_MEMDEV_Clear(hMD);
            }

            pfDraw(pData);
            GUI_MEMDEV_CopyToLCD(hMD);
        }
    }

    GUI_MEMDEV_Delete(hMD);
    GUI_MEMDEV_Select(0);
    return 0; /* Success ! */
}

#else

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

#endif /* GUI_MEMDEV_SUPPORT */

⌨️ 快捷键说明

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