fixed FDSelect size calcluation
diff --git a/src/hb-ot-cff-common.hh b/src/hb-ot-cff-common.hh
index 2f5e2f8..7a1175c 100644
--- a/src/hb-ot-cff-common.hh
+++ b/src/hb-ot-cff-common.hh
@@ -632,7 +632,7 @@
   FDSelect3_4_Range<GID_TYPE, FD_TYPE>  ranges[VAR];
   /* GID_TYPE sentinel */
 
-  DEFINE_SIZE_ARRAY (GID_TYPE::static_size * 2, ranges);
+  DEFINE_SIZE_ARRAY (GID_TYPE::static_size, ranges);
 };
 
 typedef FDSelect3_4<HBUINT16, HBUINT8> FDSelect3;
diff --git a/src/hb-subset-cff-common.cc b/src/hb-subset-cff-common.cc
index f5fcebd..b319a9a 100644
--- a/src/hb-subset-cff-common.cc
+++ b/src/hb-subset-cff-common.cc
@@ -112,14 +112,14 @@
   {
     assert (src.format == 4);
     subset_fdselect_format = 4;
-    subset_fdselect_size = FDSelect4::min_size + FDSelect4_Range::static_size * num_ranges + HBUINT32::static_size;
+    subset_fdselect_size = FDSelect::min_size + FDSelect4::min_size + FDSelect4_Range::static_size * num_ranges + HBUINT32::static_size;
   }
   else
   {
 #if CFF_SERIALIZE_FDSELECT_0
-    unsigned int format0_size = FDSelect0::min_size + HBUINT8::static_size * subset_num_glyphs;
+    unsigned int format0_size = FDSelect::min_size + FDSelect0::min_size + HBUINT8::static_size * subset_num_glyphs;
 #endif
-    unsigned int format3_size = FDSelect3::min_size + FDSelect3_Range::static_size * num_ranges + HBUINT16::static_size;
+    unsigned int format3_size = FDSelect::min_size + FDSelect3::min_size + FDSelect3_Range::static_size * num_ranges + HBUINT16::static_size;
 
 #if CFF_SERIALIZE_FDSELECT_0
     if (format0_size <= format3_size)
diff --git a/test/api/fonts/SourceHanSans-Regular.41,3041,4C2E.otf b/test/api/fonts/SourceHanSans-Regular.41,3041,4C2E.otf
index b4d1165..08bc0e0 100644
--- a/test/api/fonts/SourceHanSans-Regular.41,3041,4C2E.otf
+++ b/test/api/fonts/SourceHanSans-Regular.41,3041,4C2E.otf
Binary files differ