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