在640*480 分辨率下用dirext video frame buffer直接写屏的问题
[复制链接]
各位大佬
有段代码我用在320*240的分辨率下非常好用,可是到了640*480的屏幕,输出的画面就变成两个了。不知道是什么问题,请各位看看
这是初始化函数
struct ezfb {
HRESULT res_handle ; // direct draw api result
LPDIRECTDRAW dd_ptr ; // direct draw object ptr
DDSURFACEDESC dds_desc ; // direct draw surface desc obj
LPDIRECTDRAWSURFACE dds_ptr ; // direct draw surface ptr
u_short* vga_ptr ; // points to frame buffer of screen
u_int scr_width ;
u_int scr_height ;
u_int scr_bpp ;
};
int ezfb_init(struct ezfb* fb, HWND wnd_handle)
{
DDCAPS dd_caps ;
DDCAPS dd_hel_caps ;
// init fb value
fb->vga_ptr = NULL ;
fb->dd_ptr = NULL ;
fb->dds_ptr = NULL ;
fb->scr_width = 0 ;
fb->scr_height = 0 ;
fb->scr_bpp = 0 ;
// create direct draw object
fb->res_handle = DirectDrawCreate(NULL, &(fb->dd_ptr), NULL);
if (fb->res_handle != DD_OK)
return EZFB_FAIL_CREATE_DD ;
// Get exclusive mode
fb->res_handle = (fb->dd_ptr)->SetCooperativeLevel(wnd_handle, DDSCL_FULLSCREEN);
if (fb->res_handle != DD_OK)
return EZFB_FAIL_SET_FULLSCREEN ;
// make sure the direct draw is valid
(fb->dd_ptr)->GetCaps(&dd_caps, &dd_hel_caps) ;
if (!(dd_caps.ddsCaps.dwCaps & DDSCAPS_VALID))
return EZFB_FAIL_GET_DD_INFO ;
// create the main framebuffer surface
memset(&(fb->dds_desc), 0, sizeof(fb->dds_desc)) ;
(fb->dds_desc).dwSize = sizeof(fb->dds_desc) ;
(fb->dds_desc).dwFlags = DDSD_CAPS ;
(fb->dds_desc).ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE ;
fb->res_handle = (fb->dd_ptr)->CreateSurface(&(fb->dds_desc), &(fb->dds_ptr), NULL) ;
if (fb->res_handle != DD_OK)
return EZFB_FAIL_CREATE_DDS ;
if(EZFB_LOCK(fb) != DD_OK) return EZFB_FALSE ;
// save screen necessary params
fb->scr_bpp = fb->dds_desc.ddpfPixelFormat.dwRGBBitCount ;
EZFB_MAP(fb) ;
EZFB_UNLOCK(fb) ;
return EZFB_TRUE ;
}
然后以后的代码直接把画面内容写入(fb->dds_ptr)即可在屏幕上显示图像了。
在VGA的尺寸下,图像是2个缩得非常小的画面,而在QVGA尺寸下,图像很正常。请教各位大佬。