reactos操作系统实现(198)

为了测试2位颜色位图装载到设备是否出错,编写了下面这段测试代码,如下:

#001 /* test with 2 bits color depth, not likely to succeed */

#002 hbmp = CreateBitmap(16, 16, 1, 2, bits);

#003 ok( hbmp != NULL, "CreateBitmap returns %p\n", hbmp);

#004 oldhbmp = SelectObject( hdcmem, hbmp);

#005 if( bitspixel != 2)

#006 ok( !oldhbmp, "SelectObject of a bitmap with 2 bits/pixel should return NULL\n");

从这段代码可以看到,当内存DC不是两位颜色时,选择加载2位颜色的位图,就需要返回空句柄,否则就是这个SelectObjectAPI函数实现有问题。在没有修改这个BUG之前,这个函数返回是成功的加载位图了。因此需要修改这个函数的代码如下:

#001 HBITMAP

#002 APIENTRY

#003 NtGdiSelectBitmap(

#004 IN HDC hDC,

#005 IN HBITMAP hBmp)

#006 {

#007 PDC pDC;

#008 PDC_ATTR pdcattr;

#009 HBITMAP hOrgBmp;

#010 PSURFACE psurfBmp, psurfOld;

#011 HRGN hVisRgn;

#012

#013 if (hDC == NULL || hBmp == NULL) return NULL;

#014

#015 pDC = DC_LockDc(hDC);

#016 if (!pDC)

#017 {

#018 return NULL;

#019 }

#020 pdcattr = pDC->pdcattr;

#021

#022 /* must be memory dc to select bitmap */

#023 if (pDC->dctype != DC_TYPE_MEMORY)

#024 {

#025 DC_UnlockDc(pDC);

#026 return NULL;

#027 }

#028

#029 psurfBmp = SURFACE_LockSurface(hBmp);

#030 if (!psurfBmp)

#031 {

#032 DC_UnlockDc(pDC);

#033 return NULL;

#034 }

#035

#036 //判断位图颜色数目是否与设备的颜色数目一样。

#037 if (pDC->ppdev)

#038 {

#039 if (BitsPerFormat(psurfBmp->SurfObj.iBitmapFormat) == 4)

#040 {

#041 //

#042 DPRINT1("BitsPerFormat %d\n",BitsPerFormat(psurfBmp->SurfObj.iBitmapFormat));

#043 DPRINT1("pDC->ppdev->gdiinfo.cBitsPixel %d\n",pDC->ppdev->gdiinfo.cBitsPixel);

#044

#045 if ( BitsPerFormat(psurfBmp->SurfObj.iBitmapFormat) !=

#046 pDC->ppdev->gdiinfo.cBitsPixel)

#047 {

#048 SURFACE_UnlockSurface(psurfBmp);

#049

#050 DC_UnlockDc(pDC);

#051 return NULL;

#052 }

#053 }

#054 }

#055

36行代码开始,就是添加来解决这个BUG的,最后运行测试代码,成功地返回NULL句柄。

你可能感兴趣的:(react)