[PATCH 1/4] dwrite: Implement AnalyzeContainerType()

Nikolay Sivov nsivov at codeweavers.com
Mon Oct 9 02:47:02 CDT 2017


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/dwrite_private.h |   1 +
 dlls/dwrite/main.c           |   4 +-
 dlls/dwrite/opentype.c       |  24 ++++
 dlls/dwrite/tests/font.c     | 259 ++++++++++++++++++++++++++++---------------
 4 files changed, 198 insertions(+), 90 deletions(-)

diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index 38cf11a1e0..6c3088b044 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -243,6 +243,7 @@ extern UINT32 opentype_get_cpal_paletteentrycount(const void*) DECLSPEC_HIDDEN;
 extern HRESULT opentype_get_cpal_entries(const void*,UINT32,UINT32,UINT32,DWRITE_COLOR_F*) DECLSPEC_HIDDEN;
 extern BOOL opentype_has_vertical_variants(IDWriteFontFace4*) DECLSPEC_HIDDEN;
 extern UINT32 opentype_get_glyph_image_formats(IDWriteFontFace4*) DECLSPEC_HIDDEN;
+extern DWRITE_CONTAINER_TYPE opentype_analyze_container_type(void const *, UINT32) DECLSPEC_HIDDEN;
 
 struct dwrite_colorglyph {
     USHORT layer; /* [0, num_layers) index indicating current layer */
diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index 1cdcc7edb5..7237a0ee88 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -1636,9 +1636,9 @@ static DWRITE_CONTAINER_TYPE WINAPI dwritefactory5_AnalyzeContainerType(IDWriteF
 {
     struct dwritefactory *This = impl_from_IDWriteFactory5(iface);
 
-    FIXME("(%p)->(%p %u): stub\n", This, data, data_size);
+    TRACE("(%p)->(%p %u)\n", This, data, data_size);
 
-    return DWRITE_CONTAINER_TYPE_UNKNOWN;
+    return opentype_analyze_container_type(data, data_size);
 }
 
 static HRESULT WINAPI dwritefactory5_UnpackFontFile(IDWriteFactory5 *iface, DWRITE_CONTAINER_TYPE container_type, void const *data,
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index 36c34b630e..bb6f274cb4 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -47,6 +47,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(dwrite);
 #define MS_JPG__TAG DWRITE_MAKE_OPENTYPE_TAG('j','p','g',' ')
 #define MS_TIFF_TAG DWRITE_MAKE_OPENTYPE_TAG('t','i','f','f')
 
+#define MS_WOFF_TAG DWRITE_MAKE_OPENTYPE_TAG('w','O','F','F')
+#define MS_WOF2_TAG DWRITE_MAKE_OPENTYPE_TAG('w','O','F','2')
+
 #ifdef WORDS_BIGENDIAN
 #define GET_BE_WORD(x) (x)
 #define GET_BE_DWORD(x) (x)
@@ -2167,3 +2170,24 @@ UINT32 opentype_get_glyph_image_formats(IDWriteFontFace4 *fontface)
     /* TODO: handle embedded bitmaps tables */
     return ret;
 }
+
+DWRITE_CONTAINER_TYPE opentype_analyze_container_type(void const *data, UINT32 data_size)
+{
+    DWORD signature;
+
+    if (data_size < sizeof(DWORD))
+        return DWRITE_CONTAINER_TYPE_UNKNOWN;
+
+    /* Both WOFF and WOFF2 start with 4 bytes signature. */
+    signature = *(DWORD *)data;
+
+    switch (signature)
+    {
+    case MS_WOFF_TAG:
+        return DWRITE_CONTAINER_TYPE_WOFF;
+    case MS_WOF2_TAG:
+        return DWRITE_CONTAINER_TYPE_WOFF2;
+    default:
+        return DWRITE_CONTAINER_TYPE_UNKNOWN;
+    }
+}
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index e97c4d133b..c579d944cc 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -54,12 +54,19 @@
 #define MS_JPG__TAG DWRITE_MAKE_OPENTYPE_TAG('j','p','g',' ')
 #define MS_TIFF_TAG DWRITE_MAKE_OPENTYPE_TAG('t','i','f','f')
 
+#define MS_WOFF_TAG DWRITE_MAKE_OPENTYPE_TAG('w','O','F','F')
+#define MS_WOF2_TAG DWRITE_MAKE_OPENTYPE_TAG('w','O','F','2')
+
 #ifdef WORDS_BIGENDIAN
 #define GET_BE_WORD(x) (x)
 #define GET_BE_DWORD(x) (x)
+#define GET_LE_WORD(x) RtlUshortByteSwap(x)
+#define GET_LE_DWORD(x) RtlUlongByteSwap(x)
 #else
 #define GET_BE_WORD(x) RtlUshortByteSwap(x)
 #define GET_BE_DWORD(x) RtlUlongByteSwap(x)
+#define GET_LE_WORD(x) (x)
+#define GET_LE_DWORD(x) (x)
 #endif
 
 #define EXPECT_HR(hr,hr_exp) \
@@ -334,13 +341,54 @@ typedef struct {
     WORD numGlyphs;
 } maxp;
 
+struct WOFFHeader
+{
+    ULONG  signature;
+    ULONG  flavor;
+    ULONG  length;
+    USHORT numTables;
+    USHORT reserved;
+    ULONG  totalSfntSize;
+    USHORT majorVersion;
+    USHORT minorVersion;
+    ULONG  metaOffset;
+    ULONG  metaLength;
+    ULONG  metaOrigLength;
+    ULONG  privOffset;
+    ULONG  privLength;
+};
+
+struct WOFFHeader2
+{
+    ULONG  signature;
+    ULONG  flavor;
+    ULONG  length;
+    USHORT numTables;
+    USHORT reserved;
+    ULONG  totalSfntSize;
+    ULONG  totalCompressedSize;
+    USHORT majorVersion;
+    USHORT minorVersion;
+    ULONG  metaOffset;
+    ULONG  metaLength;
+    ULONG  metaOrigLength;
+    ULONG  privOffset;
+    ULONG  privLength;
+};
+
 #include "poppack.h"
 
+static void *create_factory_iid(REFIID riid)
+{
+    IUnknown *factory = NULL;
+    DWriteCreateFactory(DWRITE_FACTORY_TYPE_ISOLATED, riid, &factory);
+    return factory;
+}
+
 static IDWriteFactory *create_factory(void)
 {
-    IDWriteFactory *factory;
-    HRESULT hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_ISOLATED, &IID_IDWriteFactory, (IUnknown**)&factory);
-    ok(hr == S_OK, "Failed to create factory, hr %#x.\n", hr);
+    IDWriteFactory *factory = create_factory_iid(&IID_IDWriteFactory);
+    ok(factory != NULL, "Failed to create factory.\n");
     return factory;
 }
 
@@ -4459,32 +4507,28 @@ static void test_GetGlyphRunOutline(void)
 static void test_GetEudcFontCollection(void)
 {
     IDWriteFontCollection *coll, *coll2;
-    IDWriteFactory1 *factory1;
-    IDWriteFactory *factory;
+    IDWriteFactory1 *factory;
     HRESULT hr;
     ULONG ref;
 
-    factory = create_factory();
-
-    hr = IDWriteFactory_QueryInterface(factory, &IID_IDWriteFactory1, (void**)&factory1);
-    IDWriteFactory_Release(factory);
-    if (hr != S_OK) {
+    factory = create_factory_iid(&IID_IDWriteFactory1);
+    if (!factory) {
         win_skip("GetEudcFontCollection() is not supported.\n");
         return;
     }
 
-    EXPECT_REF(factory1, 1);
-    hr = IDWriteFactory1_GetEudcFontCollection(factory1, &coll, FALSE);
+    EXPECT_REF(factory, 1);
+    hr = IDWriteFactory1_GetEudcFontCollection(factory, &coll, FALSE);
     ok(hr == S_OK, "got 0x%08x\n", hr);
-    EXPECT_REF(factory1, 2);
-    hr = IDWriteFactory1_GetEudcFontCollection(factory1, &coll2, FALSE);
+    EXPECT_REF(factory, 2);
+    hr = IDWriteFactory1_GetEudcFontCollection(factory, &coll2, FALSE);
     ok(hr == S_OK, "got 0x%08x\n", hr);
-    EXPECT_REF(factory1, 2);
+    EXPECT_REF(factory, 2);
     ok(coll == coll2, "got %p, %p\n", coll, coll2);
     IDWriteFontCollection_Release(coll);
     IDWriteFontCollection_Release(coll2);
 
-    ref = IDWriteFactory1_Release(factory1);
+    ref = IDWriteFactory1_Release(factory);
     ok(ref == 0, "factory not released, %u\n", ref);
 }
 
@@ -6643,8 +6687,7 @@ static void test_TranslateColorGlyphRun(void)
     const DWRITE_COLOR_GLYPH_RUN *colorrun;
     IDWriteFontFace2 *fontface2;
     IDWriteFontFace *fontface;
-    IDWriteFactory2 *factory2;
-    IDWriteFactory *factory;
+    IDWriteFactory2 *factory;
     DWRITE_GLYPH_RUN run;
     UINT32 codepoints[2];
     IDWriteFont *font;
@@ -6653,17 +6696,14 @@ static void test_TranslateColorGlyphRun(void)
     HRESULT hr;
     ULONG ref;
 
-    factory = create_factory();
-
-    hr = IDWriteFactory_QueryInterface(factory, &IID_IDWriteFactory2, (void**)&factory2);
-    IDWriteFactory_Release(factory);
-    if (hr != S_OK) {
+    factory = create_factory_iid(&IID_IDWriteFactory2);
+    if (!factory) {
         win_skip("TranslateColorGlyphRun() is not supported.\n");
         return;
     }
 
     /* Tahoma, no color support */
-    fontface = create_fontface((IDWriteFactory*)factory2);
+    fontface = create_fontface((IDWriteFactory *)factory);
 
     codepoints[0] = 'A';
     hr = IDWriteFontFace_GetGlyphIndices(fontface, codepoints, 1, glyphs);
@@ -6679,16 +6719,16 @@ static void test_TranslateColorGlyphRun(void)
     run.bidiLevel = 0;
 
     layers = (void*)0xdeadbeef;
-    hr = IDWriteFactory2_TranslateColorGlyphRun(factory2, 0.0, 0.0, &run, NULL,
+    hr = IDWriteFactory2_TranslateColorGlyphRun(factory, 0.0f, 0.0f, &run, NULL,
         DWRITE_MEASURING_MODE_NATURAL, NULL, 0, &layers);
     ok(hr == DWRITE_E_NOCOLOR, "got 0x%08x\n", hr);
     ok(layers == NULL, "got %p\n", layers);
     IDWriteFontFace_Release(fontface);
 
     /* Segoe UI Emoji, with color support */
-    font = get_font((IDWriteFactory*)factory2, emojiW, DWRITE_FONT_STYLE_NORMAL);
+    font = get_font((IDWriteFactory *)factory, emojiW, DWRITE_FONT_STYLE_NORMAL);
     if (!font) {
-        IDWriteFactory2_Release(factory2);
+        IDWriteFactory2_Release(factory);
         skip("Segoe UI Emoji font not found.\n");
         return;
     }
@@ -6704,12 +6744,12 @@ static void test_TranslateColorGlyphRun(void)
     run.fontFace = fontface;
 
     layers = NULL;
-    hr = IDWriteFactory2_TranslateColorGlyphRun(factory2, 0.0, 0.0, &run, NULL,
+    hr = IDWriteFactory2_TranslateColorGlyphRun(factory, 0.0f, 0.0f, &run, NULL,
         DWRITE_MEASURING_MODE_NATURAL, NULL, 0, &layers);
     ok(hr == S_OK, "got 0x%08x\n", hr);
     ok(layers != NULL, "got %p\n", layers);
 
-    while (1) {
+    for (;;) {
         hasrun = FALSE;
         hr = IDWriteColorGlyphRunEnumerator_MoveNext(layers, &hasrun);
         ok(hr == S_OK, "got 0x%08x\n", hr);
@@ -6737,14 +6777,14 @@ static void test_TranslateColorGlyphRun(void)
 
     /* invalid palette index */
     layers = (void*)0xdeadbeef;
-    hr = IDWriteFactory2_TranslateColorGlyphRun(factory2, 0.0f, 0.0f, &run, NULL,
+    hr = IDWriteFactory2_TranslateColorGlyphRun(factory, 0.0f, 0.0f, &run, NULL,
         DWRITE_MEASURING_MODE_NATURAL, NULL, IDWriteFontFace2_GetColorPaletteCount(fontface2),
         &layers);
     ok(hr == DWRITE_E_NOCOLOR, "got 0x%08x\n", hr);
     ok(layers == NULL, "got %p\n", layers);
 
     layers = NULL;
-    hr = IDWriteFactory2_TranslateColorGlyphRun(factory2, 0.0f, 0.0f, &run, NULL,
+    hr = IDWriteFactory2_TranslateColorGlyphRun(factory, 0.0f, 0.0f, &run, NULL,
         DWRITE_MEASURING_MODE_NATURAL, NULL, IDWriteFontFace2_GetColorPaletteCount(fontface2) - 1,
         &layers);
     ok(hr == S_OK, "got 0x%08x\n", hr);
@@ -6756,7 +6796,7 @@ static void test_TranslateColorGlyphRun(void)
     ok(hr == S_OK, "got 0x%08x\n", hr);
 
     layers = (void*)0xdeadbeef;
-    hr = IDWriteFactory2_TranslateColorGlyphRun(factory2, 0.0, 0.0, &run, NULL,
+    hr = IDWriteFactory2_TranslateColorGlyphRun(factory, 0.0f, 0.0f, &run, NULL,
         DWRITE_MEASURING_MODE_NATURAL, NULL, 0, &layers);
     ok(hr == DWRITE_E_NOCOLOR, "got 0x%08x\n", hr);
     ok(layers == NULL, "got %p\n", layers);
@@ -6771,7 +6811,7 @@ static void test_TranslateColorGlyphRun(void)
     run.glyphCount = 2;
 
     layers = NULL;
-    hr = IDWriteFactory2_TranslateColorGlyphRun(factory2, 0.0, 0.0, &run, NULL,
+    hr = IDWriteFactory2_TranslateColorGlyphRun(factory, 0.0f, 0.0f, &run, NULL,
         DWRITE_MEASURING_MODE_NATURAL, NULL, 0, &layers);
     ok(hr == S_OK, "got 0x%08x\n", hr);
     ok(layers != NULL, "got %p\n", layers);
@@ -6779,7 +6819,7 @@ static void test_TranslateColorGlyphRun(void)
 
     IDWriteFontFace2_Release(fontface2);
     IDWriteFontFace_Release(fontface);
-    ref = IDWriteFactory2_Release(factory2);
+    ref = IDWriteFactory2_Release(factory);
     ok(ref == 0, "factory not released, %u\n", ref);
 }
 
@@ -6824,8 +6864,7 @@ static void test_CreateFontFaceReference(void)
     IDWriteFontFace3 *fontface, *fontface1;
     IDWriteFontFaceReference *ref, *ref1;
     IDWriteFontFile *file, *file1;
-    IDWriteFactory3 *factory3;
-    IDWriteFactory *factory;
+    IDWriteFactory3 *factory;
     IDWriteFont3 *font3;
     IDWriteFont *font;
     ULONG refcount;
@@ -6834,26 +6873,23 @@ static void test_CreateFontFaceReference(void)
     HRESULT hr;
     BOOL ret;
 
-    factory = create_factory();
-
-    hr = IDWriteFactory_QueryInterface(factory, &IID_IDWriteFactory3, (void**)&factory3);
-    IDWriteFactory_Release(factory);
-    if (FAILED(hr)) {
+    factory = create_factory_iid(&IID_IDWriteFactory3);
+    if (!factory) {
         win_skip("CreateFontFaceReference() is not supported.\n");
         return;
     }
 
     path = create_testfontfile(test_fontfile);
 
-    hr = IDWriteFactory3_CreateFontFaceReference(factory3, NULL, NULL, 0, DWRITE_FONT_SIMULATIONS_NONE, &ref);
+    hr = IDWriteFactory3_CreateFontFaceReference(factory, NULL, NULL, 0, DWRITE_FONT_SIMULATIONS_NONE, &ref);
     ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
 
     /* out of range simulation flags */
-    hr = IDWriteFactory3_CreateFontFaceReference(factory3, path, NULL, 0, ~0u, &ref);
+    hr = IDWriteFactory3_CreateFontFaceReference(factory, path, NULL, 0, ~0u, &ref);
     ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
 
     /* test file is not a collection, but reference could still be created with non-zero face index */
-    hr = IDWriteFactory3_CreateFontFaceReference(factory3, path, NULL, 1, DWRITE_FONT_SIMULATIONS_NONE, &ref);
+    hr = IDWriteFactory3_CreateFontFaceReference(factory, path, NULL, 1, DWRITE_FONT_SIMULATIONS_NONE, &ref);
     ok(hr == S_OK, "got 0x%08x\n", hr);
 
     index = IDWriteFontFaceReference_GetFontFaceIndex(ref);
@@ -6870,16 +6906,16 @@ todo_wine
     IDWriteFontFaceReference_Release(ref);
 
     /* path however has to be valid */
-    hr = IDWriteFactory3_CreateFontFaceReference(factory3, dummyW, NULL, 0, DWRITE_FONT_SIMULATIONS_NONE, &ref);
+    hr = IDWriteFactory3_CreateFontFaceReference(factory, dummyW, NULL, 0, DWRITE_FONT_SIMULATIONS_NONE, &ref);
 todo_wine
     ok(hr == DWRITE_E_FILENOTFOUND, "got 0x%08x\n", hr);
     if (hr == S_OK)
         IDWriteFontFaceReference_Release(ref);
 
-    EXPECT_REF(factory3, 1);
-    hr = IDWriteFactory3_CreateFontFaceReference(factory3, path, NULL, 0, DWRITE_FONT_SIMULATIONS_NONE, &ref);
+    EXPECT_REF(factory, 1);
+    hr = IDWriteFactory3_CreateFontFaceReference(factory, path, NULL, 0, DWRITE_FONT_SIMULATIONS_NONE, &ref);
     ok(hr == S_OK, "got 0x%08x\n", hr);
-    EXPECT_REF(factory3, 2);
+    EXPECT_REF(factory, 2);
 
     /* new file is returned */
     hr = IDWriteFontFaceReference_GetFontFile(ref, &file);
@@ -6893,7 +6929,7 @@ todo_wine
     IDWriteFontFile_Release(file1);
 
     /* references are not reused */
-    hr = IDWriteFactory3_CreateFontFaceReference(factory3, path, NULL, 0, DWRITE_FONT_SIMULATIONS_NONE, &ref1);
+    hr = IDWriteFactory3_CreateFontFaceReference(factory, path, NULL, 0, DWRITE_FONT_SIMULATIONS_NONE, &ref1);
     ok(hr == S_OK, "got 0x%08x\n", hr);
     ok(ref1 != ref, "got %p, previous ref %p\n", ref1, ref);
 
@@ -6912,13 +6948,13 @@ todo_wine
     ok(ret, "got %d\n", ret);
     IDWriteFontFaceReference_Release(ref1);
 
-    hr = IDWriteFactory3_CreateFontFaceReference(factory3, path, NULL, 1, DWRITE_FONT_SIMULATIONS_NONE, &ref1);
+    hr = IDWriteFactory3_CreateFontFaceReference(factory, path, NULL, 1, DWRITE_FONT_SIMULATIONS_NONE, &ref1);
     ok(hr == S_OK, "got 0x%08x\n", hr);
     ret = IDWriteFontFaceReference_Equals(ref, ref1);
     ok(!ret, "got %d\n", ret);
     IDWriteFontFaceReference_Release(ref1);
 
-    hr = IDWriteFactory3_CreateFontFaceReference(factory3, path, NULL, 0, DWRITE_FONT_SIMULATIONS_BOLD, &ref1);
+    hr = IDWriteFactory3_CreateFontFaceReference(factory, path, NULL, 0, DWRITE_FONT_SIMULATIONS_BOLD, &ref1);
     ok(hr == S_OK, "got 0x%08x\n", hr);
     ret = IDWriteFontFaceReference_Equals(ref, ref1);
     ok(!ret, "got %d\n", ret);
@@ -6927,10 +6963,10 @@ todo_wine
     IDWriteFontFaceReference_Release(ref);
 
     /* create reference from a file */
-    hr = IDWriteFactory3_CreateFontFileReference(factory3, path, NULL, &file);
+    hr = IDWriteFactory3_CreateFontFileReference(factory, path, NULL, &file);
     ok(hr == S_OK, "got 0x%08x\n", hr);
 
-    hr = IDWriteFactory3_CreateFontFaceReference_(factory3, file, 0, DWRITE_FONT_SIMULATIONS_NONE, &ref);
+    hr = IDWriteFactory3_CreateFontFaceReference_(factory, file, 0, DWRITE_FONT_SIMULATIONS_NONE, &ref);
     ok(hr == S_OK, "got 0x%08x\n", hr);
 
     hr = IDWriteFontFaceReference_GetFontFile(ref, &file1);
@@ -6942,7 +6978,7 @@ todo_wine
     IDWriteFontFile_Release(file1);
 
     /* references returned from IDWriteFont3 */
-    font = get_tahoma_instance((IDWriteFactory*)factory3, DWRITE_FONT_STYLE_NORMAL);
+    font = get_tahoma_instance((IDWriteFactory *)factory, DWRITE_FONT_STYLE_NORMAL);
     hr = IDWriteFont_QueryInterface(font, &IID_IDWriteFont3, (void**)&font3);
     ok(hr == S_OK, "got 0x%08x\n", hr);
     IDWriteFont_Release(font);
@@ -6983,7 +7019,7 @@ if (hr == S_OK) {
     IDWriteFontFace3_Release(fontface);
     IDWriteFont3_Release(font3);
 
-    refcount = IDWriteFactory3_Release(factory3);
+    refcount = IDWriteFactory3_Release(factory);
     ok(refcount == 0, "factory not released, %u\n", refcount);
     DELETE_FONTFILE(path);
 }
@@ -7370,8 +7406,7 @@ static void test_HasKerningPairs(void)
 
 static void test_ComputeGlyphOrigins(void)
 {
-    IDWriteFactory4 *factory4;
-    IDWriteFactory *factory;
+    IDWriteFactory4 *factory;
     DWRITE_GLYPH_RUN run;
     HRESULT hr;
     D2D1_POINT_2F origins[2];
@@ -7381,10 +7416,8 @@ static void test_ComputeGlyphOrigins(void)
     DWRITE_MATRIX m;
     ULONG ref;
 
-    factory = create_factory();
-    hr = IDWriteFactory_QueryInterface(factory, &IID_IDWriteFactory4, (void **)&factory4);
-    IDWriteFactory_Release(factory);
-    if (FAILED(hr)) {
+    factory = create_factory_iid(&IID_IDWriteFactory4);
+    if (!factory) {
         win_skip("ComputeGlyphOrigins() is not supported.\n");
         return;
     }
@@ -7405,13 +7438,13 @@ static void test_ComputeGlyphOrigins(void)
     baseline_origin.y = 321.0f;
 
     memset(origins, 0, sizeof(origins));
-    hr = IDWriteFactory4_ComputeGlyphOrigins_(factory4, &run, baseline_origin, origins);
+    hr = IDWriteFactory4_ComputeGlyphOrigins_(factory, &run, baseline_origin, origins);
     ok(hr == S_OK, "got 0x%08x\n", hr);
     ok(origins[0].x == 123.0f && origins[0].y == 321.0f, "origins[0] %f,%f\n", origins[0].x, origins[0].y);
     ok(origins[1].x == 133.0f && origins[1].y == 321.0f, "origins[1] %f,%f\n", origins[1].x, origins[1].y);
 
     memset(origins, 0, sizeof(origins));
-    hr = IDWriteFactory4_ComputeGlyphOrigins(factory4, &run, DWRITE_MEASURING_MODE_NATURAL, baseline_origin,
+    hr = IDWriteFactory4_ComputeGlyphOrigins(factory, &run, DWRITE_MEASURING_MODE_NATURAL, baseline_origin,
         NULL, origins);
     ok(origins[0].x == 123.0f && origins[0].y == 321.0f, "origins[0] %f,%f\n", origins[0].x, origins[0].y);
     ok(origins[1].x == 133.0f && origins[1].y == 321.0f, "origins[1] %f,%f\n", origins[1].x, origins[1].y);
@@ -7425,12 +7458,12 @@ static void test_ComputeGlyphOrigins(void)
     m.dy = 0.0f;
 
     memset(origins, 0, sizeof(origins));
-    hr = IDWriteFactory4_ComputeGlyphOrigins(factory4, &run, DWRITE_MEASURING_MODE_NATURAL, baseline_origin,
+    hr = IDWriteFactory4_ComputeGlyphOrigins(factory, &run, DWRITE_MEASURING_MODE_NATURAL, baseline_origin,
         &m, origins);
     ok(origins[0].x == 123.0f && origins[0].y == 321.0f, "origins[0] %f,%f\n", origins[0].x, origins[0].y);
     ok(origins[1].x == 133.0f && origins[1].y == 321.0f, "origins[1] %f,%f\n", origins[1].x, origins[1].y);
 
-    ref = IDWriteFactory4_Release(factory4);
+    ref = IDWriteFactory4_Release(factory);
     ok(ref == 0, "factory not released, %u\n", ref);
 }
 
@@ -7648,32 +7681,28 @@ static void test_inmemory_file_loader(void)
     UINT64 file_size, size, writetime;
     IDWriteFontFile *file, *file2;
     IDWriteFontFace *fontface;
-    IDWriteFactory5 *factory5;
     void *context, *context2;
-    IDWriteFactory *factory;
+    IDWriteFactory5 *factory;
     UINT32 count, key_size;
     DWORD ref_key;
     HRESULT hr;
     ULONG ref;
 
-    factory = create_factory();
-
-    hr = IDWriteFactory_QueryInterface(factory, &IID_IDWriteFactory5, (void **)&factory5);
-    IDWriteFactory_Release(factory);
-    if (FAILED(hr)) {
-        win_skip("CreateInMemoryFontFileLoader is not supported\n");
+    factory = create_factory_iid(&IID_IDWriteFactory5);
+    if (!factory) {
+        win_skip("CreateInMemoryFontFileLoader() is not supported\n");
         return;
     }
 
-    EXPECT_REF(factory5, 1);
-    hr = IDWriteFactory5_CreateInMemoryFontFileLoader(factory5, &loader);
+    EXPECT_REF(factory, 1);
+    hr = IDWriteFactory5_CreateInMemoryFontFileLoader(factory, &loader);
     ok(hr == S_OK, "got %#x\n", hr);
-    EXPECT_REF(factory5, 1);
+    EXPECT_REF(factory, 1);
 
     testowner_init(&ownerobject);
-    fontface = create_fontface((IDWriteFactory *)factory5);
+    fontface = create_fontface((IDWriteFactory *)factory);
 
-    hr = IDWriteFactory5_CreateInMemoryFontFileLoader(factory5, &loader2);
+    hr = IDWriteFactory5_CreateInMemoryFontFileLoader(factory, &loader2);
     ok(hr == S_OK, "got %#x\n", hr);
     ok(loader != loader2, "unexpected pointer\n");
     IDWriteFontFileLoader_Release(loader2);
@@ -7709,19 +7738,19 @@ static void test_inmemory_file_loader(void)
     ok(hr == S_OK, "got %#x\n", hr);
 
     /* Not registered yet. */
-    hr = IDWriteInMemoryFontFileLoader_CreateInMemoryFontFileReference(inmemory, (IDWriteFactory *)factory5, data,
+    hr = IDWriteInMemoryFontFileLoader_CreateInMemoryFontFileReference(inmemory, (IDWriteFactory *)factory, data,
         file_size, NULL, &file);
     ok(hr == E_INVALIDARG, "got %#x\n", hr);
 
     count = IDWriteInMemoryFontFileLoader_GetFileCount(inmemory);
     ok(count == 1, "Unexpected file count %u.\n", count);
 
-    hr = IDWriteFactory5_RegisterFontFileLoader(factory5, (IDWriteFontFileLoader *)inmemory);
+    hr = IDWriteFactory5_RegisterFontFileLoader(factory, (IDWriteFontFileLoader *)inmemory);
     ok(hr == S_OK, "got %#x\n", hr);
     EXPECT_REF(inmemory, 2);
 
     EXPECT_REF(&ownerobject.IUnknown_iface, 1);
-    hr = IDWriteInMemoryFontFileLoader_CreateInMemoryFontFileReference(inmemory, (IDWriteFactory *)factory5, data,
+    hr = IDWriteInMemoryFontFileLoader_CreateInMemoryFontFileReference(inmemory, (IDWriteFactory *)factory, data,
         file_size, &ownerobject.IUnknown_iface, &file);
     ok(hr == S_OK, "got %#x\n", hr);
     EXPECT_REF(&ownerobject.IUnknown_iface, 2);
@@ -7730,7 +7759,7 @@ static void test_inmemory_file_loader(void)
     count = IDWriteInMemoryFontFileLoader_GetFileCount(inmemory);
     ok(count == 2, "Unexpected file count %u.\n", count);
 
-    hr = IDWriteInMemoryFontFileLoader_CreateInMemoryFontFileReference(inmemory, (IDWriteFactory *)factory5, data,
+    hr = IDWriteInMemoryFontFileLoader_CreateInMemoryFontFileReference(inmemory, (IDWriteFactory *)factory, data,
         file_size, &ownerobject.IUnknown_iface, &file2);
     ok(hr == S_OK, "got %#x\n", hr);
     ok(file2 != file, "got unexpected file\n");
@@ -7784,7 +7813,7 @@ static void test_inmemory_file_loader(void)
     count = IDWriteInMemoryFontFileLoader_GetFileCount(inmemory);
     ok(count == 3, "Unexpected file count %u.\n", count);
 
-    hr = IDWriteFactory5_UnregisterFontFileLoader(factory5, (IDWriteFontFileLoader *)inmemory);
+    hr = IDWriteFactory5_UnregisterFontFileLoader(factory, (IDWriteFontFileLoader *)inmemory);
     ok(hr == S_OK, "got %#x\n", hr);
     EXPECT_REF(&ownerobject.IUnknown_iface, 3);
 
@@ -7794,21 +7823,21 @@ static void test_inmemory_file_loader(void)
     EXPECT_REF(&ownerobject.IUnknown_iface, 1);
 
     /* Test reference key for first added file. */
-    hr = IDWriteFactory5_CreateInMemoryFontFileLoader(factory5, &loader);
+    hr = IDWriteFactory5_CreateInMemoryFontFileLoader(factory, &loader);
     ok(hr == S_OK, "Failed to create loader, hr %#x.\n", hr);
 
     hr = IDWriteFontFileLoader_QueryInterface(loader, &IID_IDWriteInMemoryFontFileLoader, (void **)&inmemory);
     ok(hr == S_OK, "Failed to get in-memory interface, hr %#x.\n", hr);
     IDWriteFontFileLoader_Release(loader);
 
-    hr = IDWriteFactory5_RegisterFontFileLoader(factory5, (IDWriteFontFileLoader *)inmemory);
+    hr = IDWriteFactory5_RegisterFontFileLoader(factory, (IDWriteFontFileLoader *)inmemory);
     ok(hr == S_OK, "Failed to register loader, hr %#x.\n", hr);
 
     ref_key = 0;
     hr = IDWriteInMemoryFontFileLoader_CreateStreamFromKey(inmemory, &ref_key, sizeof(ref_key), &stream2);
     ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
 
-    hr = IDWriteInMemoryFontFileLoader_CreateInMemoryFontFileReference(inmemory, (IDWriteFactory *)factory5, data,
+    hr = IDWriteInMemoryFontFileLoader_CreateInMemoryFontFileReference(inmemory, (IDWriteFactory *)factory, data,
         file_size, &ownerobject.IUnknown_iface, &file);
     ok(hr == S_OK, "Failed to create in-memory file reference, hr %#x.\n", hr);
 
@@ -7861,14 +7890,14 @@ static void test_inmemory_file_loader(void)
     count = IDWriteInMemoryFontFileLoader_GetFileCount(inmemory);
     ok(count == 1, "Unexpected file count %u.\n", count);
 
-    hr = IDWriteFactory5_UnregisterFontFileLoader(factory5, (IDWriteFontFileLoader *)inmemory);
+    hr = IDWriteFactory5_UnregisterFontFileLoader(factory, (IDWriteFontFileLoader *)inmemory);
     ok(hr == S_OK, "Failed to unregister loader, hr %#x.\n", hr);
 
     IDWriteFontFileStream_ReleaseFileFragment(stream, context);
     IDWriteFontFileStream_Release(stream);
     IDWriteFontFace_Release(fontface);
 
-    ref = IDWriteFactory5_Release(factory5);
+    ref = IDWriteFactory5_Release(factory);
     ok(ref == 0, "factory not released, %u\n", ref);
 }
 
@@ -8156,6 +8185,59 @@ static void test_localfontfileloader(void)
     DELETE_FONTFILE(path);
 }
 
+static void test_AnalyzeContainerType(void)
+{
+    struct WOFFHeader2 woff2_header;
+    struct WOFFHeader woff_header;
+    DWRITE_CONTAINER_TYPE type;
+    IDWriteFactory5 *factory;
+
+    factory = create_factory_iid(&IID_IDWriteFactory5);
+    if (!factory) {
+        win_skip("AnalyzeContainerType() is not supported.\n");
+        return;
+    }
+
+    type = IDWriteFactory5_AnalyzeContainerType(factory, NULL, 0);
+    ok(type == DWRITE_CONTAINER_TYPE_UNKNOWN, "Unexpected container type %u.\n", type);
+
+    type = IDWriteFactory5_AnalyzeContainerType(factory, (void const *)0xdeadbeef, 0);
+    ok(type == DWRITE_CONTAINER_TYPE_UNKNOWN, "Unexpected container type %u.\n", type);
+
+    memset(&woff_header, 0xff, sizeof(woff_header));
+    woff_header.signature = GET_LE_DWORD(MS_WOFF_TAG);
+    woff_header.length = 0;
+    type = IDWriteFactory5_AnalyzeContainerType(factory, &woff_header, sizeof(woff_header));
+    ok(type == DWRITE_CONTAINER_TYPE_WOFF, "Unexpected container type %u.\n", type);
+
+    memset(&woff_header, 0xff, sizeof(woff_header));
+    woff_header.signature = GET_LE_DWORD(MS_WOFF_TAG);
+    type = IDWriteFactory5_AnalyzeContainerType(factory, &woff_header, sizeof(woff_header.signature));
+    ok(type == DWRITE_CONTAINER_TYPE_WOFF, "Unexpected container type %u.\n", type);
+
+    memset(&woff_header, 0xff, sizeof(woff_header));
+    woff_header.signature = GET_LE_DWORD(MS_WOFF_TAG);
+    type = IDWriteFactory5_AnalyzeContainerType(factory, &woff_header, sizeof(woff_header.signature) - 1);
+    ok(type == DWRITE_CONTAINER_TYPE_UNKNOWN, "Unexpected container type %u.\n", type);
+
+    memset(&woff2_header, 0xff, sizeof(woff2_header));
+    woff2_header.signature = GET_LE_DWORD(MS_WOF2_TAG);
+    type = IDWriteFactory5_AnalyzeContainerType(factory, &woff2_header, sizeof(woff2_header));
+    ok(type == DWRITE_CONTAINER_TYPE_WOFF2, "Unexpected container type %u.\n", type);
+
+    memset(&woff2_header, 0xff, sizeof(woff2_header));
+    woff2_header.signature = GET_LE_DWORD(MS_WOF2_TAG);
+    type = IDWriteFactory5_AnalyzeContainerType(factory, &woff2_header, sizeof(woff2_header.signature));
+    ok(type == DWRITE_CONTAINER_TYPE_WOFF2, "Unexpected container type %u.\n", type);
+
+    memset(&woff2_header, 0xff, sizeof(woff2_header));
+    woff2_header.signature = GET_LE_DWORD(MS_WOF2_TAG);
+    type = IDWriteFactory5_AnalyzeContainerType(factory, &woff2_header, sizeof(woff2_header.signature) - 1);
+    ok(type == DWRITE_CONTAINER_TYPE_UNKNOWN, "Unexpected container type %u.\n", type);
+
+    IDWriteFactory5_Release(factory);
+}
+
 START_TEST(font)
 {
     IDWriteFactory *factory;
@@ -8221,6 +8303,7 @@ START_TEST(font)
     test_GetGlyphImageFormats();
     test_CreateCustomRenderingParams();
     test_localfontfileloader();
+    test_AnalyzeContainerType();
 
     IDWriteFactory_Release(factory);
 }
-- 
2.14.2




More information about the wine-patches mailing list