Specification updates: known table tags, reserved flag bits, always preprocess
diff --git a/woff2/woff2.cc b/woff2/woff2.cc
index 5468280..9c3e34e 100644
--- a/woff2/woff2.cc
+++ b/woff2/woff2.cc
@@ -772,7 +772,7 @@
   return true;
 }
 
-const uint32_t known_tags[29] = {
+const uint32_t known_tags[63] = {
   TAG('c', 'm', 'a', 'p'),  // 0
   TAG('h', 'e', 'a', 'd'),  // 1
   TAG('h', 'h', 'e', 'a'),  // 2
@@ -802,13 +802,47 @@
   TAG('G', 'D', 'E', 'F'),  // 26
   TAG('G', 'P', 'O', 'S'),  // 27
   TAG('G', 'S', 'U', 'B'),  // 28
+  TAG('E', 'B', 'S', 'C'),  // 29
+  TAG('J', 'S', 'T', 'F'),  // 30
+  TAG('M', 'A', 'T', 'H'),  // 31
+  TAG('C', 'B', 'D', 'T'),  // 32
+  TAG('C', 'B', 'L', 'C'),  // 33
+  TAG('C', 'O', 'L', 'R'),  // 34
+  TAG('C', 'P', 'A', 'L'),  // 35
+  TAG('S', 'V', 'G', ' '),  // 36
+  TAG('s', 'b', 'i', 'x'),  // 37
+  TAG('a', 'c', 'n', 't'),  // 38
+  TAG('a', 'v', 'a', 'r'),  // 39
+  TAG('b', 'd', 'a', 't'),  // 40
+  TAG('b', 'l', 'o', 'c'),  // 41
+  TAG('b', 's', 'l', 'n'),  // 42
+  TAG('c', 'v', 'a', 'r'),  // 43
+  TAG('f', 'd', 's', 'c'),  // 44
+  TAG('f', 'e', 'a', 't'),  // 45
+  TAG('f', 'm', 't', 'x'),  // 46
+  TAG('f', 'v', 'a', 'r'),  // 47
+  TAG('g', 'v', 'a', 'r'),  // 48
+  TAG('h', 's', 't', 'y'),  // 49
+  TAG('j', 'u', 's', 't'),  // 50
+  TAG('l', 'c', 'a', 'r'),  // 51
+  TAG('m', 'o', 'r', 't'),  // 52
+  TAG('m', 'o', 'r', 'x'),  // 53
+  TAG('o', 'p', 'b', 'd'),  // 54
+  TAG('p', 'r', 'o', 'p'),  // 55
+  TAG('t', 'r', 'a', 'k'),  // 56
+  TAG('Z', 'a', 'p', 'f'),  // 57
+  TAG('S', 'i', 'l', 'f'),  // 58
+  TAG('G', 'l', 'a', 't'),  // 59
+  TAG('G', 'l', 'o', 'c'),  // 60
+  TAG('F', 'e', 'a', 't'),  // 61
+  TAG('S', 'i', 'l', 'l'),  // 62
 };
 
 int KnownTableIndex(uint32_t tag) {
-  for (int i = 0; i < 29; ++i) {
+  for (int i = 0; i < 63; ++i) {
     if (tag == known_tags[i]) return i;
   }
-  return 31;
+  return 63;
 }
 
 bool ReadShortDirectory(ots::Buffer* file, std::vector<Table>* tables,
@@ -820,25 +854,24 @@
       return OTS_FAILURE();
     }
     uint32_t tag;
-    if ((flag_byte & 0x1f) == 0x1f) {
+    if ((flag_byte & 0x3f) == 0x3f) {
       if (!file->ReadU32(&tag)) {
         return OTS_FAILURE();
       }
     } else {
-      if ((flag_byte & 0x1f) >= (sizeof(known_tags) / sizeof(known_tags[0]))) {
-        return OTS_FAILURE();
-      }
-      tag = known_tags[flag_byte & 0x1f];
+      tag = known_tags[flag_byte & 0x3f];
     }
-    // Bits 5 and 6 are reserved and must be 0.
-    if ((flag_byte & 0x60) != 0) {
+    // Bits 6 and 7 are reserved and must be 0.
+    if ((flag_byte & 0xC0) != 0) {
       return OTS_FAILURE();
     }
     uint32_t flags = kCompressionTypeBrotli;
     if (i > 0) {
       flags |= kWoff2FlagsContinueStream;
     }
-    if ((flag_byte & 0x80) != 0) {
+    // Always transform the glyf and loca tables
+    if (tag == TAG('g', 'l', 'y', 'f') ||
+        tag == TAG('l', 'o', 'c', 'a')) {
       flags |= kWoff2FlagsTransform;
     }
     uint32_t dst_length;
@@ -1043,15 +1076,12 @@
 
 void StoreTableEntry(const Table& table, size_t* offset, uint8_t* dst) {
   uint8_t flag_byte = KnownTableIndex(table.tag);
-  if ((table.flags & kWoff2FlagsTransform) != 0) {
-    flag_byte |= 0x80;
-  }
   dst[(*offset)++] = flag_byte;
-  if ((flag_byte & 0x1f) == 0x1f) {
+  if ((flag_byte & 0x3f) == 0x3f) {
     StoreU32(table.tag, offset, dst);
   }
   StoreBase128(table.src_length, offset, dst);
-  if ((flag_byte & 0x80) != 0) {
+  if ((table.flags & kWoff2FlagsTransform) != 0) {
     StoreBase128(table.transform_length, offset, dst);
   }
 }
@@ -1060,7 +1090,7 @@
   size_t size = KnownTableIndex(table.tag) < 31 ? 1 : 5;
   size += Base128Size(table.src_length);
   if ((table.flags & kWoff2FlagsTransform) != 0) {
-    size += Base128Size(table.transform_length);
+     size += Base128Size(table.transform_length);
   }
   return size;
 }
@@ -1123,7 +1153,6 @@
 
 bool ConvertTTFToWOFF2(const uint8_t *data, size_t length,
                        uint8_t *result, size_t *result_length) {
-
   Woff2ConvertOptions options;
 
   Font font;
diff --git a/woff2/woff2.h b/woff2/woff2.h
index 2e4ee25..6b198fb 100644
--- a/woff2/woff2.h
+++ b/woff2/woff2.h
@@ -43,8 +43,6 @@
 bool ConvertTTFToWOFF2(const uint8_t *data, size_t length,
                        uint8_t *result, size_t *result_length);
 
-
-
 } // namespace woff2
 
 #endif  // WOFF2_WOFF2_H_