Module: wine Branch: master Commit: 9e88347f4533a67df0b9cb119314b7cf5a8d4a8b URL: http://source.winehq.org/git/wine.git/?a=commit;h=9e88347f4533a67df0b9cb1193...
Author: Evan Stade estade@gmail.com Date: Fri Jul 13 17:51:49 2007 -0700
gdiplus: Simplified GdipDrawPath by moving more of the code to the helpers.
---
dlls/gdiplus/graphics.c | 102 ++++++++++++++++++++++------------------------- 1 files changed, 48 insertions(+), 54 deletions(-)
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 5bfd79a..d28d76a 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -466,52 +466,60 @@ static GpStatus draw_poly(HDC hdc, GpPen *pen, GDIPCONST GpPointF * pt, ERR("Bad bezier points\n"); goto end; } - i += 2; } }
- if((types[count - 1] & PathPointTypePathTypeMask) == PathPointTypeBezier){ - ptf = GdipAlloc(4 * sizeof(GpPointF)); - memcpy(ptf, &pt[count-4], 4 * sizeof(GpPointF)); + for(i = 0; i < count; i++){ + pti[i].x = roundr(pt[i].X); + pti[i].y = roundr(pt[i].Y); + }
- if(caps){ - if(pen->endcap == LineCapArrowAnchor) - shorten_bezier_amt(ptf, pen->width); + /* If we are drawing caps, go through the points and adjust them accordingly, + * and draw the caps. */ + if(caps){ + switch(types[count - 1] & PathPointTypePathTypeMask){ + case PathPointTypeBezier: + ptf = GdipAlloc(4 * sizeof(GpPointF)); + if(!ptf){ + status = OutOfMemory; + goto end; + } + memcpy(ptf, &pt[count - 4], 4 * sizeof(GpPointF));
- draw_cap(hdc, pen->color, pen->endcap, pen->width, - pt[count - 1].X - (ptf[3].X - ptf[2].X), - pt[count - 1].Y - (ptf[3].Y - ptf[2].Y), - pt[count - 1].X, pt[count - 1].Y); - } - for(i = 0; i < 4; i ++){ - pti[i + count - 4].x = roundr(ptf[i].X); - pti[i + count - 4].y = roundr(ptf[i].Y); - } - for(i = 0; i < count - 4; i ++){ - pti[i].x = roundr(pt[i].X); - pti[i].y = roundr(pt[i].Y); - } - } - else if((types[count - 1] & PathPointTypePathTypeMask) == PathPointTypeLine){ - if(caps){ - if(pen->endcap == LineCapArrowAnchor) - shorten_line_amt(pt[count-2].X, pt[count-2].Y, &x, &y, pen->width); + if(pen->endcap == LineCapArrowAnchor) + shorten_bezier_amt(ptf, pen->width);
- draw_cap(hdc, pen->color, pen->endcap, pen->width, pt[count-2].X, - pt[count-2].Y, pt[count - 1].X, pt[count - 1].Y); - } - pti[count - 1].x = roundr(x); - pti[count - 1].y = roundr(y); - for(i = 0; i < count - 1; i ++){ - pti[i].x = roundr(pt[i].X); - pti[i].y = roundr(pt[i].Y); + + draw_cap(hdc, pen->color, pen->endcap, pen->width, + pt[count - 1].X - (ptf[3].X - ptf[2].X), + pt[count - 1].Y - (ptf[3].Y - ptf[2].Y), + pt[count - 1].X, pt[count - 1].Y); + + for(i = 0; i < 4; i++){ + pti[i + count - 4].x = roundr(ptf[i].X); + pti[i + count - 4].y = roundr(ptf[i].Y); + } + + break; + + case PathPointTypeLine: + if(pen->endcap == LineCapArrowAnchor) + shorten_line_amt(pt[count - 2].X, pt[count - 2].Y, &x, &y, + pen->width); + + draw_cap(hdc, pen->color, pen->endcap, pen->width, pt[count - 2].X, + pt[count - 2].Y, pt[count - 1].X, pt[count - 1].Y); + + pti[count - 1].x = roundr(x); + pti[count - 1].y = roundr(y); + + break; + default: + ERR("Bad path last point\n"); + goto end; } } - else{ - ERR("Bad path last point\n"); - goto end; - }
for(i = 0; i < count; i++){ tp[i] = convert_path_point_type(types[i]); @@ -729,7 +737,7 @@ GpStatus WINGDIPAPI GdipDrawLines(GpGraphics *graphics, GpPen *pen, GDIPCONST
GpStatus WINGDIPAPI GdipDrawPath(GpGraphics *graphics, GpPen *pen, GpPath *path) { - INT save_state, i, this_fig = 0; + INT save_state; GpStatus retval;
if(!pen || !graphics) @@ -739,23 +747,9 @@ GpStatus WINGDIPAPI GdipDrawPath(GpGraphics *graphics, GpPen *pen, GpPath *path) EndPath(graphics->hdc); SelectObject(graphics->hdc, pen->gdipen);
- for(i = 0; i < path->pathdata.Count; i++){ - if(path->pathdata.Types[i] == PathPointTypeStart){ - retval = draw_poly(graphics->hdc, pen, - &path->pathdata.Points[this_fig], - &path->pathdata.Types[this_fig], i - this_fig, TRUE); - this_fig = i; + retval = draw_poly(graphics->hdc, pen, path->pathdata.Points, + path->pathdata.Types, path->pathdata.Count, TRUE);
- if(retval != Ok) - goto end; - } - } - - retval = draw_poly(graphics->hdc, pen, &path->pathdata.Points[this_fig], - &path->pathdata.Types[this_fig], path->pathdata.Count - this_fig, - TRUE); - -end: RestoreDC(graphics->hdc, save_state);
return retval;