Evan Stade : gdiplus: Use world transform when drawing points.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jul 25 07:44:19 CDT 2007


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

Author: Evan Stade <estade at gmail.com>
Date:   Tue Jul 24 17:18:50 2007 -0700

gdiplus: Use world transform when drawing points.

---

 dlls/gdiplus/graphics.c |   40 ++++++++++++++++++++--------------------
 1 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 9daf092..6f022a1 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -83,9 +83,10 @@ static BYTE convert_path_point_type(BYTE type)
  * gdi to draw, and these functions would irreparably mess with line widths.
  */
 static void transform_and_round_points(GpGraphics *graphics, POINT *pti,
-    GDIPCONST GpPointF *ptf, INT count)
+    GpPointF *ptf, INT count)
 {
     REAL unitscale;
+    GpMatrix *matrix;
     int i;
 
     switch(graphics->unit)
@@ -113,9 +114,13 @@ static void transform_and_round_points(GpGraphics *graphics, POINT *pti,
     if(graphics->unit != UnitDisplay)
         unitscale *= graphics->scale;
 
+    GdipCloneMatrix(graphics->worldtrans, &matrix);
+    GdipScaleMatrix(matrix, unitscale, unitscale, MatrixOrderAppend);
+    GdipTransformMatrixPoints(matrix, ptf, count);
+
     for(i = 0; i < count; i++){
-        pti[i].x = roundr(unitscale * ptf[i].X);
-        pti[i].y = roundr(unitscale * ptf[i].Y);
+        pti[i].x = roundr(ptf[i].X);
+        pti[i].y = roundr(ptf[i].Y);
     }
 }
 
@@ -431,9 +436,9 @@ static GpStatus draw_polyline(GpGraphics *graphics, GpPen *pen,
         goto end;
     }
 
-    if(caps){
-        memcpy(ptcopy, pt, count * sizeof(GpPointF));
+    memcpy(ptcopy, pt, count * sizeof(GpPointF));
 
+    if(caps){
         if(pen->endcap == LineCapArrowAnchor)
             shorten_line_amt(ptcopy[count-2].X, ptcopy[count-2].Y,
                              &ptcopy[count-1].X, &ptcopy[count-1].Y, pen->width);
@@ -454,11 +459,9 @@ static GpStatus draw_polyline(GpGraphics *graphics, GpPen *pen,
                  pt[count - 2].X, pt[count - 2].Y, pt[count - 1].X, pt[count - 1].Y);
         draw_cap(graphics, pen->brush->lb.lbColor, pen->startcap, pen->width, pen->customstart,
                          pt[1].X, pt[1].Y, pt[0].X, pt[0].Y);\
-
-        transform_and_round_points(graphics, pti, ptcopy, count);
     }
-    else
-        transform_and_round_points(graphics, pti, pt, count);
+
+    transform_and_round_points(graphics, pti, ptcopy, count);
 
     Polyline(graphics->hdc, pti, count);
 
@@ -533,9 +536,9 @@ static GpStatus draw_polybezier(GpGraphics *graphics, GpPen *pen,
         goto end;
     }
 
-    if(caps){
-        memcpy(ptcopy, pt, count * sizeof(GpPointF));
+    memcpy(ptcopy, pt, count * sizeof(GpPointF));
 
+    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
@@ -574,11 +577,9 @@ static GpStatus draw_polybezier(GpGraphics *graphics, GpPen *pen,
         draw_cap(graphics, pen->brush->lb.lbColor, pen->startcap, pen->width, pen->customstart,
             pt[0].X - (ptcopy[0].X - ptcopy[1].X),
             pt[0].Y - (ptcopy[0].Y - ptcopy[1].Y), pt[0].X, pt[0].Y);
-
-        transform_and_round_points(graphics, pti, ptcopy, count);
     }
-    else
-        transform_and_round_points(graphics, pti, pt, count);
+
+    transform_and_round_points(graphics, pti, ptcopy, count);
 
     PolyBezier(graphics->hdc, pti, count);
 
@@ -622,11 +623,11 @@ static GpStatus draw_poly(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *
         }
     }
 
+    memcpy(ptcopy, pt, count * sizeof(GpPointF));
+
     /* If we are drawing caps, go through the points and adjust them accordingly,
      * and draw the caps. */
     if(caps){
-        memcpy(ptcopy, pt, count * sizeof(GpPointF));
-
         switch(types[count - 1] & PathPointTypePathTypeMask){
             case PathPointTypeBezier:
                 if(pen->endcap == LineCapArrowAnchor)
@@ -711,10 +712,9 @@ static GpStatus draw_poly(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *
                 ERR("Bad path points\n");
                 goto end;
         }
-        transform_and_round_points(graphics, pti, ptcopy, count);
     }
-    else
-        transform_and_round_points(graphics, pti, pt, count);
+
+    transform_and_round_points(graphics, pti, ptcopy, count);
 
     for(i = 0; i < count; i++){
         tp[i] = convert_path_point_type(types[i]);




More information about the wine-cvs mailing list