• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © 2018  Ebrahim Byagowi
3  *
4  *  This is part of HarfBuzz, a text shaping library.
5  *
6  * Permission is hereby granted, without written agreement and without
7  * license or royalty fees, to use, copy, modify, and distribute this
8  * software and its documentation for any purpose, provided that the
9  * above copyright notice and the following two paragraphs appear in
10  * all copies of this software.
11  *
12  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16  * DAMAGE.
17  *
18  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23  */
24 
25 #ifndef HB_OT_COLOR_COLR_TABLE_HH
26 #define HB_OT_COLOR_COLR_TABLE_HH
27 
28 #include "hb-open-type.hh"
29 
30 /*
31  * COLR -- Color
32  * https://docs.microsoft.com/en-us/typography/opentype/spec/colr
33  */
34 #define HB_OT_TAG_COLR HB_TAG('C','O','L','R')
35 
36 
37 namespace OT {
38 
39 
40 struct LayerRecord
41 {
sanitizeOT::LayerRecord42   bool sanitize (hb_sanitize_context_t *c) const
43   {
44     TRACE_SANITIZE (this);
45     return_trace (c->check_struct (this));
46   }
47 
48   public:
49   GlyphID	glyphId;	/* Glyph ID of layer glyph */
50   Index		colorIdx;	/* Index value to use with a
51 				 * selected color palette.
52 				 * An index value of 0xFFFF
53 				 * is a special case indicating
54 				 * that the text foreground
55 				 * color (defined by a
56 				 * higher-level client) should
57 				 * be used and shall not be
58 				 * treated as actual index
59 				 * into CPAL ColorRecord array. */
60   public:
61   DEFINE_SIZE_STATIC (4);
62 };
63 
64 struct BaseGlyphRecord
65 {
cmpOT::BaseGlyphRecord66   int cmp (hb_codepoint_t g) const
67   { return g < glyphId ? -1 : g > glyphId ? 1 : 0; }
68 
sanitizeOT::BaseGlyphRecord69   bool sanitize (hb_sanitize_context_t *c) const
70   {
71     TRACE_SANITIZE (this);
72     return_trace (likely (c->check_struct (this)));
73   }
74 
75   public:
76   GlyphID	glyphId;	/* Glyph ID of reference glyph */
77   HBUINT16	firstLayerIdx;	/* Index (from beginning of
78 				 * the Layer Records) to the
79 				 * layer record. There will be
80 				 * numLayers consecutive entries
81 				 * for this base glyph. */
82   HBUINT16	numLayers;	/* Number of color layers
83 				 * associated with this glyph */
84   public:
85   DEFINE_SIZE_STATIC (6);
86 };
87 
88 struct COLR
89 {
90   enum { tableTag = HB_OT_TAG_COLR };
91 
has_dataOT::COLR92   bool has_data () const { return numBaseGlyphs; }
93 
get_glyph_layersOT::COLR94   unsigned int get_glyph_layers (hb_codepoint_t       glyph,
95 				 unsigned int         start_offset,
96 				 unsigned int        *count, /* IN/OUT.  May be NULL. */
97 				 hb_ot_color_layer_t *layers /* OUT.     May be NULL. */) const
98   {
99     const BaseGlyphRecord &record = (this+baseGlyphsZ).bsearch (numBaseGlyphs, glyph);
100 
101     hb_array_t<const LayerRecord> all_layers ((this+layersZ).arrayZ, numLayers);
102     hb_array_t<const LayerRecord> glyph_layers = all_layers.sub_array (record.firstLayerIdx,
103 								       record.numLayers);
104     if (count)
105     {
106       hb_array_t<const LayerRecord> segment_layers = glyph_layers.sub_array (start_offset, *count);
107       *count = segment_layers.len;
108       for (unsigned int i = 0; i < segment_layers.len; i++)
109       {
110         layers[i].glyph = segment_layers.arrayZ[i].glyphId;
111         layers[i].color_index = segment_layers.arrayZ[i].colorIdx;
112       }
113     }
114     return glyph_layers.len;
115   }
116 
sanitizeOT::COLR117   bool sanitize (hb_sanitize_context_t *c) const
118   {
119     TRACE_SANITIZE (this);
120     return_trace (likely (c->check_struct (this) &&
121 			  (this+baseGlyphsZ).sanitize (c, numBaseGlyphs) &&
122 			  (this+layersZ).sanitize (c, numLayers)));
123   }
124 
125   protected:
126   HBUINT16	version;	/* Table version number (starts at 0). */
127   HBUINT16	numBaseGlyphs;	/* Number of Base Glyph Records. */
128   LOffsetTo<SortedUnsizedArrayOf<BaseGlyphRecord>, false>
129 		baseGlyphsZ;	/* Offset to Base Glyph records. */
130   LOffsetTo<UnsizedArrayOf<LayerRecord>, false>
131 		layersZ;	/* Offset to Layer Records. */
132   HBUINT16	numLayers;	/* Number of Layer Records. */
133   public:
134   DEFINE_SIZE_STATIC (14);
135 };
136 
137 } /* namespace OT */
138 
139 
140 #endif /* HB_OT_COLOR_COLR_TABLE_HH */
141