Keep track of the character to glyph mapping in font_renderer.js, to prevent errors when different characters point to the same glyph (issue 7101)
Fixes 7101.
This commit is contained in:
parent
bec4891f5d
commit
17aaa125df
@ -137,7 +137,7 @@ var FontRendererFactory = (function FontRendererFactoryClosure() {
|
||||
}
|
||||
|
||||
function lookupCmap(ranges, unicode) {
|
||||
var code = unicode.charCodeAt(0);
|
||||
var code = unicode.charCodeAt(0), gid = 0;
|
||||
var l = 0, r = ranges.length - 1;
|
||||
while (l < r) {
|
||||
var c = (l + r + 1) >> 1;
|
||||
@ -148,10 +148,13 @@ var FontRendererFactory = (function FontRendererFactoryClosure() {
|
||||
}
|
||||
}
|
||||
if (ranges[l].start <= code && code <= ranges[l].end) {
|
||||
return (ranges[l].idDelta + (ranges[l].ids ?
|
||||
ranges[l].ids[code - ranges[l].start] : code)) & 0xFFFF;
|
||||
gid = (ranges[l].idDelta + (ranges[l].ids ?
|
||||
ranges[l].ids[code - ranges[l].start] : code)) & 0xFFFF;
|
||||
}
|
||||
return 0;
|
||||
return {
|
||||
charCode: code,
|
||||
glyphId: gid,
|
||||
};
|
||||
}
|
||||
|
||||
function compileGlyf(code, cmds, font) {
|
||||
@ -451,14 +454,14 @@ var FontRendererFactory = (function FontRendererFactoryClosure() {
|
||||
x = stack.pop();
|
||||
cmds.push({cmd: 'save'});
|
||||
cmds.push({cmd: 'translate', args: [x, y]});
|
||||
var gid = lookupCmap(font.cmap, String.fromCharCode(
|
||||
var cmap = lookupCmap(font.cmap, String.fromCharCode(
|
||||
font.glyphNameMap[StandardEncoding[achar]]));
|
||||
compileCharString(font.glyphs[gid], cmds, font);
|
||||
compileCharString(font.glyphs[cmap.glyphId], cmds, font);
|
||||
cmds.push({cmd: 'restore'});
|
||||
|
||||
gid = lookupCmap(font.cmap, String.fromCharCode(
|
||||
cmap = lookupCmap(font.cmap, String.fromCharCode(
|
||||
font.glyphNameMap[StandardEncoding[bchar]]));
|
||||
compileCharString(font.glyphs[gid], cmds, font);
|
||||
compileCharString(font.glyphs[cmap.glyphId], cmds, font);
|
||||
}
|
||||
return;
|
||||
case 18: // hstemhm
|
||||
@ -610,14 +613,19 @@ var FontRendererFactory = (function FontRendererFactoryClosure() {
|
||||
|
||||
function CompiledFont(fontMatrix) {
|
||||
this.compiledGlyphs = Object.create(null);
|
||||
this.compiledCharCodeToGlyphId = Object.create(null);
|
||||
this.fontMatrix = fontMatrix;
|
||||
}
|
||||
CompiledFont.prototype = {
|
||||
getPathJs: function (unicode) {
|
||||
var gid = lookupCmap(this.cmap, unicode);
|
||||
var fn = this.compiledGlyphs[gid];
|
||||
var cmap = lookupCmap(this.cmap, unicode);
|
||||
var fn = this.compiledGlyphs[cmap.glyphId];
|
||||
if (!fn) {
|
||||
this.compiledGlyphs[gid] = fn = this.compileGlyph(this.glyphs[gid]);
|
||||
fn = this.compileGlyph(this.glyphs[cmap.glyphId]);
|
||||
this.compiledGlyphs[cmap.glyphId] = fn;
|
||||
}
|
||||
if (this.compiledCharCodeToGlyphId[cmap.charCode] === undefined) {
|
||||
this.compiledCharCodeToGlyphId[cmap.charCode] = cmap.glyphId;
|
||||
}
|
||||
return fn;
|
||||
},
|
||||
@ -644,8 +652,9 @@ var FontRendererFactory = (function FontRendererFactoryClosure() {
|
||||
},
|
||||
|
||||
hasBuiltPath: function (unicode) {
|
||||
var gid = lookupCmap(this.cmap, unicode);
|
||||
return gid in this.compiledGlyphs;
|
||||
var cmap = lookupCmap(this.cmap, unicode);
|
||||
return (this.compiledGlyphs[cmap.glyphId] !== undefined &&
|
||||
this.compiledCharCodeToGlyphId[cmap.charCode] !== undefined);
|
||||
}
|
||||
};
|
||||
|
||||
@ -655,8 +664,6 @@ var FontRendererFactory = (function FontRendererFactoryClosure() {
|
||||
|
||||
this.glyphs = glyphs;
|
||||
this.cmap = cmap;
|
||||
|
||||
this.compiledGlyphs = [];
|
||||
}
|
||||
|
||||
Util.inherit(TrueTypeCompiled, CompiledFont, {
|
||||
@ -668,13 +675,13 @@ var FontRendererFactory = (function FontRendererFactoryClosure() {
|
||||
function Type2Compiled(cffInfo, cmap, fontMatrix, glyphNameMap) {
|
||||
fontMatrix = fontMatrix || [0.001, 0, 0, 0.001, 0, 0];
|
||||
CompiledFont.call(this, fontMatrix);
|
||||
|
||||
this.glyphs = cffInfo.glyphs;
|
||||
this.gsubrs = cffInfo.gsubrs || [];
|
||||
this.subrs = cffInfo.subrs || [];
|
||||
this.cmap = cmap;
|
||||
this.glyphNameMap = glyphNameMap || getGlyphsUnicode();
|
||||
|
||||
this.compiledGlyphs = [];
|
||||
this.gsubrsBias = (this.gsubrs.length < 1240 ?
|
||||
107 : (this.gsubrs.length < 33900 ? 1131 : 32768));
|
||||
this.subrsBias = (this.subrs.length < 1240 ?
|
||||
|
1
test/pdfs/.gitignore
vendored
1
test/pdfs/.gitignore
vendored
@ -21,6 +21,7 @@
|
||||
!issue6782.pdf
|
||||
!issue6961.pdf
|
||||
!issue7020.pdf
|
||||
!issue7101.pdf
|
||||
!issue7115.pdf
|
||||
!filled-background.pdf
|
||||
!ArabicCIDTrueType.pdf
|
||||
|
BIN
test/pdfs/issue7101.pdf
Normal file
BIN
test/pdfs/issue7101.pdf
Normal file
Binary file not shown.
@ -1263,6 +1263,13 @@
|
||||
"rounds": 1,
|
||||
"type": "eq"
|
||||
},
|
||||
{ "id": "issue7101",
|
||||
"file": "pdfs/issue7101.pdf",
|
||||
"md5": "cc9cabe12ac9ad49e5372ef33d10aeb4",
|
||||
"link": false,
|
||||
"rounds": 1,
|
||||
"type": "eq"
|
||||
},
|
||||
{ "id": "pr4606",
|
||||
"file": "pdfs/pr4606.pdf",
|
||||
"md5": "6574fde2314648600056bd0e229df98c",
|
||||
|
Loading…
Reference in New Issue
Block a user