[PATCH 2/7] dwrite: Implement GetColorPaletteCount()

Nikolay Sivov nsivov at codeweavers.com
Thu Aug 6 11:43:23 CDT 2015


---

-------------- next part --------------
>From 3498749ce11a7772a0c82329fbf738e4716ee906 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Thu, 6 Aug 2015 19:29:13 +0300
Subject: [PATCH 2/7] dwrite: Implement GetColorPaletteCount()

---
 dlls/dwrite/dwrite_private.h |  1 +
 dlls/dwrite/font.c           | 15 +++++++++++++--
 dlls/dwrite/opentype.c       | 25 +++++++++++++++++++++++++
 3 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index caa4177..7668bc9 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -153,6 +153,7 @@ extern void opentype_get_font_metrics(IDWriteFontFileStream*,DWRITE_FONT_FACE_TY
 extern HRESULT opentype_get_font_strings_from_id(const void*,DWRITE_INFORMATIONAL_STRING_ID,IDWriteLocalizedStrings**) DECLSPEC_HIDDEN;
 extern HRESULT opentype_get_typographic_features(IDWriteFontFace*,UINT32,UINT32,UINT32,UINT32*,DWRITE_FONT_FEATURE_TAG*) DECLSPEC_HIDDEN;
 extern BOOL opentype_get_vdmx_size(const void*,INT,UINT16*,UINT16*) DECLSPEC_HIDDEN;
+extern UINT32 opentype_get_cpal_palettecount(const void*) DECLSPEC_HIDDEN;
 
 enum gasp_flags {
     GASP_GRIDFIT             = 0x0001,
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index db02566..1ee97fa 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -34,6 +34,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(dwrite);
 #define MS_NAME_TAG DWRITE_MAKE_OPENTYPE_TAG('n','a','m','e')
 #define MS_VDMX_TAG DWRITE_MAKE_OPENTYPE_TAG('V','D','M','X')
 #define MS_GASP_TAG DWRITE_MAKE_OPENTYPE_TAG('g','a','s','p')
+#define MS_CPAL_TAG DWRITE_MAKE_OPENTYPE_TAG('C','P','A','L')
 
 static const IID IID_issystemcollection = {0x14d88047,0x331f,0x4cd3,{0xbc,0xa8,0x3e,0x67,0x99,0xaf,0x34,0x75}};
 
@@ -154,6 +155,7 @@ struct dwrite_fontface {
     struct dwrite_fonttable cmap;
     struct dwrite_fonttable vdmx;
     struct dwrite_fonttable gasp;
+    struct dwrite_fonttable cpal;
     DWRITE_GLYPH_METRICS *glyphs[GLYPH_MAX/GLYPH_BLOCK_SIZE];
 };
 
@@ -262,6 +264,11 @@ static inline void* get_fontface_gasp(struct dwrite_fontface *fontface, UINT32 *
     return ptr;
 }
 
+static inline void* get_fontface_cpal(struct dwrite_fontface *fontface)
+{
+    return get_fontface_table(fontface, MS_CPAL_TAG, &fontface->cpal);
+}
+
 static void release_font_data(struct dwrite_font_data *data)
 {
     int i;
@@ -338,6 +345,8 @@ static ULONG WINAPI dwritefontface_Release(IDWriteFontFace2 *iface)
             IDWriteFontFace2_ReleaseFontTable(iface, This->vdmx.context);
         if (This->gasp.context)
             IDWriteFontFace2_ReleaseFontTable(iface, This->gasp.context);
+        if (This->cpal.context)
+            IDWriteFontFace2_ReleaseFontTable(iface, This->cpal.context);
         for (i = 0; i < This->file_count; i++) {
             if (This->streams[i])
                 IDWriteFontFileStream_Release(This->streams[i]);
@@ -948,8 +957,8 @@ static BOOL WINAPI dwritefontface2_IsColorFont(IDWriteFontFace2 *iface)
 static UINT32 WINAPI dwritefontface2_GetColorPaletteCount(IDWriteFontFace2 *iface)
 {
     struct dwrite_fontface *This = impl_from_IDWriteFontFace2(iface);
-    FIXME("(%p): stub\n", This);
-    return 0;
+    TRACE("(%p)\n", This);
+    return opentype_get_cpal_palettecount(get_fontface_cpal(This));
 }
 
 static UINT32 WINAPI dwritefontface2_GetPaletteEntryCount(IDWriteFontFace2 *iface)
@@ -2476,9 +2485,11 @@ HRESULT create_fontface(DWRITE_FONT_FACE_TYPE facetype, UINT32 files_number, IDW
     memset(&fontface->cmap, 0, sizeof(fontface->cmap));
     memset(&fontface->vdmx, 0, sizeof(fontface->vdmx));
     memset(&fontface->gasp, 0, sizeof(fontface->gasp));
+    memset(&fontface->cpal, 0, sizeof(fontface->cpal));
     fontface->cmap.exists = TRUE;
     fontface->vdmx.exists = TRUE;
     fontface->gasp.exists = TRUE;
+    fontface->cpal.exists = TRUE;
     fontface->index = index;
     fontface->simulations = simulations;
     memset(fontface->glyphs, 0, sizeof(fontface->glyphs));
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index 3cb8afb..389183f 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -668,6 +668,25 @@ static const UINT16 dwriteid_to_opentypeid[DWRITE_INFORMATIONAL_STRING_POSTSCRIP
     OPENTYPE_STRING_POSTSCRIPT_CID_NAME
 };
 
+/* CPAL table */
+struct CPAL_Header_0
+{
+    USHORT version;
+    USHORT numPaletteEntries;
+    USHORT numPalette;
+    USHORT numColorRecords;
+    ULONG  offsetFirstColorRecord;
+    USHORT colorRecordIndices[1];
+};
+
+/* for version == 1, this comes after full CPAL_Header_0 */
+struct CPAL_SubHeader_1
+{
+    ULONG  offsetPaletteTypeArray;
+    ULONG  offsetPaletteLabelArray;
+    ULONG  offsetPaletteEntryLabelArray;
+};
+
 BOOL is_face_type_supported(DWRITE_FONT_FACE_TYPE type)
 {
     return (type == DWRITE_FONT_FACE_TYPE_CFF) ||
@@ -1403,3 +1422,9 @@ WORD opentype_get_gasp_flags(const WORD *ptr, UINT32 size, INT emsize)
 done:
     return flags;
 }
+
+UINT32 opentype_get_cpal_palettecount(const void *cpal)
+{
+    const struct CPAL_Header_0 *header = (const struct CPAL_Header_0*)cpal;
+    return header ? GET_BE_WORD(header->numPalette) : 0;
+}
-- 
2.1.4



More information about the wine-patches mailing list