Author: jimtabor Date: Wed May 21 17:32:13 2008 New Revision: 33629
URL: http://svn.reactos.org/svn/reactos?rev=33629&view=rev Log: Fix behavior if bmi null in NtGdiCreateDIBSection. Start internal functions for regions, includes a wine port get_region_type.
Modified: trunk/reactos/subsystems/win32/win32k/include/region.h trunk/reactos/subsystems/win32/win32k/objects/dibobj.c trunk/reactos/subsystems/win32/win32k/objects/region.c
Modified: trunk/reactos/subsystems/win32/win32k/include/region.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/region.h [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/include/region.h [iso-8859-1] Wed May 21 17:32:13 2008 @@ -38,6 +38,9 @@ BOOL FASTCALL IntGdiPaintRgn(PDC, HRGN ); HRGN FASTCALL GdiCreatePolyPolygonRgn(CONST PPOINT, CONST PINT, INT, INT );
+INT FASTCALL IntGdiCombineRgn(PROSRGNDATA, PROSRGNDATA, PROSRGNDATA, INT); +INT FASTCALL REGION_Complexity(PROSRGNDATA); + #define UnsafeIntCreateRectRgnIndirect(prc) \ NtGdiCreateRectRgn((prc)->left, (prc)->top, (prc)->right, (prc)->bottom)
Modified: trunk/reactos/subsystems/win32/win32k/objects/dibobj.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/obj... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/objects/dibobj.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/objects/dibobj.c [iso-8859-1] Wed May 21 17:32:13 2008 @@ -994,6 +994,8 @@ DC *dc; BOOL bDesktopDC = FALSE;
+ if (!bmi) return hbitmap; // Make sure. + // If the reference hdc is null, take the desktop dc if (hDC == 0) {
Modified: trunk/reactos/subsystems/win32/win32k/objects/region.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/obj... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/objects/region.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/objects/region.c [iso-8859-1] Wed May 21 17:32:13 2008 @@ -483,6 +483,20 @@ } #endif /* not NDEBUG */
+ +INT +FASTCALL +REGION_Complexity( PROSRGNDATA obj ) +{ + switch(obj->rdh.nCount) + { + DPRINT("Region Complexity -> %d",obj->rdh.nCount); + case 0: return NULLREGION; + case 1: return SIMPLEREGION; + default: return COMPLEXREGION; + } +} + static BOOL FASTCALL @@ -2064,6 +2078,62 @@ ExFreePool(pRgn->Buffer); return TRUE; } + +INT +FASTCALL +IntGdiCombineRgn(PROSRGNDATA destRgn, + PROSRGNDATA src1Rgn, + PROSRGNDATA src2Rgn, + INT CombineMode) +{ + INT result = ERROR; + + if (destRgn) + { + if (src1Rgn) + { + if (CombineMode == RGN_COPY) + { + if ( !REGION_CopyRegion(destRgn, src1Rgn) ) + return ERROR; + result = destRgn->rdh.iType; + } + else + { + if (src2Rgn) + { + switch (CombineMode) + { + case RGN_AND: + REGION_IntersectRegion(destRgn, src1Rgn, src2Rgn); + break; + case RGN_OR: + REGION_UnionRegion(destRgn, src1Rgn, src2Rgn); + break; + case RGN_XOR: + REGION_XorRegion(destRgn, src1Rgn, src2Rgn); + break; + case RGN_DIFF: + REGION_SubtractRegion(destRgn, src1Rgn, src2Rgn); + break; + } + result = destRgn->rdh.iType; + } + else if (src2Rgn == NULL) + { + DPRINT1("IntGdiCombineRgn requires hSrc2 != NULL for combine mode %d!\n", CombineMode); + } + } + } + } + else + { + DPRINT("IntGdiCombineRgn: hDest unavailable\n"); + result = ERROR; + } + return result; +} +
// NtGdi Exported Functions INT