< prev index next >

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

Print this page

        

*** 26,83 **** */ #ifndef HB_OT_COLOR_CPAL_TABLE_HH #define HB_OT_COLOR_CPAL_TABLE_HH ! #include "hb-open-type-private.hh" ! ! ! /* ! * Following parts to be moved to a public header. ! */ ! ! /** ! * hb_ot_color_t: ! * ARGB data type for holding color values. ! * ! * Since: REPLACEME ! */ ! typedef uint32_t hb_ot_color_t; ! ! ! /** ! * hb_ot_color_palette_flags_t: ! * @HB_OT_COLOR_PALETTE_FLAG_DEFAULT: default indicating that there is nothing special to note about a color palette. ! * @HB_OT_COLOR_PALETTE_FLAG_FOR_LIGHT_BACKGROUND: flag indicating that the color palette is suitable for rendering text on light background. ! * @HB_OT_COLOR_PALETTE_FLAG_FOR_DARK_BACKGROUND: flag indicating that the color palette is suitable for rendering text on dark background. ! * ! * Since: REPLACEME ! */ ! typedef enum { /*< flags >*/ ! HB_OT_COLOR_PALETTE_FLAG_DEFAULT = 0x00000000u, ! HB_OT_COLOR_PALETTE_FLAG_FOR_LIGHT_BACKGROUND = 0x00000001u, ! HB_OT_COLOR_PALETTE_FLAG_FOR_DARK_BACKGROUND = 0x00000002u, ! } hb_ot_color_palette_flags_t; ! ! // HB_EXTERN unsigned int ! // hb_ot_color_get_palette_count (hb_face_t *face); ! ! // HB_EXTERN unsigned int ! // hb_ot_color_get_palette_name_id (hb_face_t *face, unsigned int palette); ! ! // HB_EXTERN hb_ot_color_palette_flags_t ! // hb_ot_color_get_palette_flags (hb_face_t *face, unsigned int palette); ! ! // HB_EXTERN unsigned int ! // hb_ot_color_get_palette_colors (hb_face_t *face, ! // unsigned int palette, /* default=0 */ ! // unsigned int start_offset, ! // unsigned int *color_count /* IN/OUT */, ! // hb_ot_color_t *colors /* OUT */); ! ! ! /* * CPAL -- Color Palette * https://docs.microsoft.com/en-us/typography/opentype/spec/cpal --- 26,38 ---- */ #ifndef HB_OT_COLOR_CPAL_TABLE_HH #define HB_OT_COLOR_CPAL_TABLE_HH ! #include "hb-open-type.hh" ! #include "hb-ot-color.h" ! #include "hb-ot-name.h" /* * CPAL -- Color Palette * https://docs.microsoft.com/en-us/typography/opentype/spec/cpal
*** 90,215 **** struct CPALV1Tail { friend struct CPAL; ! inline bool ! sanitize (hb_sanitize_context_t *c, const void *base, unsigned int palettes) const { ! TRACE_SANITIZE (this); ! return_trace (c->check_struct (this) && ! (base+paletteFlagsZ).sanitize (c, palettes) && ! (base+paletteLabelZ).sanitize (c, palettes) && ! (base+paletteEntryLabelZ).sanitize (c, palettes)); } ! private: ! inline hb_ot_color_palette_flags_t ! get_palette_flags (const void *base, unsigned int palette) const { ! // range checked at the CPAL caller ! return (hb_ot_color_palette_flags_t) (uint32_t) (base+paletteFlagsZ)[palette]; } ! inline unsigned int ! get_palette_name_id (const void *base, unsigned int palette) const { ! // range checked at the CPAL caller ! return (base+paletteLabelZ)[palette]; } protected: ! LOffsetTo<UnsizedArrayOf<HBUINT32> > paletteFlagsZ; /* Offset from the beginning of CPAL table to * the Palette Type Array. Set to 0 if no array * is provided. */ ! LOffsetTo<UnsizedArrayOf<HBUINT16> > ! paletteLabelZ; /* Offset from the beginning of CPAL table to ! * the Palette Labels Array. Set to 0 if no * array is provided. */ ! LOffsetTo<UnsizedArrayOf<HBUINT16> > ! paletteEntryLabelZ; /* Offset from the beginning of CPAL table to ! * the Palette Entry Label Array. Set to 0 * if no array is provided. */ public: DEFINE_SIZE_STATIC (12); }; typedef HBUINT32 BGRAColor; struct CPAL { ! static const hb_tag_t tableTag = HB_OT_TAG_CPAL; ! inline bool sanitize (hb_sanitize_context_t *c) const ! { ! TRACE_SANITIZE (this); ! if (unlikely (!(c->check_struct (this) && // it checks colorRecordIndices also ! // see #get_size ! (this+colorRecordsZ).sanitize (c, numColorRecords)))) ! return_trace (false); ! // Check for indices sanity so no need for doing it runtime ! for (unsigned int i = 0; i < numPalettes; ++i) ! if (unlikely (colorRecordIndicesZ[i] + numPaletteEntries > numColorRecords)) ! return_trace (false); ! // If version is zero, we are done here; otherwise we need to check tail also ! if (version == 0) ! return_trace (true); ! ! const CPALV1Tail &v1 = StructAfter<CPALV1Tail> (*this); ! return_trace (likely (v1.sanitize (c, this, numPalettes))); ! } ! inline unsigned int get_size (void) const ! { ! return min_size + numPalettes * sizeof (HBUINT16); ! } ! inline hb_ot_color_palette_flags_t get_palette_flags (unsigned int palette) const ! { ! if (unlikely (version == 0 || palette >= numPalettes)) ! return HB_OT_COLOR_PALETTE_FLAG_DEFAULT; ! const CPALV1Tail& cpal1 = StructAfter<CPALV1Tail> (*this); ! return cpal1.get_palette_flags (this, palette); ! } ! inline unsigned int get_palette_name_id (unsigned int palette) const { ! if (unlikely (version == 0 || palette >= numPalettes)) ! return 0xFFFF; ! ! const CPALV1Tail& cpal1 = StructAfter<CPALV1Tail> (*this); ! return cpal1.get_palette_name_id (this, palette); } ! inline unsigned int get_palette_count () const { ! return numPalettes; } ! inline hb_ot_color_t ! get_color_record_argb (unsigned int color_index, unsigned int palette) const { ! if (unlikely (color_index >= numPaletteEntries || palette >= numPalettes)) ! return 0; ! ! // No need for more range check as it is already done on #sanitize ! const UnsizedArrayOf<BGRAColor>& color_records = this+colorRecordsZ; ! return color_records[colorRecordIndicesZ[palette] + color_index]; } protected: HBUINT16 version; /* Table version number */ /* Version 0 */ ! HBUINT16 numPaletteEntries; /* Number of palette entries in each palette. */ HBUINT16 numPalettes; /* Number of palettes in the table. */ HBUINT16 numColorRecords; /* Total number of color records, combined for * all palettes. */ ! LOffsetTo<UnsizedArrayOf<BGRAColor> > colorRecordsZ; /* Offset from the beginning of CPAL table to * the first ColorRecord. */ UnsizedArrayOf<HBUINT16> colorRecordIndicesZ; /* Index of each palette’s first color record in * the combined color record array. */ --- 45,184 ---- struct CPALV1Tail { friend struct CPAL; ! private: ! hb_ot_color_palette_flags_t get_palette_flags (const void *base, ! unsigned int palette_index, ! unsigned int palette_count) const { ! if (!paletteFlagsZ) return HB_OT_COLOR_PALETTE_FLAG_DEFAULT; ! return (hb_ot_color_palette_flags_t) (uint32_t) ! (base+paletteFlagsZ).as_array (palette_count)[palette_index]; } ! hb_ot_name_id_t get_palette_name_id (const void *base, ! unsigned int palette_index, ! unsigned int palette_count) const { ! if (!paletteLabelsZ) return HB_OT_NAME_ID_INVALID; ! return (base+paletteLabelsZ).as_array (palette_count)[palette_index]; } ! hb_ot_name_id_t get_color_name_id (const void *base, ! unsigned int color_index, ! unsigned int color_count) const { ! if (!colorLabelsZ) return HB_OT_NAME_ID_INVALID; ! return (base+colorLabelsZ).as_array (color_count)[color_index]; ! } ! ! public: ! bool sanitize (hb_sanitize_context_t *c, ! const void *base, ! unsigned int palette_count, ! unsigned int color_count) const ! { ! TRACE_SANITIZE (this); ! return_trace (c->check_struct (this) && ! (!paletteFlagsZ || (base+paletteFlagsZ).sanitize (c, palette_count)) && ! (!paletteLabelsZ || (base+paletteLabelsZ).sanitize (c, palette_count)) && ! (!colorLabelsZ || (base+colorLabelsZ).sanitize (c, color_count))); } protected: ! LNNOffsetTo<UnsizedArrayOf<HBUINT32> > paletteFlagsZ; /* Offset from the beginning of CPAL table to * the Palette Type Array. Set to 0 if no array * is provided. */ ! LNNOffsetTo<UnsizedArrayOf<NameID> > ! paletteLabelsZ; /* Offset from the beginning of CPAL table to ! * the palette labels array. Set to 0 if no * array is provided. */ ! LNNOffsetTo<UnsizedArrayOf<NameID> > ! colorLabelsZ; /* Offset from the beginning of CPAL table to ! * the color labels array. Set to 0 * if no array is provided. */ public: DEFINE_SIZE_STATIC (12); }; typedef HBUINT32 BGRAColor; struct CPAL { ! static constexpr hb_tag_t tableTag = HB_OT_TAG_CPAL; ! bool has_data () const { return numPalettes; } ! unsigned int get_size () const ! { return min_size + numPalettes * sizeof (colorRecordIndicesZ[0]); } ! unsigned int get_palette_count () const { return numPalettes; } ! unsigned int get_color_count () const { return numColors; } ! hb_ot_color_palette_flags_t get_palette_flags (unsigned int palette_index) const ! { return v1 ().get_palette_flags (this, palette_index, numPalettes); } ! hb_ot_name_id_t get_palette_name_id (unsigned int palette_index) const ! { return v1 ().get_palette_name_id (this, palette_index, numPalettes); } ! hb_ot_name_id_t get_color_name_id (unsigned int color_index) const ! { return v1 ().get_color_name_id (this, color_index, numColors); } ! unsigned int get_palette_colors (unsigned int palette_index, ! unsigned int start_offset, ! unsigned int *color_count, /* IN/OUT. May be NULL. */ ! hb_color_t *colors /* OUT. May be NULL. */) const { ! if (unlikely (palette_index >= numPalettes)) ! { ! if (color_count) *color_count = 0; ! return 0; ! } ! unsigned int start_index = colorRecordIndicesZ[palette_index]; ! hb_array_t<const BGRAColor> all_colors ((this+colorRecordsZ).arrayZ, numColorRecords); ! hb_array_t<const BGRAColor> palette_colors = all_colors.sub_array (start_index, ! numColors); ! if (color_count) ! { ! hb_array_t<const BGRAColor> segment_colors = palette_colors.sub_array (start_offset, *color_count); ! /* Always return numColors colors per palette even if it has out-of-bounds start index. */ ! unsigned int count = MIN<unsigned int> (MAX<int> (numColors - start_offset, 0), *color_count); ! *color_count = count; ! for (unsigned int i = 0; i < count; i++) ! colors[i] = segment_colors[i]; /* Bound-checked read. */ ! } ! return numColors; } ! private: ! const CPALV1Tail& v1 () const { ! if (version == 0) return Null(CPALV1Tail); ! return StructAfter<CPALV1Tail> (*this); } ! public: ! bool sanitize (hb_sanitize_context_t *c) const { ! TRACE_SANITIZE (this); ! return_trace (c->check_struct (this) && ! (this+colorRecordsZ).sanitize (c, numColorRecords) && ! colorRecordIndicesZ.sanitize (c, numPalettes) && ! (version == 0 || v1 ().sanitize (c, this, numPalettes, numColors))); } protected: HBUINT16 version; /* Table version number */ /* Version 0 */ ! HBUINT16 numColors; /* Number of colors in each palette. */ HBUINT16 numPalettes; /* Number of palettes in the table. */ HBUINT16 numColorRecords; /* Total number of color records, combined for * all palettes. */ ! LNNOffsetTo<UnsizedArrayOf<BGRAColor> > colorRecordsZ; /* Offset from the beginning of CPAL table to * the first ColorRecord. */ UnsizedArrayOf<HBUINT16> colorRecordIndicesZ; /* Index of each palette’s first color record in * the combined color record array. */
< prev index next >