Showing
2 changed files
with
50 additions
and
27 deletions
@@ -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) { |
-
Please register or login to post a comment