Sam Edwards : gdi32: Improve glyph positioning for the subpixel case in get_glyph_outline.

Alexandre Julliard julliard at winehq.org
Thu May 2 14:07:02 CDT 2013


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

Author: Sam Edwards <CFSworks at gmail.com>
Date:   Wed May  1 09:28:12 2013 -0600

gdi32: Improve glyph positioning for the subpixel case in get_glyph_outline.

---

 dlls/gdi32/freetype.c |   34 ++++++++++++++++++++++++----------
 1 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 5b3c138..30ab574 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -6352,20 +6352,35 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
             }
 
             x_shift = ft_face->glyph->bitmap_left - lpgm->gmptGlyphOrigin.x;
-            if ( x_shift < 0 ) x_shift = 0;
-            if ( x_shift + (src_width / hmul) > width )
-                x_shift = width - (src_width / hmul);
+            if ( x_shift < 0 )
+            {
+                src += hmul * -x_shift;
+                src_width -= hmul * -x_shift;
+            }
+            else if ( x_shift > 0 )
+            {
+                dst += x_shift;
+                width -= x_shift;
+            }
 
             y_shift = lpgm->gmptGlyphOrigin.y - ft_face->glyph->bitmap_top;
-            if ( y_shift < 0 ) y_shift = 0;
-            if ( y_shift + (src_height / vmul) > height )
-                y_shift = height - (src_height / vmul);
+            if ( y_shift < 0 )
+            {
+                src += src_pitch * vmul * -y_shift;
+                src_height -= vmul * -y_shift;
+            }
+            else if ( y_shift > 0 )
+            {
+                dst += y_shift * ( pitch / sizeof(*dst) );
+                height -= y_shift;
+            }
 
-            dst += x_shift + y_shift * ( pitch / 4 );
+            width = min( width, src_width / hmul );
             height = min( height, src_height / vmul );
+
             while ( height-- )
             {
-                for ( x = 0; x < width && x < src_width / hmul; x++ )
+                for ( x = 0; x < width; x++ )
                 {
                     if ( rgb )
                     {
@@ -6383,8 +6398,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
                     }
                 }
                 src += src_pitch * vmul;
-                dst += pitch / 4;
-                src_height -= vmul;
+                dst += pitch / sizeof(*dst);
             }
 
             break;




More information about the wine-cvs mailing list