|
@@ -248,14 +248,14 @@ var CFFParser = function CFFParserClosure() {
|
|
|
resetStack: true
|
|
|
}];
|
|
|
|
|
|
- function CFFParser(file, properties, seacAnalysisEnabled) {
|
|
|
- this.bytes = file.getBytes();
|
|
|
- this.properties = properties;
|
|
|
- this.seacAnalysisEnabled = !!seacAnalysisEnabled;
|
|
|
- }
|
|
|
+ class CFFParser {
|
|
|
+ constructor(file, properties, seacAnalysisEnabled) {
|
|
|
+ this.bytes = file.getBytes();
|
|
|
+ this.properties = properties;
|
|
|
+ this.seacAnalysisEnabled = !!seacAnalysisEnabled;
|
|
|
+ }
|
|
|
|
|
|
- CFFParser.prototype = {
|
|
|
- parse: function CFFParser_parse() {
|
|
|
+ parse() {
|
|
|
var properties = this.properties;
|
|
|
var cff = new CFF();
|
|
|
this.cff = cff;
|
|
@@ -323,8 +323,9 @@ var CFFParser = function CFFParserClosure() {
|
|
|
cff.seacs = charStringsAndSeacs.seacs;
|
|
|
cff.widths = charStringsAndSeacs.widths;
|
|
|
return cff;
|
|
|
- },
|
|
|
- parseHeader: function CFFParser_parseHeader() {
|
|
|
+ }
|
|
|
+
|
|
|
+ parseHeader() {
|
|
|
var bytes = this.bytes;
|
|
|
var bytesLength = bytes.length;
|
|
|
var offset = 0;
|
|
@@ -352,8 +353,9 @@ var CFFParser = function CFFParserClosure() {
|
|
|
obj: header,
|
|
|
endPos: hdrSize
|
|
|
};
|
|
|
- },
|
|
|
- parseDict: function CFFParser_parseDict(dict) {
|
|
|
+ }
|
|
|
+
|
|
|
+ parseDict(dict) {
|
|
|
var pos = 0;
|
|
|
|
|
|
function parseOperand() {
|
|
@@ -432,8 +434,9 @@ var CFFParser = function CFFParserClosure() {
|
|
|
}
|
|
|
|
|
|
return entries;
|
|
|
- },
|
|
|
- parseIndex: function CFFParser_parseIndex(pos) {
|
|
|
+ }
|
|
|
+
|
|
|
+ parseIndex(pos) {
|
|
|
var cffIndex = new CFFIndex();
|
|
|
var bytes = this.bytes;
|
|
|
var count = bytes[pos++] << 8 | bytes[pos++];
|
|
@@ -469,8 +472,9 @@ var CFFParser = function CFFParserClosure() {
|
|
|
obj: cffIndex,
|
|
|
endPos: end
|
|
|
};
|
|
|
- },
|
|
|
- parseNameIndex: function CFFParser_parseNameIndex(index) {
|
|
|
+ }
|
|
|
+
|
|
|
+ parseNameIndex(index) {
|
|
|
var names = [];
|
|
|
|
|
|
for (var i = 0, ii = index.count; i < ii; ++i) {
|
|
@@ -479,8 +483,9 @@ var CFFParser = function CFFParserClosure() {
|
|
|
}
|
|
|
|
|
|
return names;
|
|
|
- },
|
|
|
- parseStringIndex: function CFFParser_parseStringIndex(index) {
|
|
|
+ }
|
|
|
+
|
|
|
+ parseStringIndex(index) {
|
|
|
var strings = new CFFStrings();
|
|
|
|
|
|
for (var i = 0, ii = index.count; i < ii; ++i) {
|
|
@@ -489,8 +494,9 @@ var CFFParser = function CFFParserClosure() {
|
|
|
}
|
|
|
|
|
|
return strings;
|
|
|
- },
|
|
|
- createDict: function CFFParser_createDict(Type, dict, strings) {
|
|
|
+ }
|
|
|
+
|
|
|
+ createDict(Type, dict, strings) {
|
|
|
var cffDict = new Type(strings);
|
|
|
|
|
|
for (var i = 0, ii = dict.length; i < ii; ++i) {
|
|
@@ -501,8 +507,9 @@ var CFFParser = function CFFParserClosure() {
|
|
|
}
|
|
|
|
|
|
return cffDict;
|
|
|
- },
|
|
|
- parseCharString: function CFFParser_parseCharString(state, data, localSubrIndex, globalSubrIndex) {
|
|
|
+ }
|
|
|
+
|
|
|
+ parseCharString(state, data, localSubrIndex, globalSubrIndex) {
|
|
|
if (!data || state.callDepth > MAX_SUBR_NESTING) {
|
|
|
return false;
|
|
|
}
|
|
@@ -660,7 +667,7 @@ var CFFParser = function CFFParserClosure() {
|
|
|
|
|
|
state.stackSize = stackSize;
|
|
|
return true;
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
parseCharStrings({
|
|
|
charStrings,
|
|
@@ -738,14 +745,15 @@ var CFFParser = function CFFParserClosure() {
|
|
|
seacs,
|
|
|
widths
|
|
|
};
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- emptyPrivateDictionary: function CFFParser_emptyPrivateDictionary(parentDict) {
|
|
|
+ emptyPrivateDictionary(parentDict) {
|
|
|
var privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings);
|
|
|
parentDict.setByKey(18, [0, 0]);
|
|
|
parentDict.privateDict = privateDict;
|
|
|
- },
|
|
|
- parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {
|
|
|
+ }
|
|
|
+
|
|
|
+ parsePrivateDict(parentDict) {
|
|
|
if (!parentDict.hasName("Private")) {
|
|
|
this.emptyPrivateDictionary(parentDict);
|
|
|
return;
|
|
@@ -786,8 +794,9 @@ var CFFParser = function CFFParserClosure() {
|
|
|
|
|
|
var subrsIndex = this.parseIndex(relativeOffset);
|
|
|
privateDict.subrsIndex = subrsIndex.obj;
|
|
|
- },
|
|
|
- parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {
|
|
|
+ }
|
|
|
+
|
|
|
+ parseCharsets(pos, length, strings, cid) {
|
|
|
if (pos === 0) {
|
|
|
return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, _charsets.ISOAdobeCharset);
|
|
|
} else if (pos === 1) {
|
|
@@ -843,8 +852,9 @@ var CFFParser = function CFFParserClosure() {
|
|
|
var end = pos;
|
|
|
var raw = bytes.subarray(start, end);
|
|
|
return new CFFCharset(false, format, charset, raw);
|
|
|
- },
|
|
|
- parseEncoding: function CFFParser_parseEncoding(pos, properties, strings, charset) {
|
|
|
+ }
|
|
|
+
|
|
|
+ parseEncoding(pos, properties, strings, charset) {
|
|
|
var encoding = Object.create(null);
|
|
|
var bytes = this.bytes;
|
|
|
var predefined = false;
|
|
@@ -918,8 +928,9 @@ var CFFParser = function CFFParserClosure() {
|
|
|
|
|
|
format = format & 0x7f;
|
|
|
return new CFFEncoding(predefined, format, encoding, raw);
|
|
|
- },
|
|
|
- parseFDSelect: function CFFParser_parseFDSelect(pos, length) {
|
|
|
+ }
|
|
|
+
|
|
|
+ parseFDSelect(pos, length) {
|
|
|
var bytes = this.bytes;
|
|
|
var format = bytes[pos++];
|
|
|
var fdSelect = [];
|
|
@@ -966,14 +977,16 @@ var CFFParser = function CFFParserClosure() {
|
|
|
|
|
|
return new CFFFDSelect(format, fdSelect);
|
|
|
}
|
|
|
- };
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
return CFFParser;
|
|
|
}();
|
|
|
|
|
|
exports.CFFParser = CFFParser;
|
|
|
|
|
|
-var CFF = function CFFClosure() {
|
|
|
- function CFF() {
|
|
|
+class CFF {
|
|
|
+ constructor() {
|
|
|
this.header = null;
|
|
|
this.names = [];
|
|
|
this.topDict = null;
|
|
@@ -987,124 +1000,120 @@ var CFF = function CFFClosure() {
|
|
|
this.isCIDFont = false;
|
|
|
}
|
|
|
|
|
|
- CFF.prototype = {
|
|
|
- duplicateFirstGlyph: function CFF_duplicateFirstGlyph() {
|
|
|
- if (this.charStrings.count >= 65535) {
|
|
|
- (0, _util.warn)("Not enough space in charstrings to duplicate first glyph.");
|
|
|
- return;
|
|
|
- }
|
|
|
+ duplicateFirstGlyph() {
|
|
|
+ if (this.charStrings.count >= 65535) {
|
|
|
+ (0, _util.warn)("Not enough space in charstrings to duplicate first glyph.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- var glyphZero = this.charStrings.get(0);
|
|
|
- this.charStrings.add(glyphZero);
|
|
|
+ var glyphZero = this.charStrings.get(0);
|
|
|
+ this.charStrings.add(glyphZero);
|
|
|
|
|
|
- if (this.isCIDFont) {
|
|
|
- this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]);
|
|
|
- }
|
|
|
- },
|
|
|
- hasGlyphId: function CFF_hasGlyphID(id) {
|
|
|
- if (id < 0 || id >= this.charStrings.count) {
|
|
|
- return false;
|
|
|
- }
|
|
|
+ if (this.isCIDFont) {
|
|
|
+ this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- var glyph = this.charStrings.get(id);
|
|
|
- return glyph.length > 0;
|
|
|
+ hasGlyphId(id) {
|
|
|
+ if (id < 0 || id >= this.charStrings.count) {
|
|
|
+ return false;
|
|
|
}
|
|
|
- };
|
|
|
- return CFF;
|
|
|
-}();
|
|
|
+
|
|
|
+ var glyph = this.charStrings.get(id);
|
|
|
+ return glyph.length > 0;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
|
|
|
exports.CFF = CFF;
|
|
|
|
|
|
-var CFFHeader = function CFFHeaderClosure() {
|
|
|
- function CFFHeader(major, minor, hdrSize, offSize) {
|
|
|
+class CFFHeader {
|
|
|
+ constructor(major, minor, hdrSize, offSize) {
|
|
|
this.major = major;
|
|
|
this.minor = minor;
|
|
|
this.hdrSize = hdrSize;
|
|
|
this.offSize = offSize;
|
|
|
}
|
|
|
|
|
|
- return CFFHeader;
|
|
|
-}();
|
|
|
+}
|
|
|
|
|
|
exports.CFFHeader = CFFHeader;
|
|
|
|
|
|
-var CFFStrings = function CFFStringsClosure() {
|
|
|
- function CFFStrings() {
|
|
|
+class CFFStrings {
|
|
|
+ constructor() {
|
|
|
this.strings = [];
|
|
|
}
|
|
|
|
|
|
- CFFStrings.prototype = {
|
|
|
- get: function CFFStrings_get(index) {
|
|
|
- if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) {
|
|
|
- return CFFStandardStrings[index];
|
|
|
- }
|
|
|
-
|
|
|
- if (index - NUM_STANDARD_CFF_STRINGS <= this.strings.length) {
|
|
|
- return this.strings[index - NUM_STANDARD_CFF_STRINGS];
|
|
|
- }
|
|
|
+ get(index) {
|
|
|
+ if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) {
|
|
|
+ return CFFStandardStrings[index];
|
|
|
+ }
|
|
|
|
|
|
- return CFFStandardStrings[0];
|
|
|
- },
|
|
|
- getSID: function CFFStrings_getSID(str) {
|
|
|
- let index = CFFStandardStrings.indexOf(str);
|
|
|
+ if (index - NUM_STANDARD_CFF_STRINGS <= this.strings.length) {
|
|
|
+ return this.strings[index - NUM_STANDARD_CFF_STRINGS];
|
|
|
+ }
|
|
|
|
|
|
- if (index !== -1) {
|
|
|
- return index;
|
|
|
- }
|
|
|
+ return CFFStandardStrings[0];
|
|
|
+ }
|
|
|
|
|
|
- index = this.strings.indexOf(str);
|
|
|
+ getSID(str) {
|
|
|
+ let index = CFFStandardStrings.indexOf(str);
|
|
|
|
|
|
- if (index !== -1) {
|
|
|
- return index + NUM_STANDARD_CFF_STRINGS;
|
|
|
- }
|
|
|
+ if (index !== -1) {
|
|
|
+ return index;
|
|
|
+ }
|
|
|
|
|
|
- return -1;
|
|
|
- },
|
|
|
- add: function CFFStrings_add(value) {
|
|
|
- this.strings.push(value);
|
|
|
- },
|
|
|
+ index = this.strings.indexOf(str);
|
|
|
|
|
|
- get count() {
|
|
|
- return this.strings.length;
|
|
|
+ if (index !== -1) {
|
|
|
+ return index + NUM_STANDARD_CFF_STRINGS;
|
|
|
}
|
|
|
|
|
|
- };
|
|
|
- return CFFStrings;
|
|
|
-}();
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ add(value) {
|
|
|
+ this.strings.push(value);
|
|
|
+ }
|
|
|
+
|
|
|
+ get count() {
|
|
|
+ return this.strings.length;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
|
|
|
exports.CFFStrings = CFFStrings;
|
|
|
|
|
|
-var CFFIndex = function CFFIndexClosure() {
|
|
|
- function CFFIndex() {
|
|
|
+class CFFIndex {
|
|
|
+ constructor() {
|
|
|
this.objects = [];
|
|
|
this.length = 0;
|
|
|
}
|
|
|
|
|
|
- CFFIndex.prototype = {
|
|
|
- add: function CFFIndex_add(data) {
|
|
|
- this.length += data.length;
|
|
|
- this.objects.push(data);
|
|
|
- },
|
|
|
- set: function CFFIndex_set(index, data) {
|
|
|
- this.length += data.length - this.objects[index].length;
|
|
|
- this.objects[index] = data;
|
|
|
- },
|
|
|
- get: function CFFIndex_get(index) {
|
|
|
- return this.objects[index];
|
|
|
- },
|
|
|
-
|
|
|
- get count() {
|
|
|
- return this.objects.length;
|
|
|
- }
|
|
|
-
|
|
|
- };
|
|
|
- return CFFIndex;
|
|
|
-}();
|
|
|
+ add(data) {
|
|
|
+ this.length += data.length;
|
|
|
+ this.objects.push(data);
|
|
|
+ }
|
|
|
+
|
|
|
+ set(index, data) {
|
|
|
+ this.length += data.length - this.objects[index].length;
|
|
|
+ this.objects[index] = data;
|
|
|
+ }
|
|
|
+
|
|
|
+ get(index) {
|
|
|
+ return this.objects[index];
|
|
|
+ }
|
|
|
+
|
|
|
+ get count() {
|
|
|
+ return this.objects.length;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
|
|
|
exports.CFFIndex = CFFIndex;
|
|
|
|
|
|
-var CFFDict = function CFFDictClosure() {
|
|
|
- function CFFDict(tables, strings) {
|
|
|
+class CFFDict {
|
|
|
+ constructor(tables, strings) {
|
|
|
this.keyToNameMap = tables.keyToNameMap;
|
|
|
this.nameToKeyMap = tables.nameToKeyMap;
|
|
|
this.defaults = tables.defaults;
|
|
@@ -1115,63 +1124,65 @@ var CFFDict = function CFFDictClosure() {
|
|
|
this.values = Object.create(null);
|
|
|
}
|
|
|
|
|
|
- CFFDict.prototype = {
|
|
|
- setByKey: function CFFDict_setByKey(key, value) {
|
|
|
- if (!(key in this.keyToNameMap)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
+ setByKey(key, value) {
|
|
|
+ if (!(key in this.keyToNameMap)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
- var valueLength = value.length;
|
|
|
+ var valueLength = value.length;
|
|
|
|
|
|
- if (valueLength === 0) {
|
|
|
+ if (valueLength === 0) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (var i = 0; i < valueLength; i++) {
|
|
|
+ if (isNaN(value[i])) {
|
|
|
+ (0, _util.warn)('Invalid CFFDict value: "' + value + '" for key "' + key + '".');
|
|
|
return true;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- for (var i = 0; i < valueLength; i++) {
|
|
|
- if (isNaN(value[i])) {
|
|
|
- (0, _util.warn)('Invalid CFFDict value: "' + value + '" for key "' + key + '".');
|
|
|
- return true;
|
|
|
- }
|
|
|
- }
|
|
|
+ var type = this.types[key];
|
|
|
|
|
|
- var type = this.types[key];
|
|
|
+ if (type === "num" || type === "sid" || type === "offset") {
|
|
|
+ value = value[0];
|
|
|
+ }
|
|
|
|
|
|
- if (type === "num" || type === "sid" || type === "offset") {
|
|
|
- value = value[0];
|
|
|
- }
|
|
|
+ this.values[key] = value;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
|
|
|
- this.values[key] = value;
|
|
|
- return true;
|
|
|
- },
|
|
|
- setByName: function CFFDict_setByName(name, value) {
|
|
|
- if (!(name in this.nameToKeyMap)) {
|
|
|
- throw new _util.FormatError(`Invalid dictionary name "${name}"`);
|
|
|
- }
|
|
|
+ setByName(name, value) {
|
|
|
+ if (!(name in this.nameToKeyMap)) {
|
|
|
+ throw new _util.FormatError(`Invalid dictionary name "${name}"`);
|
|
|
+ }
|
|
|
|
|
|
- this.values[this.nameToKeyMap[name]] = value;
|
|
|
- },
|
|
|
- hasName: function CFFDict_hasName(name) {
|
|
|
- return this.nameToKeyMap[name] in this.values;
|
|
|
- },
|
|
|
- getByName: function CFFDict_getByName(name) {
|
|
|
- if (!(name in this.nameToKeyMap)) {
|
|
|
- throw new _util.FormatError(`Invalid dictionary name ${name}"`);
|
|
|
- }
|
|
|
+ this.values[this.nameToKeyMap[name]] = value;
|
|
|
+ }
|
|
|
|
|
|
- var key = this.nameToKeyMap[name];
|
|
|
+ hasName(name) {
|
|
|
+ return this.nameToKeyMap[name] in this.values;
|
|
|
+ }
|
|
|
|
|
|
- if (!(key in this.values)) {
|
|
|
- return this.defaults[key];
|
|
|
- }
|
|
|
+ getByName(name) {
|
|
|
+ if (!(name in this.nameToKeyMap)) {
|
|
|
+ throw new _util.FormatError(`Invalid dictionary name ${name}"`);
|
|
|
+ }
|
|
|
+
|
|
|
+ var key = this.nameToKeyMap[name];
|
|
|
|
|
|
- return this.values[key];
|
|
|
- },
|
|
|
- removeByName: function CFFDict_removeByName(name) {
|
|
|
- delete this.values[this.nameToKeyMap[name]];
|
|
|
+ if (!(key in this.values)) {
|
|
|
+ return this.defaults[key];
|
|
|
}
|
|
|
- };
|
|
|
|
|
|
- CFFDict.createTables = function CFFDict_createTables(layout) {
|
|
|
+ return this.values[key];
|
|
|
+ }
|
|
|
+
|
|
|
+ removeByName(name) {
|
|
|
+ delete this.values[this.nameToKeyMap[name]];
|
|
|
+ }
|
|
|
+
|
|
|
+ static createTables(layout) {
|
|
|
var tables = {
|
|
|
keyToNameMap: {},
|
|
|
nameToKeyMap: {},
|
|
@@ -1193,25 +1204,26 @@ var CFFDict = function CFFDictClosure() {
|
|
|
}
|
|
|
|
|
|
return tables;
|
|
|
- };
|
|
|
+ }
|
|
|
|
|
|
- return CFFDict;
|
|
|
-}();
|
|
|
+}
|
|
|
|
|
|
var CFFTopDict = function CFFTopDictClosure() {
|
|
|
var layout = [[[12, 30], "ROS", ["sid", "sid", "num"], null], [[12, 20], "SyntheticBase", "num", null], [0, "version", "sid", null], [1, "Notice", "sid", null], [[12, 0], "Copyright", "sid", null], [2, "FullName", "sid", null], [3, "FamilyName", "sid", null], [4, "Weight", "sid", null], [[12, 1], "isFixedPitch", "num", 0], [[12, 2], "ItalicAngle", "num", 0], [[12, 3], "UnderlinePosition", "num", -100], [[12, 4], "UnderlineThickness", "num", 50], [[12, 5], "PaintType", "num", 0], [[12, 6], "CharstringType", "num", 2], [[12, 7], "FontMatrix", ["num", "num", "num", "num", "num", "num"], [0.001, 0, 0, 0.001, 0, 0]], [13, "UniqueID", "num", null], [5, "FontBBox", ["num", "num", "num", "num"], [0, 0, 0, 0]], [[12, 8], "StrokeWidth", "num", 0], [14, "XUID", "array", null], [15, "charset", "offset", 0], [16, "Encoding", "offset", 0], [17, "CharStrings", "offset", 0], [18, "Private", ["offset", "offset"], null], [[12, 21], "PostScript", "sid", null], [[12, 22], "BaseFontName", "sid", null], [[12, 23], "BaseFontBlend", "delta", null], [[12, 31], "CIDFontVersion", "num", 0], [[12, 32], "CIDFontRevision", "num", 0], [[12, 33], "CIDFontType", "num", 0], [[12, 34], "CIDCount", "num", 8720], [[12, 35], "UIDBase", "num", null], [[12, 37], "FDSelect", "offset", null], [[12, 36], "FDArray", "offset", null], [[12, 38], "FontName", "sid", null]];
|
|
|
var tables = null;
|
|
|
|
|
|
- function CFFTopDict(strings) {
|
|
|
- if (tables === null) {
|
|
|
- tables = CFFDict.createTables(layout);
|
|
|
+ class CFFTopDict extends CFFDict {
|
|
|
+ constructor(strings) {
|
|
|
+ if (tables === null) {
|
|
|
+ tables = CFFDict.createTables(layout);
|
|
|
+ }
|
|
|
+
|
|
|
+ super(tables, strings);
|
|
|
+ this.privateDict = null;
|
|
|
}
|
|
|
|
|
|
- CFFDict.call(this, tables, strings);
|
|
|
- this.privateDict = null;
|
|
|
}
|
|
|
|
|
|
- CFFTopDict.prototype = Object.create(CFFDict.prototype);
|
|
|
return CFFTopDict;
|
|
|
}();
|
|
|
|
|
@@ -1221,16 +1233,18 @@ var CFFPrivateDict = function CFFPrivateDictClosure() {
|
|
|
var layout = [[6, "BlueValues", "delta", null], [7, "OtherBlues", "delta", null], [8, "FamilyBlues", "delta", null], [9, "FamilyOtherBlues", "delta", null], [[12, 9], "BlueScale", "num", 0.039625], [[12, 10], "BlueShift", "num", 7], [[12, 11], "BlueFuzz", "num", 1], [10, "StdHW", "num", null], [11, "StdVW", "num", null], [[12, 12], "StemSnapH", "delta", null], [[12, 13], "StemSnapV", "delta", null], [[12, 14], "ForceBold", "num", 0], [[12, 17], "LanguageGroup", "num", 0], [[12, 18], "ExpansionFactor", "num", 0.06], [[12, 19], "initialRandomSeed", "num", 0], [20, "defaultWidthX", "num", 0], [21, "nominalWidthX", "num", 0], [19, "Subrs", "offset", null]];
|
|
|
var tables = null;
|
|
|
|
|
|
- function CFFPrivateDict(strings) {
|
|
|
- if (tables === null) {
|
|
|
- tables = CFFDict.createTables(layout);
|
|
|
+ class CFFPrivateDict extends CFFDict {
|
|
|
+ constructor(strings) {
|
|
|
+ if (tables === null) {
|
|
|
+ tables = CFFDict.createTables(layout);
|
|
|
+ }
|
|
|
+
|
|
|
+ super(tables, strings);
|
|
|
+ this.subrsIndex = null;
|
|
|
}
|
|
|
|
|
|
- CFFDict.call(this, tables, strings);
|
|
|
- this.subrsIndex = null;
|
|
|
}
|
|
|
|
|
|
- CFFPrivateDict.prototype = Object.create(CFFDict.prototype);
|
|
|
return CFFPrivateDict;
|
|
|
}();
|
|
|
|
|
@@ -1241,578 +1255,592 @@ var CFFCharsetPredefinedTypes = {
|
|
|
EXPERT_SUBSET: 2
|
|
|
};
|
|
|
|
|
|
-var CFFCharset = function CFFCharsetClosure() {
|
|
|
- function CFFCharset(predefined, format, charset, raw) {
|
|
|
+class CFFCharset {
|
|
|
+ constructor(predefined, format, charset, raw) {
|
|
|
this.predefined = predefined;
|
|
|
this.format = format;
|
|
|
this.charset = charset;
|
|
|
this.raw = raw;
|
|
|
}
|
|
|
|
|
|
- return CFFCharset;
|
|
|
-}();
|
|
|
+}
|
|
|
|
|
|
exports.CFFCharset = CFFCharset;
|
|
|
|
|
|
-var CFFEncoding = function CFFEncodingClosure() {
|
|
|
- function CFFEncoding(predefined, format, encoding, raw) {
|
|
|
+class CFFEncoding {
|
|
|
+ constructor(predefined, format, encoding, raw) {
|
|
|
this.predefined = predefined;
|
|
|
this.format = format;
|
|
|
this.encoding = encoding;
|
|
|
this.raw = raw;
|
|
|
}
|
|
|
|
|
|
- return CFFEncoding;
|
|
|
-}();
|
|
|
+}
|
|
|
|
|
|
-var CFFFDSelect = function CFFFDSelectClosure() {
|
|
|
- function CFFFDSelect(format, fdSelect) {
|
|
|
+class CFFFDSelect {
|
|
|
+ constructor(format, fdSelect) {
|
|
|
this.format = format;
|
|
|
this.fdSelect = fdSelect;
|
|
|
}
|
|
|
|
|
|
- CFFFDSelect.prototype = {
|
|
|
- getFDIndex: function CFFFDSelect_get(glyphIndex) {
|
|
|
- if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- return this.fdSelect[glyphIndex];
|
|
|
+ getFDIndex(glyphIndex) {
|
|
|
+ if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {
|
|
|
+ return -1;
|
|
|
}
|
|
|
- };
|
|
|
- return CFFFDSelect;
|
|
|
-}();
|
|
|
+
|
|
|
+ return this.fdSelect[glyphIndex];
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
|
|
|
exports.CFFFDSelect = CFFFDSelect;
|
|
|
|
|
|
-var CFFOffsetTracker = function CFFOffsetTrackerClosure() {
|
|
|
- function CFFOffsetTracker() {
|
|
|
+class CFFOffsetTracker {
|
|
|
+ constructor() {
|
|
|
this.offsets = Object.create(null);
|
|
|
}
|
|
|
|
|
|
- CFFOffsetTracker.prototype = {
|
|
|
- isTracking: function CFFOffsetTracker_isTracking(key) {
|
|
|
- return key in this.offsets;
|
|
|
- },
|
|
|
- track: function CFFOffsetTracker_track(key, location) {
|
|
|
- if (key in this.offsets) {
|
|
|
- throw new _util.FormatError(`Already tracking location of ${key}`);
|
|
|
- }
|
|
|
+ isTracking(key) {
|
|
|
+ return key in this.offsets;
|
|
|
+ }
|
|
|
|
|
|
- this.offsets[key] = location;
|
|
|
- },
|
|
|
- offset: function CFFOffsetTracker_offset(value) {
|
|
|
- for (var key in this.offsets) {
|
|
|
- this.offsets[key] += value;
|
|
|
- }
|
|
|
- },
|
|
|
- setEntryLocation: function CFFOffsetTracker_setEntryLocation(key, values, output) {
|
|
|
- if (!(key in this.offsets)) {
|
|
|
- throw new _util.FormatError(`Not tracking location of ${key}`);
|
|
|
- }
|
|
|
+ track(key, location) {
|
|
|
+ if (key in this.offsets) {
|
|
|
+ throw new _util.FormatError(`Already tracking location of ${key}`);
|
|
|
+ }
|
|
|
|
|
|
- var data = output.data;
|
|
|
- var dataOffset = this.offsets[key];
|
|
|
- var size = 5;
|
|
|
+ this.offsets[key] = location;
|
|
|
+ }
|
|
|
|
|
|
- for (var i = 0, ii = values.length; i < ii; ++i) {
|
|
|
- var offset0 = i * size + dataOffset;
|
|
|
- var offset1 = offset0 + 1;
|
|
|
- var offset2 = offset0 + 2;
|
|
|
- var offset3 = offset0 + 3;
|
|
|
- var offset4 = offset0 + 4;
|
|
|
+ offset(value) {
|
|
|
+ for (var key in this.offsets) {
|
|
|
+ this.offsets[key] += value;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) {
|
|
|
- throw new _util.FormatError("writing to an offset that is not empty");
|
|
|
- }
|
|
|
+ setEntryLocation(key, values, output) {
|
|
|
+ if (!(key in this.offsets)) {
|
|
|
+ throw new _util.FormatError(`Not tracking location of ${key}`);
|
|
|
+ }
|
|
|
|
|
|
- var value = values[i];
|
|
|
- data[offset0] = 0x1d;
|
|
|
- data[offset1] = value >> 24 & 0xff;
|
|
|
- data[offset2] = value >> 16 & 0xff;
|
|
|
- data[offset3] = value >> 8 & 0xff;
|
|
|
- data[offset4] = value & 0xff;
|
|
|
+ var data = output.data;
|
|
|
+ var dataOffset = this.offsets[key];
|
|
|
+ var size = 5;
|
|
|
+
|
|
|
+ for (var i = 0, ii = values.length; i < ii; ++i) {
|
|
|
+ var offset0 = i * size + dataOffset;
|
|
|
+ var offset1 = offset0 + 1;
|
|
|
+ var offset2 = offset0 + 2;
|
|
|
+ var offset3 = offset0 + 3;
|
|
|
+ var offset4 = offset0 + 4;
|
|
|
+
|
|
|
+ if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) {
|
|
|
+ throw new _util.FormatError("writing to an offset that is not empty");
|
|
|
}
|
|
|
+
|
|
|
+ var value = values[i];
|
|
|
+ data[offset0] = 0x1d;
|
|
|
+ data[offset1] = value >> 24 & 0xff;
|
|
|
+ data[offset2] = value >> 16 & 0xff;
|
|
|
+ data[offset3] = value >> 8 & 0xff;
|
|
|
+ data[offset4] = value & 0xff;
|
|
|
}
|
|
|
- };
|
|
|
- return CFFOffsetTracker;
|
|
|
-}();
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
|
|
|
-var CFFCompiler = function CFFCompilerClosure() {
|
|
|
- function CFFCompiler(cff) {
|
|
|
+class CFFCompiler {
|
|
|
+ constructor(cff) {
|
|
|
this.cff = cff;
|
|
|
}
|
|
|
|
|
|
- CFFCompiler.prototype = {
|
|
|
- compile: function CFFCompiler_compile() {
|
|
|
- var cff = this.cff;
|
|
|
- var output = {
|
|
|
- data: [],
|
|
|
- length: 0,
|
|
|
- add: function CFFCompiler_add(data) {
|
|
|
- this.data = this.data.concat(data);
|
|
|
- this.length = this.data.length;
|
|
|
+ compile() {
|
|
|
+ var cff = this.cff;
|
|
|
+ var output = {
|
|
|
+ data: [],
|
|
|
+ length: 0,
|
|
|
+ add: function CFFCompiler_add(data) {
|
|
|
+ this.data = this.data.concat(data);
|
|
|
+ this.length = this.data.length;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ var header = this.compileHeader(cff.header);
|
|
|
+ output.add(header);
|
|
|
+ var nameIndex = this.compileNameIndex(cff.names);
|
|
|
+ output.add(nameIndex);
|
|
|
+
|
|
|
+ if (cff.isCIDFont) {
|
|
|
+ if (cff.topDict.hasName("FontMatrix")) {
|
|
|
+ var base = cff.topDict.getByName("FontMatrix");
|
|
|
+ cff.topDict.removeByName("FontMatrix");
|
|
|
+
|
|
|
+ for (var i = 0, ii = cff.fdArray.length; i < ii; i++) {
|
|
|
+ var subDict = cff.fdArray[i];
|
|
|
+ var matrix = base.slice(0);
|
|
|
+
|
|
|
+ if (subDict.hasName("FontMatrix")) {
|
|
|
+ matrix = _util.Util.transform(matrix, subDict.getByName("FontMatrix"));
|
|
|
+ }
|
|
|
+
|
|
|
+ subDict.setByName("FontMatrix", matrix);
|
|
|
}
|
|
|
- };
|
|
|
- var header = this.compileHeader(cff.header);
|
|
|
- output.add(header);
|
|
|
- var nameIndex = this.compileNameIndex(cff.names);
|
|
|
- output.add(nameIndex);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- if (cff.isCIDFont) {
|
|
|
- if (cff.topDict.hasName("FontMatrix")) {
|
|
|
- var base = cff.topDict.getByName("FontMatrix");
|
|
|
- cff.topDict.removeByName("FontMatrix");
|
|
|
+ cff.topDict.setByName("charset", 0);
|
|
|
+ var compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont);
|
|
|
+ output.add(compiled.output);
|
|
|
+ var topDictTracker = compiled.trackers[0];
|
|
|
+ var stringIndex = this.compileStringIndex(cff.strings.strings);
|
|
|
+ output.add(stringIndex);
|
|
|
+ var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
|
|
|
+ output.add(globalSubrIndex);
|
|
|
+
|
|
|
+ if (cff.encoding && cff.topDict.hasName("Encoding")) {
|
|
|
+ if (cff.encoding.predefined) {
|
|
|
+ topDictTracker.setEntryLocation("Encoding", [cff.encoding.format], output);
|
|
|
+ } else {
|
|
|
+ var encoding = this.compileEncoding(cff.encoding);
|
|
|
+ topDictTracker.setEntryLocation("Encoding", [output.length], output);
|
|
|
+ output.add(encoding);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- for (var i = 0, ii = cff.fdArray.length; i < ii; i++) {
|
|
|
- var subDict = cff.fdArray[i];
|
|
|
- var matrix = base.slice(0);
|
|
|
+ var charset = this.compileCharset(cff.charset, cff.charStrings.count, cff.strings, cff.isCIDFont);
|
|
|
+ topDictTracker.setEntryLocation("charset", [output.length], output);
|
|
|
+ output.add(charset);
|
|
|
+ var charStrings = this.compileCharStrings(cff.charStrings);
|
|
|
+ topDictTracker.setEntryLocation("CharStrings", [output.length], output);
|
|
|
+ output.add(charStrings);
|
|
|
+
|
|
|
+ if (cff.isCIDFont) {
|
|
|
+ topDictTracker.setEntryLocation("FDSelect", [output.length], output);
|
|
|
+ var fdSelect = this.compileFDSelect(cff.fdSelect);
|
|
|
+ output.add(fdSelect);
|
|
|
+ compiled = this.compileTopDicts(cff.fdArray, output.length, true);
|
|
|
+ topDictTracker.setEntryLocation("FDArray", [output.length], output);
|
|
|
+ output.add(compiled.output);
|
|
|
+ var fontDictTrackers = compiled.trackers;
|
|
|
+ this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
|
|
|
+ }
|
|
|
|
|
|
- if (subDict.hasName("FontMatrix")) {
|
|
|
- matrix = _util.Util.transform(matrix, subDict.getByName("FontMatrix"));
|
|
|
- }
|
|
|
+ this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
|
|
|
+ output.add([0]);
|
|
|
+ return output.data;
|
|
|
+ }
|
|
|
|
|
|
- subDict.setByName("FontMatrix", matrix);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ encodeNumber(value) {
|
|
|
+ if (Number.isInteger(value)) {
|
|
|
+ return this.encodeInteger(value);
|
|
|
+ }
|
|
|
|
|
|
- cff.topDict.setByName("charset", 0);
|
|
|
- var compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont);
|
|
|
- output.add(compiled.output);
|
|
|
- var topDictTracker = compiled.trackers[0];
|
|
|
- var stringIndex = this.compileStringIndex(cff.strings.strings);
|
|
|
- output.add(stringIndex);
|
|
|
- var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
|
|
|
- output.add(globalSubrIndex);
|
|
|
-
|
|
|
- if (cff.encoding && cff.topDict.hasName("Encoding")) {
|
|
|
- if (cff.encoding.predefined) {
|
|
|
- topDictTracker.setEntryLocation("Encoding", [cff.encoding.format], output);
|
|
|
- } else {
|
|
|
- var encoding = this.compileEncoding(cff.encoding);
|
|
|
- topDictTracker.setEntryLocation("Encoding", [output.length], output);
|
|
|
- output.add(encoding);
|
|
|
- }
|
|
|
- }
|
|
|
+ return this.encodeFloat(value);
|
|
|
+ }
|
|
|
|
|
|
- var charset = this.compileCharset(cff.charset, cff.charStrings.count, cff.strings, cff.isCIDFont);
|
|
|
- topDictTracker.setEntryLocation("charset", [output.length], output);
|
|
|
- output.add(charset);
|
|
|
- var charStrings = this.compileCharStrings(cff.charStrings);
|
|
|
- topDictTracker.setEntryLocation("CharStrings", [output.length], output);
|
|
|
- output.add(charStrings);
|
|
|
+ static get EncodeFloatRegExp() {
|
|
|
+ return (0, _util.shadow)(this, "EncodeFloatRegExp", /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/);
|
|
|
+ }
|
|
|
|
|
|
- if (cff.isCIDFont) {
|
|
|
- topDictTracker.setEntryLocation("FDSelect", [output.length], output);
|
|
|
- var fdSelect = this.compileFDSelect(cff.fdSelect);
|
|
|
- output.add(fdSelect);
|
|
|
- compiled = this.compileTopDicts(cff.fdArray, output.length, true);
|
|
|
- topDictTracker.setEntryLocation("FDArray", [output.length], output);
|
|
|
- output.add(compiled.output);
|
|
|
- var fontDictTrackers = compiled.trackers;
|
|
|
- this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
|
|
|
- }
|
|
|
+ encodeFloat(num) {
|
|
|
+ var value = num.toString();
|
|
|
+ var m = CFFCompiler.EncodeFloatRegExp.exec(value);
|
|
|
|
|
|
- this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
|
|
|
- output.add([0]);
|
|
|
- return output.data;
|
|
|
- },
|
|
|
- encodeNumber: function CFFCompiler_encodeNumber(value) {
|
|
|
- if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) {
|
|
|
- return this.encodeInteger(value);
|
|
|
- }
|
|
|
+ if (m) {
|
|
|
+ var epsilon = parseFloat("1e" + ((m[2] ? +m[2] : 0) + m[1].length));
|
|
|
+ value = (Math.round(num * epsilon) / epsilon).toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ var nibbles = "";
|
|
|
+ var i, ii;
|
|
|
|
|
|
- return this.encodeFloat(value);
|
|
|
- },
|
|
|
- encodeFloat: function CFFCompiler_encodeFloat(num) {
|
|
|
- var value = num.toString();
|
|
|
- var m = /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(value);
|
|
|
+ for (i = 0, ii = value.length; i < ii; ++i) {
|
|
|
+ var a = value[i];
|
|
|
|
|
|
- if (m) {
|
|
|
- var epsilon = parseFloat("1e" + ((m[2] ? +m[2] : 0) + m[1].length));
|
|
|
- value = (Math.round(num * epsilon) / epsilon).toString();
|
|
|
+ if (a === "e") {
|
|
|
+ nibbles += value[++i] === "-" ? "c" : "b";
|
|
|
+ } else if (a === ".") {
|
|
|
+ nibbles += "a";
|
|
|
+ } else if (a === "-") {
|
|
|
+ nibbles += "e";
|
|
|
+ } else {
|
|
|
+ nibbles += a;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- var nibbles = "";
|
|
|
- var i, ii;
|
|
|
+ nibbles += nibbles.length & 1 ? "f" : "ff";
|
|
|
+ var out = [30];
|
|
|
|
|
|
- for (i = 0, ii = value.length; i < ii; ++i) {
|
|
|
- var a = value[i];
|
|
|
+ for (i = 0, ii = nibbles.length; i < ii; i += 2) {
|
|
|
+ out.push(parseInt(nibbles.substring(i, i + 2), 16));
|
|
|
+ }
|
|
|
|
|
|
- if (a === "e") {
|
|
|
- nibbles += value[++i] === "-" ? "c" : "b";
|
|
|
- } else if (a === ".") {
|
|
|
- nibbles += "a";
|
|
|
- } else if (a === "-") {
|
|
|
- nibbles += "e";
|
|
|
- } else {
|
|
|
- nibbles += a;
|
|
|
+ return out;
|
|
|
+ }
|
|
|
+
|
|
|
+ encodeInteger(value) {
|
|
|
+ var code;
|
|
|
+
|
|
|
+ if (value >= -107 && value <= 107) {
|
|
|
+ code = [value + 139];
|
|
|
+ } else if (value >= 108 && value <= 1131) {
|
|
|
+ value = value - 108;
|
|
|
+ code = [(value >> 8) + 247, value & 0xff];
|
|
|
+ } else if (value >= -1131 && value <= -108) {
|
|
|
+ value = -value - 108;
|
|
|
+ code = [(value >> 8) + 251, value & 0xff];
|
|
|
+ } else if (value >= -32768 && value <= 32767) {
|
|
|
+ code = [0x1c, value >> 8 & 0xff, value & 0xff];
|
|
|
+ } else {
|
|
|
+ code = [0x1d, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff];
|
|
|
+ }
|
|
|
+
|
|
|
+ return code;
|
|
|
+ }
|
|
|
+
|
|
|
+ compileHeader(header) {
|
|
|
+ return [header.major, header.minor, header.hdrSize, header.offSize];
|
|
|
+ }
|
|
|
+
|
|
|
+ compileNameIndex(names) {
|
|
|
+ var nameIndex = new CFFIndex();
|
|
|
+
|
|
|
+ for (var i = 0, ii = names.length; i < ii; ++i) {
|
|
|
+ var name = names[i];
|
|
|
+ var length = Math.min(name.length, 127);
|
|
|
+ var sanitizedName = new Array(length);
|
|
|
+
|
|
|
+ for (var j = 0; j < length; j++) {
|
|
|
+ var char = name[j];
|
|
|
+
|
|
|
+ if (char < "!" || char > "~" || char === "[" || char === "]" || char === "(" || char === ")" || char === "{" || char === "}" || char === "<" || char === ">" || char === "/" || char === "%") {
|
|
|
+ char = "_";
|
|
|
}
|
|
|
+
|
|
|
+ sanitizedName[j] = char;
|
|
|
}
|
|
|
|
|
|
- nibbles += nibbles.length & 1 ? "f" : "ff";
|
|
|
- var out = [30];
|
|
|
+ sanitizedName = sanitizedName.join("");
|
|
|
|
|
|
- for (i = 0, ii = nibbles.length; i < ii; i += 2) {
|
|
|
- out.push(parseInt(nibbles.substring(i, i + 2), 16));
|
|
|
+ if (sanitizedName === "") {
|
|
|
+ sanitizedName = "Bad_Font_Name";
|
|
|
}
|
|
|
|
|
|
- return out;
|
|
|
- },
|
|
|
- encodeInteger: function CFFCompiler_encodeInteger(value) {
|
|
|
- var code;
|
|
|
-
|
|
|
- if (value >= -107 && value <= 107) {
|
|
|
- code = [value + 139];
|
|
|
- } else if (value >= 108 && value <= 1131) {
|
|
|
- value = value - 108;
|
|
|
- code = [(value >> 8) + 247, value & 0xff];
|
|
|
- } else if (value >= -1131 && value <= -108) {
|
|
|
- value = -value - 108;
|
|
|
- code = [(value >> 8) + 251, value & 0xff];
|
|
|
- } else if (value >= -32768 && value <= 32767) {
|
|
|
- code = [0x1c, value >> 8 & 0xff, value & 0xff];
|
|
|
- } else {
|
|
|
- code = [0x1d, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff];
|
|
|
- }
|
|
|
+ nameIndex.add((0, _util.stringToBytes)(sanitizedName));
|
|
|
+ }
|
|
|
|
|
|
- return code;
|
|
|
- },
|
|
|
- compileHeader: function CFFCompiler_compileHeader(header) {
|
|
|
- return [header.major, header.minor, header.hdrSize, header.offSize];
|
|
|
- },
|
|
|
- compileNameIndex: function CFFCompiler_compileNameIndex(names) {
|
|
|
- var nameIndex = new CFFIndex();
|
|
|
+ return this.compileIndex(nameIndex);
|
|
|
+ }
|
|
|
|
|
|
- for (var i = 0, ii = names.length; i < ii; ++i) {
|
|
|
- var name = names[i];
|
|
|
- var length = Math.min(name.length, 127);
|
|
|
- var sanitizedName = new Array(length);
|
|
|
+ compileTopDicts(dicts, length, removeCidKeys) {
|
|
|
+ var fontDictTrackers = [];
|
|
|
+ var fdArrayIndex = new CFFIndex();
|
|
|
|
|
|
- for (var j = 0; j < length; j++) {
|
|
|
- var char = name[j];
|
|
|
+ for (var i = 0, ii = dicts.length; i < ii; ++i) {
|
|
|
+ var fontDict = dicts[i];
|
|
|
|
|
|
- if (char < "!" || char > "~" || char === "[" || char === "]" || char === "(" || char === ")" || char === "{" || char === "}" || char === "<" || char === ">" || char === "/" || char === "%") {
|
|
|
- char = "_";
|
|
|
- }
|
|
|
+ if (removeCidKeys) {
|
|
|
+ fontDict.removeByName("CIDFontVersion");
|
|
|
+ fontDict.removeByName("CIDFontRevision");
|
|
|
+ fontDict.removeByName("CIDFontType");
|
|
|
+ fontDict.removeByName("CIDCount");
|
|
|
+ fontDict.removeByName("UIDBase");
|
|
|
+ }
|
|
|
|
|
|
- sanitizedName[j] = char;
|
|
|
- }
|
|
|
+ var fontDictTracker = new CFFOffsetTracker();
|
|
|
+ var fontDictData = this.compileDict(fontDict, fontDictTracker);
|
|
|
+ fontDictTrackers.push(fontDictTracker);
|
|
|
+ fdArrayIndex.add(fontDictData);
|
|
|
+ fontDictTracker.offset(length);
|
|
|
+ }
|
|
|
|
|
|
- sanitizedName = sanitizedName.join("");
|
|
|
+ fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
|
|
|
+ return {
|
|
|
+ trackers: fontDictTrackers,
|
|
|
+ output: fdArrayIndex
|
|
|
+ };
|
|
|
+ }
|
|
|
|
|
|
- if (sanitizedName === "") {
|
|
|
- sanitizedName = "Bad_Font_Name";
|
|
|
- }
|
|
|
+ compilePrivateDicts(dicts, trackers, output) {
|
|
|
+ for (var i = 0, ii = dicts.length; i < ii; ++i) {
|
|
|
+ var fontDict = dicts[i];
|
|
|
+ var privateDict = fontDict.privateDict;
|
|
|
|
|
|
- nameIndex.add((0, _util.stringToBytes)(sanitizedName));
|
|
|
+ if (!privateDict || !fontDict.hasName("Private")) {
|
|
|
+ throw new _util.FormatError("There must be a private dictionary.");
|
|
|
}
|
|
|
|
|
|
- return this.compileIndex(nameIndex);
|
|
|
- },
|
|
|
- compileTopDicts: function CFFCompiler_compileTopDicts(dicts, length, removeCidKeys) {
|
|
|
- var fontDictTrackers = [];
|
|
|
- var fdArrayIndex = new CFFIndex();
|
|
|
-
|
|
|
- for (var i = 0, ii = dicts.length; i < ii; ++i) {
|
|
|
- var fontDict = dicts[i];
|
|
|
-
|
|
|
- if (removeCidKeys) {
|
|
|
- fontDict.removeByName("CIDFontVersion");
|
|
|
- fontDict.removeByName("CIDFontRevision");
|
|
|
- fontDict.removeByName("CIDFontType");
|
|
|
- fontDict.removeByName("CIDCount");
|
|
|
- fontDict.removeByName("UIDBase");
|
|
|
- }
|
|
|
+ var privateDictTracker = new CFFOffsetTracker();
|
|
|
+ var privateDictData = this.compileDict(privateDict, privateDictTracker);
|
|
|
+ var outputLength = output.length;
|
|
|
+ privateDictTracker.offset(outputLength);
|
|
|
|
|
|
- var fontDictTracker = new CFFOffsetTracker();
|
|
|
- var fontDictData = this.compileDict(fontDict, fontDictTracker);
|
|
|
- fontDictTrackers.push(fontDictTracker);
|
|
|
- fdArrayIndex.add(fontDictData);
|
|
|
- fontDictTracker.offset(length);
|
|
|
+ if (!privateDictData.length) {
|
|
|
+ outputLength = 0;
|
|
|
}
|
|
|
|
|
|
- fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
|
|
|
- return {
|
|
|
- trackers: fontDictTrackers,
|
|
|
- output: fdArrayIndex
|
|
|
- };
|
|
|
- },
|
|
|
- compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts, trackers, output) {
|
|
|
- for (var i = 0, ii = dicts.length; i < ii; ++i) {
|
|
|
- var fontDict = dicts[i];
|
|
|
- var privateDict = fontDict.privateDict;
|
|
|
-
|
|
|
- if (!privateDict || !fontDict.hasName("Private")) {
|
|
|
- throw new _util.FormatError("There must be a private dictionary.");
|
|
|
- }
|
|
|
+ trackers[i].setEntryLocation("Private", [privateDictData.length, outputLength], output);
|
|
|
+ output.add(privateDictData);
|
|
|
|
|
|
- var privateDictTracker = new CFFOffsetTracker();
|
|
|
- var privateDictData = this.compileDict(privateDict, privateDictTracker);
|
|
|
- var outputLength = output.length;
|
|
|
- privateDictTracker.offset(outputLength);
|
|
|
+ if (privateDict.subrsIndex && privateDict.hasName("Subrs")) {
|
|
|
+ var subrs = this.compileIndex(privateDict.subrsIndex);
|
|
|
+ privateDictTracker.setEntryLocation("Subrs", [privateDictData.length], output);
|
|
|
+ output.add(subrs);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- if (!privateDictData.length) {
|
|
|
- outputLength = 0;
|
|
|
- }
|
|
|
+ compileDict(dict, offsetTracker) {
|
|
|
+ var out = [];
|
|
|
+ var order = dict.order;
|
|
|
|
|
|
- trackers[i].setEntryLocation("Private", [privateDictData.length, outputLength], output);
|
|
|
- output.add(privateDictData);
|
|
|
+ for (var i = 0; i < order.length; ++i) {
|
|
|
+ var key = order[i];
|
|
|
|
|
|
- if (privateDict.subrsIndex && privateDict.hasName("Subrs")) {
|
|
|
- var subrs = this.compileIndex(privateDict.subrsIndex);
|
|
|
- privateDictTracker.setEntryLocation("Subrs", [privateDictData.length], output);
|
|
|
- output.add(subrs);
|
|
|
- }
|
|
|
+ if (!(key in dict.values)) {
|
|
|
+ continue;
|
|
|
}
|
|
|
- },
|
|
|
- compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {
|
|
|
- var out = [];
|
|
|
- var order = dict.order;
|
|
|
|
|
|
- for (var i = 0; i < order.length; ++i) {
|
|
|
- var key = order[i];
|
|
|
+ var values = dict.values[key];
|
|
|
+ var types = dict.types[key];
|
|
|
|
|
|
- if (!(key in dict.values)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
+ if (!Array.isArray(types)) {
|
|
|
+ types = [types];
|
|
|
+ }
|
|
|
|
|
|
- var values = dict.values[key];
|
|
|
- var types = dict.types[key];
|
|
|
+ if (!Array.isArray(values)) {
|
|
|
+ values = [values];
|
|
|
+ }
|
|
|
|
|
|
- if (!Array.isArray(types)) {
|
|
|
- types = [types];
|
|
|
- }
|
|
|
+ if (values.length === 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- if (!Array.isArray(values)) {
|
|
|
- values = [values];
|
|
|
- }
|
|
|
+ for (var j = 0, jj = types.length; j < jj; ++j) {
|
|
|
+ var type = types[j];
|
|
|
+ var value = values[j];
|
|
|
|
|
|
- if (values.length === 0) {
|
|
|
- continue;
|
|
|
- }
|
|
|
+ switch (type) {
|
|
|
+ case "num":
|
|
|
+ case "sid":
|
|
|
+ out = out.concat(this.encodeNumber(value));
|
|
|
+ break;
|
|
|
|
|
|
- for (var j = 0, jj = types.length; j < jj; ++j) {
|
|
|
- var type = types[j];
|
|
|
- var value = values[j];
|
|
|
+ case "offset":
|
|
|
+ var name = dict.keyToNameMap[key];
|
|
|
|
|
|
- switch (type) {
|
|
|
- case "num":
|
|
|
- case "sid":
|
|
|
- out = out.concat(this.encodeNumber(value));
|
|
|
- break;
|
|
|
+ if (!offsetTracker.isTracking(name)) {
|
|
|
+ offsetTracker.track(name, out.length);
|
|
|
+ }
|
|
|
|
|
|
- case "offset":
|
|
|
- var name = dict.keyToNameMap[key];
|
|
|
+ out = out.concat([0x1d, 0, 0, 0, 0]);
|
|
|
+ break;
|
|
|
|
|
|
- if (!offsetTracker.isTracking(name)) {
|
|
|
- offsetTracker.track(name, out.length);
|
|
|
- }
|
|
|
+ case "array":
|
|
|
+ case "delta":
|
|
|
+ out = out.concat(this.encodeNumber(value));
|
|
|
|
|
|
- out = out.concat([0x1d, 0, 0, 0, 0]);
|
|
|
- break;
|
|
|
+ for (var k = 1, kk = values.length; k < kk; ++k) {
|
|
|
+ out = out.concat(this.encodeNumber(values[k]));
|
|
|
+ }
|
|
|
|
|
|
- case "array":
|
|
|
- case "delta":
|
|
|
- out = out.concat(this.encodeNumber(value));
|
|
|
+ break;
|
|
|
|
|
|
- for (var k = 1, kk = values.length; k < kk; ++k) {
|
|
|
- out = out.concat(this.encodeNumber(values[k]));
|
|
|
- }
|
|
|
+ default:
|
|
|
+ throw new _util.FormatError(`Unknown data type of ${type}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- break;
|
|
|
+ out = out.concat(dict.opcodes[key]);
|
|
|
+ }
|
|
|
|
|
|
- default:
|
|
|
- throw new _util.FormatError(`Unknown data type of ${type}`);
|
|
|
- }
|
|
|
- }
|
|
|
+ return out;
|
|
|
+ }
|
|
|
|
|
|
- out = out.concat(dict.opcodes[key]);
|
|
|
- }
|
|
|
+ compileStringIndex(strings) {
|
|
|
+ var stringIndex = new CFFIndex();
|
|
|
|
|
|
- return out;
|
|
|
- },
|
|
|
- compileStringIndex: function CFFCompiler_compileStringIndex(strings) {
|
|
|
- var stringIndex = new CFFIndex();
|
|
|
+ for (var i = 0, ii = strings.length; i < ii; ++i) {
|
|
|
+ stringIndex.add((0, _util.stringToBytes)(strings[i]));
|
|
|
+ }
|
|
|
|
|
|
- for (var i = 0, ii = strings.length; i < ii; ++i) {
|
|
|
- stringIndex.add((0, _util.stringToBytes)(strings[i]));
|
|
|
- }
|
|
|
+ return this.compileIndex(stringIndex);
|
|
|
+ }
|
|
|
|
|
|
- return this.compileIndex(stringIndex);
|
|
|
- },
|
|
|
- compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {
|
|
|
- var globalSubrIndex = this.cff.globalSubrIndex;
|
|
|
- this.out.writeByteArray(this.compileIndex(globalSubrIndex));
|
|
|
- },
|
|
|
- compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {
|
|
|
- var charStringsIndex = new CFFIndex();
|
|
|
+ compileGlobalSubrIndex() {
|
|
|
+ var globalSubrIndex = this.cff.globalSubrIndex;
|
|
|
+ this.out.writeByteArray(this.compileIndex(globalSubrIndex));
|
|
|
+ }
|
|
|
|
|
|
- for (var i = 0; i < charStrings.count; i++) {
|
|
|
- var glyph = charStrings.get(i);
|
|
|
+ compileCharStrings(charStrings) {
|
|
|
+ var charStringsIndex = new CFFIndex();
|
|
|
|
|
|
- if (glyph.length === 0) {
|
|
|
- charStringsIndex.add(new Uint8Array([0x8b, 0x0e]));
|
|
|
- continue;
|
|
|
- }
|
|
|
+ for (var i = 0; i < charStrings.count; i++) {
|
|
|
+ var glyph = charStrings.get(i);
|
|
|
|
|
|
- charStringsIndex.add(glyph);
|
|
|
+ if (glyph.length === 0) {
|
|
|
+ charStringsIndex.add(new Uint8Array([0x8b, 0x0e]));
|
|
|
+ continue;
|
|
|
}
|
|
|
|
|
|
- return this.compileIndex(charStringsIndex);
|
|
|
- },
|
|
|
- compileCharset: function CFFCompiler_compileCharset(charset, numGlyphs, strings, isCIDFont) {
|
|
|
- let out;
|
|
|
- const numGlyphsLessNotDef = numGlyphs - 1;
|
|
|
+ charStringsIndex.add(glyph);
|
|
|
+ }
|
|
|
|
|
|
- if (isCIDFont) {
|
|
|
- out = new Uint8Array([2, 0, 0, numGlyphsLessNotDef >> 8 & 0xff, numGlyphsLessNotDef & 0xff]);
|
|
|
- } else {
|
|
|
- const length = 1 + numGlyphsLessNotDef * 2;
|
|
|
- out = new Uint8Array(length);
|
|
|
- out[0] = 0;
|
|
|
- let charsetIndex = 0;
|
|
|
- const numCharsets = charset.charset.length;
|
|
|
- let warned = false;
|
|
|
-
|
|
|
- for (let i = 1; i < out.length; i += 2) {
|
|
|
- let sid = 0;
|
|
|
-
|
|
|
- if (charsetIndex < numCharsets) {
|
|
|
- const name = charset.charset[charsetIndex++];
|
|
|
- sid = strings.getSID(name);
|
|
|
-
|
|
|
- if (sid === -1) {
|
|
|
- sid = 0;
|
|
|
-
|
|
|
- if (!warned) {
|
|
|
- warned = true;
|
|
|
- (0, _util.warn)(`Couldn't find ${name} in CFF strings`);
|
|
|
- }
|
|
|
+ return this.compileIndex(charStringsIndex);
|
|
|
+ }
|
|
|
+
|
|
|
+ compileCharset(charset, numGlyphs, strings, isCIDFont) {
|
|
|
+ let out;
|
|
|
+ const numGlyphsLessNotDef = numGlyphs - 1;
|
|
|
+
|
|
|
+ if (isCIDFont) {
|
|
|
+ out = new Uint8Array([2, 0, 0, numGlyphsLessNotDef >> 8 & 0xff, numGlyphsLessNotDef & 0xff]);
|
|
|
+ } else {
|
|
|
+ const length = 1 + numGlyphsLessNotDef * 2;
|
|
|
+ out = new Uint8Array(length);
|
|
|
+ out[0] = 0;
|
|
|
+ let charsetIndex = 0;
|
|
|
+ const numCharsets = charset.charset.length;
|
|
|
+ let warned = false;
|
|
|
+
|
|
|
+ for (let i = 1; i < out.length; i += 2) {
|
|
|
+ let sid = 0;
|
|
|
+
|
|
|
+ if (charsetIndex < numCharsets) {
|
|
|
+ const name = charset.charset[charsetIndex++];
|
|
|
+ sid = strings.getSID(name);
|
|
|
+
|
|
|
+ if (sid === -1) {
|
|
|
+ sid = 0;
|
|
|
+
|
|
|
+ if (!warned) {
|
|
|
+ warned = true;
|
|
|
+ (0, _util.warn)(`Couldn't find ${name} in CFF strings`);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- out[i] = sid >> 8 & 0xff;
|
|
|
- out[i + 1] = sid & 0xff;
|
|
|
}
|
|
|
+
|
|
|
+ out[i] = sid >> 8 & 0xff;
|
|
|
+ out[i + 1] = sid & 0xff;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- return this.compileTypedArray(out);
|
|
|
- },
|
|
|
- compileEncoding: function CFFCompiler_compileEncoding(encoding) {
|
|
|
- return this.compileTypedArray(encoding.raw);
|
|
|
- },
|
|
|
- compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {
|
|
|
- const format = fdSelect.format;
|
|
|
- let out, i;
|
|
|
+ return this.compileTypedArray(out);
|
|
|
+ }
|
|
|
|
|
|
- switch (format) {
|
|
|
- case 0:
|
|
|
- out = new Uint8Array(1 + fdSelect.fdSelect.length);
|
|
|
- out[0] = format;
|
|
|
+ compileEncoding(encoding) {
|
|
|
+ return this.compileTypedArray(encoding.raw);
|
|
|
+ }
|
|
|
|
|
|
- for (i = 0; i < fdSelect.fdSelect.length; i++) {
|
|
|
- out[i + 1] = fdSelect.fdSelect[i];
|
|
|
- }
|
|
|
+ compileFDSelect(fdSelect) {
|
|
|
+ const format = fdSelect.format;
|
|
|
+ let out, i;
|
|
|
|
|
|
- break;
|
|
|
+ switch (format) {
|
|
|
+ case 0:
|
|
|
+ out = new Uint8Array(1 + fdSelect.fdSelect.length);
|
|
|
+ out[0] = format;
|
|
|
|
|
|
- case 3:
|
|
|
- const start = 0;
|
|
|
- let lastFD = fdSelect.fdSelect[0];
|
|
|
- const ranges = [format, 0, 0, start >> 8 & 0xff, start & 0xff, lastFD];
|
|
|
+ for (i = 0; i < fdSelect.fdSelect.length; i++) {
|
|
|
+ out[i + 1] = fdSelect.fdSelect[i];
|
|
|
+ }
|
|
|
|
|
|
- for (i = 1; i < fdSelect.fdSelect.length; i++) {
|
|
|
- const currentFD = fdSelect.fdSelect[i];
|
|
|
+ break;
|
|
|
|
|
|
- if (currentFD !== lastFD) {
|
|
|
- ranges.push(i >> 8 & 0xff, i & 0xff, currentFD);
|
|
|
- lastFD = currentFD;
|
|
|
- }
|
|
|
+ case 3:
|
|
|
+ const start = 0;
|
|
|
+ let lastFD = fdSelect.fdSelect[0];
|
|
|
+ const ranges = [format, 0, 0, start >> 8 & 0xff, start & 0xff, lastFD];
|
|
|
+
|
|
|
+ for (i = 1; i < fdSelect.fdSelect.length; i++) {
|
|
|
+ const currentFD = fdSelect.fdSelect[i];
|
|
|
+
|
|
|
+ if (currentFD !== lastFD) {
|
|
|
+ ranges.push(i >> 8 & 0xff, i & 0xff, currentFD);
|
|
|
+ lastFD = currentFD;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- const numRanges = (ranges.length - 3) / 3;
|
|
|
- ranges[1] = numRanges >> 8 & 0xff;
|
|
|
- ranges[2] = numRanges & 0xff;
|
|
|
- ranges.push(i >> 8 & 0xff, i & 0xff);
|
|
|
- out = new Uint8Array(ranges);
|
|
|
- break;
|
|
|
- }
|
|
|
+ const numRanges = (ranges.length - 3) / 3;
|
|
|
+ ranges[1] = numRanges >> 8 & 0xff;
|
|
|
+ ranges[2] = numRanges & 0xff;
|
|
|
+ ranges.push(i >> 8 & 0xff, i & 0xff);
|
|
|
+ out = new Uint8Array(ranges);
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- return this.compileTypedArray(out);
|
|
|
- },
|
|
|
- compileTypedArray: function CFFCompiler_compileTypedArray(data) {
|
|
|
- var out = [];
|
|
|
+ return this.compileTypedArray(out);
|
|
|
+ }
|
|
|
|
|
|
- for (var i = 0, ii = data.length; i < ii; ++i) {
|
|
|
- out[i] = data[i];
|
|
|
- }
|
|
|
+ compileTypedArray(data) {
|
|
|
+ var out = [];
|
|
|
|
|
|
- return out;
|
|
|
- },
|
|
|
- compileIndex: function CFFCompiler_compileIndex(index, trackers) {
|
|
|
- trackers = trackers || [];
|
|
|
- var objects = index.objects;
|
|
|
- var count = objects.length;
|
|
|
+ for (var i = 0, ii = data.length; i < ii; ++i) {
|
|
|
+ out[i] = data[i];
|
|
|
+ }
|
|
|
|
|
|
- if (count === 0) {
|
|
|
- return [0, 0, 0];
|
|
|
- }
|
|
|
+ return out;
|
|
|
+ }
|
|
|
|
|
|
- var data = [count >> 8 & 0xff, count & 0xff];
|
|
|
- var lastOffset = 1,
|
|
|
- i;
|
|
|
+ compileIndex(index, trackers = []) {
|
|
|
+ var objects = index.objects;
|
|
|
+ var count = objects.length;
|
|
|
|
|
|
- for (i = 0; i < count; ++i) {
|
|
|
- lastOffset += objects[i].length;
|
|
|
- }
|
|
|
+ if (count === 0) {
|
|
|
+ return [0, 0, 0];
|
|
|
+ }
|
|
|
|
|
|
- var offsetSize;
|
|
|
+ var data = [count >> 8 & 0xff, count & 0xff];
|
|
|
+ var lastOffset = 1,
|
|
|
+ i;
|
|
|
|
|
|
- if (lastOffset < 0x100) {
|
|
|
- offsetSize = 1;
|
|
|
- } else if (lastOffset < 0x10000) {
|
|
|
- offsetSize = 2;
|
|
|
- } else if (lastOffset < 0x1000000) {
|
|
|
- offsetSize = 3;
|
|
|
- } else {
|
|
|
- offsetSize = 4;
|
|
|
- }
|
|
|
+ for (i = 0; i < count; ++i) {
|
|
|
+ lastOffset += objects[i].length;
|
|
|
+ }
|
|
|
|
|
|
- data.push(offsetSize);
|
|
|
- var relativeOffset = 1;
|
|
|
+ var offsetSize;
|
|
|
|
|
|
- for (i = 0; i < count + 1; i++) {
|
|
|
- if (offsetSize === 1) {
|
|
|
- data.push(relativeOffset & 0xff);
|
|
|
- } else if (offsetSize === 2) {
|
|
|
- data.push(relativeOffset >> 8 & 0xff, relativeOffset & 0xff);
|
|
|
- } else if (offsetSize === 3) {
|
|
|
- data.push(relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff);
|
|
|
- } else {
|
|
|
- data.push(relativeOffset >>> 24 & 0xff, relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff);
|
|
|
- }
|
|
|
+ if (lastOffset < 0x100) {
|
|
|
+ offsetSize = 1;
|
|
|
+ } else if (lastOffset < 0x10000) {
|
|
|
+ offsetSize = 2;
|
|
|
+ } else if (lastOffset < 0x1000000) {
|
|
|
+ offsetSize = 3;
|
|
|
+ } else {
|
|
|
+ offsetSize = 4;
|
|
|
+ }
|
|
|
|
|
|
- if (objects[i]) {
|
|
|
- relativeOffset += objects[i].length;
|
|
|
- }
|
|
|
+ data.push(offsetSize);
|
|
|
+ var relativeOffset = 1;
|
|
|
+
|
|
|
+ for (i = 0; i < count + 1; i++) {
|
|
|
+ if (offsetSize === 1) {
|
|
|
+ data.push(relativeOffset & 0xff);
|
|
|
+ } else if (offsetSize === 2) {
|
|
|
+ data.push(relativeOffset >> 8 & 0xff, relativeOffset & 0xff);
|
|
|
+ } else if (offsetSize === 3) {
|
|
|
+ data.push(relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff);
|
|
|
+ } else {
|
|
|
+ data.push(relativeOffset >>> 24 & 0xff, relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff);
|
|
|
}
|
|
|
|
|
|
- for (i = 0; i < count; i++) {
|
|
|
- if (trackers[i]) {
|
|
|
- trackers[i].offset(data.length);
|
|
|
- }
|
|
|
+ if (objects[i]) {
|
|
|
+ relativeOffset += objects[i].length;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- for (var j = 0, jj = objects[i].length; j < jj; j++) {
|
|
|
- data.push(objects[i][j]);
|
|
|
- }
|
|
|
+ for (i = 0; i < count; i++) {
|
|
|
+ if (trackers[i]) {
|
|
|
+ trackers[i].offset(data.length);
|
|
|
}
|
|
|
|
|
|
- return data;
|
|
|
+ for (var j = 0, jj = objects[i].length; j < jj; j++) {
|
|
|
+ data.push(objects[i][j]);
|
|
|
+ }
|
|
|
}
|
|
|
- };
|
|
|
- return CFFCompiler;
|
|
|
-}();
|
|
|
+
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
|
|
|
exports.CFFCompiler = CFFCompiler;
|