Merge remote-tracking branch 'origin/master' into mozilla
This commit is contained in:
commit
8c8242f5d1
1
LICENSE
1
LICENSE
@ -12,6 +12,7 @@
|
|||||||
Jakob Miland <saebekassebil@gmail.com>
|
Jakob Miland <saebekassebil@gmail.com>
|
||||||
Artur Adib <aadib@mozilla.com>
|
Artur Adib <aadib@mozilla.com>
|
||||||
Brendan Dahl <bdahl@mozilla.com>
|
Brendan Dahl <bdahl@mozilla.com>
|
||||||
|
David Quintana <gigaherz@gmail.com>
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
copy of this software and associated documentation files (the "Software"),
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
12
src/bidi.js
12
src/bidi.js
@ -132,9 +132,9 @@ var bidi = PDFJS.bidi = (function bidiClosure() {
|
|||||||
|
|
||||||
// get types, fill arrays
|
// get types, fill arrays
|
||||||
|
|
||||||
var chars = new Array(strLength);
|
var chars = [];
|
||||||
var types = new Array(strLength);
|
var types = [];
|
||||||
var oldtypes = new Array(strLength);
|
var oldtypes = [];
|
||||||
var numBidi = 0;
|
var numBidi = 0;
|
||||||
|
|
||||||
for (var i = 0; i < strLength; ++i) {
|
for (var i = 0; i < strLength; ++i) {
|
||||||
@ -176,16 +176,12 @@ var bidi = PDFJS.bidi = (function bidiClosure() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var levels = new Array(strLength);
|
var levels = [];
|
||||||
|
|
||||||
for (var i = 0; i < strLength; ++i) {
|
for (var i = 0; i < strLength; ++i) {
|
||||||
levels[i] = startLevel;
|
levels[i] = startLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
var diffChars = new Array(strLength);
|
|
||||||
var diffLevels = new Array(strLength);
|
|
||||||
var diffTypes = new Array(strLength);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
X1-X10: skip most of this, since we are NOT doing the embeddings.
|
X1-X10: skip most of this, since we are NOT doing the embeddings.
|
||||||
*/
|
*/
|
||||||
|
@ -220,7 +220,7 @@ var AlternateCS = (function AlternateCSClosure() {
|
|||||||
var baseNumComps = base.numComps;
|
var baseNumComps = base.numComps;
|
||||||
var baseBuf = new Uint8Array(baseNumComps * length);
|
var baseBuf = new Uint8Array(baseNumComps * length);
|
||||||
var numComps = this.numComps;
|
var numComps = this.numComps;
|
||||||
var scaled = new Array(numComps);
|
var scaled = [];
|
||||||
|
|
||||||
for (var i = 0; i < length; i += numComps) {
|
for (var i = 0; i < length; i += numComps) {
|
||||||
for (var z = 0; z < numComps; ++z)
|
for (var z = 0; z < numComps; ++z)
|
||||||
|
81
src/fonts.js
81
src/fonts.js
@ -174,7 +174,6 @@ var Encodings = {
|
|||||||
'', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae',
|
'', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae',
|
||||||
'', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'],
|
'', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'],
|
||||||
WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
|
WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
|
||||||
|
|
||||||
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
|
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
|
||||||
'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
|
'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
|
||||||
'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
|
'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
|
||||||
@ -1658,6 +1657,30 @@ var Font = (function FontClosure() {
|
|||||||
glyf.data = newGlyfData.subarray(0, writeOffset);
|
glyf.data = newGlyfData.subarray(0, writeOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function findEmptyGlyphs(locaTable, isGlyphLocationsLong, emptyGlyphIds) {
|
||||||
|
var itemSize, itemDecode;
|
||||||
|
if (isGlyphLocationsLong) {
|
||||||
|
itemSize = 4;
|
||||||
|
itemDecode = function fontItemDecodeLong(data, offset) {
|
||||||
|
return (data[offset] << 24) | (data[offset + 1] << 16) |
|
||||||
|
(data[offset + 2] << 8) | data[offset + 3];
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
itemSize = 2;
|
||||||
|
itemDecode = function fontItemDecode(data, offset) {
|
||||||
|
return (data[offset] << 9) | (data[offset + 1] << 1);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
var data = locaTable.data, length = data.length;
|
||||||
|
var lastOffset = itemDecode(data, 0);
|
||||||
|
for (var i = itemSize, j = 0; i < length; i += itemSize, j++) {
|
||||||
|
var offset = itemDecode(data, i);
|
||||||
|
if (offset == lastOffset)
|
||||||
|
emptyGlyphIds[j] = true;
|
||||||
|
lastOffset = offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function readGlyphNameMap(post, properties) {
|
function readGlyphNameMap(post, properties) {
|
||||||
var start = (font.start ? font.start : 0) + post.offset;
|
var start = (font.start ? font.start : 0) + post.offset;
|
||||||
font.pos = start;
|
font.pos = start;
|
||||||
@ -1784,11 +1807,15 @@ var Font = (function FontClosure() {
|
|||||||
sanitizeMetrics(font, hhea, hmtx, numGlyphs);
|
sanitizeMetrics(font, hhea, hmtx, numGlyphs);
|
||||||
sanitizeMetrics(font, vhea, vmtx, numGlyphs);
|
sanitizeMetrics(font, vhea, vmtx, numGlyphs);
|
||||||
|
|
||||||
if (head && loca && glyf) {
|
|
||||||
var isGlyphLocationsLong = int16([head.data[50], head.data[51]]);
|
var isGlyphLocationsLong = int16([head.data[50], head.data[51]]);
|
||||||
|
if (head && loca && glyf) {
|
||||||
sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong);
|
sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var emptyGlyphIds = [];
|
||||||
|
if (glyf)
|
||||||
|
findEmptyGlyphs(loca, isGlyphLocationsLong, emptyGlyphIds);
|
||||||
|
|
||||||
// Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth
|
// Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth
|
||||||
// Sometimes it's 0. That needs to be fixed
|
// Sometimes it's 0. That needs to be fixed
|
||||||
if (hhea.data[10] == 0 && hhea.data[11] == 0) {
|
if (hhea.data[10] == 0 && hhea.data[11] == 0) {
|
||||||
@ -1920,6 +1947,25 @@ var Font = (function FontClosure() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// remove glyph references outside range of avaialable glyphs or empty
|
||||||
|
var glyphsRemoved = 0;
|
||||||
|
for (var i = ids.length - 1; i >= 0; i--) {
|
||||||
|
if (ids[i] < numGlyphs &&
|
||||||
|
(!emptyGlyphIds[ids[i]] || this.isSymbolicFont))
|
||||||
|
continue;
|
||||||
|
ids.splice(i, 1);
|
||||||
|
glyphs.splice(i, 1);
|
||||||
|
glyphsRemoved++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// heuristics: if removed more than 2 glyphs encoding WinAnsiEncoding
|
||||||
|
// does not set properly
|
||||||
|
if (glyphsRemoved > 2) {
|
||||||
|
warn('Switching TrueType encoding to MacRomanEncoding for ' +
|
||||||
|
this.name + ' font');
|
||||||
|
encoding = Encodings.MacRomanEncoding;
|
||||||
|
}
|
||||||
|
|
||||||
if (hasShortCmap && this.hasEncoding && !this.isSymbolicFont) {
|
if (hasShortCmap && this.hasEncoding && !this.isSymbolicFont) {
|
||||||
// Re-encode short map encoding to unicode -- that simplifies the
|
// Re-encode short map encoding to unicode -- that simplifies the
|
||||||
// resolution of MacRoman encoded glyphs logic for TrueType fonts:
|
// resolution of MacRoman encoded glyphs logic for TrueType fonts:
|
||||||
@ -1956,6 +2002,7 @@ var Font = (function FontClosure() {
|
|||||||
for (var i = 0, ii = glyphs.length; i < ii; i++)
|
for (var i = 0, ii = glyphs.length; i < ii; i++)
|
||||||
reverseMap[glyphs[i].unicode] = i;
|
reverseMap[glyphs[i].unicode] = i;
|
||||||
|
|
||||||
|
var newGlyphUnicodes = [];
|
||||||
for (var i = 0, ii = glyphs.length; i < ii; i++) {
|
for (var i = 0, ii = glyphs.length; i < ii; i++) {
|
||||||
var code = glyphs[i].unicode;
|
var code = glyphs[i].unicode;
|
||||||
var changeCode = false;
|
var changeCode = false;
|
||||||
@ -1968,17 +2015,27 @@ var Font = (function FontClosure() {
|
|||||||
}
|
}
|
||||||
if (glyphName in GlyphsUnicode) {
|
if (glyphName in GlyphsUnicode) {
|
||||||
var unicode = GlyphsUnicode[glyphName];
|
var unicode = GlyphsUnicode[glyphName];
|
||||||
if (!unicode || (unicode in reverseMap))
|
if (!unicode || reverseMap[unicode] === i)
|
||||||
continue; // unknown glyph name or its place is taken
|
continue; // unknown glyph name or in its own place
|
||||||
|
|
||||||
glyphs[i].unicode = unicode;
|
newGlyphUnicodes[i] = unicode;
|
||||||
reverseMap[unicode] = i;
|
|
||||||
if (changeCode)
|
if (changeCode)
|
||||||
toFontChar[code] = unicode;
|
toFontChar[code] = unicode;
|
||||||
|
delete reverseMap[code];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var index in newGlyphUnicodes) {
|
||||||
|
var unicode = newGlyphUnicodes[index];
|
||||||
|
if (reverseMap[unicode]) {
|
||||||
|
// avoiding assigning to the same unicode
|
||||||
|
glyphs[index].unicode = unusedUnicode++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
glyphs[index].unicode = unicode;
|
||||||
|
reverseMap[unicode] = index;
|
||||||
}
|
}
|
||||||
this.useToFontChar = true;
|
this.useToFontChar = true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Moving all symbolic font glyphs into 0xF000 - 0xF0FF range.
|
// Moving all symbolic font glyphs into 0xF000 - 0xF0FF range.
|
||||||
if (this.isSymbolicFont) {
|
if (this.isSymbolicFont) {
|
||||||
@ -1990,12 +2047,6 @@ var Font = (function FontClosure() {
|
|||||||
this.useToFontChar = true;
|
this.useToFontChar = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove glyph references outside range of avaialable glyphs
|
|
||||||
for (var i = 0, ii = ids.length; i < ii; i++) {
|
|
||||||
if (ids[i] >= numGlyphs)
|
|
||||||
ids[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
createGlyphNameMap(glyphs, ids, properties);
|
createGlyphNameMap(glyphs, ids, properties);
|
||||||
this.glyphNameMap = properties.glyphNameMap;
|
this.glyphNameMap = properties.glyphNameMap;
|
||||||
|
|
||||||
@ -3652,7 +3703,7 @@ var CFFParser = (function CFFParserClosure() {
|
|||||||
var name = index.get(i);
|
var name = index.get(i);
|
||||||
// OTS doesn't allow names to be over 127 characters.
|
// OTS doesn't allow names to be over 127 characters.
|
||||||
var length = Math.min(name.length, 127);
|
var length = Math.min(name.length, 127);
|
||||||
var data = new Array(length);
|
var data = [];
|
||||||
// OTS also only permits certain characters in the name.
|
// OTS also only permits certain characters in the name.
|
||||||
for (var j = 0; j < length; ++j) {
|
for (var j = 0; j < length; ++j) {
|
||||||
var c = name[j];
|
var c = name[j];
|
||||||
@ -4502,7 +4553,7 @@ var CFFCompiler = (function CFFCompilerClosure() {
|
|||||||
return this.compileTypedArray(fdSelect);
|
return this.compileTypedArray(fdSelect);
|
||||||
},
|
},
|
||||||
compileTypedArray: function compileTypedArray(data) {
|
compileTypedArray: function compileTypedArray(data) {
|
||||||
var out = new Array(data.length);
|
var out = [];
|
||||||
for (var i = 0, ii = data.length; i < ii; ++i)
|
for (var i = 0, ii = data.length; i < ii; ++i)
|
||||||
out[i] = data[i];
|
out[i] = data[i];
|
||||||
return out;
|
return out;
|
||||||
|
@ -81,7 +81,7 @@ var PDFFunction = (function PDFFunctionClosure() {
|
|||||||
function toMultiArray(arr) {
|
function toMultiArray(arr) {
|
||||||
var inputLength = arr.length;
|
var inputLength = arr.length;
|
||||||
var outputLength = arr.length / 2;
|
var outputLength = arr.length / 2;
|
||||||
var out = new Array(outputLength);
|
var out = [];
|
||||||
var index = 0;
|
var index = 0;
|
||||||
for (var i = 0; i < inputLength; i += 2) {
|
for (var i = 0; i < inputLength; i += 2) {
|
||||||
out[index] = [arr[i], arr[i + 1]];
|
out[index] = [arr[i], arr[i + 1]];
|
||||||
@ -364,7 +364,7 @@ var PDFFunction = (function PDFFunctionClosure() {
|
|||||||
return cache.get(key);
|
return cache.get(key);
|
||||||
|
|
||||||
var stack = evaluator.execute(initialStack);
|
var stack = evaluator.execute(initialStack);
|
||||||
var transformed = new Array(numOutputs);
|
var transformed = [];
|
||||||
for (i = numOutputs - 1; i >= 0; --i) {
|
for (i = numOutputs - 1; i >= 0; --i) {
|
||||||
var out = stack.pop();
|
var out = stack.pop();
|
||||||
var rangeIndex = 2 * i;
|
var rangeIndex = 2 * i;
|
||||||
|
1
test/pdfs/issue1309.pdf.link
Normal file
1
test/pdfs/issue1309.pdf.link
Normal file
@ -0,0 +1 @@
|
|||||||
|
http://www.lufthansa.com/mediapool/pdf/31/media_907231.pdf
|
1
test/pdfs/issue1317.pdf.link
Normal file
1
test/pdfs/issue1317.pdf.link
Normal file
@ -0,0 +1 @@
|
|||||||
|
http://iliad.fr/presse/2012/CP_080312_Free_mobile.pdf
|
@ -530,5 +530,19 @@
|
|||||||
"pageLimit": 2,
|
"pageLimit": 2,
|
||||||
"link": true,
|
"link": true,
|
||||||
"type": "eq"
|
"type": "eq"
|
||||||
|
},
|
||||||
|
{ "id": "issue1309",
|
||||||
|
"file": "pdfs/issue1309.pdf",
|
||||||
|
"md5": "e835fb7f3dab3073ad37d0bd3c6399fa",
|
||||||
|
"rounds": 1,
|
||||||
|
"link": true,
|
||||||
|
"type": "eq"
|
||||||
|
},
|
||||||
|
{ "id": "issue1317",
|
||||||
|
"file": "pdfs/issue1317.pdf",
|
||||||
|
"md5": "6fb46275b30c48c8985617d4f86199e3",
|
||||||
|
"rounds": 1,
|
||||||
|
"link": true,
|
||||||
|
"type": "eq"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user