< prev index next >

src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-color-colr-table.hh

Print this page

        

*** 23,33 **** */ #ifndef HB_OT_COLOR_COLR_TABLE_HH #define HB_OT_COLOR_COLR_TABLE_HH ! #include "hb-open-type-private.hh" /* * COLR -- Color * https://docs.microsoft.com/en-us/typography/opentype/spec/colr */ --- 23,33 ---- */ #ifndef HB_OT_COLOR_COLR_TABLE_HH #define HB_OT_COLOR_COLR_TABLE_HH ! #include "hb-open-type.hh" /* * COLR -- Color * https://docs.microsoft.com/en-us/typography/opentype/spec/colr */
*** 37,141 **** namespace OT { struct LayerRecord { ! friend struct COLR; ! ! inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this)); } ! protected: ! GlyphID glyphid; /* Glyph ID of layer glyph */ ! HBUINT16 colorIdx; /* Index value to use with a selected color palette */ public: DEFINE_SIZE_STATIC (4); }; struct BaseGlyphRecord { ! friend struct COLR; ! inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this))); } ! inline int cmp (hb_codepoint_t g) const { ! return g < glyphid ? -1 : g > glyphid ? 1 : 0; ! } ! ! protected: ! GlyphID glyphid; /* Glyph ID of reference glyph */ ! HBUINT16 firstLayerIdx; /* Index to the layer record */ ! HBUINT16 numLayers; /* Number of color layers associated with this glyph */ public: DEFINE_SIZE_STATIC (6); }; - static int compare_bgr (const void *pa, const void *pb) - { - const hb_codepoint_t *a = (const hb_codepoint_t *) pa; - const BaseGlyphRecord *b = (const BaseGlyphRecord *) pb; - return b->cmp (*a); - } - struct COLR { ! static const hb_tag_t tableTag = HB_OT_TAG_COLR; ! inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && (this+baseGlyphsZ).sanitize (c, numBaseGlyphs) && (this+layersZ).sanitize (c, numLayers))); } - inline bool get_base_glyph_record (hb_codepoint_t glyph_id, - unsigned int *first_layer /* OUT */, - unsigned int *num_layers /* OUT */) const - { - const BaseGlyphRecord* record; - record = (BaseGlyphRecord *) bsearch (&glyph_id, &(this+baseGlyphsZ), numBaseGlyphs, - sizeof (BaseGlyphRecord), compare_bgr); - if (unlikely (!record)) - return false; - - *first_layer = record->firstLayerIdx; - *num_layers = record->numLayers; - return true; - } - - inline bool get_layer_record (unsigned int record, - hb_codepoint_t *glyph_id /* OUT */, - unsigned int *palette_index /* OUT */) const - { - if (unlikely (record >= numLayers)) - { - *glyph_id = 0; - *palette_index = 0xFFFF; - return false; - } - const LayerRecord &layer = (this+layersZ)[record]; - *glyph_id = layer.glyphid; - *palette_index = layer.colorIdx; - return true; - } - protected: ! HBUINT16 version; /* Table version number */ ! HBUINT16 numBaseGlyphs; /* Number of Base Glyph Records */ ! LOffsetTo<UnsizedArrayOf<BaseGlyphRecord> > baseGlyphsZ; /* Offset to Base Glyph records. */ ! LOffsetTo<UnsizedArrayOf<LayerRecord> > ! layersZ; /* Offset to Layer Records */ ! HBUINT16 numLayers; /* Number of Layer Records */ public: DEFINE_SIZE_STATIC (14); }; } /* namespace OT */ --- 37,137 ---- namespace OT { struct LayerRecord { ! bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this)); } ! public: ! GlyphID glyphId; /* Glyph ID of layer glyph */ ! Index colorIdx; /* Index value to use with a ! * selected color palette. ! * An index value of 0xFFFF ! * is a special case indicating ! * that the text foreground ! * color (defined by a ! * higher-level client) should ! * be used and shall not be ! * treated as actual index ! * into CPAL ColorRecord array. */ public: DEFINE_SIZE_STATIC (4); }; struct BaseGlyphRecord { ! int cmp (hb_codepoint_t g) const ! { return g < glyphId ? -1 : g > glyphId ? 1 : 0; } ! bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this))); } ! public: ! GlyphID glyphId; /* Glyph ID of reference glyph */ ! HBUINT16 firstLayerIdx; /* Index (from beginning of ! * the Layer Records) to the ! * layer record. There will be ! * numLayers consecutive entries ! * for this base glyph. */ ! HBUINT16 numLayers; /* Number of color layers ! * associated with this glyph */ public: DEFINE_SIZE_STATIC (6); }; struct COLR { ! static constexpr hb_tag_t tableTag = HB_OT_TAG_COLR; ! ! bool has_data () const { return numBaseGlyphs; } ! unsigned int get_glyph_layers (hb_codepoint_t glyph, ! unsigned int start_offset, ! unsigned int *count, /* IN/OUT. May be NULL. */ ! hb_ot_color_layer_t *layers /* OUT. May be NULL. */) const ! { ! const BaseGlyphRecord &record = (this+baseGlyphsZ).bsearch (numBaseGlyphs, glyph); ! ! hb_array_t<const LayerRecord> all_layers ((this+layersZ).arrayZ, numLayers); ! hb_array_t<const LayerRecord> glyph_layers = all_layers.sub_array (record.firstLayerIdx, ! record.numLayers); ! if (count) ! { ! hb_array_t<const LayerRecord> segment_layers = glyph_layers.sub_array (start_offset, *count); ! *count = segment_layers.length; ! for (unsigned int i = 0; i < segment_layers.length; i++) ! { ! layers[i].glyph = segment_layers.arrayZ[i].glyphId; ! layers[i].color_index = segment_layers.arrayZ[i].colorIdx; ! } ! } ! return glyph_layers.length; ! } ! ! bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && (this+baseGlyphsZ).sanitize (c, numBaseGlyphs) && (this+layersZ).sanitize (c, numLayers))); } protected: ! HBUINT16 version; /* Table version number (starts at 0). */ ! HBUINT16 numBaseGlyphs; /* Number of Base Glyph Records. */ ! LNNOffsetTo<SortedUnsizedArrayOf<BaseGlyphRecord> > baseGlyphsZ; /* Offset to Base Glyph records. */ ! LNNOffsetTo<UnsizedArrayOf<LayerRecord> > ! layersZ; /* Offset to Layer Records. */ ! HBUINT16 numLayers; /* Number of Layer Records. */ public: DEFINE_SIZE_STATIC (14); }; } /* namespace OT */
< prev index next >