Merge branch 'master' into predictor
This commit is contained in:
commit
8a18c82f15
1552
Encodings.js
1552
Encodings.js
File diff suppressed because it is too large
Load Diff
210
fonts.js
210
fonts.js
@ -31,7 +31,7 @@ var fontCount = 0;
|
|||||||
var Fonts = {
|
var Fonts = {
|
||||||
_active: null,
|
_active: null,
|
||||||
get active() {
|
get active() {
|
||||||
return this._active || { encoding: [] };
|
return this._active;
|
||||||
},
|
},
|
||||||
|
|
||||||
set active(aName) {
|
set active(aName) {
|
||||||
@ -39,8 +39,11 @@ var Fonts = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
unicodeFromCode: function fonts_unicodeFromCode(aCode) {
|
unicodeFromCode: function fonts_unicodeFromCode(aCode) {
|
||||||
var unicode = GlyphsUnicode[this.active.encoding[aCode]];
|
var active = this._active;
|
||||||
return unicode ? unicode : aCode;
|
if (!active || !active.properties.encoding)
|
||||||
|
return aCode;
|
||||||
|
|
||||||
|
return GlyphsUnicode[active.properties.encoding[aCode]];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -49,16 +52,10 @@ var Fonts = {
|
|||||||
* decoding logics whatever type it is (assuming the font type is supported).
|
* decoding logics whatever type it is (assuming the font type is supported).
|
||||||
*
|
*
|
||||||
* For example to read a Type1 font and to attach it to the document:
|
* For example to read a Type1 font and to attach it to the document:
|
||||||
* var type1Font = new Font("MyFontName", binaryData, aFontEncoding, "Type1");
|
* var type1Font = new Font("MyFontName", binaryFile, propertiesObject);
|
||||||
* type1Font.bind();
|
* type1Font.bind();
|
||||||
*
|
|
||||||
* As an improvment the last parameter can be replaced by an automatic guess
|
|
||||||
* of the font type based on the first byte of the file.
|
|
||||||
*
|
|
||||||
* FIXME There is now too many parameters, this should be turned into an
|
|
||||||
* object containing all the required informations about the font
|
|
||||||
*/
|
*/
|
||||||
var Font = function(aName, aFile, aEncoding, aCharset, aBBox, aType) {
|
var Font = function(aName, aFile, aProperties) {
|
||||||
this.name = aName;
|
this.name = aName;
|
||||||
|
|
||||||
// If the font has already been decoded simply return
|
// If the font has already been decoded simply return
|
||||||
@ -68,41 +65,40 @@ var Font = function(aName, aFile, aEncoding, aCharset, aBBox, aType) {
|
|||||||
}
|
}
|
||||||
fontCount++;
|
fontCount++;
|
||||||
|
|
||||||
var start = Date.now();
|
switch (aProperties.type) {
|
||||||
switch (aType) {
|
|
||||||
case "Type1":
|
case "Type1":
|
||||||
var cff = new CFF(aName, aBBox, aFile);
|
var cff = new CFF(aName, aFile, aProperties);
|
||||||
this.mimetype = "font/otf";
|
this.mimetype = "font/otf";
|
||||||
|
|
||||||
// Wrap the CFF data inside an OTF font file
|
// Wrap the CFF data inside an OTF font file
|
||||||
this.font = this.cover(cff);
|
this.font = this.cover(cff, aProperties);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "TrueType":
|
case "TrueType":
|
||||||
|
// TrueType is disabled for the moment since the sanitizer prevent it
|
||||||
|
// from loading because of an overdated cmap table
|
||||||
return Fonts[aName] = {
|
return Fonts[aName] = {
|
||||||
data: null,
|
data: null,
|
||||||
|
properties: {
|
||||||
encoding: {},
|
encoding: {},
|
||||||
charset: null,
|
charset: null
|
||||||
|
},
|
||||||
loading: false
|
loading: false
|
||||||
};
|
};
|
||||||
|
|
||||||
// TrueType is disabled for the moment since the sanitizer prevent it
|
|
||||||
// from loading
|
|
||||||
this.mimetype = "font/ttf";
|
this.mimetype = "font/ttf";
|
||||||
var ttf = new TrueType(aFile);
|
var ttf = new TrueType(aFile);
|
||||||
this.font = ttf.data;
|
this.font = ttf.data;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
warn("Font " + aType + " is not supported");
|
warn("Font " + aProperties.type + " is not supported");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
var end = Date.now();
|
|
||||||
|
|
||||||
Fonts[aName] = {
|
Fonts[aName] = {
|
||||||
data: this.font,
|
data: this.font,
|
||||||
encoding: aEncoding,
|
properties: aProperties,
|
||||||
charset: aCharset ? aCharset.slice() : null,
|
|
||||||
loading: true
|
loading: true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,7 +200,7 @@ Font.prototype = {
|
|||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
ctx.fillText(testString, 20, 50);
|
ctx.fillText(testString, 20, 50);
|
||||||
}, 20, this);
|
}, 50, this);
|
||||||
|
|
||||||
/** Hack end */
|
/** Hack end */
|
||||||
|
|
||||||
@ -355,7 +351,7 @@ Font.prototype = {
|
|||||||
idDeltas, idRangeOffsets, glyphsIdsArray);
|
idDeltas, idRangeOffsets, glyphsIdsArray);
|
||||||
},
|
},
|
||||||
|
|
||||||
cover: function font_cover(aFont) {
|
cover: function font_cover(aFont, aProperties) {
|
||||||
var otf = new Uint8Array(kMaxFontFileSize);
|
var otf = new Uint8Array(kMaxFontFileSize);
|
||||||
|
|
||||||
// Required Tables
|
// Required Tables
|
||||||
@ -431,7 +427,7 @@ Font.prototype = {
|
|||||||
this._createTableEntry(otf, offsets, "OS/2", OS2);
|
this._createTableEntry(otf, offsets, "OS/2", OS2);
|
||||||
|
|
||||||
//XXX Getting charstrings here seems wrong since this is another CFF glue
|
//XXX Getting charstrings here seems wrong since this is another CFF glue
|
||||||
var charstrings = aFont.getOrderedCharStrings(aFont.glyphs);
|
var charstrings = aFont.getOrderedCharStrings(aProperties.glyphs);
|
||||||
|
|
||||||
/** CMAP */
|
/** CMAP */
|
||||||
cmap = this._createCMAPTable(charstrings);
|
cmap = this._createCMAPTable(charstrings);
|
||||||
@ -715,22 +711,11 @@ var TrueType = function(aFile) {
|
|||||||
ttf.set(tableData, offsets.currentOffset);
|
ttf.set(tableData, offsets.currentOffset);
|
||||||
offsets.currentOffset += tableData.length;
|
offsets.currentOffset += tableData.length;
|
||||||
|
|
||||||
if (0) {
|
|
||||||
var data = [];
|
|
||||||
for (var j = 0; j < tableData.length; j++)
|
|
||||||
d.push(tableData[j]);
|
|
||||||
log("data for table: " + table.tag + ": " + data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4-byte aligned data
|
// 4-byte aligned data
|
||||||
while (offsets.currentOffset & 3)
|
while (offsets.currentOffset & 3)
|
||||||
offsets.currentOffset++;
|
offsets.currentOffset++;
|
||||||
}
|
}
|
||||||
|
|
||||||
var fontData = [];
|
|
||||||
for (var i = 0; i < ttf.length; i++)
|
|
||||||
fontData.push(ttf[i]);
|
|
||||||
|
|
||||||
this.data = ttf;
|
this.data = ttf;
|
||||||
return;
|
return;
|
||||||
} else if (requiredTables.lenght) {
|
} else if (requiredTables.lenght) {
|
||||||
@ -844,17 +829,11 @@ TrueType.prototype = {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This dictionary holds decoded fonts data.
|
* Type1Parser encapsulate the needed code for parsing a Type1 font
|
||||||
|
* program.
|
||||||
|
* Some of its logic depends on the Type2 charstrings structure.
|
||||||
*/
|
*/
|
||||||
var Type1Parser = function() {
|
var Type1Parser = function() {
|
||||||
// Turn on this flag for additional debugging logs
|
|
||||||
var debug = false;
|
|
||||||
|
|
||||||
var dump = function(aData) {
|
|
||||||
if (debug)
|
|
||||||
log(aData);
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence
|
* Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence
|
||||||
* of Plaintext Bytes. The function took a key as a parameter which can be
|
* of Plaintext Bytes. The function took a key as a parameter which can be
|
||||||
@ -863,8 +842,7 @@ var Type1Parser = function() {
|
|||||||
var kEexecEncryptionKey = 55665;
|
var kEexecEncryptionKey = 55665;
|
||||||
var kCharStringsEncryptionKey = 4330;
|
var kCharStringsEncryptionKey = 4330;
|
||||||
|
|
||||||
function decrypt(aStream, aKey, aDiscardNumber, aByteArray) {
|
function decrypt(aStream, aKey, aDiscardNumber) {
|
||||||
var start = Date.now();
|
|
||||||
var r = aKey, c1 = 52845, c2 = 22719;
|
var r = aKey, c1 = 52845, c2 = 22719;
|
||||||
var decryptedString = [];
|
var decryptedString = [];
|
||||||
|
|
||||||
@ -872,14 +850,9 @@ var Type1Parser = function() {
|
|||||||
var count = aStream.length;
|
var count = aStream.length;
|
||||||
for (var i = 0; i < count; i++) {
|
for (var i = 0; i < count; i++) {
|
||||||
value = aStream[i];
|
value = aStream[i];
|
||||||
if (aByteArray)
|
|
||||||
decryptedString[i] = value ^ (r >> 8);
|
decryptedString[i] = value ^ (r >> 8);
|
||||||
else
|
|
||||||
decryptedString[i] = String.fromCharCode(value ^ (r >> 8));
|
|
||||||
r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
|
r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
|
||||||
}
|
}
|
||||||
var end = Date.now();
|
|
||||||
dump("Time to decrypt string of length " + count + " is " + (end - start));
|
|
||||||
return decryptedString.slice(aDiscardNumber);
|
return decryptedString.slice(aDiscardNumber);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1014,8 +987,7 @@ var Type1Parser = function() {
|
|||||||
} else if (!command) {
|
} else if (!command) {
|
||||||
break;
|
break;
|
||||||
} else if (command == -1) {
|
} else if (command == -1) {
|
||||||
log("decodeCharstring: " + charString);
|
error("Support for Type1 command " + value + " (" + escape + ") is not implemented in charstring: " + charString);
|
||||||
error("Support for Type1 command " + value + " (" + escape + ") is not implemented");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
value = command;
|
value = command;
|
||||||
@ -1042,8 +1014,8 @@ var Type1Parser = function() {
|
|||||||
* Returns an object containing a Subrs array and a CharStrings array
|
* Returns an object containing a Subrs array and a CharStrings array
|
||||||
* extracted from and eexec encrypted block of data
|
* extracted from and eexec encrypted block of data
|
||||||
*/
|
*/
|
||||||
this.extractFontInfo = function(aStream) {
|
this.extractFontProgram = function t1_extractFontProgram(aStream) {
|
||||||
var eexecString = decrypt(aStream, kEexecEncryptionKey, 4, true);
|
var eexecString = decrypt(aStream, kEexecEncryptionKey, 4);
|
||||||
var subrs = [], glyphs = [];
|
var subrs = [], glyphs = [];
|
||||||
var inSubrs = inGlyphs = false;
|
var inSubrs = inGlyphs = false;
|
||||||
var glyph = "";
|
var glyph = "";
|
||||||
@ -1052,15 +1024,15 @@ var Type1Parser = function() {
|
|||||||
var index = 0;
|
var index = 0;
|
||||||
var length = 0;
|
var length = 0;
|
||||||
|
|
||||||
var count = eexecString.length;
|
|
||||||
var c = "";
|
var c = "";
|
||||||
|
var count = eexecString.length;
|
||||||
for (var i = 0; i < count; i++) {
|
for (var i = 0; i < count; i++) {
|
||||||
var c = eexecString[i];
|
var c = eexecString[i];
|
||||||
|
|
||||||
if (inSubrs && c == 0x52) {
|
if (inSubrs && c == 0x52) {
|
||||||
length = parseInt(length);
|
length = parseInt(length);
|
||||||
var data = eexecString.slice(i + 3, i + 3 + length);
|
var data = eexecString.slice(i + 3, i + 3 + length);
|
||||||
var encodedSubr = decrypt(data, kCharStringsEncryptionKey, 4, true);
|
var encodedSubr = decrypt(data, kCharStringsEncryptionKey, 4);
|
||||||
var subr = decodeCharString(encodedSubr);
|
var subr = decodeCharString(encodedSubr);
|
||||||
|
|
||||||
subrs.push(subr);
|
subrs.push(subr);
|
||||||
@ -1068,7 +1040,7 @@ var Type1Parser = function() {
|
|||||||
} else if (inGlyphs && c == 0x52) {
|
} else if (inGlyphs && c == 0x52) {
|
||||||
length = parseInt(length);
|
length = parseInt(length);
|
||||||
var data = eexecString.slice(i + 3, i + 3 + length);
|
var data = eexecString.slice(i + 3, i + 3 + length);
|
||||||
var encodedCharstring = decrypt(data, kCharStringsEncryptionKey, 4, true);
|
var encodedCharstring = decrypt(data, kCharStringsEncryptionKey, 4);
|
||||||
var subr = decodeCharString(encodedCharstring);
|
var subr = decodeCharString(encodedCharstring);
|
||||||
|
|
||||||
glyphs.push({
|
glyphs.push({
|
||||||
@ -1104,36 +1076,95 @@ var Type1Parser = function() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var CFF = function(aFontName, aFontBBox, aFontFile) {
|
const CFFStrings = [
|
||||||
|
".notdef","space","exclam","quotedbl","numbersign","dollar","percent","ampersand",
|
||||||
|
"quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period",
|
||||||
|
"slash","zero","one","two","three","four","five","six","seven","eight","nine",
|
||||||
|
"colon","semicolon","less","equal","greater","question","at","A","B","C","D","E",
|
||||||
|
"F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y",
|
||||||
|
"Z","bracketleft","backslash","bracketright","asciicircum","underscore",
|
||||||
|
"quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q",
|
||||||
|
"r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde",
|
||||||
|
"exclamdown","cent","sterling","fraction","yen","florin","section","currency",
|
||||||
|
"quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright",
|
||||||
|
"fi","fl","endash","dagger","daggerdbl","periodcentered","paragraph","bullet",
|
||||||
|
"quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis",
|
||||||
|
"perthousand","questiondown","grave","acute","circumflex","tilde","macron",
|
||||||
|
"breve","dotaccent","dieresis","ring","cedilla","hungarumlaut","ogonek","caron",
|
||||||
|
"emdash","AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae","dotlessi",
|
||||||
|
"lslash","oslash","oe","germandbls","onesuperior","logicalnot","mu","trademark",
|
||||||
|
"Eth","onehalf","plusminus","Thorn","onequarter","divide","brokenbar","degree",
|
||||||
|
"thorn","threequarters","twosuperior","registered","minus","eth","multiply",
|
||||||
|
"threesuperior","copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring",
|
||||||
|
"Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave","Iacute",
|
||||||
|
"Icircumflex","Idieresis","Igrave","Ntilde","Oacute","Ocircumflex","Odieresis",
|
||||||
|
"Ograve","Otilde","Scaron","Uacute","Ucircumflex","Udieresis","Ugrave","Yacute",
|
||||||
|
"Ydieresis","Zcaron","aacute","acircumflex","adieresis","agrave","aring","atilde",
|
||||||
|
"ccedilla","eacute","ecircumflex","edieresis","egrave","iacute","icircumflex",
|
||||||
|
"idieresis","igrave","ntilde","oacute","ocircumflex","odieresis","ograve",
|
||||||
|
"otilde","scaron","uacute","ucircumflex","udieresis","ugrave","yacute",
|
||||||
|
"ydieresis","zcaron","exclamsmall","Hungarumlautsmall","dollaroldstyle",
|
||||||
|
"dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior",
|
||||||
|
"parenrightsuperior","266 ff","onedotenleader","zerooldstyle","oneoldstyle",
|
||||||
|
"twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle",
|
||||||
|
"sevenoldstyle","eightoldstyle","nineoldstyle","commasuperior",
|
||||||
|
"threequartersemdash","periodsuperior","questionsmall","asuperior","bsuperior",
|
||||||
|
"centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior",
|
||||||
|
"nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","ffi","ffl",
|
||||||
|
"parenleftinferior","parenrightinferior","Circumflexsmall","hyphensuperior",
|
||||||
|
"Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall",
|
||||||
|
"Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall",
|
||||||
|
"Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall",
|
||||||
|
"Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","exclamdownsmall",
|
||||||
|
"centoldstyle","Lslashsmall","Scaronsmall","Zcaronsmall","Dieresissmall",
|
||||||
|
"Brevesmall","Caronsmall","Dotaccentsmall","Macronsmall","figuredash",
|
||||||
|
"hypheninferior","Ogoneksmall","Ringsmall","Cedillasmall","questiondownsmall",
|
||||||
|
"oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds",
|
||||||
|
"zerosuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior",
|
||||||
|
"eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior",
|
||||||
|
"threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior",
|
||||||
|
"eightinferior","nineinferior","centinferior","dollarinferior","periodinferior",
|
||||||
|
"commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall",
|
||||||
|
"Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall",
|
||||||
|
"Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall",
|
||||||
|
"Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall",
|
||||||
|
"Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall",
|
||||||
|
"Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall",
|
||||||
|
"Yacutesmall","Thornsmall","Ydieresissmall","001.000","001.001","001.002",
|
||||||
|
"001.003","Black","Bold","Book","Light","Medium","Regular","Roman","Semibold"
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Take a Type1 file as input and wrap it into a Compact Font Format (CFF)
|
||||||
|
* wrapping Type2 charstrings.
|
||||||
|
*/
|
||||||
|
var CFF = function(aName, aFile, aProperties) {
|
||||||
// Get the data block containing glyphs and subrs informations
|
// Get the data block containing glyphs and subrs informations
|
||||||
var length1 = aFontFile.dict.get("Length1");
|
var length1 = aFile.dict.get("Length1");
|
||||||
var length2 = aFontFile.dict.get("Length2");
|
var length2 = aFile.dict.get("Length2");
|
||||||
aFontFile.skip(length1);
|
aFile.skip(length1);
|
||||||
var eexecBlock = aFontFile.getBytes(length2);
|
var eexecBlock = aFile.getBytes(length2);
|
||||||
|
|
||||||
// Extract informations from it
|
// Decrypt the data blocks and retrieve the informations from it
|
||||||
var start = Date.now();
|
|
||||||
var parser = new Type1Parser();
|
var parser = new Type1Parser();
|
||||||
var fontInfo = parser.extractFontInfo(eexecBlock);
|
var fontInfo = parser.extractFontProgram(eexecBlock);
|
||||||
fontInfo.name = aFontName;
|
|
||||||
fontInfo.bbox = aFontBBox;
|
|
||||||
|
|
||||||
// XXX This hold the glyph data as if, this should be improved
|
aProperties.subrs = fontInfo.subrs;
|
||||||
this.glyphs = fontInfo.charstrings;
|
aProperties.glyphs = fontInfo.charstrings;
|
||||||
|
this.data = this.wrap(aName, aProperties);
|
||||||
this.data = this.convertToCFF(fontInfo);
|
|
||||||
var end = Date.now();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
CFF.prototype = {
|
CFF.prototype = {
|
||||||
createCFFIndexHeader: function(aObjects, aIsByte) {
|
createCFFIndexHeader: function(aObjects, aIsByte) {
|
||||||
var data = [];
|
|
||||||
|
|
||||||
// First 2 bytes contains the number of objects contained into this index
|
// First 2 bytes contains the number of objects contained into this index
|
||||||
var count = aObjects.length;
|
var count = aObjects.length;
|
||||||
|
|
||||||
|
// If there is no object, just create an array saying that with another
|
||||||
|
// offset byte.
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
return [0x00, 0x00, 0x00];
|
return [0x00, 0x00, 0x00];
|
||||||
|
|
||||||
|
var data = [];
|
||||||
var bytes = FontsUtils.integerToBytes(count, 2);
|
var bytes = FontsUtils.integerToBytes(count, 2);
|
||||||
for (var i = 0; i < bytes.length; i++)
|
for (var i = 0; i < bytes.length; i++)
|
||||||
data.push(bytes[i]);
|
data.push(bytes[i]);
|
||||||
@ -1164,10 +1195,9 @@ CFF.prototype = {
|
|||||||
encodeNumber: function(aValue) {
|
encodeNumber: function(aValue) {
|
||||||
var x = 0;
|
var x = 0;
|
||||||
if (aValue >= -32768 && aValue <= 32767) {
|
if (aValue >= -32768 && aValue <= 32767) {
|
||||||
return [ 28, aValue >> 8, aValue ];
|
return [ 28, aValue >> 8, aValue & 0xFF ];
|
||||||
} else if (aValue >= (-2147483647-1) && aValue <= 2147483647) {
|
} else if (aValue >= (-2147483647-1) && aValue <= 2147483647) {
|
||||||
return [
|
return [ 0xFF, aValue >> 24, Value >> 16, aValue >> 8, aValue & 0xFF ];
|
||||||
0xFF, aValue >> 24, Value >> 16, aValue >> 8, aValue ];
|
|
||||||
} else {
|
} else {
|
||||||
error("Value: " + aValue + " is not allowed");
|
error("Value: " + aValue + " is not allowed");
|
||||||
}
|
}
|
||||||
@ -1220,7 +1250,6 @@ CFF.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
flattenCharstring: function(aGlyph, aCharstring, aSubrs) {
|
flattenCharstring: function(aGlyph, aCharstring, aSubrs) {
|
||||||
var original = aCharstring.slice();
|
|
||||||
var i = 0;
|
var i = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
var obj = aCharstring[i];
|
var obj = aCharstring[i];
|
||||||
@ -1324,17 +1353,10 @@ CFF.prototype = {
|
|||||||
error("failing with i = " + i + " in charstring:" + aCharstring + "(" + aCharstring.length + ")");
|
error("failing with i = " + i + " in charstring:" + aCharstring + "(" + aCharstring.length + ")");
|
||||||
},
|
},
|
||||||
|
|
||||||
convertToCFF: function(aFontInfo) {
|
wrap: function(aName, aProperties) {
|
||||||
var debug = false;
|
var charstrings = this.getOrderedCharStrings(aProperties.glyphs);
|
||||||
function dump(aMsg) {
|
|
||||||
if (debug)
|
|
||||||
log(aMsg);
|
|
||||||
};
|
|
||||||
|
|
||||||
var charstrings = this.getOrderedCharStrings(aFontInfo.charstrings);
|
|
||||||
|
|
||||||
// Starts the conversion of the Type1 charstrings to Type2
|
// Starts the conversion of the Type1 charstrings to Type2
|
||||||
var start = Date.now();
|
|
||||||
var charstringsCount = 0;
|
var charstringsCount = 0;
|
||||||
var charstringsDataLength = 0;
|
var charstringsDataLength = 0;
|
||||||
var glyphs = [];
|
var glyphs = [];
|
||||||
@ -1342,16 +1364,12 @@ CFF.prototype = {
|
|||||||
var charstring = charstrings[i].charstring.slice();
|
var charstring = charstrings[i].charstring.slice();
|
||||||
var glyph = charstrings[i].glyph;
|
var glyph = charstrings[i].glyph;
|
||||||
|
|
||||||
var flattened = this.flattenCharstring(glyph, charstring, aFontInfo.subrs);
|
var flattened = this.flattenCharstring(glyph, charstring, aProperties.subrs);
|
||||||
glyphs.push(flattened);
|
glyphs.push(flattened);
|
||||||
charstringsCount++;
|
charstringsCount++;
|
||||||
charstringsDataLength += flattened.length;
|
charstringsDataLength += flattened.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
var end = Date.now();
|
|
||||||
dump("There is " + charstringsCount + " glyphs (size: " + charstringsDataLength + ")");
|
|
||||||
dump("Time to flatten the strings is : " + (end -start));
|
|
||||||
|
|
||||||
// Create a CFF font data
|
// Create a CFF font data
|
||||||
var cff = new Uint8Array(kMaxFontFileSize);
|
var cff = new Uint8Array(kMaxFontFileSize);
|
||||||
var currentOffset = 0;
|
var currentOffset = 0;
|
||||||
@ -1362,7 +1380,7 @@ CFF.prototype = {
|
|||||||
cff.set(header);
|
cff.set(header);
|
||||||
|
|
||||||
// Names Index
|
// Names Index
|
||||||
var nameIndex = this.createCFFIndexHeader([aFontInfo.name]);
|
var nameIndex = this.createCFFIndexHeader([aName]);
|
||||||
cff.set(nameIndex, currentOffset);
|
cff.set(nameIndex, currentOffset);
|
||||||
currentOffset += nameIndex.length;
|
currentOffset += nameIndex.length;
|
||||||
|
|
||||||
@ -1406,7 +1424,7 @@ CFF.prototype = {
|
|||||||
248, 31, 4 // Weight
|
248, 31, 4 // Weight
|
||||||
];
|
];
|
||||||
|
|
||||||
var fontBBox = aFontInfo.bbox;
|
var fontBBox = aProperties.bbox;
|
||||||
for (var i = 0; i < fontBBox.length; i++)
|
for (var i = 0; i < fontBBox.length; i++)
|
||||||
topDictIndex = topDictIndex.concat(this.encodeNumber(fontBBox[i]));
|
topDictIndex = topDictIndex.concat(this.encodeNumber(fontBBox[i]));
|
||||||
topDictIndex.push(5) // FontBBox;
|
topDictIndex.push(5) // FontBBox;
|
||||||
|
@ -4282,8 +4282,8 @@ var GlyphsUnicode = {
|
|||||||
zukatakana: 0x30BA
|
zukatakana: 0x30BA
|
||||||
};
|
};
|
||||||
|
|
||||||
// Add missing glyphs from the original Adobe's list
|
// Add missing glyphs from the Adobe's original list
|
||||||
GlyphsUnicode["angbracketleft"] = 0x3008;
|
GlyphsUnicode.angbracketleft = 0x3008;
|
||||||
GlyphsUnicode["angbracketright"] = 0x3009;
|
GlyphsUnicode.angbracketright = 0x3009;
|
||||||
GlyphsUnicode["circlecopyrt"] = 0x00A9;
|
GlyphsUnicode.circlecopyrt = 0x00A9;
|
||||||
|
|
||||||
|
228
pdf.js
228
pdf.js
@ -1798,6 +1798,180 @@ var CanvasExtraState = (function() {
|
|||||||
return constructor;
|
return constructor;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
const Encodings = {
|
||||||
|
get ExpertEncoding() {
|
||||||
|
return shadow(this, "ExpertEncoding", [
|
||||||
|
"space","exclamsmall","Hungarumlautsmall",,"dollaroldstyle","dollarsuperior",
|
||||||
|
"ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior",
|
||||||
|
"twodotenleader","onedotenleader","comma","hyphen","period","fraction",
|
||||||
|
"zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle",
|
||||||
|
"fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle",
|
||||||
|
"colon","semicolon","commasuperior","threequartersemdash","periodsuperior",
|
||||||
|
"questionsmall",,"asuperior","bsuperior","centsuperior","dsuperior","esuperior",,,
|
||||||
|
"isuperior",,,"lsuperior","msuperior","nsuperior","osuperior",,,"rsuperior",
|
||||||
|
"ssuperior","tsuperior",,"ff","fi","fl","ffi","ffl","parenleftinferior",,
|
||||||
|
"parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall",
|
||||||
|
"Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall",
|
||||||
|
"Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall",
|
||||||
|
"Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary",
|
||||||
|
"onefitted","rupiah","Tildesmall",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
"exclamdownsmall","centoldstyle","Lslashsmall",,,"Scaronsmall","Zcaronsmall",
|
||||||
|
"Dieresissmall","Brevesmall","Caronsmall",,"Dotaccentsmall",,,"Macronsmall",,,
|
||||||
|
"figuredash","hypheninferior",,,"Ogoneksmall","Ringsmall","Cedillasmall",,,,
|
||||||
|
"onequarter","onehalf","threequarters","questiondownsmall","oneeighth",
|
||||||
|
"threeeighths","fiveeighths","seveneighths","onethird","twothirds",,,
|
||||||
|
"zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior",
|
||||||
|
"fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior",
|
||||||
|
"zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior",
|
||||||
|
"fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior",
|
||||||
|
"centinferior","dollarinferior","periodinferior","commainferior","Agravesmall",
|
||||||
|
"Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall",
|
||||||
|
"AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall",
|
||||||
|
"Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall",
|
||||||
|
"Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall",
|
||||||
|
"Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall",
|
||||||
|
"Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall",
|
||||||
|
"Ydieresissmall"
|
||||||
|
]);
|
||||||
|
},
|
||||||
|
get MacExpertEncoding() {
|
||||||
|
return shadow(this, "MacExpertEncoding", [
|
||||||
|
"space","exclamsmall","Hungarumlautsmall","centoldstyle","dollaroldstyle",
|
||||||
|
"dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior",
|
||||||
|
"parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period",
|
||||||
|
"fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle",
|
||||||
|
"fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle",
|
||||||
|
"nineoldstyle","colon","semicolon",,"threequartersemdash",,"questionsmall",,,,,
|
||||||
|
"Ethsmall",,,"onequarter","onehalf","threequarters","oneeighth","threeeighths",
|
||||||
|
"fiveeighths","seveneighths","onethird","twothirds",,,,,,,"ff","fi","fl","ffi",
|
||||||
|
"ffl","parenleftinferior",,"parenrightinferior","Circumflexsmall",
|
||||||
|
"hypheninferior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall",
|
||||||
|
"Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall",
|
||||||
|
"Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall",
|
||||||
|
"Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall",,,
|
||||||
|
"asuperior","centsuperior",,,,,"Aacutesmall","Agravesmall","Acircumflexsmall",
|
||||||
|
"Adieresissmall","Atildesmall","Aringsmall","Ccedillasmall","Eacutesmall",
|
||||||
|
"Egravesmall","Ecircumflexsmall","Edieresissmall","Iacutesmall","Igravesmall",
|
||||||
|
"Icircumflexsmall","Idieresissmall","Ntildesmall","Oacutesmall","Ogravesmall",
|
||||||
|
"Ocircumflexsmall","Odieresissmall","Otildesmall","Uacutesmall","Ugravesmall",
|
||||||
|
"Ucircumflexsmall","Udieresissmall",,"eightsuperior","fourinferior",
|
||||||
|
"threeinferior","sixinferior","eightinferior","seveninferior","Scaronsmall",,
|
||||||
|
"centinferior","twoinferior",,"Dieresissmall",,"Caronsmall","osuperior",
|
||||||
|
"fiveinferior",,"commainferior","periodinferior","Yacutesmall",,"dollarinferior",,
|
||||||
|
"Thornsmall",,"nineinferior","zeroinferior","Zcaronsmall","AEsmall","Oslashsmall",
|
||||||
|
"questiondownsmall","oneinferior","Lslashsmall",,,,,,,"Cedillasmall",,,,,,
|
||||||
|
"OEsmall","figuredash","hyphensuperior",,,,,"exclamdownsmall",,"Ydieresissmall",,
|
||||||
|
"onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior",
|
||||||
|
"sixsuperior","sevensuperior","ninesuperior","zerosuperior",,"esuperior",
|
||||||
|
"rsuperior","tsuperior",,,"isuperior","ssuperior","dsuperior",,,,,,"lsuperior",
|
||||||
|
"Ogoneksmall","Brevesmall","Macronsmall","bsuperior","nsuperior","msuperior",
|
||||||
|
"commasuperior","periodsuperior","Dotaccentsmall","Ringsmall",,,
|
||||||
|
]);
|
||||||
|
},
|
||||||
|
get MacRomanEncoding() {
|
||||||
|
return shadow(this, "MacRomanEncoding", [
|
||||||
|
"space","exclam","quotedbl","numbersign","dollar","percent","ampersand",
|
||||||
|
"quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen",
|
||||||
|
"period","slash","zero","one","two","three","four","five","six","seven","eight",
|
||||||
|
"nine","colon","semicolon","less","equal","greater","question","at","A","B","C",
|
||||||
|
"D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W",
|
||||||
|
"X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore",
|
||||||
|
"grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r",
|
||||||
|
"s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde",,
|
||||||
|
"Adieresis","Aring","Ccedilla","Eacute","Ntilde","Odieresis","Udieresis","aacute",
|
||||||
|
"agrave","acircumflex","adieresis","atilde","aring","ccedilla","eacute","egrave",
|
||||||
|
"ecircumflex","edieresis","iacute","igrave","icircumflex","idieresis","ntilde",
|
||||||
|
"oacute","ograve","ocircumflex","odieresis","otilde","uacute","ugrave",
|
||||||
|
"ucircumflex","udieresis","dagger","degree","cent","sterling","section","bullet",
|
||||||
|
"paragraph","germandbls","registered","copyright","trademark","acute","dieresis",
|
||||||
|
"notequal","AE","Oslash","infinity","plusminus","lessequal","greaterequal","yen",
|
||||||
|
"mu","partialdiff","summation","product","pi","integral","ordfeminine",
|
||||||
|
"ordmasculine","Omega","ae","oslash","questiondown","exclamdown","logicalnot",
|
||||||
|
"radical","florin","approxequal","Delta","guillemotleft","guillemotright",
|
||||||
|
"ellipsis","space","Agrave","Atilde","Otilde","OE","oe","endash","emdash",
|
||||||
|
"quotedblleft","quotedblright","quoteleft","quoteright","divide","lozenge",
|
||||||
|
"ydieresis","Ydieresis","fraction","currency","guilsinglleft","guilsinglright",
|
||||||
|
"fi","fl","daggerdbl","periodcentered","quotesinglbase","quotedblbase",
|
||||||
|
"perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave","Iacute",
|
||||||
|
"Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex","apple","Ograve",
|
||||||
|
"Uacute","Ucircumflex","Ugrave","dotlessi","circumflex","tilde","macron","breve",
|
||||||
|
"dotaccent","ring","cedilla","hungarumlaut","ogonek","caron"
|
||||||
|
]);
|
||||||
|
},
|
||||||
|
get StandardEncoding() {
|
||||||
|
return shadow(this, "StandardEncoding", [
|
||||||
|
"space","exclam","quotedbl","numbersign","dollar","percent","ampersand",
|
||||||
|
"quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period",
|
||||||
|
"slash","zero","one","two","three","four","five","six","seven","eight","nine",
|
||||||
|
"colon","semicolon","less","equal","greater","question","at","A","B","C","D","E",
|
||||||
|
"F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y",
|
||||||
|
"Z","bracketleft","backslash","bracketright","asciicircum","underscore",
|
||||||
|
"quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q",
|
||||||
|
"r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde",,,
|
||||||
|
"exclamdown","cent","sterling","fraction","yen","florin","section","currency",
|
||||||
|
"quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright",
|
||||||
|
"fi","fl",,"endash","dagger","daggerdbl","periodcentered",,"paragraph","bullet",
|
||||||
|
"quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis",
|
||||||
|
"perthousand",,"questiondown",,"grave","acute","circumflex","tilde","macron",
|
||||||
|
"breve","dotaccent","dieresis",,"ring","cedilla",,"hungarumlaut","ogonek","caron",
|
||||||
|
"emdash",,,,,,,,,,,,,,,,,"AE",,"ordfeminine",,,,,"Lslash","Oslash","OE",
|
||||||
|
"ordmasculine",,,,,,"ae",,,,"dotlessi",,,"lslash","oslash","oe","germandbls",,,
|
||||||
|
]);
|
||||||
|
},
|
||||||
|
get WinAnsiEncoding() {
|
||||||
|
return shadow(this, "WinAnsiEncoding", [
|
||||||
|
"space","exclam","quotedbl","numbersign","dollar","percent","ampersand",
|
||||||
|
"quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen",
|
||||||
|
"period","slash","zero","one","two","three","four","five","six","seven","eight",
|
||||||
|
"nine","colon","semicolon","less","equal","greater","question","at","A","B","C",
|
||||||
|
"D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W",
|
||||||
|
"X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore",
|
||||||
|
"grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r",
|
||||||
|
"s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde",
|
||||||
|
"bullet","Euro","bullet","quotesinglbase","florin","quotedblbase","ellipsis",
|
||||||
|
"dagger","daggerdbl","circumflex","perthousand","Scaron","guilsinglleft","OE",
|
||||||
|
"bullet","Zcaron","bullet","bullet","quoteleft","quoteright","quotedblleft",
|
||||||
|
"quotedblright","bullet","endash","emdash","tilde","trademark","scaron",
|
||||||
|
"guilsinglright","oe","bullet","zcaron","Ydieresis","space","exclamdown","cent",
|
||||||
|
"sterling","currency","yen","brokenbar","section","dieresis","copyright",
|
||||||
|
"ordfeminine","guillemotleft","logicalnot","hyphen","registered","macron",
|
||||||
|
"degree","plusminus","twosuperior","threesuperior","acute","mu","paragraph",
|
||||||
|
"periodcentered","cedilla","onesuperior","ordmasculine","guillemotright",
|
||||||
|
"onequarter","onehalf","threequarters","questiondown","Agrave","Aacute",
|
||||||
|
"Acircumflex","Atilde","Adieresis","Aring","AE","Ccedilla","Egrave","Eacute",
|
||||||
|
"Ecircumflex","Edieresis","Igrave","Iacute","Icircumflex","Idieresis","Eth",
|
||||||
|
"Ntilde","Ograve","Oacute","Ocircumflex","Otilde","Odieresis","multiply","Oslash",
|
||||||
|
"Ugrave","Uacute","Ucircumflex","Udieresis","Yacute","Thorn","germandbls",
|
||||||
|
"agrave","aacute","acircumflex","atilde","adieresis","aring","ae","ccedilla",
|
||||||
|
"egrave","eacute","ecircumflex","edieresis","igrave","iacute","icircumflex",
|
||||||
|
"idieresis","eth","ntilde","ograve","oacute","ocircumflex","otilde","odieresis",
|
||||||
|
"divide","oslash","ugrave","uacute","ucircumflex","udieresis","yacute","thorn",
|
||||||
|
"ydieresis"
|
||||||
|
]);
|
||||||
|
},
|
||||||
|
get zapfDingbatsEncoding() {
|
||||||
|
return shadow(this, "zapfDingbatsEncoding", [
|
||||||
|
"space","a1","a2","a202","a3","a4","a5","a119","a118","a117","a11","a12","a13",
|
||||||
|
"a14","a15","a16","a105","a17","a18","a19","a20","a21","a22","a23","a24","a25",
|
||||||
|
"a26","a27","a28","a6","a7","a8","a9","a10","a29","a30","a31","a32","a33","a34",
|
||||||
|
"a35","a36","a37","a38","a39","a40","a41","a42","a43","a44","a45","a46","a47",
|
||||||
|
"a48","a49","a50","a51","a52","a53","a54","a55","a56","a57","a58","a59","a60",
|
||||||
|
"a61","a62","a63","a64","a65","a66","a67","a68","a69","a70","a71","a72","a73",
|
||||||
|
"a74","a203","a75","a204","a76","a77","a78","a79","a81","a82","a83","a84","a97",
|
||||||
|
"a98","a99","a100",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"a101","a102","a103","a104",
|
||||||
|
"a106","a107","a108","a112","a111","a110","a109","a120","a121","a122","a123",
|
||||||
|
"a124","a125","a126","a127","a128","a129","a130","a131","a132","a133","a134",
|
||||||
|
"a135","a136","a137","a138","a139","a140","a141","a142","a143","a144","a145",
|
||||||
|
"a146","a147","a148","a149","a150","a151","a152","a153","a154","a155","a156",
|
||||||
|
"a157","a158","a159","a160","a161","a163","a164","a196","a165","a192","a166",
|
||||||
|
"a167","a168","a169","a170","a171","a172","a173","a162","a174","a175","a176",
|
||||||
|
"a177","a178","a179","a193","a180","a199","a181","a200","a182",,"a201","a183",
|
||||||
|
"a184","a197","a185","a194","a198","a186","a195","a187","a188","a189","a190",
|
||||||
|
"a191"
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
var CanvasGraphics = (function() {
|
var CanvasGraphics = (function() {
|
||||||
function constructor(canvasCtx) {
|
function constructor(canvasCtx) {
|
||||||
this.ctx = canvasCtx;
|
this.ctx = canvasCtx;
|
||||||
@ -1909,12 +2083,14 @@ var CanvasGraphics = (function() {
|
|||||||
constructor.prototype = {
|
constructor.prototype = {
|
||||||
translateFont: function(fontDict, xref, resources) {
|
translateFont: function(fontDict, xref, resources) {
|
||||||
var descriptor = xref.fetch(fontDict.get("FontDescriptor"));
|
var descriptor = xref.fetch(fontDict.get("FontDescriptor"));
|
||||||
var fontName = descriptor.get("FontName").name;
|
|
||||||
fontName = fontName.replace("+", "_");
|
|
||||||
|
|
||||||
var font = Fonts[fontName];
|
var fontName = descriptor.get("FontName");
|
||||||
if (!font) {
|
assertWellFormed(IsName(fontName), "invalid font name");
|
||||||
|
fontName = fontName.name.replace("+", "_");
|
||||||
|
|
||||||
var fontFile = descriptor.get2("FontFile", "FontFile2");
|
var fontFile = descriptor.get2("FontFile", "FontFile2");
|
||||||
|
if (!fontFile)
|
||||||
|
error("FontFile not found for font: " + fontName);
|
||||||
fontFile = xref.fetchIfRef(fontFile);
|
fontFile = xref.fetchIfRef(fontFile);
|
||||||
|
|
||||||
// Generate the custom cmap of the font if needed
|
// Generate the custom cmap of the font if needed
|
||||||
@ -1930,27 +2106,45 @@ var CanvasGraphics = (function() {
|
|||||||
IsNum(data) ? index = data : encodingMap[index++] = data;
|
IsNum(data) ? index = data : encodingMap[index++] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the font charset
|
// Get the font charset if any
|
||||||
var charset = descriptor.get("CharSet").split("/");
|
var charset = descriptor.get("CharSet");
|
||||||
} else if (IsName(encoding)) {
|
assertWellFormed(IsString(charset), "invalid charset");
|
||||||
var encoding = Encodings[encoding];
|
|
||||||
var widths = xref.fetchIfRef(fontDict.get("Widths"));
|
|
||||||
var firstchar = xref.fetchIfRef(fontDict.get("FirstChar"));
|
|
||||||
|
|
||||||
|
charset = charset.split("/");
|
||||||
|
} else if (IsName(encoding)) {
|
||||||
|
var encoding = Encodings[encoding.name];
|
||||||
|
if (!encoding)
|
||||||
|
error("Unknown font encoding");
|
||||||
|
|
||||||
|
var widths = xref.fetchIfRef(fontDict.get("Widths"));
|
||||||
|
var firstChar = xref.fetchIfRef(fontDict.get("FirstChar"));
|
||||||
|
assertWellFormed(IsArray(widths) && IsInteger(firstChar),
|
||||||
|
"invalid font Widths or FirstChar");
|
||||||
var charset = [];
|
var charset = [];
|
||||||
for (var j = 0; j < widths.length; j++) {
|
for (var j = 0; j < widths.length; j++) {
|
||||||
var index = widths[j];
|
if (widths[j])
|
||||||
if (index)
|
charset.push(encoding[j + firstChar]);
|
||||||
charset.push(encoding[j + firstchar]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var fontBBox = descriptor.get("FontBBox");
|
var subType = fontDict.get("Subtype");
|
||||||
var subtype = fontDict.get("Subtype").name;
|
var bbox = descriptor.get("FontBBox");
|
||||||
new Font(fontName, fontFile, encodingMap, charset, fontBBox, subtype);
|
assertWellFormed(IsName(subType) && IsArray(bbox),
|
||||||
|
"invalid font Subtype or FontBBox");
|
||||||
|
|
||||||
|
var properties = {
|
||||||
|
type: subType.name,
|
||||||
|
encoding: encodingMap,
|
||||||
|
charset: charset,
|
||||||
|
bbox: bbox
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
name: fontName,
|
||||||
|
file: fontFile,
|
||||||
|
properties: properties
|
||||||
}
|
}
|
||||||
return Fonts[fontName];
|
|
||||||
},
|
},
|
||||||
|
|
||||||
beginDrawing: function(mediaBox) {
|
beginDrawing: function(mediaBox) {
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Simple pdf.js page viewer</title>
|
<title>Simple pdf.js page viewer</title>
|
||||||
<link rel="stylesheet" href="test.css"></link>
|
<link rel="stylesheet" href="viewer.css"></link>
|
||||||
|
|
||||||
<script type="text/javascript" src="test.js"></script>
|
<script type="text/javascript" src="viewer.js"></script>
|
||||||
<script type="text/javascript" src="pdf.js"></script>
|
<script type="text/javascript" src="pdf.js"></script>
|
||||||
<script type="text/javascript" src="fonts.js"></script>
|
<script type="text/javascript" src="fonts.js"></script>
|
||||||
<script type="text/javascript" src="cffStandardStrings.js"></script>
|
|
||||||
<script type="text/javascript" src="Encodings.js"></script>
|
|
||||||
<script type="text/javascript" src="glyphlist.js"></script>
|
<script type="text/javascript" src="glyphlist.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
@ -74,30 +74,43 @@ function displayPage(num) {
|
|||||||
page.compile(gfx, fonts);
|
page.compile(gfx, fonts);
|
||||||
var t2 = Date.now();
|
var t2 = Date.now();
|
||||||
|
|
||||||
var interval = 0;
|
var fontsReady = true;
|
||||||
for (var i = 0; i < fonts.length; i++) {
|
|
||||||
if (fonts[i].loading) {
|
|
||||||
interval = 10;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// FIXME This need to be replaced by an event
|
// Inspect fonts and translate the missing one
|
||||||
pageInterval = setInterval(function() {
|
var count = fonts.length;
|
||||||
for (var i = 0; i < fonts.length; i++) {
|
for (var i = 0; i < count; i++) {
|
||||||
if (fonts[i].loading)
|
var font = fonts[i];
|
||||||
|
if (Fonts[font.name]) {
|
||||||
|
fontsReady = fontsReady && !Fonts[font.name].loading;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
new Font(font.name, font.file, font.properties);
|
||||||
|
fontsReady = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function delayLoadFont() {
|
||||||
|
for (var i = 0; i < count; i++) {
|
||||||
|
if (Fonts[font.name].loading)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
clearInterval(pageInterval);
|
||||||
|
|
||||||
var t3 = Date.now();
|
var t3 = Date.now();
|
||||||
|
|
||||||
clearInterval(pageInterval);
|
|
||||||
page.display(gfx);
|
page.display(gfx);
|
||||||
|
|
||||||
var t4 = Date.now();
|
var t4 = Date.now();
|
||||||
|
|
||||||
var infoDisplay = document.getElementById("info");
|
var infoDisplay = document.getElementById("info");
|
||||||
infoDisplay.innerHTML = "Time to load/compile/fonts/render: "+ (t1 - t0) + "/" + (t2 - t1) + "/" + (t3 - t2) + "/" + (t4 - t3) + " ms";
|
infoDisplay.innerHTML = "Time to load/compile/fonts/render: "+ (t1 - t0) + "/" + (t2 - t1) + "/" + (t3 - t2) + "/" + (t4 - t3) + " ms";
|
||||||
}, interval);
|
};
|
||||||
|
|
||||||
|
if (fontsReady) {
|
||||||
|
delayLoadFont();
|
||||||
|
} else {
|
||||||
|
pageInterval = setInterval(delayLoadFont, 10);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function nextPage() {
|
function nextPage() {
|
Loading…
Reference in New Issue
Block a user