自已实现一个UI库-实现画图API接口

来源:互联网 发布:37传奇霸业注灵数据 编辑:程序博客网 时间:2024/06/11 03:26

实现画图API接口

定义一个画图操作的容器集合

很多时候程序需要移植,同样对一个UI来说,有时需要在很多平台上能运行,如在板上的程序,希望能在WINDOW上写一个模拟器,(为了方便,我的程序也在一个简单WINDOWS模拟器上执行);很多平台上也提供了不同的硬件来对画图进行加速或一些特效,但对于上层UI的代码我们希望和这些都是无关的,所以要定义一些接口,对于C语言来说,可以定义一个操作的struct集合容器,上层的UI操作只能通过这些操作来画图,接着上节的,如下定义一些基本的操作:

在一个头文件里(UI_Adapter.h) 作如下的定义:

/*画点*/

typedef void (*tagUI_SetPointPixel) (int x, int y, PIXELINDEX pixelValue);

/*获取一个点的颜色*/

typedef unsigned int (*tagUI_GetPointPixel) (int x, int y);

/*画线*/

typedef void (*tagUI_DrawHLine) (int x0, int y0, int x1);

typedef void (*tagUI_DrawVLine) (int x0, int y0, int y1);

/*画填充的矩形*/

typedef void (*tagUI_DrawFillRect) (int x0, int y0, int x1, int y1);

/*获取显存的分辨率宽高*/

typedef int (*tagUI_GetScreenX) ();

typedef int (*tagUI_GetScreenY) ();

typedef struct _GUI_DrawApi

{

tagUI_SetPointPixel pfSetPointPixel;

tagUI_GetPointPixel pfGetPointPixel;

tagUI_DrawHLine pfDrawHLine;

tagUI_DrawVLine pfDrawVLine;

tagUI_DrawFillRect pfDrawFillRect;

tagUI_GetScreenX pfGetScreenX;

tagUI_GetScreenY pfGetScreenY;

}UI_DriveDrawApi;

为了方便移值,在一个头文件(UI_Types.h)中有如下的定义:

typedef signed char I8;

typedef unsigned char U8; /* unsigned 8 bits. */

typedef signed short I16; /* signed 16 bits. */

typedef unsigned short U16; /* unsigned 16 bits. */

typedef signed int I32; /* signed 32 bits. */

typedef unsigned int U32; /* unsigned 32 bits. */ /*保险的应是 unsigned long*/

typedef signed int S32; /*保险的应是 signed long*/

typedef signed long long S64;

#ifdef linux

#define PIXELINDEX U16 /*每个像素位数*/

#endif

#ifdef WIN32

#define PIXELINDEX U32

#endif

有了上面的基本的操作API操口,那么对于LINUX FRAMEBUFFER的定义可以像下面这样的写:

首先定义一个全局的 UI_DriveDrawApi 对像,可以定义在一个c 文件里,定义一个方法来初始化这个对像,如下:

static UI_DriveDrawApi *_pDriverDrawApi;

void UI_DrawApiInit(UI_DriveDrawApi* pDriveDrawApi)

{

UI_LOCK();

_pDriverDrawApi = pDriveDrawApi;

UI_UNLOCK();

}

UI_DrawApiInit 方法是公开的,不同平台的应用程序需要定义一个 UI_DriveDrawApi的接口来初始化上面的静态变量_pDriverDrawApi.

在根据前一节的定义,可以这样定义linux framebuffer 的操作.

static UI_DriveDrawApi _DriverDrawApi = {

fb_SetPointPixel,

fb_GetPointPixel,

fb_DrawHLine,

fb_DrawVLine,

fb_DrawFillRect,

fb_GetScreenX,

fb_GetScreenY

};

有了上面这个,可以在应用程序里的一个合适的地方,操作UI画图前,调用前面UI的初始化过程:UI_DrawApiInit,

像下面这样:

UI_DrawApiInit(&_DriverDrawApi);

上面接口里的 tagUI_GetScreenX 和 tagUI_GetScreenY 方法对于 linux framebuffer 来说就是获取fb_var_screeninfo 里的 xres_virtual 和 yres_virtual.

为上层操作定义方法

对于后面的UI实现来说,通过上面的接口,可以操作显存了,这了方便再定义如下的转换方法:

#include "UI_Adapter.h"

/*对应底层的画图API*/

static UI_DriveDrawApi *_pDriverDrawApi;

void UI_DrawApiInit(UI_DriveDrawApi* pDriveDrawApi)

{

UI_LOCK();

_pDriverDrawApi = pDriveDrawApi;

UI_UNLOCK();

}

int UI_GetScreenX()

{

return _pDriverDrawApi->pfGetScreenX();

}

int UI_GetScreenY()

{

return _pDriverDrawApi->pfGetScreenY();

}

void UI_SetPointPixel(int x, int y, int pixelValue)

{

_pDriverDrawApi->pfSetPointPixel(x, y, pixelValue);

}

unsigned int UI_GetPointPixel(int x, int y)

{

return (unsigned int)_pDriverDrawApi->pfGetPointPixel(x, y);

}

void UI_HLine(int x0, int y0, int x1)

{

_pDriverDrawApi->pfDrawHLine(x0, y0, x1);

}

void UI_VLine(int x0, int y0, int y1)

{

_pDriverDrawApi->pfDrawVLine(x0, y0, y1);

}

void UI_FillRect(int x0, int y0, int x1, int y1)

{

_pDriverDrawApi->pfDrawFillRect(x0, y0, x1, y1);

}

void UI_DrawRect(int x0, int y0, int x1, int y1)

{

UI_HLine(x0, y0, x1);

UI_HLine(x0, y1, x1);

UI_VLine(x0, y0, y1);

UI_VLine(x1, y0, y1);

}

UI_LOCK() 与 UI_UNLOCK() 这是一个加锁的操作,在不同的平台需要不同的实现,如常用的互拆锁。

有上面的操作API后,UI画图就用上面的定义来操作画图。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 率土之滨没地了怎么办 老公有外遇怎么办他还舍不得小三 11选5输了6万 怎么办 k宝密码忘了怎么办5次 k宝密码输错5次怎么办 上火了牙疼怎么办怎样快速止疼 身体不吸收营养胖不起来怎么办 突然牙疼怎么办教你立刻止疼 蛀牙疼怎么办教你立刻止疼 做了牙套的牙疼怎么办 牙疼怎么办教你立刻止疼 七个月宝宝便秘拉不出来怎么办 喝酒脸上起了很多小红疙瘩怎么办 我的脸又痒又红怎么办 脸又红又痒又烫怎么办 满脸痘痘怎么办全部都是红的 身上起大片扁疙瘩很痒怎么办 我急用钱借钱又借不到怎么办 小孩蛀牙牙疼怎么办教你立刻止疼 牙齿里面长了个小牙齿怎么办 2岁宝宝又吐又拉怎么办 u盘坏了怎么办没反应了 怀孕了不知道孩子是谁的怎么办 怀孕八个月耻骨疼的厉害怎么办 没感情了这段婚姻该怎么办 1岁半宝宝o型腿怎么办 4s店没按时交车怎么办 几天几夜睡不着觉没有睡意怎么办 辣的吃多了胃疼怎么办 喉咙痛怎么办有最好即简单好得快 减肥过后皮肤留下的肥胖纹怎么办 用了完美玛丽艳脸上长痘痘怎么办 腰疼怎么办8方法解决腰疼 红米3x开不了机怎么办 苹果手机忘记了锁屏密码怎么办 小米5的4g网速慢怎么办 红米4a卡机了怎么办 信而富逾期3个月怎么办 苹果6锁屏密码忘了怎么办 孕8个月咳嗽有痰怎么办 微信红包输了6万怎么办