Nikolay Sivov : dwrite: Implement GetMetrics() for fontface.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Nov 6 09:22:40 CST 2014


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Nov  6 08:50:12 2014 +0300

dwrite: Implement GetMetrics() for fontface.

---

 dlls/dwrite/font.c       | 16 +++++++++++++---
 dlls/dwrite/tests/font.c | 21 +++++++++++++++++++++
 2 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 6c62056..e6154b4 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -112,6 +112,7 @@ struct dwrite_fontface {
 
     USHORT simulations;
     DWRITE_FONT_FACE_TYPE type;
+    DWRITE_FONT_METRICS metrics;
 
     struct dwrite_fonttable cmap;
 };
@@ -313,7 +314,8 @@ static BOOL WINAPI dwritefontface_IsSymbolFont(IDWriteFontFace2 *iface)
 static void WINAPI dwritefontface_GetMetrics(IDWriteFontFace2 *iface, DWRITE_FONT_METRICS *metrics)
 {
     struct dwrite_fontface *This = impl_from_IDWriteFontFace2(iface);
-    FIXME("(%p)->(%p): stub\n", This, metrics);
+    TRACE("(%p)->(%p)\n", This, metrics);
+    *metrics = This->metrics;
 }
 
 static UINT16 WINAPI dwritefontface_GetGlyphCount(IDWriteFontFace2 *iface)
@@ -615,11 +617,18 @@ static void get_font_properties_from_stream(IDWriteFontFileStream *stream, DWRIT
 {
     const void *tt_os2 = NULL, *tt_head = NULL, *tt_post = NULL;
     void *os2_context, *head_context, *post_context;
+    DWRITE_FONT_STRETCH fontstretch;
+    DWRITE_FONT_WEIGHT fontweight;
+    DWRITE_FONT_STYLE fontstyle;
 
     opentype_get_font_table(stream, face_type, face_index, MS_OS2_TAG, &tt_os2, &os2_context, NULL, NULL);
     opentype_get_font_table(stream, face_type, face_index, MS_HEAD_TAG, &tt_head, &head_context, NULL, NULL);
     opentype_get_font_table(stream, face_type, face_index, MS_POST_TAG, &tt_post, &post_context, NULL, NULL);
 
+    if (!stretch) stretch = &fontstretch;
+    if (!weight) weight = &fontweight;
+    if (!style) style = &fontstyle;
+
     opentype_get_font_properties(tt_os2, tt_head, stretch, weight, style);
     opentype_get_font_metrics(tt_os2, tt_head, tt_post, metrics);
 
@@ -1930,6 +1939,8 @@ HRESULT create_fontface(DWRITE_FONT_FACE_TYPE facetype, UINT32 files_number, IDW
     fontface->cmap.data = NULL;
     fontface->cmap.context = NULL;
     fontface->cmap.size = 0;
+    fontface->index = index;
+    fontface->simulations = simulations;
 
     for (i = 0; i < fontface->file_count; i++) {
         hr = get_stream_from_file(font_files[i], &fontface->streams[i]);
@@ -1942,8 +1953,7 @@ HRESULT create_fontface(DWRITE_FONT_FACE_TYPE facetype, UINT32 files_number, IDW
         IDWriteFontFile_AddRef(font_files[i]);
     }
 
-    fontface->index = index;
-    fontface->simulations = simulations;
+    get_font_properties_from_stream(fontface->streams[0], facetype, index, &fontface->metrics, NULL, NULL, NULL);
 
     *ret = &fontface->IDWriteFontFace2_iface;
     return S_OK;
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index e51b702..51a07c7 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -957,6 +957,7 @@ static void test_GetMetrics(void)
 {
     IDWriteGdiInterop *interop;
     DWRITE_FONT_METRICS metrics;
+    IDWriteFontFace *fontface;
     IDWriteFactory *factory;
     OUTLINETEXTMETRICW otm;
     IDWriteFont *font;
@@ -1009,6 +1010,26 @@ todo_wine
     ok(metrics.strikethroughPosition > 0, "strikethroughPosition %d\n", metrics.strikethroughPosition);
     ok(metrics.strikethroughThickness != 0, "strikethroughThickness %u\n", metrics.strikethroughThickness);
 
+    hr = IDWriteFont_CreateFontFace(font, &fontface);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    memset(&metrics, 0, sizeof(metrics));
+    IDWriteFontFace_GetMetrics(fontface, &metrics);
+
+    ok(metrics.designUnitsPerEm != 0, "designUnitsPerEm %u\n", metrics.designUnitsPerEm);
+    ok(metrics.ascent != 0, "ascent %u\n", metrics.ascent);
+    ok(metrics.descent != 0, "descent %u\n", metrics.descent);
+todo_wine
+    ok(metrics.lineGap == 0, "lineGap %d\n", metrics.lineGap);
+    ok(metrics.capHeight, "capHeight %u\n", metrics.capHeight);
+    ok(metrics.xHeight != 0, "xHeight %u\n", metrics.xHeight);
+    ok(metrics.underlinePosition < 0, "underlinePosition %d\n", metrics.underlinePosition);
+    ok(metrics.underlineThickness != 0, "underlineThickness %u\n", metrics.underlineThickness);
+    ok(metrics.strikethroughPosition > 0, "strikethroughPosition %d\n", metrics.strikethroughPosition);
+    ok(metrics.strikethroughThickness != 0, "strikethroughThickness %u\n", metrics.strikethroughThickness);
+
+    IDWriteFontFace_Release(fontface);
+
     IDWriteFont_Release(font);
     IDWriteGdiInterop_Release(interop);
     IDWriteFactory_Release(factory);




More information about the wine-cvs mailing list