Evan Stade : gdiplus: Use custom cap base inset differently.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Aug 3 08:04:52 CDT 2007


Module: wine
Branch: master
Commit: 7f0aa3af7c945a8e538e12eca2b631a44c9c3d06
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7f0aa3af7c945a8e538e12eca2b631a44c9c3d06

Author: Evan Stade <estade at gmail.com>
Date:   Thu Aug  2 17:53:08 2007 -0700

gdiplus: Use custom cap base inset differently.

---

 dlls/gdiplus/graphics.c |   57 ++++++++++------------------------------------
 1 files changed, 13 insertions(+), 44 deletions(-)

diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 439dedd..ab19fa7 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -574,9 +574,8 @@ static void shorten_bezier_amt(GpPointF * pt, REAL amt, BOOL rev)
 static GpStatus draw_polybezier(GpGraphics *graphics, GpPen *pen,
     GDIPCONST GpPointF * pt, INT count, BOOL caps)
 {
-    POINT *pti, curpos;
+    POINT *pti;
     GpPointF *ptcopy;
-    REAL x, y;
     GpStatus status = GenericError;
 
     if(!count)
@@ -595,30 +594,14 @@ static GpStatus draw_polybezier(GpGraphics *graphics, GpPen *pen,
     if(caps){
         if(pen->endcap == LineCapArrowAnchor)
             shorten_bezier_amt(&ptcopy[count-4], pen->width, FALSE);
-        /* FIXME The following is seemingly correct only for baseinset < 0 or
-         * baseinset > ~3. With smaller baseinsets, windows actually
-         * lengthens the bezier line instead of shortening it. */
-        else if((pen->endcap == LineCapCustom) && pen->customend){
-            x = pt[count - 1].X;
-            y = pt[count - 1].Y;
-            shorten_line_amt(pt[count - 2].X, pt[count - 2].Y, &x, &y,
-                             pen->width * pen->customend->inset);
-            MoveToEx(graphics->hdc, roundr(pt[count - 1].X), roundr(pt[count - 1].Y), &curpos);
-            LineTo(graphics->hdc, roundr(x), roundr(y));
-            MoveToEx(graphics->hdc, curpos.x, curpos.y, NULL);
-        }
+        else if((pen->endcap == LineCapCustom) && pen->customend)
+            shorten_bezier_amt(&ptcopy[count-4], pen->width * pen->customend->inset,
+                               FALSE);
 
         if(pen->startcap == LineCapArrowAnchor)
             shorten_bezier_amt(ptcopy, pen->width, TRUE);
-        else if((pen->startcap == LineCapCustom) && pen->customstart){
-            x = ptcopy[0].X;
-            y = ptcopy[0].Y;
-            shorten_line_amt(ptcopy[1].X, ptcopy[1].Y, &x, &y,
-                             pen->width * pen->customend->inset);
-            MoveToEx(graphics->hdc, roundr(pt[0].X), roundr(pt[0].Y), &curpos);
-            LineTo(graphics->hdc, roundr(x), roundr(y));
-            MoveToEx(graphics->hdc, curpos.x, curpos.y, NULL);
-        }
+        else if((pen->startcap == LineCapCustom) && pen->customstart)
+            shorten_bezier_amt(ptcopy, pen->width * pen->customend->inset, TRUE);
 
         /* the direction of the line cap is parallel to the direction at the
          * end of the bezier (which, if it has been shortened, is not the same
@@ -650,10 +633,9 @@ end:
 static GpStatus draw_poly(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF * pt,
     GDIPCONST BYTE * types, INT count, BOOL caps)
 {
-    POINT *pti = GdipAlloc(count * sizeof(POINT)), curpos;
+    POINT *pti = GdipAlloc(count * sizeof(POINT));
     BYTE *tp = GdipAlloc(count);
     GpPointF *ptcopy = GdipAlloc(count * sizeof(GpPointF));
-    REAL x = pt[count - 1].X, y = pt[count - 1].Y;
     INT i, j;
     GpStatus status = GenericError;
 
@@ -686,16 +668,9 @@ static GpStatus draw_poly(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *
             case PathPointTypeBezier:
                 if(pen->endcap == LineCapArrowAnchor)
                     shorten_bezier_amt(&ptcopy[count - 4], pen->width, FALSE);
-                else if((pen->endcap == LineCapCustom) && pen->customend){
-                    x = pt[count - 1].X;
-                    y = pt[count - 1].Y;
-                    shorten_line_amt(pt[count - 2].X, pt[count - 2].Y, &x, &y,
-                                     pen->width * pen->customend->inset);
-                    MoveToEx(graphics->hdc, roundr(pt[count - 1].X),
-                             roundr(pt[count - 1].Y), &curpos);
-                    LineTo(graphics->hdc, roundr(x), roundr(y));
-                    MoveToEx(graphics->hdc, curpos.x, curpos.y, NULL);
-                }
+                else if((pen->endcap == LineCapCustom) && pen->customend)
+                    shorten_bezier_amt(&ptcopy[count - 4],
+                                       pen->width * pen->customend->inset, FALSE);
 
                 draw_cap(graphics, pen->brush->lb.lbColor, pen->endcap, pen->width, pen->customend,
                     pt[count - 1].X - (ptcopy[count - 1].X - ptcopy[count - 2].X),
@@ -731,15 +706,9 @@ static GpStatus draw_poly(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *
             case PathPointTypeBezier:
                 if(pen->startcap == LineCapArrowAnchor)
                     shorten_bezier_amt(&ptcopy[j - 1], pen->width, TRUE);
-                else if((pen->startcap == LineCapCustom) && pen->customstart){
-                    x = pt[j - 1].X;
-                    y = pt[j - 1].Y;
-                    shorten_line_amt(ptcopy[j].X, ptcopy[j].Y, &x, &y,
-                                     pen->width * pen->customstart->inset);
-                    MoveToEx(graphics->hdc, roundr(pt[j - 1].X), roundr(pt[j - 1].Y), &curpos);
-                    LineTo(graphics->hdc, roundr(x), roundr(y));
-                    MoveToEx(graphics->hdc, curpos.x, curpos.y, NULL);
-                }
+                else if((pen->startcap == LineCapCustom) && pen->customstart)
+                    shorten_bezier_amt(&ptcopy[j - 1],
+                                       pen->width * pen->customend->inset, TRUE);
 
                 draw_cap(graphics, pen->brush->lb.lbColor, pen->startcap, pen->width, pen->customstart,
                     pt[j - 1].X - (ptcopy[j - 1].X - ptcopy[j].X),




More information about the wine-cvs mailing list