Showing
4 changed files
with
59 additions
and
24 deletions
@@ -137,49 +137,52 @@ class TtfParser { | @@ -137,49 +137,52 @@ class TtfParser { | ||
137 | for (int i = 0; i < numSubTables; i++) { | 137 | for (int i = 0; i < numSubTables; i++) { |
138 | final int offset = bytes.getUint32(basePosition + i * 8 + 8); | 138 | final int offset = bytes.getUint32(basePosition + i * 8 + 8); |
139 | final int format = bytes.getUint16(basePosition + offset); | 139 | final int format = bytes.getUint16(basePosition + offset); |
140 | - final int length = bytes.getUint16(basePosition + offset + 2); | ||
141 | 140 | ||
142 | switch (format) { | 141 | switch (format) { |
143 | case 0: | 142 | case 0: |
144 | - _parseCMapFormat0(basePosition + offset + 4, length); | 143 | + _parseCMapFormat0(basePosition + offset + 2); |
145 | break; | 144 | break; |
146 | 145 | ||
147 | case 4: | 146 | case 4: |
148 | - _parseCMapFormat4(basePosition + offset + 4, length); | 147 | + _parseCMapFormat4(basePosition + offset + 2); |
149 | break; | 148 | break; |
150 | case 6: | 149 | case 6: |
151 | - _parseCMapFormat6(basePosition + offset + 4, length); | 150 | + _parseCMapFormat6(basePosition + offset + 2); |
151 | + break; | ||
152 | + | ||
153 | + case 12: | ||
154 | + _parseCMapFormat12(basePosition + offset + 2); | ||
152 | break; | 155 | break; |
153 | } | 156 | } |
154 | } | 157 | } |
155 | } | 158 | } |
156 | 159 | ||
157 | - void _parseCMapFormat0(int basePosition, int length) { | ||
158 | - assert(length == 262); | 160 | + void _parseCMapFormat0(int basePosition) { |
161 | + assert(bytes.getUint16(basePosition) == 262); | ||
159 | for (int i = 0; i < 256; i++) { | 162 | for (int i = 0; i < 256; i++) { |
160 | final int charCode = i; | 163 | final int charCode = i; |
161 | - final int glyphIndex = bytes.getUint8(basePosition + i); | 164 | + final int glyphIndex = bytes.getUint8(basePosition + i + 2); |
162 | if (glyphIndex > 0) { | 165 | if (glyphIndex > 0) { |
163 | charToGlyphIndexMap[charCode] = glyphIndex; | 166 | charToGlyphIndexMap[charCode] = glyphIndex; |
164 | } | 167 | } |
165 | } | 168 | } |
166 | } | 169 | } |
167 | 170 | ||
168 | - void _parseCMapFormat4(int basePosition, int length) { | ||
169 | - final int segCount = bytes.getUint16(basePosition + 2) ~/ 2; | 171 | + void _parseCMapFormat4(int basePosition) { |
172 | + final int segCount = bytes.getUint16(basePosition + 4) ~/ 2; | ||
170 | final List<int> endCodes = <int>[]; | 173 | final List<int> endCodes = <int>[]; |
171 | for (int i = 0; i < segCount; i++) { | 174 | for (int i = 0; i < segCount; i++) { |
172 | - endCodes.add(bytes.getUint16(basePosition + i * 2 + 10)); | 175 | + endCodes.add(bytes.getUint16(basePosition + i * 2 + 12)); |
173 | } | 176 | } |
174 | final List<int> startCodes = <int>[]; | 177 | final List<int> startCodes = <int>[]; |
175 | for (int i = 0; i < segCount; i++) { | 178 | for (int i = 0; i < segCount; i++) { |
176 | - startCodes.add(bytes.getUint16(basePosition + (segCount + i) * 2 + 12)); | 179 | + startCodes.add(bytes.getUint16(basePosition + (segCount + i) * 2 + 14)); |
177 | } | 180 | } |
178 | final List<int> idDeltas = <int>[]; | 181 | final List<int> idDeltas = <int>[]; |
179 | for (int i = 0; i < segCount; i++) { | 182 | for (int i = 0; i < segCount; i++) { |
180 | - idDeltas.add(bytes.getUint16(basePosition + (segCount * 2 + i) * 2 + 12)); | 183 | + idDeltas.add(bytes.getUint16(basePosition + (segCount * 2 + i) * 2 + 14)); |
181 | } | 184 | } |
182 | - final int idRangeOffsetBasePos = basePosition + segCount * 6 + 12; | 185 | + final int idRangeOffsetBasePos = basePosition + segCount * 6 + 14; |
183 | final List<int> idRangeOffsets = <int>[]; | 186 | final List<int> idRangeOffsets = <int>[]; |
184 | for (int i = 0; i < segCount; i++) { | 187 | for (int i = 0; i < segCount; i++) { |
185 | idRangeOffsets.add(bytes.getUint16(idRangeOffsetBasePos + i * 2)); | 188 | idRangeOffsets.add(bytes.getUint16(idRangeOffsetBasePos + i * 2)); |
@@ -204,18 +207,35 @@ class TtfParser { | @@ -204,18 +207,35 @@ class TtfParser { | ||
204 | } | 207 | } |
205 | } | 208 | } |
206 | 209 | ||
207 | - void _parseCMapFormat6(int basePosition, int length) { | ||
208 | - final int firstCode = bytes.getUint16(basePosition + 2); | ||
209 | - final int entryCount = bytes.getUint16(basePosition + 4); | 210 | + void _parseCMapFormat6(int basePosition) { |
211 | + final int firstCode = bytes.getUint16(basePosition + 4); | ||
212 | + final int entryCount = bytes.getUint16(basePosition + 6); | ||
210 | for (int i = 0; i < entryCount; i++) { | 213 | for (int i = 0; i < entryCount; i++) { |
211 | final int charCode = firstCode + i; | 214 | final int charCode = firstCode + i; |
212 | - final int glyphIndex = bytes.getUint16(basePosition + i * 2 + 6); | 215 | + final int glyphIndex = bytes.getUint16(basePosition + i * 2 + 8); |
213 | if (glyphIndex > 0) { | 216 | if (glyphIndex > 0) { |
214 | charToGlyphIndexMap[charCode] = glyphIndex; | 217 | charToGlyphIndexMap[charCode] = glyphIndex; |
215 | } | 218 | } |
216 | } | 219 | } |
217 | } | 220 | } |
218 | 221 | ||
222 | + void _parseCMapFormat12(int basePosition) { | ||
223 | + final int numGroups = bytes.getUint32(basePosition + 10); | ||
224 | + assert(bytes.getUint32(basePosition + 2) == 12 * numGroups + 16); | ||
225 | + | ||
226 | + for (int i = 0; i < numGroups; i++) { | ||
227 | + final int startCharCode = bytes.getUint32(basePosition + i * 12 + 14); | ||
228 | + final int endCharCode = bytes.getUint32(basePosition + i * 12 + 18); | ||
229 | + final int startGlyphID = bytes.getUint32(basePosition + i * 12 + 22); | ||
230 | + | ||
231 | + for (int j = startCharCode; j <= endCharCode; j++) { | ||
232 | + assert(!charToGlyphIndexMap.containsKey(j) || | ||
233 | + charToGlyphIndexMap[j] == startGlyphID + j - startCharCode); | ||
234 | + charToGlyphIndexMap[j] = startGlyphID + j - startCharCode; | ||
235 | + } | ||
236 | + } | ||
237 | + } | ||
238 | + | ||
219 | void _parseIndexes() { | 239 | void _parseIndexes() { |
220 | final int basePosition = tableOffsets[loca_table]; | 240 | final int basePosition = tableOffsets[loca_table]; |
221 | final int numGlyphs = this.numGlyphs; | 241 | final int numGlyphs = this.numGlyphs; |
@@ -196,14 +196,24 @@ class TtfWriter { | @@ -196,14 +196,24 @@ class TtfWriter { | ||
196 | 196 | ||
197 | { | 197 | { |
198 | // CMAP table | 198 | // CMAP table |
199 | - final Uint8List cmap = Uint8List(_wordAlign(0x112, 4)); | ||
200 | - cmap.setAll(3, <int>[1, 0, 1, 0, 0, 0, 0, 0, 12, 0, 0, 1, 6]); | 199 | + const int len = 40; |
200 | + final Uint8List cmap = Uint8List(_wordAlign(len, 4)); | ||
201 | final ByteData cmapData = cmap.buffer.asByteData(); | 201 | final ByteData cmapData = cmap.buffer.asByteData(); |
202 | - for (int i = 1; i < chars.length; i++) { | ||
203 | - cmapData.setUint8(i + 18, i); | ||
204 | - } | 202 | + cmapData.setUint16(0, 0); // Table version number |
203 | + cmapData.setUint16(2, 1); // Number of encoding tables that follow. | ||
204 | + cmapData.setUint16(4, 3); // Platform ID | ||
205 | + cmapData.setUint16(6, 1); // Platform-specific encoding ID | ||
206 | + cmapData.setUint32(8, 12); // Offset from beginning of table | ||
207 | + cmapData.setUint16(12, 12); // Table format | ||
208 | + cmapData.setUint32(16, 28); // Table length | ||
209 | + cmapData.setUint32(20, 1); // Table language | ||
210 | + cmapData.setUint32(24, 1); // numGroups | ||
211 | + cmapData.setUint32(28, 32); // startCharCode | ||
212 | + cmapData.setUint32(32, chars.length + 31); // endCharCode | ||
213 | + cmapData.setUint32(36, 0); // startGlyphID | ||
214 | + | ||
205 | tables[TtfParser.cmap_table] = cmap; | 215 | tables[TtfParser.cmap_table] = cmap; |
206 | - tablesLength[TtfParser.cmap_table] = 0x112; | 216 | + tablesLength[TtfParser.cmap_table] = len; |
207 | } | 217 | } |
208 | 218 | ||
209 | { | 219 | { |
@@ -4,7 +4,7 @@ description: A pdf producer for Dart. It can create pdf files for both web or fl | @@ -4,7 +4,7 @@ description: A pdf producer for Dart. It can create pdf files for both web or fl | ||
4 | homepage: https://github.com/DavBfr/dart_pdf/tree/master/pdf | 4 | homepage: https://github.com/DavBfr/dart_pdf/tree/master/pdf |
5 | repository: https://github.com/DavBfr/dart_pdf | 5 | repository: https://github.com/DavBfr/dart_pdf |
6 | issue_tracker: https://github.com/DavBfr/dart_pdf/issues | 6 | issue_tracker: https://github.com/DavBfr/dart_pdf/issues |
7 | -version: 1.10.0 | 7 | +version: 1.10.1 |
8 | 8 | ||
9 | environment: | 9 | environment: |
10 | sdk: ">=2.3.0 <3.0.0" | 10 | sdk: ">=2.3.0 <3.0.0" |
-
Please register or login to post a comment