Nikolay Sivov : dwrite: Implement GetGlyphCount().

Alexandre Julliard julliard at wine.codeweavers.com
Thu Feb 5 10:42:43 CST 2015


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Feb  5 15:54:05 2015 +0300

dwrite: Implement GetGlyphCount().

---

 dlls/dwrite/dwrite_private.h |  1 +
 dlls/dwrite/font.c           |  4 ++--
 dlls/dwrite/freetype.c       | 18 ++++++++++++++++++
 dlls/dwrite/tests/font.c     | 31 ++++++++++++++++++++++++++++++-
 4 files changed, 51 insertions(+), 3 deletions(-)

diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index ce7aad5..674e9f0 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -160,6 +160,7 @@ extern HRESULT freetype_get_design_glyph_metrics(IDWriteFontFace2*,UINT16,UINT16
 extern void freetype_notify_cacheremove(IDWriteFontFace2*) DECLSPEC_HIDDEN;
 extern BOOL freetype_is_monospaced(IDWriteFontFace2*) DECLSPEC_HIDDEN;
 extern HRESULT freetype_get_glyph_outline(IDWriteFontFace2*,FLOAT,UINT16,USHORT,struct glyph_outline**) DECLSPEC_HIDDEN;
+extern UINT16 freetype_get_glyphcount(IDWriteFontFace2*) DECLSPEC_HIDDEN;
 
 /* Glyph shaping */
 enum SCRIPT_JUSTIFY
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 1f1f367..e3480ec 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -349,8 +349,8 @@ static void WINAPI dwritefontface_GetMetrics(IDWriteFontFace2 *iface, DWRITE_FON
 static UINT16 WINAPI dwritefontface_GetGlyphCount(IDWriteFontFace2 *iface)
 {
     struct dwrite_fontface *This = impl_from_IDWriteFontFace2(iface);
-    FIXME("(%p): stub\n", This);
-    return 0;
+    TRACE("(%p)\n", This);
+    return freetype_get_glyphcount(iface);
 }
 
 static HRESULT WINAPI dwritefontface_GetDesignGlyphMetrics(IDWriteFontFace2 *iface,
diff --git a/dlls/dwrite/freetype.c b/dlls/dwrite/freetype.c
index 43fa4df..3b9681d 100644
--- a/dlls/dwrite/freetype.c
+++ b/dlls/dwrite/freetype.c
@@ -375,6 +375,19 @@ HRESULT freetype_get_glyph_outline(IDWriteFontFace2 *fontface, FLOAT emSize, UIN
     return hr;
 }
 
+UINT16 freetype_get_glyphcount(IDWriteFontFace2 *fontface)
+{
+    UINT16 count = 0;
+    FT_Face face;
+
+    EnterCriticalSection(&freetype_cs);
+    if (pFTC_Manager_LookupFace(cache_manager, fontface, &face) == 0)
+        count = face->num_glyphs;
+    LeaveCriticalSection(&freetype_cs);
+
+    return count;
+}
+
 #else /* HAVE_FREETYPE */
 
 BOOL init_freetype(void)
@@ -406,4 +419,9 @@ HRESULT freetype_get_glyph_outline(IDWriteFontFace2 *fontface, FLOAT emSize, UIN
     return E_NOTIMPL;
 }
 
+UINT16 freetype_get_glyphcount(IDWriteFontFace2 *fontface)
+{
+    return 0;
+}
+
 #endif /* HAVE_FREETYPE */
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index 915fb98..ca31f29 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -75,7 +75,7 @@ static void create_testfontfile(const WCHAR *filename)
     HRSRC res;
     void *ptr;
     file = CreateFileW(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0 );
-    ok( file != INVALID_HANDLE_VALUE, "file creation failed\n" );
+    ok(file != INVALID_HANDLE_VALUE, "file creation failed, error %d\n", GetLastError());
 
     res = FindResourceA(GetModuleHandleA(NULL), (LPCSTR)MAKEINTRESOURCE(1), (LPCSTR)RT_RCDATA);
     ok( res != 0, "couldn't find resource\n" );
@@ -2994,8 +2994,10 @@ static void test_GetCaretMetrics(void)
     ok(caret.slopeRun == 0, "got %d\n", caret.slopeRun);
     ok(caret.offset == 0, "got %d\n", caret.offset);
     IDWriteFontFace1_Release(fontface1);
+    IDWriteFactory_Release(factory);
 
     /* now with Tahoma Normal */
+    factory = create_factory();
     font = get_tahoma_instance(factory, DWRITE_FONT_STYLE_NORMAL);
     hr = IDWriteFont_CreateFontFace(font, &fontface);
     ok(hr == S_OK, "got 0x%08x\n", hr);
@@ -3033,6 +3035,32 @@ static void test_GetCaretMetrics(void)
     DeleteFileW(test_fontfile);
 }
 
+static void test_GetGlyphCount(void)
+{
+    IDWriteFontFace *fontface;
+    IDWriteFactory *factory;
+    IDWriteFontFile *file;
+    HRESULT hr;
+    UINT16 count;
+
+    create_testfontfile(test_fontfile);
+    factory = create_factory();
+
+    hr = IDWriteFactory_CreateFontFileReference(factory, test_fontfile, NULL, &file);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IDWriteFactory_CreateFontFace(factory, DWRITE_FONT_FACE_TYPE_TRUETYPE, 1, &file, 0, DWRITE_FONT_SIMULATIONS_NONE, &fontface);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    IDWriteFontFile_Release(file);
+
+    count = IDWriteFontFace_GetGlyphCount(fontface);
+    ok(count == 7, "got %u\n", count);
+
+    IDWriteFontFace_Release(fontface);
+    IDWriteFactory_Release(factory);
+    DeleteFileW(test_fontfile);
+}
+
 START_TEST(font)
 {
     IDWriteFactory *factory;
@@ -3072,6 +3100,7 @@ START_TEST(font)
     test_GetGlyphRunOutline();
     test_GetEudcFontCollection();
     test_GetCaretMetrics();
+    test_GetGlyphCount();
 
     IDWriteFactory_Release(factory);
 }




More information about the wine-cvs mailing list