[subset] add DeltasetIndexMap struct definition
diff --git a/src/hb-ot-color-colr-table.hh b/src/hb-ot-color-colr-table.hh
index bc8b322..bb71938 100644
--- a/src/hb-ot-color-colr-table.hh
+++ b/src/hb-ot-color-colr-table.hh
@@ -1043,6 +1043,87 @@
}
};
+struct DeltasetIndexMapFormat0
+{
+ friend struct DeltasetIndexMap;
+
+ private:
+ unsigned int get_width () const
+ { return ((entryFormat >> 4) & 3) + 1; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ c->check_range (mapDataZ.arrayZ,
+ mapCount,
+ get_width ()));
+ }
+
+ protected:
+ HBUINT8 format; /* Format identifier--format = 0 */
+ HBUINT8 entryFormat; /* A packed field that describes the compressed
+ * representation of delta-set indices. */
+ HBUINT16 mapCount; /* The number of mapping entries. */
+ UnsizedArrayOf<HBUINT8>
+ mapDataZ; /* The delta-set index mapping data. */
+
+ public:
+ DEFINE_SIZE_ARRAY (4, mapDataZ);
+};
+
+struct DeltasetIndexMapFormat1
+{
+ friend struct DeltasetIndexMap;
+
+ private:
+ unsigned int get_width () const
+ { return ((entryFormat >> 4) & 3) + 1; }
+
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ c->check_range (mapDataZ.arrayZ,
+ mapCount,
+ get_width ()));
+ }
+
+ protected:
+ HBUINT8 format; /* Format identifier--format = 1 */
+ HBUINT8 entryFormat; /* A packed field that describes the compressed
+ * representation of delta-set indices. */
+ HBUINT32 mapCount; /* The number of mapping entries. */
+ UnsizedArrayOf<HBUINT8>
+ mapDataZ; /* The delta-set index mapping data. */
+
+ public:
+ DEFINE_SIZE_ARRAY (6, mapDataZ);
+};
+
+struct DeltasetIndexMap
+{
+ bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ if (!u.format.sanitize (c)) return_trace (false);
+ switch (u.format) {
+ case 0: return_trace (u.format0.sanitize (c));
+ case 1: return_trace (u.format1.sanitize (c));
+ default:return_trace (true);
+ }
+ }
+
+ protected:
+ union {
+ HBUINT8 format; /* Format identifier */
+ DeltasetIndexMapFormat0 format0;
+ DeltasetIndexMapFormat1 format1;
+ } u;
+ public:
+ DEFINE_SIZE_UNION (1, format);
+};
+
struct COLR
{
static constexpr hb_tag_t tableTag = HB_OT_TAG_COLR;
@@ -1287,7 +1368,7 @@
if (version == 0) return_trace (ret);
auto snap = c->serializer->snapshot ();
- if (!c->serializer->allocate_size<void> (3 * HBUINT32::static_size)) return_trace (false);
+ if (!c->serializer->allocate_size<void> (4 * HBUINT32::static_size)) return_trace (false);
if (!colr_prime->baseGlyphList.serialize_subset (c, baseGlyphList, this))
{
if (c->serializer->in_error ()) return_trace (false);
@@ -1299,6 +1380,7 @@
if (!colr_prime->layerList.serialize_subset (c, layerList, this)) return_trace (false);
+ colr_prime->varIdxMap = 0;
colr_prime->varStore = 0;
//TODO: subset varStore once it's implemented in fonttools
return_trace (true);
@@ -1315,7 +1397,7 @@
// Version-1 additions
Offset32To<BaseGlyphList> baseGlyphList;
Offset32To<LayerList> layerList;
- //Offset32<DeltaSetIndexMap> varIdxMap; // Offset to DeltaSetIndexMap table (may be NULL)
+ Offset32To<DeltasetIndexMap> varIdxMap; // Offset to DeltasetIndexMap table (may be NULL)
Offset32To<VariationStore> varStore;
public:
DEFINE_SIZE_MIN (14);