Only draw glyphs on canvas if they are in the font or the font file is missing.

This commit is contained in:
Brendan Dahl 2016-02-24 10:48:02 -08:00
parent c53581f4e5
commit ff87f3fb86
5 changed files with 34 additions and 14 deletions

View File

@ -191,7 +191,7 @@ function getFontType(type, subtype) {
var Glyph = (function GlyphClosure() {
function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId,
isSpace) {
isSpace, isInFont) {
this.fontChar = fontChar;
this.unicode = unicode;
this.accent = accent;
@ -199,17 +199,20 @@ var Glyph = (function GlyphClosure() {
this.vmetric = vmetric;
this.operatorListId = operatorListId;
this.isSpace = isSpace;
this.isInFont = isInFont;
}
Glyph.prototype.matchesForCache = function(fontChar, unicode, accent, width,
vmetric, operatorListId, isSpace) {
vmetric, operatorListId, isSpace,
isInFont) {
return this.fontChar === fontChar &&
this.unicode === unicode &&
this.accent === accent &&
this.width === width &&
this.vmetric === vmetric &&
this.operatorListId === operatorListId &&
this.isSpace === isSpace;
this.isSpace === isSpace &&
this.isInFont === isInFont;
};
return Glyph;
@ -468,6 +471,7 @@ var Font = (function FontClosure() {
this.loadedName = properties.loadedName;
this.isType3Font = properties.isType3Font;
this.sizes = [];
this.missingFile = false;
this.glyphCache = Object.create(null);
@ -2807,6 +2811,7 @@ var Font = (function FontClosure() {
unicode = String.fromCharCode(unicode);
}
var isInFont = charcode in this.toFontChar;
// First try the toFontChar map, if it's not there then try falling
// back to the char code.
fontCharCode = this.toFontChar[charcode] || charcode;
@ -2821,6 +2826,7 @@ var Font = (function FontClosure() {
var accent = null;
if (this.seacMap && this.seacMap[charcode]) {
isInFont = true;
var seac = this.seacMap[charcode];
fontCharCode = seac.baseFontCharCode;
accent = {
@ -2834,9 +2840,9 @@ var Font = (function FontClosure() {
var glyph = this.glyphCache[charcode];
if (!glyph ||
!glyph.matchesForCache(fontChar, unicode, accent, width, vmetric,
operatorListId, isSpace)) {
operatorListId, isSpace, isInFont)) {
glyph = new Glyph(fontChar, unicode, accent, width, vmetric,
operatorListId, isSpace);
operatorListId, isSpace, isInFont);
this.glyphCache[charcode] = glyph;
}
return glyph;

View File

@ -1501,15 +1501,19 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
}
}
if (simpleFillText && !accent) {
// common case
ctx.fillText(character, scaledX, scaledY);
} else {
this.paintChar(character, scaledX, scaledY);
if (accent) {
scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);
// Only attempt to draw the glyph if it is actually in the embedded font
// file or if there isn't a font file so the fallback font is shown.
if (glyph.isInFont || font.missingFile) {
if (simpleFillText && !accent) {
// common case
ctx.fillText(character, scaledX, scaledY);
} else {
this.paintChar(character, scaledX, scaledY);
if (accent) {
scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);
}
}
}

View File

@ -166,6 +166,7 @@
!issue5010.pdf
!issue4934.pdf
!issue4650.pdf
!issue6721_reduced.pdf
!issue3025.pdf
!issue2099-1.pdf
!issue3371.pdf

Binary file not shown.

View File

@ -543,6 +543,15 @@
"lastPage": 1,
"type": "eq"
},
{ "id": "issue6721_reduced",
"file": "pdfs/issue6721_reduced.pdf",
"md5": "719aa66d8081a15e3ba6032ed4279237",
"rounds": 1,
"link": false,
"firstPage": 1,
"lastPage": 1,
"type": "eq"
},
{ "id": "issue5010",
"file": "pdfs/issue5010.pdf",
"md5": "419f4b13403a0871c463ec69d96e342c",