David PHAM-VAN

TTFWriter: Add name, post and os/2 tables

@@ -161,6 +161,8 @@ class TtfParser { @@ -161,6 +161,8 @@ class TtfParser {
161 static const String glyf_table = 'glyf'; 161 static const String glyf_table = 'glyf';
162 static const String cblc_table = 'CBLC'; 162 static const String cblc_table = 'CBLC';
163 static const String cbdt_table = 'CBDT'; 163 static const String cbdt_table = 'CBDT';
  164 + static const String post_table = 'post';
  165 + static const String os_2_table = 'OS/2';
164 166
165 final ByteData bytes; 167 final ByteData bytes;
166 final tableOffsets = <String, int>{}; 168 final tableOffsets = <String, int>{};
@@ -155,40 +155,46 @@ class TtfWriter { @@ -155,40 +155,46 @@ class TtfWriter {
155 } 155 }
156 } 156 }
157 157
158 - {  
159 - // Head table  
160 - final start = ttf.tableOffsets[TtfParser.head_table]!;  
161 - final len = ttf.tableSize[TtfParser.head_table]!;  
162 - final head = Uint8List.fromList(  
163 - ttf.bytes.buffer.asUint8List(start, _wordAlign(len)));  
164 - head.buffer.asByteData().setUint32(8, 0); // checkSumAdjustment  
165 - tables[TtfParser.head_table] = head;  
166 - tablesLength[TtfParser.head_table] = len; 158 + // Copy some tables from the original file
  159 + for (final tn in {
  160 + TtfParser.head_table,
  161 + TtfParser.maxp_table,
  162 + TtfParser.hhea_table,
  163 + TtfParser.os_2_table,
  164 + }) {
  165 + final start = ttf.tableOffsets[tn];
  166 + if (start == null) {
  167 + continue;
167 } 168 }
168 -  
169 - {  
170 - // MaxP table  
171 - final start = ttf.tableOffsets[TtfParser.maxp_table]!;  
172 - final len = ttf.tableSize[TtfParser.maxp_table]!;  
173 - final maxp = Uint8List.fromList( 169 + final len = ttf.tableSize[tn]!;
  170 + final data = Uint8List.fromList(
174 ttf.bytes.buffer.asUint8List(start, _wordAlign(len))); 171 ttf.bytes.buffer.asUint8List(start, _wordAlign(len)));
175 - maxp.buffer.asByteData().setUint16(4, glyphsInfo.length);  
176 - tables[TtfParser.maxp_table] = maxp;  
177 - tablesLength[TtfParser.maxp_table] = len; 172 + tables[tn] = data;
  173 + tablesLength[tn] = len;
178 } 174 }
179 175
180 - {  
181 - // HHEA table  
182 - final start = ttf.tableOffsets[TtfParser.hhea_table]!;  
183 - final len = ttf.tableSize[TtfParser.hhea_table]!;  
184 - final hhea = Uint8List.fromList(  
185 - ttf.bytes.buffer.asUint8List(start, _wordAlign(len)));  
186 - hhea.buffer 176 + tables[TtfParser.head_table]!
  177 + .buffer
  178 + .asByteData()
  179 + .setUint32(8, 0); // checkSumAdjustment
  180 + tables[TtfParser.maxp_table]!
  181 + .buffer
  182 + .asByteData()
  183 + .setUint16(4, glyphsInfo.length);
  184 + tables[TtfParser.hhea_table]!
  185 + .buffer
187 .asByteData() 186 .asByteData()
188 .setUint16(34, glyphsInfo.length); // numOfLongHorMetrics 187 .setUint16(34, glyphsInfo.length); // numOfLongHorMetrics
189 188
190 - tables[TtfParser.hhea_table] = hhea;  
191 - tablesLength[TtfParser.hhea_table] = len; 189 + {
  190 + // post Table
  191 + final start = ttf.tableOffsets[TtfParser.post_table]!;
  192 + const len = 32;
  193 + final data = Uint8List.fromList(
  194 + ttf.bytes.buffer.asUint8List(start, _wordAlign(len)));
  195 + data.buffer.asByteData().setUint32(0, 0x00030000); // Version 3.0 no names
  196 + tables[TtfParser.post_table] = data;
  197 + tablesLength[TtfParser.post_table] = len;
192 } 198 }
193 199
194 { 200 {
@@ -241,6 +247,18 @@ class TtfWriter { @@ -241,6 +247,18 @@ class TtfWriter {
241 } 247 }
242 248
243 { 249 {
  250 + // name table
  251 + const len = 18;
  252 + final nameBuf = Uint8List(_wordAlign(len));
  253 + final nameData = nameBuf.buffer.asByteData();
  254 + nameData.setUint16(0, 0); // Table version number 0
  255 + nameData.setUint16(2, 0); // Count 0 -> no names
  256 + nameData.setUint16(4, 6); // Storage Offset
  257 + tables[TtfParser.name_table] = nameBuf;
  258 + tablesLength[TtfParser.name_table] = len;
  259 + }
  260 +
  261 + {
244 final bytes = BytesBuilder(); 262 final bytes = BytesBuilder();
245 263
246 final numTables = tables.length; 264 final numTables = tables.length;
@@ -266,10 +284,13 @@ class TtfWriter { @@ -266,10 +284,13 @@ class TtfWriter {
266 TtfParser.head_table, 284 TtfParser.head_table,
267 TtfParser.hhea_table, 285 TtfParser.hhea_table,
268 TtfParser.maxp_table, 286 TtfParser.maxp_table,
  287 + TtfParser.os_2_table,
269 TtfParser.hmtx_table, 288 TtfParser.hmtx_table,
270 TtfParser.cmap_table, 289 TtfParser.cmap_table,
271 TtfParser.loca_table, 290 TtfParser.loca_table,
272 TtfParser.glyf_table, 291 TtfParser.glyf_table,
  292 + TtfParser.name_table,
  293 + TtfParser.post_table,
273 ]; 294 ];
274 295
275 for (final name in tableKeys) { 296 for (final name in tableKeys) {