Jeff Latimer : gdi: Add missing glyph code to GetGlyphIndices and tests.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Aug 24 07:55:54 CDT 2006


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

Author: Jeff Latimer <lats at yless4u.com.au>
Date:   Thu Aug 24 00:49:13 2006 +1000

gdi: Add missing glyph code to GetGlyphIndices and tests.

---

 dlls/gdi/freetype.c   |   18 ++++++++++++++++--
 dlls/gdi/tests/font.c |   31 +++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/dlls/gdi/freetype.c b/dlls/gdi/freetype.c
index f82112f..1278b6a 100644
--- a/dlls/gdi/freetype.c
+++ b/dlls/gdi/freetype.c
@@ -2898,11 +2898,25 @@ static FT_UInt get_glyph_index(GdiFont f
 DWORD WineEngGetGlyphIndices(GdiFont font, LPCWSTR lpstr, INT count,
 				LPWORD pgi, DWORD flags)
 {
-    INT i;
+    int i;
+    WCHAR default_char = 0;
+    TEXTMETRICW textm;
+
+    if  (flags & GGI_MARK_NONEXISTING_GLYPHS) default_char = 0x001f;  /* Indicate non existence */
 
     for(i = 0; i < count; i++)
+    {
         pgi[i] = get_glyph_index(font, lpstr[i]);
-
+        if  (pgi[i] == 0)
+        {
+            if (!default_char)
+            {
+                WineEngGetTextMetrics(font, &textm);
+                default_char = textm.tmDefaultChar;
+            }
+            pgi[i] = default_char;
+        }
+    }
     return count;
 }
 
diff --git a/dlls/gdi/tests/font.c b/dlls/gdi/tests/font.c
index c4ac60d..bfda353 100644
--- a/dlls/gdi/tests/font.c
+++ b/dlls/gdi/tests/font.c
@@ -391,6 +391,36 @@ static void test_text_extents(void)
     ReleaseDC(NULL, hdc);
 }
 
+static void test_GetGlyphIndices()
+{
+    HDC      hdc;
+    HFONT    hfont;
+    DWORD    charcount;
+    LOGFONTA lf;
+    DWORD    flags = 0;
+    WCHAR    testtext[] = {'T','e','s','t',0xffff,0};
+    WORD     glyphs[(sizeof(testtext)/2)-1];
+    TEXTMETRIC textm;
+
+    memset(&lf, 0, sizeof(lf));
+    strcpy(lf.lfFaceName, "Symbol");
+    lf.lfHeight = 20;
+
+    hfont = CreateFontIndirectA(&lf);
+    hdc = GetDC(0);
+
+    ok(GetTextMetrics(hdc, &textm), "GetTextMetric failed\n");
+    flags |= GGI_MARK_NONEXISTING_GLYPHS;
+    charcount = GetGlyphIndicesW(hdc, testtext, (sizeof(testtext)/2)-1, glyphs, flags);
+    ok(charcount == 5, "GetGlyphIndices count of glyphs should = 5 not %ld\n", charcount);
+    ok(glyphs[4] == 0x001f, "GetGlyphIndices should have returned a non existant char not %04x\n", glyphs[4]);
+    flags = 0;
+    charcount = GetGlyphIndicesW(hdc, testtext, (sizeof(testtext)/2)-1, glyphs, flags);
+    ok(charcount == 5, "GetGlyphIndices count of glyphs should = 5 not %ld\n", charcount);
+    ok(glyphs[4] == textm.tmDefaultChar, "GetGlyphIndices should have returned a %04x not %04x\n", 
+                    textm.tmDefaultChar, glyphs[4]);
+}
+
 START_TEST(font)
 {
     test_logfont();
@@ -399,4 +429,5 @@ START_TEST(font)
     test_GdiGetCharDimensions();
     test_GetCharABCWidthsW();
     test_text_extents();
+    test_GetGlyphIndices();
 }




More information about the wine-cvs mailing list