Author: greatlrd Date: Sat Jun 7 09:34:25 2008 New Revision: 33887
URL: http://svn.reactos.org/svn/reactos?rev=33887&view=rev Log: Fixed almost all firefox 1.5 crash also sync with trunk thus files
Modified: branches/win32k-gdi-dx/subsystems/win32/win32k/objects/bitblt.c branches/win32k-gdi-dx/subsystems/win32/win32k/objects/dibobj.c branches/win32k-gdi-dx/subsystems/win32/win32k/objects/fillshap.c branches/win32k-gdi-dx/subsystems/win32/win32k/objects/polyfill.c
Modified: branches/win32k-gdi-dx/subsystems/win32/win32k/objects/bitblt.c URL: http://svn.reactos.org/svn/reactos/branches/win32k-gdi-dx/subsystems/win32/w... ============================================================================== --- branches/win32k-gdi-dx/subsystems/win32/win32k/objects/bitblt.c [iso-8859-1] (original) +++ branches/win32k-gdi-dx/subsystems/win32/win32k/objects/bitblt.c [iso-8859-1] Sat Jun 7 09:34:25 2008 @@ -42,13 +42,11 @@ { PDC DCDest = NULL; PDC DCSrc = NULL; - PDC_ATTR Dc_Attr = NULL; BITMAPOBJ *BitmapDest, *BitmapSrc; RECTL DestRect, SourceRect; BOOL Status; XLATEOBJ *XlateObj; BLENDOBJ BlendObj; - HPALETTE SourcePalette = 0, DestPalette = 0; BlendObj.BlendFunction = BlendFunc;
DCDest = DC_LockDc(hDCDest); @@ -88,14 +86,11 @@ DCSrc = DCDest; }
- Dc_Attr = DCSrc->pDc_Attr; - if (!Dc_Attr) Dc_Attr = &DCSrc->Dc_Attr; - /* Offset the destination and source by the origin of their DCs. */ - XOriginDest += DCDest->w.DCOrgX; - YOriginDest += DCDest->w.DCOrgY; - XOriginSrc += DCSrc->w.DCOrgX; - YOriginSrc += DCSrc->w.DCOrgY; + XOriginDest += DCDest->ptlDCOrig.x; + YOriginDest += DCDest->ptlDCOrig.y; + XOriginSrc += DCSrc->ptlDCOrig.x; + YOriginSrc += DCSrc->ptlDCOrig.y;
DestRect.left = XOriginDest; DestRect.top = YOriginDest; @@ -109,53 +104,43 @@
/* Determine surfaces to be used in the bitblt */ BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap); + if (!BitmapDest) + { + DC_UnlockDc(DCSrc); + DC_UnlockDc(DCDest); + return FALSE; + } if (DCSrc->w.hBitmap == DCDest->w.hBitmap) BitmapSrc = BitmapDest; else + { BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap); + if (!BitmapDest) + { + BITMAPOBJ_UnlockBitmap(BitmapDest); + DC_UnlockDc(DCSrc); + DC_UnlockDc(DCDest); + return FALSE; + } + }
/* Create the XLATEOBJ. */ - if (DCDest->DcLevel.hpal != 0) - DestPalette = DCDest->DcLevel.hpal; - if (DCSrc->DcLevel.hpal != 0) - SourcePalette = DCSrc->DcLevel.hpal; - - /* KB41464 details how to convert between mono and color */ - if (DCDest->w.bitsPerPixel == 1 && DCSrc->w.bitsPerPixel == 1) - { + XlateObj = IntCreateXlateForBlt(DCDest, DCSrc, BitmapDest, BitmapSrc); + + if (XlateObj == (XLATEOBJ*)-1) + { + DPRINT1("error!!!\n"); + SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); XlateObj = NULL; + Status = FALSE; } else { - if (DCDest->w.bitsPerPixel == 1) - { - XlateObj = IntEngCreateMonoXlate(0, DestPalette, SourcePalette, Dc_Attr->crBackgroundClr); - } - else if (DCSrc->w.bitsPerPixel == 1) - { - XlateObj = IntEngCreateSrcMonoXlate(DestPalette, Dc_Attr->crBackgroundClr, Dc_Attr->crForegroundClr); - } - else - { - XlateObj = IntEngCreateXlate(0, 0, DestPalette, SourcePalette); - } - if (NULL == XlateObj) - { - BITMAPOBJ_UnlockBitmap(BitmapDest); - if (BitmapSrc != BitmapDest) - BITMAPOBJ_UnlockBitmap(BitmapSrc); - DC_UnlockDc(DCDest); - if (hDCSrc != hDCDest) - DC_UnlockDc(DCSrc); - SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); - return FALSE; - } - } - - /* Perform the alpha blend operation */ - Status = IntEngAlphaBlend(&BitmapDest->SurfObj, &BitmapSrc->SurfObj, - DCDest->CombinedClip, XlateObj, - &DestRect, &SourceRect, &BlendObj); + /* Perform the alpha blend operation */ + Status = IntEngAlphaBlend(&BitmapDest->SurfObj, &BitmapSrc->SurfObj, + DCDest->CombinedClip, XlateObj, + &DestRect, &SourceRect, &BlendObj); + }
if (XlateObj != NULL) EngDeleteXlate(XlateObj); @@ -186,14 +171,13 @@ { PDC DCDest = NULL; PDC DCSrc = NULL; - PDC_ATTR Dc_Attr = NULL; - BITMAPOBJ *BitmapDest, *BitmapSrc; + PDC_ATTR Dc_Attr = NULL; + BITMAPOBJ *BitmapDest, *BitmapSrc = NULL; RECTL DestRect; POINTL SourcePoint, BrushOrigin; - BOOL Status; + BOOL Status = FALSE; XLATEOBJ *XlateObj = NULL; - HPALETTE SourcePalette = 0, DestPalette = 0; - PGDIBRUSHOBJ BrushObj; + PGDIBRUSHOBJ BrushObj = NULL; GDIBRUSHINST BrushInst; BOOL UsesSource = ROP3_USES_SOURCE(ROP); BOOL UsesPattern = ROP3_USES_PATTERN(ROP); @@ -240,16 +224,16 @@ DCSrc = NULL; }
- Dc_Attr = DCDest->pDc_Attr; - if (!Dc_Attr) Dc_Attr = &DCDest->Dc_Attr; + Dc_Attr = DCDest->pDc_Attr; + if (!Dc_Attr) Dc_Attr = &DCDest->Dc_Attr;
/* Offset the destination and source by the origin of their DCs. */ - XDest += DCDest->w.DCOrgX; - YDest += DCDest->w.DCOrgY; + XDest += DCDest->ptlDCOrig.x; + YDest += DCDest->ptlDCOrig.y; if (UsesSource) { - XSrc += DCSrc->w.DCOrgX; - YSrc += DCSrc->w.DCOrgY; + XSrc += DCSrc->ptlDCOrig.x; + YSrc += DCSrc->ptlDCOrig.y; }
DestRect.left = XDest; @@ -267,12 +251,19 @@
/* Determine surfaces to be used in the bitblt */ BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap); + if (!BitmapDest) + goto cleanup; + if (UsesSource) { if (DCSrc->w.hBitmap == DCDest->w.hBitmap) BitmapSrc = BitmapDest; else + { BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap); + if (!BitmapSrc) + goto cleanup; + } } else { @@ -284,21 +275,8 @@ BrushObj = BRUSHOBJ_LockBrush(Dc_Attr->hbrush); if (NULL == BrushObj) { - if (UsesSource && hDCSrc != hDCDest) - { - DC_UnlockDc(DCSrc); - } - if(BitmapDest != NULL) - { - BITMAPOBJ_UnlockBitmap(BitmapDest); - } - if(BitmapSrc != NULL && BitmapSrc != BitmapDest) - { - BITMAPOBJ_UnlockBitmap(BitmapSrc); - } - DC_UnlockDc(DCDest); SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; + goto cleanup; } BrushOrigin = *((PPOINTL)&BrushObj->ptOrigin); IntGdiInitBrushInstance(&BrushInst, BrushObj, DCDest->XlateBrush); @@ -311,65 +289,25 @@ /* Create the XLATEOBJ. */ if (UsesSource) { - if (DCDest->DcLevel.hpal != 0) - DestPalette = DCDest->DcLevel.hpal; - - if (DCSrc->DcLevel.hpal != 0) - SourcePalette = DCSrc->DcLevel.hpal; - - /* KB41464 details how to convert between mono and color */ - if (DCDest->w.bitsPerPixel == 1 && DCSrc->w.bitsPerPixel == 1) - { + XlateObj = IntCreateXlateForBlt(DCDest, DCSrc, BitmapDest, BitmapSrc); + + if (XlateObj == (XLATEOBJ*)-1) + { + DPRINT1("error!\n"); + SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); XlateObj = NULL; - } - else - { - Dc_Attr = DCSrc->pDc_Attr; - if (!Dc_Attr) Dc_Attr = &DCSrc->Dc_Attr; - if (DCDest->w.bitsPerPixel == 1) - { - XlateObj = IntEngCreateMonoXlate(0, DestPalette, SourcePalette, Dc_Attr->crBackgroundClr); - } - else if (DCSrc->w.bitsPerPixel == 1) - { - XlateObj = IntEngCreateSrcMonoXlate(DestPalette, Dc_Attr->crBackgroundClr, Dc_Attr->crForegroundClr); - } - else - { - XlateObj = IntEngCreateXlate(0, 0, DestPalette, SourcePalette); - } - if (NULL == XlateObj) - { - if (UsesSource && hDCSrc != hDCDest) - { - DC_UnlockDc(DCSrc); - } - DC_UnlockDc(DCDest); - if(BitmapDest != NULL) - { - BITMAPOBJ_UnlockBitmap(BitmapDest); - } - if(BitmapSrc != NULL && BitmapSrc != BitmapDest) - { - BITMAPOBJ_UnlockBitmap(BitmapSrc); - } - if(BrushObj != NULL) - { - BRUSHOBJ_UnlockBrush(BrushObj); - } - SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); - return FALSE; - } + goto cleanup; } }
/* Perform the bitblt operation */ - Status = IntEngBitBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj, NULL, + Status = IntEngBitBlt( BitmapDest ? &BitmapDest->SurfObj : NULL, BitmapSrc ? &BitmapSrc->SurfObj : NULL, NULL, DCDest->CombinedClip, XlateObj, &DestRect, &SourcePoint, NULL, BrushObj ? &BrushInst.BrushObject : NULL, &BrushOrigin, ROP3_TO_ROP4(ROP));
+cleanup: if (UsesSource && XlateObj != NULL) EngDeleteXlate(XlateObj);
@@ -410,8 +348,8 @@ { PDC DCDest, DCSrc; RECTL rcDest, rcSrc; - BITMAPOBJ *BitmapDest, *BitmapSrc; - XLATEOBJ *XlateObj; + BITMAPOBJ *BitmapDest, *BitmapSrc = NULL; + XLATEOBJ *XlateObj = NULL; HPALETTE SourcePalette = 0, DestPalette = 0; PPALGDI PalDestGDI, PalSourceGDI; USHORT PalDestMode, PalSrcMode; @@ -454,43 +392,51 @@ }
/* Offset positions */ - xDst += DCDest->w.DCOrgX; - yDst += DCDest->w.DCOrgY; - xSrc += DCSrc->w.DCOrgX; - ySrc += DCSrc->w.DCOrgY; - - if(DCDest->DcLevel.hpal) - DestPalette = DCDest->DcLevel.hpal; - - if(DCSrc->DcLevel.hpal) - SourcePalette = DCSrc->DcLevel.hpal; + xDst += DCDest->ptlDCOrig.x; + yDst += DCDest->ptlDCOrig.y; + xSrc += DCSrc->ptlDCOrig.x; + ySrc += DCSrc->ptlDCOrig.y; + + BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap); + if (!BitmapDest) + { + goto done; + } + + BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap); + if (!BitmapSrc) + { + goto done; + } + + DestPalette = BitmapDest->hDIBPalette; + if (!DestPalette) DestPalette = pPrimarySurface->DevInfo.hpalDefault; + + SourcePalette = BitmapSrc->hDIBPalette; + if (!SourcePalette) SourcePalette = pPrimarySurface->DevInfo.hpalDefault;
if(!(PalSourceGDI = PALETTE_LockPalette(SourcePalette))) { - DC_UnlockDc(DCSrc); - DC_UnlockDc(DCDest); SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } - if((DestPalette != SourcePalette) && !(PalDestGDI = PALETTE_LockPalette(DestPalette))) - { - PALETTE_UnlockPalette(PalSourceGDI); - DC_UnlockDc(DCSrc); - DC_UnlockDc(DCDest); - SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } + goto done; + } + PalSrcMode = PalSourceGDI->Mode; + PALETTE_UnlockPalette(PalSourceGDI); + if(DestPalette != SourcePalette) { + if (!(PalDestGDI = PALETTE_LockPalette(DestPalette))) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + goto done; + } PalDestMode = PalDestGDI->Mode; - PalSrcMode = PalSourceGDI->Mode; PALETTE_UnlockPalette(PalDestGDI); } else { - PalDestMode = PalSrcMode = PalSourceGDI->Mode; - } - PALETTE_UnlockPalette(PalSourceGDI); + PalDestMode = PalSrcMode; + }
/* Translate Transparent (RGB) Color to the source palette */ if((XlateObj = (XLATEOBJ*)IntEngCreateXlate(PalSrcMode, PAL_RGB, SourcePalette, NULL))) @@ -501,13 +447,6 @@
/* Create the XLATE object to convert colors between source and destination */ XlateObj = (XLATEOBJ*)IntEngCreateXlate(PalDestMode, PalSrcMode, DestPalette, SourcePalette); - - BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap); - /* FIXME - BitmapDest can be NULL!!!! Don't assert here! */ - ASSERT(BitmapDest); - BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap); - /* FIXME - BitmapSrc can be NULL!!!! Don't assert here! */ - ASSERT(BitmapSrc);
rcDest.left = xDst; rcDest.top = yDst; @@ -529,9 +468,15 @@ TransparentColor, 0);
done: - BITMAPOBJ_UnlockBitmap(BitmapDest); - BITMAPOBJ_UnlockBitmap(BitmapSrc); DC_UnlockDc(DCSrc); + if (BitmapDest) + { + BITMAPOBJ_UnlockBitmap(BitmapDest); + } + if (BitmapSrc) + { + BITMAPOBJ_UnlockBitmap(BitmapSrc); + } if(hdcDst != hdcSrc) { DC_UnlockDc(DCDest); @@ -791,14 +736,13 @@ { PDC DCDest = NULL; PDC DCSrc = NULL; - PDC_ATTR Dc_Attr = NULL; - BITMAPOBJ *BitmapDest, *BitmapSrc; + PDC_ATTR Dc_Attr; + BITMAPOBJ *BitmapDest, *BitmapSrc = NULL; RECTL DestRect; RECTL SourceRect; BOOL Status; XLATEOBJ *XlateObj = NULL; - HPALETTE SourcePalette = 0, DestPalette = 0; - PGDIBRUSHOBJ BrushObj; + PGDIBRUSHOBJ BrushObj = NULL; BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000); BOOL UsesPattern = ((ROP & 0xF00000) >> 4) != (ROP & 0x0F0000);
@@ -852,12 +796,13 @@ }
/* Offset the destination and source by the origin of their DCs. */ - XOriginDest += DCDest->w.DCOrgX; - YOriginDest += DCDest->w.DCOrgY; + // FIXME: ptlDCOrig is in device coordinates! + XOriginDest += DCDest->ptlDCOrig.x; + YOriginDest += DCDest->ptlDCOrig.y; if (UsesSource) { - XOriginSrc += DCSrc->w.DCOrgX; - YOriginSrc += DCSrc->w.DCOrgY; + XOriginSrc += DCSrc->ptlDCOrig.x; + YOriginSrc += DCSrc->ptlDCOrig.y; }
DestRect.left = XOriginDest; @@ -878,14 +823,7 @@ BitmapSrc = BitmapDest; else BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap); - } - else - { - BitmapSrc = NULL; - } - - if ( UsesSource ) - { + int sw = BitmapSrc->SurfObj.sizlBitmap.cx; int sh = BitmapSrc->SurfObj.sizlBitmap.cy; if ( SourceRect.left < 0 ) @@ -936,50 +874,36 @@ Status = FALSE; goto failed; } + + /* Create the XLATEOBJ. */ + XlateObj = IntCreateXlateForBlt(DCDest, DCSrc, BitmapDest, BitmapSrc); + if (XlateObj == (XLATEOBJ*)-1) + { + SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); + Status = FALSE; + goto failed; + } + } + else + { + BitmapSrc = NULL; }
if (UsesPattern) { - Dc_Attr = DCDest->pDc_Attr; - if (!Dc_Attr) Dc_Attr = &DCDest->Dc_Attr; + Dc_Attr = DCDest->pDc_Attr; + if (!Dc_Attr) Dc_Attr = &DCDest->Dc_Attr; BrushObj = BRUSHOBJ_LockBrush(Dc_Attr->hbrush); if (NULL == BrushObj) { - if (UsesSource && hDCSrc != hDCDest) - { - DC_UnlockDc(DCSrc); - } - DC_UnlockDc(DCDest); SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; + Status = FALSE; + goto failed; } } else { BrushObj = NULL; - } - - /* Create the XLATEOBJ. */ - if (UsesSource) - { - if (DCDest->DcLevel.hpal != 0) - DestPalette = DCDest->DcLevel.hpal; - - if (DCSrc->DcLevel.hpal != 0) - SourcePalette = DCSrc->DcLevel.hpal; - - /* FIXME: Use the same logic for create XLATEOBJ as in NtGdiBitBlt. */ - XlateObj = (XLATEOBJ*)IntEngCreateXlate(0, 0, DestPalette, SourcePalette); - if (NULL == XlateObj) - { - if (UsesSource && hDCSrc != hDCDest) - { - DC_UnlockDc(DCSrc); - } - DC_UnlockDc(DCDest); - SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); - return FALSE; - } }
/* Perform the bitblt operation */ @@ -988,18 +912,26 @@ &DestRect, &SourceRect, NULL, NULL, NULL, COLORONCOLOR);
- if (UsesSource) +failed: + if (XlateObj) + { EngDeleteXlate(XlateObj); - if (UsesPattern) + } + if (BrushObj) { BRUSHOBJ_UnlockBrush(BrushObj); } -failed: - if (UsesSource && DCSrc->w.hBitmap != DCDest->w.hBitmap) + if ( (BitmapSrc) && + (BitmapSrc != BitmapDest)) { BITMAPOBJ_UnlockBitmap(BitmapSrc); } - BITMAPOBJ_UnlockBitmap(BitmapDest); + + if (BitmapDest) + { + BITMAPOBJ_UnlockBitmap(BitmapDest); + } + if (UsesSource && hDCSrc != hDCDest) { DC_UnlockDc(DCSrc); @@ -1038,30 +970,30 @@ { if (Width > 0) { - DestRect.left = XLeft + dc->w.DCOrgX; - DestRect.right = XLeft + Width + dc->w.DCOrgX; + DestRect.left = XLeft + dc->ptlDCOrig.x; + DestRect.right = XLeft + Width + dc->ptlDCOrig.x; } else { - DestRect.left = XLeft + Width + 1 + dc->w.DCOrgX; - DestRect.right = XLeft + dc->w.DCOrgX + 1; + DestRect.left = XLeft + Width + 1 + dc->ptlDCOrig.x; + DestRect.right = XLeft + dc->ptlDCOrig.x + 1; }
if (Height > 0) { - DestRect.top = YLeft + dc->w.DCOrgY; - DestRect.bottom = YLeft + Height + dc->w.DCOrgY; + DestRect.top = YLeft + dc->ptlDCOrig.y; + DestRect.bottom = YLeft + Height + dc->ptlDCOrig.y; } else { - DestRect.top = YLeft + Height + dc->w.DCOrgY + 1; - DestRect.bottom = YLeft + dc->w.DCOrgY + 1; + DestRect.top = YLeft + Height + dc->ptlDCOrig.y + 1; + DestRect.bottom = YLeft + dc->ptlDCOrig.y + 1; }
IntLPtoDP(dc, (LPPOINT)&DestRect, 2);
- BrushOrigin.x = BrushObj->ptOrigin.x + dc->w.DCOrgX; - BrushOrigin.y = BrushObj->ptOrigin.y + dc->w.DCOrgY; + BrushOrigin.x = BrushObj->ptOrigin.x + dc->ptlDCOrig.x; + BrushOrigin.y = BrushObj->ptOrigin.y + dc->ptlDCOrig.y;
IntGdiInitBrushInstance(&BrushInst, BrushObj, dc->XlateBrush);
@@ -1074,7 +1006,7 @@ &DestRect, NULL, NULL, - &BrushInst.BrushObject, + &BrushInst.BrushObject, // use pDC->eboFill &BrushOrigin, ROP3_TO_ROP4(ROP)); } @@ -1144,10 +1076,18 @@ DWORD ROP) { PGDIBRUSHOBJ BrushObj; - DC *dc = DC_LockDc(hDC); + DC *dc; PDC_ATTR Dc_Attr; BOOL ret;
+ BOOL UsesSource = ROP3_USES_SOURCE(ROP); + if (UsesSource) + { + /* in this case we call on GdiMaskBlt */ + return NtGdiMaskBlt(hDC, XLeft, YLeft, Width, Height, 0,0,0,0,0,0,ROP,0); + } + + dc = DC_LockDc(hDC); if (dc == NULL) { SetLastWin32Error(ERROR_INVALID_HANDLE);
Modified: branches/win32k-gdi-dx/subsystems/win32/win32k/objects/dibobj.c URL: http://svn.reactos.org/svn/reactos/branches/win32k-gdi-dx/subsystems/win32/w... ============================================================================== --- branches/win32k-gdi-dx/subsystems/win32/win32k/objects/dibobj.c [iso-8859-1] (original) +++ branches/win32k-gdi-dx/subsystems/win32/win32k/objects/dibobj.c [iso-8859-1] Sat Jun 7 09:34:25 2008 @@ -372,8 +372,14 @@
rcDest.left = XDest; rcDest.top = YDest; - rcDest.right = XDest + Width; - rcDest.bottom = YDest + Height; + if (bTransformCoordinates) + { + CoordLPtoDP(pDC, (LPPOINT)&rcDest); + } + rcDest.left += pDC->ptlDCOrig.x; + rcDest.top += pDC->ptlDCOrig.y; + rcDest.right = rcDest.left + Width; + rcDest.bottom = rcDest.top + Height; ptSource.x = XSrc; ptSource.y = YSrc;
@@ -758,7 +764,7 @@ INT APIENTRY NtGdiStretchDIBitsInternal( - HDC hDC, + HDC hdc, INT XDest, INT YDest, INT DestWidth, @@ -779,6 +785,7 @@ HDC hdcMem; HPALETTE hPal = NULL; PDC pDC; + HDC hDC = hdc;
if (!Bits || !BitsInfo) { @@ -786,15 +793,33 @@ return 0; }
+ /* if hdc is null we get it, for NtGdiCreateCompatibleDC can not handle NULL hdc */ + if (hDC == NULL) + { + DPRINT1("hdc is NULL we using GetDC(NULL) hdc\n"); + hDC = NtUserGetDC(NULL); + } + hdcMem = NtGdiCreateCompatibleDC(hDC); + if (hdcMem == NULL) + { + DPRINT1("Waring : NtGdiCreateCompatibleDC fails \n"); + } + hBitmap = NtGdiCreateCompatibleBitmap(hDC, BitsInfo->bmiHeader.biWidth, BitsInfo->bmiHeader.biHeight); + + if (hBitmap == NULL) + { + DPRINT1("Waring : NtGdiCreateCompatibleBitmap fails \n"); + } + hOldBitmap = NtGdiSelectBitmap(hdcMem, hBitmap);
if(Usage == DIB_PAL_COLORS) { hPal = NtGdiGetDCObject(hDC, GDI_OBJECT_TYPE_PALETTE); - hPal = NtUserSelectPalette(hdcMem, hPal, FALSE); + hPal = GdiSelectPalette(hdcMem, hPal, FALSE); }
if (BitsInfo->bmiHeader.biCompression == BI_RLE4 || @@ -811,12 +836,18 @@ }
pDC = DC_LockDc(hdcMem); - - IntSetDIBits(pDC, hBitmap, 0, BitsInfo->bmiHeader.biHeight, Bits, + if (pDC != NULL) + { + /* Note BitsInfo->bmiHeader.biHeight is the number of scanline, + * if it negitve we getting to many scanline for scanline is UINT not + * a INT, so we need make the negtive value to positve and that make the + * count correct for negtive bitmap, TODO : we need testcase for this api */ + + IntSetDIBits(pDC, hBitmap, 0, abs(BitsInfo->bmiHeader.biHeight), Bits, BitsInfo, Usage);
- DC_UnlockDc(pDC); - + DC_UnlockDc(pDC); + }
/* Origin for DIBitmap may be bottom left (positive biHeight) or top left (negative biHeight) */ @@ -830,11 +861,18 @@ SrcWidth, SrcHeight, ROP, 0);
if(hPal) - NtUserSelectPalette(hdcMem, hPal, FALSE); + GdiSelectPalette(hdcMem, hPal, FALSE);
NtGdiSelectBitmap(hdcMem, hOldBitmap); - NtGdiDeleteObjectApp(hdcMem); - NtGdiDeleteObject(hBitmap); + + if (hdcMem) + NtGdiDeleteObjectApp(hdcMem); + + if (hBitmap) + NtGdiDeleteObject(hBitmap); + + if (hdc == NULL) + UserReleaseDC(NULL, hDC, FALSE);
return SrcHeight; } @@ -993,6 +1031,8 @@ HBITMAP hbitmap = 0; 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: branches/win32k-gdi-dx/subsystems/win32/win32k/objects/fillshap.c URL: http://svn.reactos.org/svn/reactos/branches/win32k-gdi-dx/subsystems/win32/w... ============================================================================== --- branches/win32k-gdi-dx/subsystems/win32/win32k/objects/fillshap.c [iso-8859-1] (original) +++ branches/win32k-gdi-dx/subsystems/win32/win32k/objects/fillshap.c [iso-8859-1] Sat Jun 7 09:34:25 2008 @@ -73,8 +73,8 @@ IntLPtoDP(dc, UnsafePoints, Count); for (CurrentPoint = 0; CurrentPoint < Count; CurrentPoint++) { - UnsafePoints[CurrentPoint].x += dc->w.DCOrgX; - UnsafePoints[CurrentPoint].y += dc->w.DCOrgY; + UnsafePoints[CurrentPoint].x += dc->ptlDCOrig.x; + UnsafePoints[CurrentPoint].y += dc->ptlDCOrig.y; }
if (PATH_IsPathOpen(dc->w.path)) @@ -157,7 +157,8 @@ LPINT PolyCounts, int Count) { - while (--Count >=0) + /* crash in POLYGONFILL_MakeEdgeList if we process point 0 */ + while (--Count >=1) { if (!IntGdiPolygon ( dc, Points, *PolyCounts )) return FALSE; @@ -273,10 +274,10 @@
IntLPtoDP(dc, (LPPOINT)&RectBounds, 2);
- RectBounds.left += dc->w.DCOrgX; - RectBounds.right += dc->w.DCOrgX; - RectBounds.top += dc->w.DCOrgY; - RectBounds.bottom += dc->w.DCOrgY; + RectBounds.left += dc->ptlDCOrig.x; + RectBounds.right += dc->ptlDCOrig.x; + RectBounds.top += dc->ptlDCOrig.y; + RectBounds.bottom += dc->ptlDCOrig.y;
RadiusX = max((RectBounds.right - RectBounds.left) >> 1, 1); RadiusY = max((RectBounds.bottom - RectBounds.top) >> 1, 1); @@ -683,14 +684,14 @@ return FALSE; }
- Left += dc->w.DCOrgX; - Right += dc->w.DCOrgX; - Top += dc->w.DCOrgY; - Bottom += dc->w.DCOrgY; - XRadialStart += dc->w.DCOrgX; - YRadialStart += dc->w.DCOrgY; - XRadialEnd += dc->w.DCOrgX; - YRadialEnd += dc->w.DCOrgY; + Left += dc->ptlDCOrig.x; + Right += dc->ptlDCOrig.x; + Top += dc->ptlDCOrig.y; + Bottom += dc->ptlDCOrig.y; + XRadialStart += dc->ptlDCOrig.x; + YRadialStart += dc->ptlDCOrig.y; + XRadialEnd += dc->ptlDCOrig.x; + YRadialEnd += dc->ptlDCOrig.y;
RectBounds.left = Left; RectBounds.right = Right; @@ -1047,10 +1048,10 @@ } else { - LeftRect += dc->w.DCOrgX; - RightRect += dc->w.DCOrgX - 1; - TopRect += dc->w.DCOrgY; - BottomRect += dc->w.DCOrgY - 1; + LeftRect += dc->ptlDCOrig.x; + RightRect += dc->ptlDCOrig.x - 1; + TopRect += dc->ptlDCOrig.y; + BottomRect += dc->ptlDCOrig.y - 1;
DestRect.left = LeftRect; DestRect.right = RightRect; @@ -1207,10 +1208,10 @@ xradius = xCurveDiameter >> 1; yradius = yCurveDiameter >> 1;
- left += dc->w.DCOrgX; - right += dc->w.DCOrgX; - top += dc->w.DCOrgY; - bottom += dc->w.DCOrgY; + left += dc->ptlDCOrig.x; + right += dc->ptlDCOrig.x; + top += dc->ptlDCOrig.y; + bottom += dc->ptlDCOrig.y;
RectBounds.left = left; RectBounds.right = right; @@ -1492,6 +1493,7 @@ POINTL DitherOrg; ULONG Mode, i; BOOL Ret; + HPALETTE hDestPalette;
ASSERT(dc); ASSERT(pVertex); @@ -1539,8 +1541,8 @@ Extent.bottom = max(Extent.bottom, (pVertex + i)->y); }
- DitherOrg.x = dc->w.DCOrgX; - DitherOrg.y = dc->w.DCOrgY; + DitherOrg.x = dc->ptlDCOrig.x; + DitherOrg.y = dc->ptlDCOrig.y; Extent.left += DitherOrg.x; Extent.right += DitherOrg.x; Extent.top += DitherOrg.y; @@ -1550,13 +1552,19 @@ /* FIXME - BitmapObj can be NULL!!! Don't assert but handle this case gracefully! */ ASSERT(BitmapObj);
- PalDestGDI = PALETTE_LockPalette(dc->DcLevel.hpal); - /* FIXME - PalDestGDI can be NULL!!! Don't assert but handle this case gracefully! */ - ASSERT(PalDestGDI); - Mode = PalDestGDI->Mode; - PALETTE_UnlockPalette(PalDestGDI); - - XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, dc->DcLevel.hpal, NULL); + hDestPalette = BitmapObj->hDIBPalette; + if (!hDestPalette) hDestPalette = pPrimarySurface->DevInfo.hpalDefault; + + PalDestGDI = PALETTE_LockPalette(hDestPalette); + if (PalDestGDI) + { + Mode = PalDestGDI->Mode; + PALETTE_UnlockPalette(PalDestGDI); + } + else + Mode = PAL_RGB; + + XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, hDestPalette, NULL); ASSERT(XlateObj);
Ret = IntEngGradientFill(&BitmapObj->SurfObj,
Modified: branches/win32k-gdi-dx/subsystems/win32/win32k/objects/polyfill.c URL: http://svn.reactos.org/svn/reactos/branches/win32k-gdi-dx/subsystems/win32/w... ============================================================================== --- branches/win32k-gdi-dx/subsystems/win32/win32k/objects/polyfill.c [iso-8859-1] (original) +++ branches/win32k-gdi-dx/subsystems/win32/win32k/objects/polyfill.c [iso-8859-1] Sat Jun 7 09:34:25 2008 @@ -281,6 +281,7 @@ else list->Edges[list->Count++] = e; } + /* notes pionts does not come with paris from IntGdiPolyPolygon */ e = POLYGONFILL_MakeEdge ( Points[CurPt-1], Points[0] ); if ( !e ) goto fail;