Vincent Povirk : gdiplus: Implement DriverStringOptionsRealizedAdvance in software.

Alexandre Julliard julliard at winehq.org
Tue May 24 12:53:44 CDT 2011


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Mon May 23 16:35:41 2011 -0500

gdiplus: Implement DriverStringOptionsRealizedAdvance in software.

---

 dlls/gdiplus/graphics.c |   43 ++++++++++++++++++++++++++-----------------
 1 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 867889d..8c6a042 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -5674,9 +5674,9 @@ static GpStatus SOFTWARE_GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UI
                                          GDIPCONST PointF *positions, INT flags,
                                          GDIPCONST GpMatrix *matrix )
 {
-    static const INT unsupported_flags = ~(DriverStringOptionsCmapLookup);
+    static const INT unsupported_flags = ~(DriverStringOptionsCmapLookup|DriverStringOptionsRealizedAdvance);
     GpStatus stat;
-    PointF *real_positions;
+    PointF *real_positions, real_position;
     POINT *pti;
     HFONT hfont;
     HDC hdc;
@@ -5695,12 +5695,6 @@ static GpStatus SOFTWARE_GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UI
     if (length <= 0)
         return Ok;
 
-    if (flags & DriverStringOptionsRealizedAdvance)
-    {
-        FIXME("Not implemented for DriverStringOptionsRealizedAdvance\n");
-        return NotImplemented;
-    }
-
     if (!(flags & DriverStringOptionsCmapLookup))
         ggo_flags |= GGO_GLYPH_INDEX;
 
@@ -5710,22 +5704,31 @@ static GpStatus SOFTWARE_GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UI
     if (matrix)
         FIXME("Ignoring matrix\n");
 
-    real_positions = GdipAlloc(sizeof(PointF) * length);
-    if (!real_positions)
-        return OutOfMemory;
-
     pti = GdipAlloc(sizeof(POINT) * length);
     if (!pti)
-    {
-        GdipFree(real_positions);
         return OutOfMemory;
+
+    if (flags & DriverStringOptionsRealizedAdvance)
+    {
+        real_position = positions[0];
+
+        transform_and_round_points(graphics, pti, &real_position, 1);
     }
+    else
+    {
+        real_positions = GdipAlloc(sizeof(PointF) * length);
+        if (!real_positions)
+        {
+            GdipFree(pti);
+            return OutOfMemory;
+        }
 
-    memcpy(real_positions, positions, sizeof(PointF) * length);
+        memcpy(real_positions, positions, sizeof(PointF) * length);
 
-    transform_and_round_points(graphics, pti, real_positions, length);
+        transform_and_round_points(graphics, pti, real_positions, length);
 
-    GdipFree(real_positions);
+        GdipFree(real_positions);
+    }
 
     get_font_hfont(graphics, font, &hfont);
 
@@ -5762,6 +5765,12 @@ static GpStatus SOFTWARE_GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UI
         if (top < min_y) min_y = top;
         if (right > max_x) max_x = right;
         if (bottom > max_y) max_y = bottom;
+
+        if (i+1 < length && (flags & DriverStringOptionsRealizedAdvance) == DriverStringOptionsRealizedAdvance)
+        {
+            pti[i+1].x = pti[i].x + glyphmetrics.gmCellIncX;
+            pti[i+1].y = pti[i].y + glyphmetrics.gmCellIncY;
+        }
     }
 
     glyph_mask = GdipAlloc(max_glyphsize);




More information about the wine-cvs mailing list