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和Vue一样的,核心思想玩的就是组件...
前言: 前段时间学习完react后,刚好就接到公司一个react项目...
前言: 最近收到组长通知我们项目组后面新开的项目准备统一技...
react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom...