Dmitry Timoshkov : gdiplus: Reimplement GdipDrawPie using GdipDrawPath.
Alexandre Julliard
julliard at winehq.org
Tue Feb 19 13:33:03 CST 2013
Module: wine
Branch: master
Commit: 981223a7363738b2b90030e8e61d52aed186df85
URL: http://source.winehq.org/git/wine.git/?a=commit;h=981223a7363738b2b90030e8e61d52aed186df85
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Tue Feb 19 11:45:28 2013 +0800
gdiplus: Reimplement GdipDrawPie using GdipDrawPath.
---
dlls/gdiplus/graphics.c | 55 +++++++---------------------------------------
1 files changed, 9 insertions(+), 46 deletions(-)
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 7cf9e0e..201ef7b 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -51,18 +51,6 @@ static GpStatus draw_driver_string(GpGraphics *graphics, GDIPCONST UINT16 *text,
GDIPCONST GpBrush *brush, GDIPCONST PointF *positions,
INT flags, GDIPCONST GpMatrix *matrix);
-/* Converts angle (in degrees) to x/y coordinates */
-static void deg2xy(REAL angle, REAL x_0, REAL y_0, REAL *x, REAL *y)
-{
- REAL radAngle, hypotenuse;
-
- radAngle = deg2rad(angle);
- hypotenuse = 50.0; /* arbitrary */
-
- *x = x_0 + cos(radAngle) * hypotenuse;
- *y = y_0 + sin(radAngle) * hypotenuse;
-}
-
/* Converts from gdiplus path point type to gdi path point type. */
static BYTE convert_path_point_type(BYTE type)
{
@@ -1456,27 +1444,6 @@ static GpStatus brush_fill_pixels(GpGraphics *graphics, GpBrush *brush,
}
}
-/* GdipDrawPie/GdipFillPie helper function */
-static void draw_pie(GpGraphics *graphics, REAL x, REAL y, REAL width,
- REAL height, REAL startAngle, REAL sweepAngle)
-{
- GpPointF ptf[4];
- POINT pti[4];
-
- ptf[0].X = x;
- ptf[0].Y = y;
- ptf[1].X = x + width;
- ptf[1].Y = y + height;
-
- deg2xy(startAngle+sweepAngle, x + width / 2.0, y + width / 2.0, &ptf[2].X, &ptf[2].Y);
- deg2xy(startAngle, x + width / 2.0, y + width / 2.0, &ptf[3].X, &ptf[3].Y);
-
- transform_and_round_points(graphics, pti, ptf, 4);
-
- Pie(graphics->hdc, pti[0].x, pti[0].y, pti[1].x, pti[1].y, pti[2].x,
- pti[2].y, pti[3].x, pti[3].y);
-}
-
/* Draws the linecap the specified color and size on the hdc. The linecap is in
* direction of the line from x1, y1 to x2, y2 and is anchored on x2, y2. Probably
* should not be called on an hdc that has a path you care about. */
@@ -3396,7 +3363,8 @@ GpStatus WINGDIPAPI GdipDrawPath(GpGraphics *graphics, GpPen *pen, GpPath *path)
GpStatus WINGDIPAPI GdipDrawPie(GpGraphics *graphics, GpPen *pen, REAL x,
REAL y, REAL width, REAL height, REAL startAngle, REAL sweepAngle)
{
- INT save_state;
+ GpStatus status;
+ GpPath *path;
TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f)\n", graphics, pen, x, y,
width, height, startAngle, sweepAngle);
@@ -3407,20 +3375,15 @@ GpStatus WINGDIPAPI GdipDrawPie(GpGraphics *graphics, GpPen *pen, REAL x,
if(graphics->busy)
return ObjectBusy;
- if (!graphics->hdc)
- {
- FIXME("graphics object has no HDC\n");
- return Ok;
- }
-
- save_state = prepare_dc(graphics, pen);
- SelectObject(graphics->hdc, GetStockObject(NULL_BRUSH));
-
- draw_pie(graphics, x, y, width, height, startAngle, sweepAngle);
+ status = GdipCreatePath(FillModeAlternate, &path);
+ if (status != Ok) return status;
- restore_dc(graphics, save_state);
+ status = GdipAddPathPie(path, x, y, width, height, startAngle, sweepAngle);
+ if (status == Ok)
+ status = GdipDrawPath(graphics, pen, path);
- return Ok;
+ GdipDeletePath(path);
+ return status;
}
GpStatus WINGDIPAPI GdipDrawPieI(GpGraphics *graphics, GpPen *pen, INT x,
More information about the wine-cvs
mailing list