Browse Source

Remove glyph id's outside the range of valid glyphs.

OTS does not like invalid glyph ids in a camp table.
Brendan Dahl 10 years ago
parent
commit
87762afec4
  1. 15
      src/core/fonts.js
  2. 1
      test/pdfs/.gitignore
  3. BIN
      test/pdfs/issue5564_reduced.pdf
  4. 10
      test/test_manifest.json

15
src/core/fonts.js

@ -2798,11 +2798,15 @@ var Font = (function FontClosure() {
}; };
} }
function getRanges(glyphs) { function getRanges(glyphs, numGlyphs) {
// Array.sort() sorts by characters, not numerically, so convert to an // Array.sort() sorts by characters, not numerically, so convert to an
// array of characters. // array of characters.
var codes = []; var codes = [];
for (var charCode in glyphs) { for (var charCode in glyphs) {
// Remove an invalid glyph ID mappings to make OTS happy.
if (glyphs[charCode] >= numGlyphs) {
continue;
}
codes.push({ fontCharCode: charCode | 0, glyphId: glyphs[charCode] }); codes.push({ fontCharCode: charCode | 0, glyphId: glyphs[charCode] });
} }
codes.sort(function fontGetRangesSort(a, b) { codes.sort(function fontGetRangesSort(a, b) {
@ -2831,8 +2835,8 @@ var Font = (function FontClosure() {
return ranges; return ranges;
} }
function createCmapTable(glyphs) { function createCmapTable(glyphs, numGlyphs) {
var ranges = getRanges(glyphs); var ranges = getRanges(glyphs, numGlyphs);
var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1; var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1;
var cmap = '\x00\x00' + // version var cmap = '\x00\x00' + // version
string16(numTables) + // numTables string16(numTables) + // numTables
@ -4335,7 +4339,7 @@ var Font = (function FontClosure() {
this.toFontChar = newMapping.toFontChar; this.toFontChar = newMapping.toFontChar;
tables.cmap = { tables.cmap = {
tag: 'cmap', tag: 'cmap',
data: createCmapTable(newMapping.charCodeToGlyphId) data: createCmapTable(newMapping.charCodeToGlyphId, numGlyphs)
}; };
if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) { if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) {
@ -4473,7 +4477,8 @@ var Font = (function FontClosure() {
builder.addTable('OS/2', createOS2Table(properties, builder.addTable('OS/2', createOS2Table(properties,
newMapping.charCodeToGlyphId)); newMapping.charCodeToGlyphId));
// Character to glyphs mapping // Character to glyphs mapping
builder.addTable('cmap', createCmapTable(newMapping.charCodeToGlyphId)); builder.addTable('cmap', createCmapTable(newMapping.charCodeToGlyphId,
numGlyphs));
// Font header // Font header
builder.addTable('head', builder.addTable('head',
'\x00\x01\x00\x00' + // Version number '\x00\x01\x00\x00' + // Version number

1
test/pdfs/.gitignore vendored

@ -22,6 +22,7 @@
!bug1020858.pdf !bug1020858.pdf
!bug1050040.pdf !bug1050040.pdf
!bug1200096.pdf !bug1200096.pdf
!issue5564_reduced.pdf
!canvas.pdf !canvas.pdf
!complex_ttf_font.pdf !complex_ttf_font.pdf
!extgstate.pdf !extgstate.pdf

BIN
test/pdfs/issue5564_reduced.pdf

Binary file not shown.

10
test/test_manifest.json

@ -40,6 +40,16 @@
"type": "load", "type": "load",
"about": "PDF with undefined stream length." "about": "PDF with undefined stream length."
}, },
{ "id": "issue5564_reduced",
"file": "pdfs/issue5564_reduced.pdf",
"md5": "097853614b56fc10bfbf7e56daa0c66b",
"rounds": 1,
"link": false,
"firstPage": 1,
"lastPage": 1,
"type": "eq",
"about": "Causes cmap to be created with invalid glyph ids."
},
{ "id": "bug946506", { "id": "bug946506",
"file": "pdfs/bug946506.pdf", "file": "pdfs/bug946506.pdf",
"md5": "c28911b5c31bdc337c2ce404c5971cfc", "md5": "c28911b5c31bdc337c2ce404c5971cfc",

Loading…
Cancel
Save