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);
