Hans Leidekker : gdi32: Implement WineEngGetCharABCWidthsFloat and forward GetCharABCWidthsFloat to it .

Alexandre Julliard julliard at winehq.org
Fri Dec 11 11:04:48 CST 2009


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Fri Dec 11 11:38:24 2009 +0100

gdi32: Implement WineEngGetCharABCWidthsFloat and forward GetCharABCWidthsFloat to it.

---

 dlls/gdi32/font.c        |   40 +++++++++++++++++++++++-----------------
 dlls/gdi32/freetype.c    |   38 ++++++++++++++++++++++++++++++++++++++
 dlls/gdi32/gdi_private.h |    2 ++
 3 files changed, 63 insertions(+), 17 deletions(-)

diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 7f8f6f6..eea53fd 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -2908,34 +2908,40 @@ BOOL WINAPI GetCharABCWidthsFloatA( HDC hdc, UINT first, UINT last, LPABCFLOAT a
  * RETURNS
  *    Success: TRUE
  *    Failure: FALSE
- *
- * BUGS
- *    Only works with TrueType fonts. It also doesn't return real
- *    floats but converted integers because it's implemented on
- *    top of GetCharABCWidthsW.
  */
 BOOL WINAPI GetCharABCWidthsFloatW( HDC hdc, UINT first, UINT last, LPABCFLOAT abcf )
 {
-    ABC *abc, *abc_base;
-    unsigned int i, size = sizeof(ABC) * (last - first + 1);
-    BOOL ret;
+    UINT i;
+    BOOL ret = FALSE;
+    DC *dc = get_dc_ptr( hdc );
+
+    TRACE("%p, %d, %d, %p\n", hdc, first, last, abcf);
+
+    if (!dc) return FALSE;
 
-    TRACE("%p, %d, %d, %p - partial stub\n", hdc, first, last, abcf);
+    if (!abcf)
+    {
+        release_dc_ptr( dc );
+        return FALSE;
+    }
 
-    abc = abc_base = HeapAlloc( GetProcessHeap(), 0, size );
-    if (!abc) return FALSE;
+    if (dc->gdiFont)
+        ret = WineEngGetCharABCWidthsFloat( dc->gdiFont, first, last, abcf );
+    else
+        FIXME("stub\n");
 
-    ret = GetCharABCWidthsW( hdc, first, last, abc );
     if (ret)
     {
-        for (i = first; i <= last; i++, abc++, abcf++)
+        /* convert device units to logical */
+        for (i = first; i <= last; i++, abcf++)
         {
-            abcf->abcfA = abc->abcA;
-            abcf->abcfB = abc->abcB;
-            abcf->abcfC = abc->abcC;
+            abcf->abcfA = abcf->abcfA * dc->xformVport2World.eM11;
+            abcf->abcfB = abcf->abcfB * dc->xformVport2World.eM11;
+            abcf->abcfC = abcf->abcfC * dc->xformVport2World.eM11;
         }
     }
-    HeapFree( GetProcessHeap(), 0, abc_base );
+
+    release_dc_ptr( dc );
     return ret;
 }
 
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index ed37a25..a93cb60 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -5913,6 +5913,38 @@ BOOL WineEngGetCharABCWidths(GdiFont *font, UINT firstChar, UINT lastChar,
 }
 
 /*************************************************************
+ * WineEngGetCharABCWidthsFloat
+ *
+ */
+BOOL WineEngGetCharABCWidthsFloat(GdiFont *font, UINT first, UINT last, LPABCFLOAT buffer)
+{
+    static const MAT2 identity = {{0,1}, {0,0}, {0,0}, {0,1}};
+    UINT c;
+    GLYPHMETRICS gm;
+    FT_UInt glyph_index;
+    GdiFont *linked_font;
+
+    TRACE("%p, %d, %d, %p\n", font, first, last, buffer);
+
+    GDI_CheckNotLock();
+    EnterCriticalSection( &freetype_cs );
+
+    for (c = first; c <= last; c++)
+    {
+        get_glyph_index_linked(font, c, &linked_font, &glyph_index);
+        WineEngGetGlyphOutline(linked_font, glyph_index, GGO_METRICS | GGO_GLYPH_INDEX,
+                               &gm, 0, NULL, &identity);
+        buffer[c - first].abcfA = FONT_GM(linked_font, glyph_index)->lsb;
+        buffer[c - first].abcfB = FONT_GM(linked_font, glyph_index)->bbx;
+        buffer[c - first].abcfC = FONT_GM(linked_font, glyph_index)->adv -
+                                  FONT_GM(linked_font, glyph_index)->lsb -
+                                  FONT_GM(linked_font, glyph_index)->bbx;
+    }
+    LeaveCriticalSection( &freetype_cs );
+    return TRUE;
+}
+
+/*************************************************************
  * WineEngGetCharABCWidthsI
  *
  */
@@ -6605,6 +6637,12 @@ BOOL WineEngGetCharABCWidths(GdiFont *font, UINT firstChar, UINT lastChar,
     return FALSE;
 }
 
+BOOL WineEngGetCharABCWidthsFloat(GdiFont *font, UINT first, UINT last, LPABCFLOAT buffer)
+{
+    ERR("called but we don't have FreeType\n");
+    return FALSE;
+}
+
 BOOL WineEngGetCharABCWidthsI(GdiFont *font, UINT firstChar, UINT count, LPWORD pgi,
 			      LPABC buffer)
 {
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 670ef41..d5f9112 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -412,6 +412,8 @@ extern BOOL WineEngDestroyFontInstance(HFONT handle) DECLSPEC_HIDDEN;
 extern DWORD WineEngEnumFonts(LPLOGFONTW, FONTENUMPROCW, LPARAM) DECLSPEC_HIDDEN;
 extern BOOL WineEngGetCharABCWidths(GdiFont *font, UINT firstChar,
                                     UINT lastChar, LPABC buffer) DECLSPEC_HIDDEN;
+extern BOOL WineEngGetCharABCWidthsFloat(GdiFont *font, UINT firstChar,
+                                         UINT lastChar, LPABCFLOAT buffer) DECLSPEC_HIDDEN;
 extern BOOL WineEngGetCharABCWidthsI(GdiFont *font, UINT firstChar,
                                     UINT count, LPWORD pgi, LPABC buffer) DECLSPEC_HIDDEN;
 extern BOOL WineEngGetCharWidth(GdiFont*, UINT, UINT, LPINT) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list