*/
#define PUTPIXEL(x,y,BrushInst) \
ret = ret && IntEngLineTo(&psurf->SurfObj, \
- dc->rosdc.CombinedClip, \
+ &dc->co.ClipObj, \
&BrushInst.BrushObject, \
x, y, (x)+1, y, \
&RectBounds, \
#define PUTLINE(x1,y1,x2,y2,BrushInst) \
ret = ret && IntEngLineTo(&psurf->SurfObj, \
- dc->rosdc.CombinedClip, \
+ &dc->co.ClipObj, \
&BrushInst.BrushObject, \
x1, y1, x2, y2, \
&RectBounds, \
ROP2_TO_MIX(pdcattr->jROP2));
-#define Rsin(d) ((d) == 0.0 ? 0.0 : ((d) == 90.0 ? 1.0 : sin(d*M_PI/180.0)))
-#define Rcos(d) ((d) == 0.0 ? 1.0 : ((d) == 90.0 ? 0.0 : cos(d*M_PI/180.0)))
-
static
BOOL
FASTCALL
BOOL ret = TRUE;
LONG PenWidth, PenOrigWidth;
double AngleStart, AngleEnd;
- LONG RadiusX, RadiusY, CenterX, CenterY;
- LONG SfCx, SfCy, EfCx, EfCy;
+ LONG CenterX, CenterY;
if (Right < Left)
{
return FALSE;
}
- PenOrigWidth = PenWidth = pbrPen->ptPenWidth.x;
+ PenOrigWidth = PenWidth = pbrPen->lWidth;
if (pbrPen->ulPenStyle == PS_NULL) PenWidth = 0;
if (pbrPen->ulPenStyle == PS_INSIDEFRAME)
}
if (!PenWidth) PenWidth = 1;
- pbrPen->ptPenWidth.x = PenWidth;
+ pbrPen->lWidth = PenWidth;
RectBounds.left = Left;
RectBounds.right = Right;
DPRINT("1: Left: %d, Top: %d, Right: %d, Bottom: %d\n",
RectBounds.left,RectBounds.top,RectBounds.right,RectBounds.bottom);
- RadiusX = max((RectBounds.right - RectBounds.left) / 2, 1);
- RadiusY = max((RectBounds.bottom - RectBounds.top) / 2, 1);
CenterX = (RectBounds.right + RectBounds.left) / 2;
CenterY = (RectBounds.bottom + RectBounds.top) / 2;
AngleEnd = atan2((RectSEpts.bottom - CenterY), RectSEpts.right - CenterX)*(360.0/(M_PI*2));
AngleStart = atan2((RectSEpts.top - CenterY), RectSEpts.left - CenterX)*(360.0/(M_PI*2));
- SfCx = (LONG)(Rcos(AngleStart) * RadiusX);
- SfCy = (LONG)(Rsin(AngleStart) * RadiusY);
- EfCx = (LONG)(Rcos(AngleEnd) * RadiusX);
- EfCy = (LONG)(Rsin(AngleEnd) * RadiusY);
+ /* Edge Case: Check if the start segments overlaps(is equal) the end segment */
+ if (AngleEnd == AngleStart)
+ {
+ AngleStart = AngleEnd + 360.0; // Arc(), ArcTo(), Pie() and Chord() are counterclockwise APIs.
+ }
if ((arctype == GdiTypePie) || (arctype == GdiTypeChord))
{
if (arctype == GdiTypePie)
{
- PUTLINE(CenterX, CenterY, SfCx + CenterX, SfCy + CenterY, dc->eboLine);
- PUTLINE(EfCx + CenterX, EfCy + CenterY, CenterX, CenterY, dc->eboLine);
+ PUTLINE(CenterX, CenterY, RectSEpts.left, RectSEpts.top, dc->eboLine);
+ PUTLINE(RectSEpts.right, RectSEpts.bottom, CenterX, CenterY, dc->eboLine);
}
if (arctype == GdiTypeChord)
- PUTLINE(EfCx + CenterX, EfCy + CenterY, SfCx + CenterX, SfCy + CenterY, dc->eboLine);
+ PUTLINE(RectSEpts.right, RectSEpts.bottom, RectSEpts.left, RectSEpts.top, dc->eboLine);
- pbrPen->ptPenWidth.x = PenOrigWidth;
+ pbrPen->lWidth = PenOrigWidth;
PEN_ShareUnlockPen(pbrPen);
DPRINT("IntArc Exit.\n");
return ret;
DC *pDC;
BOOL Ret = FALSE;
gxf_long worker, worker1;
+ KFLOATING_SAVE FloatSave;
+ NTSTATUS status;
pDC = DC_LockDc (hDC);
if(!pDC)
/* Yes, Windows really returns TRUE in this case */
return TRUE;
}
+
+ status = KeSaveFloatingPointState(&FloatSave);
+ if (!NT_SUCCESS(status))
+ {
+ DC_UnlockDc( pDC );
+ return FALSE;
+ }
+
worker.l = dwStartAngle;
worker1.l = dwSweepAngle;
- DC_vPrepareDCsForBlit(pDC, pDC->rosdc.CombinedClip->rclBounds,
- NULL, pDC->rosdc.CombinedClip->rclBounds);
+ DC_vPrepareDCsForBlit(pDC, NULL, NULL, NULL);
if (pDC->pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY))
DC_vUpdateFillBrush(pDC);
if (pDC->pdcattr->ulDirty_ & (DIRTY_LINE | DC_PEN_DIRTY))
Ret = IntGdiAngleArc( pDC, x, y, dwRadius, worker.f, worker1.f);
DC_vFinishBlit(pDC, NULL);
DC_UnlockDc( pDC );
+
+ KeRestoreFloatingPointState(&FloatSave);
+
return Ret;
}
{
DC *dc;
BOOL Ret;
+ KFLOATING_SAVE FloatSave;
+ NTSTATUS status;
dc = DC_LockDc (hDC);
if(!dc)
return TRUE;
}
- DC_vPrepareDCsForBlit(dc, dc->rosdc.CombinedClip->rclBounds,
- NULL, dc->rosdc.CombinedClip->rclBounds);
+ DC_vPrepareDCsForBlit(dc, NULL, NULL, NULL);
if (dc->pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY))
DC_vUpdateFillBrush(dc);
if (dc->pdcattr->ulDirty_ & (DIRTY_LINE | DC_PEN_DIRTY))
DC_vUpdateLineBrush(dc);
+ status = KeSaveFloatingPointState(&FloatSave);
+ if (!NT_SUCCESS(status))
+ {
+ DC_UnlockDc( dc );
+ return FALSE;
+ }
+
Ret = IntGdiArcInternal(
arctype,
dc,
XEndArc,
YEndArc);
+ KeRestoreFloatingPointState(&FloatSave);
DC_vFinishBlit(dc, NULL);
DC_UnlockDc( dc );
return Ret;