微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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句柄。

原文地址:https://www.jb51.cc/react/308321.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐