Author: tkreuzer Date: Tue Jul 23 15:31:43 2013 New Revision: 59564
URL: http://svn.reactos.org/svn/reactos?rev=59564&view=rev Log: [WIN32K] Fix some bugs related to DIB brushes.
Modified: branches/dib_rewrite/win32ss/gdi/ntgdi/brush.c branches/dib_rewrite/win32ss/gdi/ntgdi/dibitmap.c
Modified: branches/dib_rewrite/win32ss/gdi/ntgdi/brush.c URL: http://svn.reactos.org/svn/reactos/branches/dib_rewrite/win32ss/gdi/ntgdi/br... ============================================================================== --- branches/dib_rewrite/win32ss/gdi/ntgdi/brush.c [iso-8859-1] (original) +++ branches/dib_rewrite/win32ss/gdi/ntgdi/brush.c [iso-8859-1] Tue Jul 23 15:31:43 2013 @@ -424,6 +424,13 @@ return NULL; }
+ /* Check for undocumented case 2 */ + if (iUsage == 2) + { + /* Tests show that this results in a hollow/null brush */ + return GreCreateNullBrush(); + } + /* Allocate a buffer large enough to hold the complete packed DIB */ pvSaveDIB = ExAllocatePoolWithTag(PagedPool, cjDIBSize, TAG_DIB); if (pvSaveDIB == NULL) @@ -468,18 +475,22 @@ entries directly, instead we need to create a fake palette containing pal indices, which is converted into a real palette when the brush is realized. */ - if (iUsage == DIB_PAL_COLORS) iUsage = DIB_PAL_BRUSHHACK; + if (iUsage == DIB_PAL_COLORS) + { + iUsage = DIB_PAL_BRUSHHACK; + flAttr |= BR_IS_DIBPALCOLORS; + }
/* Create the pattern bitmap from the DIB. */ hbmPattern = GreCreateDIBitmapInternal(NULL, pbmi->bmiHeader.biWidth, abs(pbmi->bmiHeader.biHeight), - CBM_INIT, + CBM_INIT | CBM_CREATDIB, pvSafeBits, pbmi, iUsage,// FIXME!!! + cjDIBSize - cjInfoSize, 0, - cjDIBSize - cjInfoSize, NULL);
/* Free the buffer already */ @@ -492,9 +503,6 @@ return NULL; }
- /* Remember if the palette consists of palette indices */ - if (iUsage == DIB_PAL_COLORS) flAttr |= BR_IS_DIBPALCOLORS; - /* Call the internal worker function */ return GreCreateBrushInternal(0, hbmPattern, pvPackedDIB, 0, flAttr); }
Modified: branches/dib_rewrite/win32ss/gdi/ntgdi/dibitmap.c URL: http://svn.reactos.org/svn/reactos/branches/dib_rewrite/win32ss/gdi/ntgdi/di... ============================================================================== --- branches/dib_rewrite/win32ss/gdi/ntgdi/dibitmap.c [iso-8859-1] (original) +++ branches/dib_rewrite/win32ss/gdi/ntgdi/dibitmap.c [iso-8859-1] Tue Jul 23 15:31:43 2013 @@ -286,7 +286,7 @@ the number of colors in the DC palette */ WORD wIndex = pwColors[i] % ppalDC->NumColors;
- /* USe the RGB value from the DC palette */ + /* Use the RGB value from the DC palette */ crColor = PALETTE_ulGetRGBColorFromIndex(ppalDC, wIndex); PALETTE_vSetRGBColorForIndex(ppal, i, crColor); } @@ -644,6 +644,7 @@ if ((iUsage == DIB_PAL_COLORS) && !pdc) goto cleanup;
iFormat = psurfDIB->SurfObj.iBitmapFormat; + if (iFormat > BMF_32BPP) goto cleanup;
if (psurfDIB) { @@ -1354,7 +1355,7 @@ yTop = cyDIB - (iStartScan + cNumScan);
/* Bail out if the intersecion between scanlines and copy area is empty */ - if ((ySrc > yTop + cNumScan) || (ySrc + (INT)cy < yTop)) goto leave; + if ((ySrc > yTop + (INT)cNumScan) || (ySrc + (INT)cy < yTop)) goto leave;
/* Check if the copy area starts below or at the topmost scanline */ if (ySrc >= yTop)