diff --git a/reactos/win32ss/gdi/ntgdi/arc.c b/reactos/win32ss/gdi/ntgdi/arc.c index b332a90b4bf..0b6f421fbf8 100644 --- a/reactos/win32ss/gdi/ntgdi/arc.c +++ b/reactos/win32ss/gdi/ntgdi/arc.c @@ -316,6 +316,7 @@ NtGdiAngleArc( DC *pDC; BOOL Ret = FALSE; gxf_long worker, worker1; + KFLOATING_SAVE FloatSave; pDC = DC_LockDc (hDC); if(!pDC) @@ -329,6 +330,9 @@ NtGdiAngleArc( /* Yes, Windows really returns TRUE in this case */ return TRUE; } + + KeSaveFloatingPointState(&FloatSave); + worker.l = dwStartAngle; worker1.l = dwSweepAngle; DC_vPrepareDCsForBlit(pDC, pDC->rosdc.CombinedClip->rclBounds, @@ -340,6 +344,9 @@ NtGdiAngleArc( Ret = IntGdiAngleArc( pDC, x, y, dwRadius, worker.f, worker1.f); DC_vFinishBlit(pDC, NULL); DC_UnlockDc( pDC ); + + KeRestoreFloatingPointState(&FloatSave); + return Ret; } @@ -359,6 +366,7 @@ NtGdiArcInternal( { DC *dc; BOOL Ret; + KFLOATING_SAVE FloatSave; dc = DC_LockDc (hDC); if(!dc) @@ -382,6 +390,8 @@ NtGdiArcInternal( if (dc->pdcattr->ulDirty_ & (DIRTY_LINE | DC_PEN_DIRTY)) DC_vUpdateLineBrush(dc); + KeSaveFloatingPointState(&FloatSave); + Ret = IntGdiArcInternal( arctype, dc, @@ -394,6 +404,7 @@ NtGdiArcInternal( XEndArc, YEndArc); + KeRestoreFloatingPointState(&FloatSave); DC_vFinishBlit(dc, NULL); DC_UnlockDc( dc ); return Ret; diff --git a/reactos/win32ss/gdi/ntgdi/fillshap.c b/reactos/win32ss/gdi/ntgdi/fillshap.c index b3356a2e825..77e22f7efd7 100644 --- a/reactos/win32ss/gdi/ntgdi/fillshap.c +++ b/reactos/win32ss/gdi/ntgdi/fillshap.c @@ -306,6 +306,9 @@ NtGdiEllipse( //tmpFillBrushObj.ptOrigin.y += RectBounds.top - Top; tmpFillBrushObj.ptOrigin.x += dc->ptlDCOrig.x; tmpFillBrushObj.ptOrigin.y += dc->ptlDCOrig.y; + + DC_vPrepareDCsForBlit(dc, RectBounds, NULL, RectBounds); + ret = IntFillEllipse( dc, CenterX - RadiusX, CenterY - RadiusY, @@ -313,15 +316,19 @@ NtGdiEllipse( RadiusY*2, // Height &tmpFillBrushObj); BRUSH_ShareUnlockBrush(pFillBrushObj); - } - if (ret) - ret = IntDrawEllipse( dc, - CenterX - RadiusX, - CenterY - RadiusY, - RadiusX*2, // Width - RadiusY*2, // Height - pbrush); + if (ret) + { + ret = IntDrawEllipse( dc, + CenterX - RadiusX, + CenterY - RadiusY, + RadiusX*2, // Width + RadiusY*2, // Height + pbrush); + } + + DC_vFinishBlit(dc, NULL); + } pbrush->ptPenWidth.x = PenOrigWidth; PEN_ShareUnlockPen(pbrush); @@ -788,6 +795,9 @@ IntRoundRect( } else { + + DC_vPrepareDCsForBlit(dc, RectBounds, NULL, RectBounds); + RtlCopyMemory(&brushTemp, pbrFill, sizeof(brushTemp)); brushTemp.ptOrigin.x += RectBounds.left - Left; brushTemp.ptOrigin.y += RectBounds.top - Top; @@ -800,17 +810,22 @@ IntRoundRect( yCurveDiameter, &brushTemp); BRUSH_ShareUnlockBrush(pbrFill); + + if (ret) + { + ret = IntDrawRoundRect( dc, + RectBounds.left, + RectBounds.top, + RectBounds.right, + RectBounds.bottom, + xCurveDiameter, + yCurveDiameter, + pbrLine); + } + + DC_vFinishBlit(dc, NULL); } - if (ret) - ret = IntDrawRoundRect( dc, - RectBounds.left, - RectBounds.top, - RectBounds.right, - RectBounds.bottom, - xCurveDiameter, - yCurveDiameter, - pbrLine); pbrLine->ptPenWidth.x = PenOrigWidth; PEN_ShareUnlockPen(pbrLine); @@ -1094,6 +1109,8 @@ NtGdiExtFloodFill( else goto cleanup; + DC_vPrepareDCsForBlit(dc, DestRect, NULL, DestRect); + psurf = dc->dclevel.pSurface; if (!psurf) { @@ -1113,6 +1130,7 @@ NtGdiExtFloodFill( EXLATEOBJ_vCleanup(&exlo); cleanup: + DC_vFinishBlit(dc, NULL); DC_UnlockDc(dc); return Ret; }