浅析minigui下向HDC_SCREEN对应的PDC发送的数据是如何直接显示到lcd上的
pdc = dc_HDC2PDC (hdc);
static inline PDC dc_HDC2PDC (HDC hdc)
{
if (hdc == HDC_SCREEN) return &__mg_screen_dc;
return (PDC) hdc;
}
GAL_Surface* __gal_screen;
DC __mg_screen_dc;
InitGAL
==>(__gal_screen = GAL_SetVideoMode (w, h, depth, GAL_HWPALETTE))
==>FB_SetVideoMode
__gal_screen->flags = (GAL_FULLSCREEN|GAL_HWSURFACE);
__gal_screen->w = vinfo.xres; // framebuffer宽
__gal_screen->h = vinfo.yres; // framebuffer高
__gal_screen->pitch = finfo.line_length; // framebuffer一行字节数
__gal_screen->pixels 等于 framebuffer显示区首地址
应为__mg_screen_dc->cur_dst直接对应__gal_screen->pixels即framebuffer的显示内存地址,
所以向__mg_screen_dc的cur_dst赋值将直接显示到lcd屏幕上[luther.gliethttp]
InitGUI
==>InitScreenDC (__gal_screen)
libminigui-1.6.10/src/newgdi/gdi.c|178| dc_InitScreenDC (&__mg_screen_dc, (GAL_Surface *)surface);
BOOL InitScreenDC (void* surface)
{
InitFreeClipRectList (&__mg_FreeClipRectList, SIZE_CLIPRECTHEAP);
INIT_LOCK (&__mg_gdilock, NULL);
INIT_LOCK (&dcslot, NULL);
dc_InitClipRgnInfo ();
dc_InitScreenDC (&__mg_screen_dc, (GAL_Surface *)surface);
return TRUE;
}
static void dc_InitScreenDC (PDC pdc, GAL_Surface *surface)
{
pdc->DataType = TYPE_HDC; // hdc内存数据类型
pdc->DCType = TYPE_SCRDC; // 类型
pdc->hwnd = 0;
pdc->surface = surface; // 该hdc管理的surface区块,这里就是__gal_screen,整个lcd屏幕对应的framebuffer.[luther.gliethttp]
......
pdc->DevRC.left = 0; // 左上角
pdc->DevRC.top = 0;
pdc->DevRC.right = surface->w;
// 右下角,这样该pdc对应矩形surface,即__gal_screen的w和h,就是整个lcd屏幕的framebuffer内存区[luther.gliethttp]
pdc->DevRC.bottom = surface->h;
......
/* context info and raster operations. */
pdc->rop = ROP_SET;
pdc->step = 1;
pdc->set_pixel = set_pixel_ops [pdc->rop] // 画点函数设置
[pdc->surface->format->BytesPerPixel - 1];
pdc->draw_hline = draw_hline_ops [pdc->rop]
[pdc->surface->format->BytesPerPixel - 1];
pdc->put_hline = put_hline_ops [pdc->rop]
[pdc->surface->format->BytesPerPixel - 1];
pdc->cur_dst = pdc->surface->pixels; // 对该pdc的操作将直接反应到该pdc对应的surface矩形管理区块中,
// __mg_screen_dc对应的__gal_screen,就直接表示framebuffer的显示内存地址
// 所以对__mg_screen_dc的cur_dst赋值将直接显示到lcd屏幕上[luther.gliethttp]
......
}
阅读(2524) | 评论(0) | 转发(0) |