[CBDT] Implement IndexSubtableFormat3
authorBehdad Esfahbod <behdad@behdad.org>
Mon, 5 Dec 2016 03:26:54 +0000 (19:26 -0800)
committerBehdad Esfahbod <behdad@behdad.org>
Mon, 5 Dec 2016 03:26:54 +0000 (19:26 -0800)
src/hb-ot-cbdt-table.hh

index 4770cf3..3bf5794 100644 (file)
@@ -100,7 +100,8 @@ struct IndexSubtableHeader
   DEFINE_SIZE_STATIC(8);
 };
 
-struct IndexSubtableFormat1
+template <typename OffsetType>
+struct IndexSubtableFormat1Or3
 {
   inline bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const
   {
@@ -122,11 +123,14 @@ struct IndexSubtableFormat1
   }
 
   IndexSubtableHeader header;
-  Offset<ULONG> offsetArrayZ[VAR];
+  Offset<OffsetType> offsetArrayZ[VAR];
 
   DEFINE_SIZE_ARRAY(8, offsetArrayZ);
 };
 
+struct IndexSubtableFormat1 : IndexSubtableFormat1Or3<ULONG> {};
+struct IndexSubtableFormat3 : IndexSubtableFormat1Or3<USHORT> {};
+
 struct IndexSubtable
 {
   inline bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const
@@ -135,6 +139,7 @@ struct IndexSubtable
     if (!u.header.sanitize (c)) return_trace (false);
     switch (u.header.indexFormat) {
     case 1: return_trace (u.format1.sanitize (c, glyph_count));
+    case 3: return_trace (u.format3.sanitize (c, glyph_count));
     default:return_trace (true);
     }
   }
@@ -156,6 +161,7 @@ struct IndexSubtable
     *format = u.header.imageFormat;
     switch (u.header.indexFormat) {
     case 1: return u.format1.get_image_data (idx, offset, length);
+    case 3: return u.format3.get_image_data (idx, offset, length);
     default: return false;
     }
   }
@@ -164,6 +170,7 @@ struct IndexSubtable
   union {
   IndexSubtableHeader  header;
   IndexSubtableFormat1 format1;
+  IndexSubtableFormat3 format3;
   } u;
   public:
   DEFINE_SIZE_UNION (8, header);