Nikolay Sivov : dwrite: Don't create enumerator with invalid palette.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Feb 8 10:09:21 CST 2016


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

Author: Nikolay Sivov <bunglehead at gmail.com>
Date:   Mon Feb  8 12:31:17 2016 +0300

dwrite: Don't create enumerator with invalid palette.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dwrite/font.c       |  2 +-
 dlls/dwrite/tests/font.c | 31 +++++++++++++++++++++++++++++--
 2 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index d466612..18e4e0e 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -4643,7 +4643,7 @@ HRESULT create_colorglyphenum(FLOAT originX, FLOAT originY, const DWRITE_GLYPH_R
         return hr;
     }
 
-    colorfont = IDWriteFontFace2_IsColorFont(fontface2);
+    colorfont = IDWriteFontFace2_IsColorFont(fontface2) && IDWriteFontFace2_GetColorPaletteCount(fontface2) > palette;
     IDWriteFontFace2_Release(fontface2);
     if (!colorfont)
         return DWRITE_E_NOCOLOR;
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index b77d0cd..76d76f7 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -5137,6 +5137,7 @@ static void test_TranslateColorGlyphRun(void)
 {
     IDWriteColorGlyphRunEnumerator *layers;
     const DWRITE_COLOR_GLYPH_RUN *colorrun;
+    IDWriteFontFace2 *fontface2;
     IDWriteFontFace *fontface;
     IDWriteFactory2 *factory2;
     IDWriteFactory *factory;
@@ -5200,9 +5201,12 @@ static void test_TranslateColorGlyphRun(void)
     layers = NULL;
     hr = IDWriteFactory2_TranslateColorGlyphRun(factory2, 0.0, 0.0, &run, NULL,
         DWRITE_MEASURING_MODE_NATURAL, NULL, 0, &layers);
+todo_wine {
     ok(hr == S_OK, "got 0x%08x\n", hr);
     ok(layers != NULL, "got %p\n", layers);
+}
 
+if (layers) {
     while (1) {
         hasrun = FALSE;
         hr = IDWriteColorGlyphRunEnumerator_MoveNext(layers, &hasrun);
@@ -5219,6 +5223,26 @@ todo_wine
     ok(hr == E_NOT_VALID_STATE, "got 0x%08x\n", hr);
 
     IDWriteColorGlyphRunEnumerator_Release(layers);
+}
+    hr = IDWriteFontFace_QueryInterface(fontface, &IID_IDWriteFontFace2, (void**)&fontface2);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    /* invalid palette index */
+    layers = (void*)0xdeadbeef;
+    hr = IDWriteFactory2_TranslateColorGlyphRun(factory2, 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,
+        DWRITE_MEASURING_MODE_NATURAL, NULL, IDWriteFontFace2_GetColorPaletteCount(fontface2) - 1,
+        &layers);
+todo_wine
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+if (layers)
+    IDWriteColorGlyphRunEnumerator_Release(layers);
 
     /* color font, glyph without color info */
     codepoints[0] = 'A';
@@ -5228,10 +5252,9 @@ todo_wine
     layers = (void*)0xdeadbeef;
     hr = IDWriteFactory2_TranslateColorGlyphRun(factory2, 0.0, 0.0, &run, NULL,
         DWRITE_MEASURING_MODE_NATURAL, NULL, 0, &layers);
-todo_wine {
     ok(hr == DWRITE_E_NOCOLOR, "got 0x%08x\n", hr);
     ok(layers == NULL, "got %p\n", layers);
-}
+
     /* one glyph with, one without */
     codepoints[0] = 'A';
     codepoints[1] = 0x26c4;
@@ -5244,10 +5267,14 @@ todo_wine {
     layers = NULL;
     hr = IDWriteFactory2_TranslateColorGlyphRun(factory2, 0.0, 0.0, &run, NULL,
         DWRITE_MEASURING_MODE_NATURAL, NULL, 0, &layers);
+todo_wine {
     ok(hr == S_OK, "got 0x%08x\n", hr);
     ok(layers != NULL, "got %p\n", layers);
+}
+if (layers)
     IDWriteColorGlyphRunEnumerator_Release(layers);
 
+    IDWriteFontFace2_Release(fontface2);
     IDWriteFontFace_Release(fontface);
     IDWriteFactory2_Release(factory2);
 }




More information about the wine-cvs mailing list