Showing
3 changed files
with
35 additions
and
12 deletions
@@ -168,6 +168,7 @@ class TtfParser { | @@ -168,6 +168,7 @@ class TtfParser { | ||
168 | 168 | ||
169 | final charToGlyphIndexMap = <int, int>{}; | 169 | final charToGlyphIndexMap = <int, int>{}; |
170 | final glyphOffsets = <int>[]; | 170 | final glyphOffsets = <int>[]; |
171 | + final glyphSizes = <int>[]; | ||
171 | final glyphInfoMap = <int, PdfFontMetrics>{}; | 172 | final glyphInfoMap = <int, PdfFontMetrics>{}; |
172 | final bitmapOffsets = <int, TtfBitmapInfo>{}; | 173 | final bitmapOffsets = <int, TtfBitmapInfo>{}; |
173 | 174 | ||
@@ -346,14 +347,21 @@ class TtfParser { | @@ -346,14 +347,21 @@ class TtfParser { | ||
346 | 347 | ||
347 | void _parseIndexes() { | 348 | void _parseIndexes() { |
348 | final basePosition = tableOffsets[loca_table]!; | 349 | final basePosition = tableOffsets[loca_table]!; |
349 | - final numGlyphs = this.numGlyphs; | ||
350 | if (indexToLocFormat == 0) { | 350 | if (indexToLocFormat == 0) { |
351 | - for (var i = 0; i < numGlyphs; i++) { | ||
352 | - glyphOffsets.add(bytes.getUint16(basePosition + i * 2) * 2); | 351 | + var prevOffset = bytes.getUint16(basePosition) * 2; |
352 | + for (var i = 1; i < numGlyphs + 1; i++) { | ||
353 | + final offset = bytes.getUint16(basePosition + i * 2) * 2; | ||
354 | + glyphOffsets.add(prevOffset); | ||
355 | + glyphSizes.add(offset - prevOffset); | ||
356 | + prevOffset = offset; | ||
353 | } | 357 | } |
354 | } else { | 358 | } else { |
355 | - for (var i = 0; i < numGlyphs; i++) { | ||
356 | - glyphOffsets.add(bytes.getUint32(basePosition + i * 4)); | 359 | + var prevOffset = bytes.getUint32(basePosition); |
360 | + for (var i = 1; i < numGlyphs + 1; i++) { | ||
361 | + final offset = bytes.getUint32(basePosition + i * 4); | ||
362 | + glyphOffsets.add(prevOffset); | ||
363 | + glyphSizes.add(offset - prevOffset); | ||
364 | + prevOffset = offset; | ||
357 | } | 365 | } |
358 | } | 366 | } |
359 | } | 367 | } |
@@ -366,12 +374,8 @@ class TtfParser { | @@ -366,12 +374,8 @@ class TtfParser { | ||
366 | final numOfLongHorMetrics = this.numOfLongHorMetrics; | 374 | final numOfLongHorMetrics = this.numOfLongHorMetrics; |
367 | final defaultadvanceWidth = | 375 | final defaultadvanceWidth = |
368 | bytes.getUint16(hmtxOffset + (numOfLongHorMetrics - 1) * 4); | 376 | bytes.getUint16(hmtxOffset + (numOfLongHorMetrics - 1) * 4); |
369 | - var glyphIndex = 0; | ||
370 | - for (final offset in glyphOffsets) { | ||
371 | - final xMin = bytes.getInt16(baseOffset + offset + 2); // 2 | ||
372 | - final yMin = bytes.getInt16(baseOffset + offset + 4); // 4 | ||
373 | - final xMax = bytes.getInt16(baseOffset + offset + 6); // 6 | ||
374 | - final yMax = bytes.getInt16(baseOffset + offset + 8); // 8 | 377 | + |
378 | + for (var glyphIndex = 0; glyphIndex < numGlyphs; glyphIndex++) { | ||
375 | final advanceWidth = glyphIndex < numOfLongHorMetrics | 379 | final advanceWidth = glyphIndex < numOfLongHorMetrics |
376 | ? bytes.getUint16(hmtxOffset + glyphIndex * 4) | 380 | ? bytes.getUint16(hmtxOffset + glyphIndex * 4) |
377 | : defaultadvanceWidth; | 381 | : defaultadvanceWidth; |
@@ -380,6 +384,25 @@ class TtfParser { | @@ -380,6 +384,25 @@ class TtfParser { | ||
380 | : bytes.getInt16(hmtxOffset + | 384 | : bytes.getInt16(hmtxOffset + |
381 | numOfLongHorMetrics * 4 + | 385 | numOfLongHorMetrics * 4 + |
382 | (glyphIndex - numOfLongHorMetrics) * 2); | 386 | (glyphIndex - numOfLongHorMetrics) * 2); |
387 | + if (glyphSizes[glyphIndex] == 0) { | ||
388 | + glyphInfoMap[glyphIndex] = PdfFontMetrics( | ||
389 | + left: 0, | ||
390 | + top: 0, | ||
391 | + right: 0, | ||
392 | + bottom: 0, | ||
393 | + ascent: 0, | ||
394 | + descent: 0, | ||
395 | + advanceWidth: advanceWidth / unitsPerEm, | ||
396 | + leftBearing: leftBearing / unitsPerEm, | ||
397 | + ); | ||
398 | + continue; | ||
399 | + } | ||
400 | + final offset = glyphOffsets[glyphIndex]; | ||
401 | + final xMin = bytes.getInt16(baseOffset + offset + 2); // 2 | ||
402 | + final yMin = bytes.getInt16(baseOffset + offset + 4); // 4 | ||
403 | + final xMax = bytes.getInt16(baseOffset + offset + 6); // 6 | ||
404 | + final yMax = bytes.getInt16(baseOffset + offset + 8); // 8 | ||
405 | + | ||
383 | glyphInfoMap[glyphIndex] = PdfFontMetrics( | 406 | glyphInfoMap[glyphIndex] = PdfFontMetrics( |
384 | left: xMin.toDouble() / unitsPerEm, | 407 | left: xMin.toDouble() / unitsPerEm, |
385 | top: yMin.toDouble() / unitsPerEm, | 408 | top: yMin.toDouble() / unitsPerEm, |
@@ -390,7 +413,6 @@ class TtfParser { | @@ -390,7 +413,6 @@ class TtfParser { | ||
390 | advanceWidth: advanceWidth.toDouble() / unitsPerEm, | 413 | advanceWidth: advanceWidth.toDouble() / unitsPerEm, |
391 | leftBearing: leftBearing.toDouble() / unitsPerEm, | 414 | leftBearing: leftBearing.toDouble() / unitsPerEm, |
392 | ); | 415 | ); |
393 | - glyphIndex++; | ||
394 | } | 416 | } |
395 | } | 417 | } |
396 | 418 |
@@ -4,6 +4,7 @@ | @@ -4,6 +4,7 @@ | ||
4 | 4 | ||
5 | - Update pdfium version to 4861 | 5 | - Update pdfium version to 4861 |
6 | - Fix crash when Android load a PDF file which had password | 6 | - Fix crash when Android load a PDF file which had password |
7 | +- Fix parsing TTF fonts with zero-length glyphs | ||
7 | 8 | ||
8 | ## 5.7.2 | 9 | ## 5.7.2 |
9 | 10 |
No preview for this file type
-
Please register or login to post a comment