mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-22 16:18:08 +02:00
Merge pull request #7023 from brendandahl/issue6721
Only draw glyphs on canvas if they are in the font or the font file is missing.
This commit is contained in:
commit
a6acf74b54
5 changed files with 34 additions and 14 deletions
|
@ -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);
|
||||
|
||||
|
@ -2810,6 +2814,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;
|
||||
|
@ -2824,6 +2829,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 = {
|
||||
|
@ -2837,9 +2843,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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue