pdfjs-dist 2.0.943 → 2.1.266
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pdfjs-dist might be problematic. Click here for more details.
- package/bower.json +1 -1
- package/build/pdf.js +15329 -11095
- package/build/pdf.js.map +1 -1
- package/build/pdf.min.js +1 -1
- package/build/pdf.worker.js +12497 -4184
- package/build/pdf.worker.js.map +1 -1
- package/build/pdf.worker.min.js +1 -1
- package/image_decoders/pdf.image_decoders.js +3438 -1209
- package/image_decoders/pdf.image_decoders.js.map +1 -1
- package/image_decoders/pdf.image_decoders.min.js +1 -1
- package/lib/core/annotation.js +335 -109
- package/lib/core/arithmetic_decoder.js +274 -244
- package/lib/core/bidi.js +64 -5
- package/lib/core/ccitt.js +172 -17
- package/lib/core/ccitt_stream.js +14 -5
- package/lib/core/cff_parser.js +304 -28
- package/lib/core/charsets.js +4 -3
- package/lib/core/chunked_stream.js +379 -149
- package/lib/core/cmap.js +210 -40
- package/lib/core/colorspace.js +332 -187
- package/lib/core/crypto.js +289 -44
- package/lib/core/document.js +508 -249
- package/lib/core/encodings.js +18 -9
- package/lib/core/evaluator.js +657 -119
- package/lib/core/font_renderer.js +217 -34
- package/lib/core/fonts.js +632 -41
- package/lib/core/function.js +252 -26
- package/lib/core/glyphlist.js +2 -1
- package/lib/core/image.js +124 -27
- package/lib/core/jbig2.js +425 -65
- package/lib/core/jbig2_stream.js +18 -7
- package/lib/core/jpeg_stream.js +24 -8
- package/lib/core/jpg.js +208 -16
- package/lib/core/jpx.js +395 -5
- package/lib/core/jpx_stream.js +17 -5
- package/lib/core/metrics.js +3 -3
- package/lib/core/murmurhash3.js +23 -5
- package/lib/core/obj.js +625 -132
- package/lib/core/operator_list.js +104 -3
- package/lib/core/parser.js +262 -25
- package/lib/core/pattern.js +144 -12
- package/lib/core/pdf_manager.js +104 -70
- package/lib/core/primitives.js +74 -21
- package/lib/core/ps_parser.js +133 -44
- package/lib/core/standard_fonts.js +9 -9
- package/lib/core/stream.js +283 -31
- package/lib/core/type1_parser.js +138 -6
- package/lib/core/unicode.js +28 -1
- package/lib/core/worker.js +192 -57
- package/lib/display/annotation_layer.js +303 -123
- package/lib/display/api.js +1073 -574
- package/lib/display/api_compatibility.js +4 -1
- package/lib/display/canvas.js +314 -18
- package/lib/display/content_disposition.js +70 -23
- package/lib/display/dom_utils.js +112 -59
- package/lib/display/fetch_stream.js +95 -50
- package/lib/display/font_loader.js +250 -132
- package/lib/display/metadata.js +37 -15
- package/lib/display/network.js +123 -34
- package/lib/display/network_utils.js +23 -10
- package/lib/display/node_stream.js +162 -65
- package/lib/display/pattern_helper.js +57 -6
- package/lib/display/svg.js +194 -18
- package/lib/display/text_layer.js +128 -14
- package/lib/display/transport_stream.js +83 -27
- package/lib/display/webgl.js +63 -17
- package/lib/display/worker_options.js +4 -3
- package/lib/display/xml_parser.js +162 -52
- package/lib/examples/node/domstubs.js +56 -3
- package/lib/pdf.js +15 -2
- package/lib/pdf.worker.js +4 -2
- package/lib/shared/compatibility.js +129 -26
- package/lib/shared/global_scope.js +1 -1
- package/lib/shared/is_node.js +3 -3
- package/lib/shared/message_handler.js +103 -45
- package/lib/shared/streams_polyfill.js +20 -16
- package/lib/shared/url_polyfill.js +8 -2
- package/lib/shared/util.js +246 -84
- package/lib/test/unit/annotation_spec.js +99 -73
- package/lib/test/unit/api_spec.js +347 -113
- package/lib/test/unit/bidi_spec.js +6 -6
- package/lib/test/unit/cff_parser_spec.js +17 -5
- package/lib/test/unit/clitests_helper.js +7 -8
- package/lib/test/unit/cmap_spec.js +79 -25
- package/lib/test/unit/colorspace_spec.js +65 -18
- package/lib/test/unit/crypto_spec.js +16 -4
- package/lib/test/unit/custom_spec.js +40 -52
- package/lib/test/unit/display_svg_spec.js +32 -16
- package/lib/test/unit/document_spec.js +2 -2
- package/lib/test/unit/dom_utils_spec.js +8 -8
- package/lib/test/unit/encodings_spec.js +24 -44
- package/lib/test/unit/evaluator_spec.js +15 -8
- package/lib/test/unit/function_spec.js +16 -4
- package/lib/test/unit/jasmine-boot.js +29 -16
- package/lib/test/unit/message_handler_spec.js +19 -6
- package/lib/test/unit/metadata_spec.js +64 -11
- package/lib/test/unit/murmurhash3_spec.js +2 -2
- package/lib/test/unit/network_spec.js +19 -4
- package/lib/test/unit/network_utils_spec.js +6 -4
- package/lib/test/unit/node_stream_spec.js +50 -26
- package/lib/test/unit/parser_spec.js +13 -29
- package/lib/test/unit/pdf_find_controller_spec.js +144 -32
- package/lib/test/unit/pdf_find_utils_spec.js +10 -9
- package/lib/test/unit/pdf_history_spec.js +20 -8
- package/lib/test/unit/primitives_spec.js +23 -3
- package/lib/test/unit/stream_spec.js +8 -3
- package/lib/test/unit/test_utils.js +89 -26
- package/lib/test/unit/testreporter.js +19 -1
- package/lib/test/unit/type1_parser_spec.js +7 -5
- package/lib/test/unit/ui_utils_spec.js +162 -38
- package/lib/test/unit/unicode_spec.js +13 -10
- package/lib/test/unit/util_spec.js +89 -9
- package/lib/web/annotation_layer_builder.js +38 -21
- package/lib/web/app.js +610 -245
- package/lib/web/app_options.js +54 -34
- package/lib/web/base_viewer.js +359 -162
- package/lib/web/chromecom.js +159 -80
- package/lib/web/debugger.js +161 -17
- package/lib/web/download_manager.js +29 -11
- package/lib/web/firefox_print_service.js +16 -8
- package/lib/web/firefoxcom.js +127 -91
- package/lib/web/genericcom.js +50 -31
- package/lib/web/genericl10n.js +46 -34
- package/lib/web/grab_to_pan.js +25 -3
- package/lib/web/interfaces.js +108 -61
- package/lib/web/overlay_manager.js +67 -45
- package/lib/web/password_prompt.js +20 -12
- package/lib/web/pdf_attachment_viewer.js +37 -17
- package/lib/web/pdf_cursor_tools.js +38 -15
- package/lib/web/pdf_document_properties.js +65 -24
- package/lib/web/pdf_find_bar.js +48 -20
- package/lib/web/pdf_find_controller.js +290 -89
- package/lib/web/pdf_find_utils.js +19 -3
- package/lib/web/pdf_history.js +186 -49
- package/lib/web/pdf_link_service.js +127 -52
- package/lib/web/pdf_outline_viewer.js +71 -21
- package/lib/web/pdf_page_view.js +188 -63
- package/lib/web/pdf_presentation_mode.js +98 -33
- package/lib/web/pdf_print_service.js +54 -10
- package/lib/web/pdf_rendering_queue.js +26 -4
- package/lib/web/pdf_sidebar.js +116 -62
- package/lib/web/pdf_sidebar_resizer.js +41 -15
- package/lib/web/pdf_single_page_viewer.js +65 -68
- package/lib/web/pdf_thumbnail_view.js +102 -31
- package/lib/web/pdf_thumbnail_viewer.js +62 -22
- package/lib/web/pdf_viewer.component.js +111 -31
- package/lib/web/pdf_viewer.js +80 -60
- package/lib/web/preferences.js +61 -39
- package/lib/web/secondary_toolbar.js +101 -82
- package/lib/web/text_layer_builder.js +124 -69
- package/lib/web/toolbar.js +67 -27
- package/lib/web/ui_utils.js +284 -128
- package/lib/web/view_history.js +75 -51
- package/lib/web/viewer_compatibility.js +2 -1
- package/package.json +1 -1
- package/web/pdf_viewer.css +1 -1
- package/web/pdf_viewer.js +2200 -973
- package/web/pdf_viewer.js.map +1 -1
- package/lib/web/dom_events.js +0 -140
package/lib/core/cff_parser.js
CHANGED
@@ -19,21 +19,23 @@
|
|
19
19
|
* @licend The above is the entire license notice for the
|
20
20
|
* Javascript code in this page
|
21
21
|
*/
|
22
|
-
|
22
|
+
"use strict";
|
23
23
|
|
24
24
|
Object.defineProperty(exports, "__esModule", {
|
25
25
|
value: true
|
26
26
|
});
|
27
|
-
exports.CFFFDSelect = exports.CFFCompiler = exports.CFFPrivateDict = exports.CFFTopDict = exports.CFFCharset = exports.CFFIndex = exports.CFFStrings = exports.CFFHeader = exports.CFF = exports.CFFParser = exports.CFFStandardStrings =
|
27
|
+
exports.CFFFDSelect = exports.CFFCompiler = exports.CFFPrivateDict = exports.CFFTopDict = exports.CFFCharset = exports.CFFIndex = exports.CFFStrings = exports.CFFHeader = exports.CFF = exports.CFFParser = exports.CFFStandardStrings = void 0;
|
28
28
|
|
29
|
-
var _util = require(
|
29
|
+
var _util = require("../shared/util");
|
30
30
|
|
31
|
-
var _charsets = require(
|
31
|
+
var _charsets = require("./charsets");
|
32
32
|
|
33
|
-
var _encodings = require(
|
33
|
+
var _encodings = require("./encodings");
|
34
34
|
|
35
35
|
var MAX_SUBR_NESTING = 10;
|
36
36
|
var CFFStandardStrings = ['.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', 'twodotenleader', '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'];
|
37
|
+
exports.CFFStandardStrings = CFFStandardStrings;
|
38
|
+
|
37
39
|
var CFFParser = function CFFParserClosure() {
|
38
40
|
var CharstringValidationData = [null, {
|
39
41
|
id: 'hstem',
|
@@ -244,11 +246,13 @@ var CFFParser = function CFFParserClosure() {
|
|
244
246
|
min: 11,
|
245
247
|
resetStack: true
|
246
248
|
}];
|
249
|
+
|
247
250
|
function CFFParser(file, properties, seacAnalysisEnabled) {
|
248
251
|
this.bytes = file.getBytes();
|
249
252
|
this.properties = properties;
|
250
253
|
this.seacAnalysisEnabled = !!seacAnalysisEnabled;
|
251
254
|
}
|
255
|
+
|
252
256
|
CFFParser.prototype = {
|
253
257
|
parse: function CFFParser_parse() {
|
254
258
|
var properties = this.properties;
|
@@ -271,24 +275,31 @@ var CFFParser = function CFFParserClosure() {
|
|
271
275
|
var charStringOffset = topDict.getByName('CharStrings');
|
272
276
|
var charStringIndex = this.parseIndex(charStringOffset).obj;
|
273
277
|
var fontMatrix = topDict.getByName('FontMatrix');
|
278
|
+
|
274
279
|
if (fontMatrix) {
|
275
280
|
properties.fontMatrix = fontMatrix;
|
276
281
|
}
|
282
|
+
|
277
283
|
var fontBBox = topDict.getByName('FontBBox');
|
284
|
+
|
278
285
|
if (fontBBox) {
|
279
286
|
properties.ascent = Math.max(fontBBox[3], fontBBox[1]);
|
280
287
|
properties.descent = Math.min(fontBBox[1], fontBBox[3]);
|
281
288
|
properties.ascentScaled = true;
|
282
289
|
}
|
290
|
+
|
283
291
|
var charset, encoding;
|
292
|
+
|
284
293
|
if (cff.isCIDFont) {
|
285
294
|
var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj;
|
295
|
+
|
286
296
|
for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {
|
287
297
|
var dictRaw = fdArrayIndex.get(i);
|
288
298
|
var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings);
|
289
299
|
this.parsePrivateDict(fontDict);
|
290
300
|
cff.fdArray.push(fontDict);
|
291
301
|
}
|
302
|
+
|
292
303
|
encoding = null;
|
293
304
|
charset = this.parseCharsets(topDict.getByName('charset'), charStringIndex.count, cff.strings, true);
|
294
305
|
cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'), charStringIndex.count);
|
@@ -296,6 +307,7 @@ var CFFParser = function CFFParserClosure() {
|
|
296
307
|
charset = this.parseCharsets(topDict.getByName('charset'), charStringIndex.count, cff.strings, false);
|
297
308
|
encoding = this.parseEncoding(topDict.getByName('Encoding'), properties, cff.strings, charset.charset);
|
298
309
|
}
|
310
|
+
|
299
311
|
cff.charset = charset;
|
300
312
|
cff.encoding = encoding;
|
301
313
|
var charStringsAndSeacs = this.parseCharStrings({
|
@@ -315,17 +327,21 @@ var CFFParser = function CFFParserClosure() {
|
|
315
327
|
var bytes = this.bytes;
|
316
328
|
var bytesLength = bytes.length;
|
317
329
|
var offset = 0;
|
330
|
+
|
318
331
|
while (offset < bytesLength && bytes[offset] !== 1) {
|
319
332
|
++offset;
|
320
333
|
}
|
334
|
+
|
321
335
|
if (offset >= bytesLength) {
|
322
336
|
throw new _util.FormatError('Invalid CFF header');
|
323
337
|
}
|
338
|
+
|
324
339
|
if (offset !== 0) {
|
325
340
|
(0, _util.info)('cff data is shifted');
|
326
341
|
bytes = bytes.subarray(offset);
|
327
342
|
this.bytes = bytes;
|
328
343
|
}
|
344
|
+
|
329
345
|
var major = bytes[0];
|
330
346
|
var minor = bytes[1];
|
331
347
|
var hdrSize = bytes[2];
|
@@ -338,8 +354,10 @@ var CFFParser = function CFFParserClosure() {
|
|
338
354
|
},
|
339
355
|
parseDict: function CFFParser_parseDict(dict) {
|
340
356
|
var pos = 0;
|
357
|
+
|
341
358
|
function parseOperand() {
|
342
359
|
var value = dict[pos++];
|
360
|
+
|
343
361
|
if (value === 30) {
|
344
362
|
return parseFloatOperand();
|
345
363
|
} else if (value === 28) {
|
@@ -359,39 +377,51 @@ var CFFParser = function CFFParserClosure() {
|
|
359
377
|
} else if (value >= 251 && value <= 254) {
|
360
378
|
return -((value - 251) * 256) - dict[pos++] - 108;
|
361
379
|
}
|
380
|
+
|
362
381
|
(0, _util.warn)('CFFParser_parseDict: "' + value + '" is a reserved command.');
|
363
382
|
return NaN;
|
364
383
|
}
|
384
|
+
|
365
385
|
function parseFloatOperand() {
|
366
386
|
var str = '';
|
367
387
|
var eof = 15;
|
368
388
|
var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'E', 'E-', null, '-'];
|
369
389
|
var length = dict.length;
|
390
|
+
|
370
391
|
while (pos < length) {
|
371
392
|
var b = dict[pos++];
|
372
393
|
var b1 = b >> 4;
|
373
394
|
var b2 = b & 15;
|
395
|
+
|
374
396
|
if (b1 === eof) {
|
375
397
|
break;
|
376
398
|
}
|
399
|
+
|
377
400
|
str += lookup[b1];
|
401
|
+
|
378
402
|
if (b2 === eof) {
|
379
403
|
break;
|
380
404
|
}
|
405
|
+
|
381
406
|
str += lookup[b2];
|
382
407
|
}
|
408
|
+
|
383
409
|
return parseFloat(str);
|
384
410
|
}
|
411
|
+
|
385
412
|
var operands = [];
|
386
413
|
var entries = [];
|
387
414
|
pos = 0;
|
388
415
|
var end = dict.length;
|
416
|
+
|
389
417
|
while (pos < end) {
|
390
418
|
var b = dict[pos];
|
419
|
+
|
391
420
|
if (b <= 21) {
|
392
421
|
if (b === 12) {
|
393
422
|
b = b << 8 | dict[++pos];
|
394
423
|
}
|
424
|
+
|
395
425
|
entries.push([b, operands]);
|
396
426
|
operands = [];
|
397
427
|
++pos;
|
@@ -399,6 +429,7 @@ var CFFParser = function CFFParserClosure() {
|
|
399
429
|
operands.push(parseOperand());
|
400
430
|
}
|
401
431
|
}
|
432
|
+
|
402
433
|
return entries;
|
403
434
|
},
|
404
435
|
parseIndex: function CFFParser_parseIndex(pos) {
|
@@ -408,24 +439,31 @@ var CFFParser = function CFFParserClosure() {
|
|
408
439
|
var offsets = [];
|
409
440
|
var end = pos;
|
410
441
|
var i, ii;
|
442
|
+
|
411
443
|
if (count !== 0) {
|
412
444
|
var offsetSize = bytes[pos++];
|
413
445
|
var startPos = pos + (count + 1) * offsetSize - 1;
|
446
|
+
|
414
447
|
for (i = 0, ii = count + 1; i < ii; ++i) {
|
415
448
|
var offset = 0;
|
449
|
+
|
416
450
|
for (var j = 0; j < offsetSize; ++j) {
|
417
451
|
offset <<= 8;
|
418
452
|
offset += bytes[pos++];
|
419
453
|
}
|
454
|
+
|
420
455
|
offsets.push(startPos + offset);
|
421
456
|
}
|
457
|
+
|
422
458
|
end = offsets[count];
|
423
459
|
}
|
460
|
+
|
424
461
|
for (i = 0, ii = offsets.length - 1; i < ii; ++i) {
|
425
462
|
var offsetStart = offsets[i];
|
426
463
|
var offsetEnd = offsets[i + 1];
|
427
464
|
cffIndex.add(bytes.subarray(offsetStart, offsetEnd));
|
428
465
|
}
|
466
|
+
|
429
467
|
return {
|
430
468
|
obj: cffIndex,
|
431
469
|
endPos: end
|
@@ -433,42 +471,52 @@ var CFFParser = function CFFParserClosure() {
|
|
433
471
|
},
|
434
472
|
parseNameIndex: function CFFParser_parseNameIndex(index) {
|
435
473
|
var names = [];
|
474
|
+
|
436
475
|
for (var i = 0, ii = index.count; i < ii; ++i) {
|
437
476
|
var name = index.get(i);
|
438
477
|
names.push((0, _util.bytesToString)(name));
|
439
478
|
}
|
479
|
+
|
440
480
|
return names;
|
441
481
|
},
|
442
482
|
parseStringIndex: function CFFParser_parseStringIndex(index) {
|
443
483
|
var strings = new CFFStrings();
|
484
|
+
|
444
485
|
for (var i = 0, ii = index.count; i < ii; ++i) {
|
445
486
|
var data = index.get(i);
|
446
487
|
strings.add((0, _util.bytesToString)(data));
|
447
488
|
}
|
489
|
+
|
448
490
|
return strings;
|
449
491
|
},
|
450
492
|
createDict: function CFFParser_createDict(Type, dict, strings) {
|
451
493
|
var cffDict = new Type(strings);
|
494
|
+
|
452
495
|
for (var i = 0, ii = dict.length; i < ii; ++i) {
|
453
496
|
var pair = dict[i];
|
454
497
|
var key = pair[0];
|
455
498
|
var value = pair[1];
|
456
499
|
cffDict.setByKey(key, value);
|
457
500
|
}
|
501
|
+
|
458
502
|
return cffDict;
|
459
503
|
},
|
460
504
|
parseCharString: function CFFParser_parseCharString(state, data, localSubrIndex, globalSubrIndex) {
|
461
505
|
if (!data || state.callDepth > MAX_SUBR_NESTING) {
|
462
506
|
return false;
|
463
507
|
}
|
508
|
+
|
464
509
|
var stackSize = state.stackSize;
|
465
510
|
var stack = state.stack;
|
466
511
|
var length = data.length;
|
512
|
+
|
467
513
|
for (var j = 0; j < length;) {
|
468
514
|
var value = data[j++];
|
469
515
|
var validationCommand = null;
|
516
|
+
|
470
517
|
if (value === 12) {
|
471
518
|
var q = data[j++];
|
519
|
+
|
472
520
|
if (q === 0) {
|
473
521
|
data[j - 2] = 139;
|
474
522
|
data[j - 1] = 22;
|
@@ -483,11 +531,13 @@ var CFFParser = function CFFParserClosure() {
|
|
483
531
|
} else if (value === 14) {
|
484
532
|
if (stackSize >= 4) {
|
485
533
|
stackSize -= 4;
|
534
|
+
|
486
535
|
if (this.seacAnalysisEnabled) {
|
487
536
|
state.seac = stack.slice(stackSize, stackSize + 4);
|
488
537
|
return false;
|
489
538
|
}
|
490
539
|
}
|
540
|
+
|
491
541
|
validationCommand = CharstringValidationData[value];
|
492
542
|
} else if (value >= 32 && value <= 246) {
|
493
543
|
stack[stackSize] = value - 139;
|
@@ -507,34 +557,43 @@ var CFFParser = function CFFParserClosure() {
|
|
507
557
|
validationCommand = CharstringValidationData[value];
|
508
558
|
} else if (value === 10 || value === 29) {
|
509
559
|
var subrsIndex;
|
560
|
+
|
510
561
|
if (value === 10) {
|
511
562
|
subrsIndex = localSubrIndex;
|
512
563
|
} else {
|
513
564
|
subrsIndex = globalSubrIndex;
|
514
565
|
}
|
566
|
+
|
515
567
|
if (!subrsIndex) {
|
516
568
|
validationCommand = CharstringValidationData[value];
|
517
569
|
(0, _util.warn)('Missing subrsIndex for ' + validationCommand.id);
|
518
570
|
return false;
|
519
571
|
}
|
572
|
+
|
520
573
|
var bias = 32768;
|
574
|
+
|
521
575
|
if (subrsIndex.count < 1240) {
|
522
576
|
bias = 107;
|
523
577
|
} else if (subrsIndex.count < 33900) {
|
524
578
|
bias = 1131;
|
525
579
|
}
|
580
|
+
|
526
581
|
var subrNumber = stack[--stackSize] + bias;
|
582
|
+
|
527
583
|
if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) {
|
528
584
|
validationCommand = CharstringValidationData[value];
|
529
585
|
(0, _util.warn)('Out of bounds subrIndex for ' + validationCommand.id);
|
530
586
|
return false;
|
531
587
|
}
|
588
|
+
|
532
589
|
state.stackSize = stackSize;
|
533
590
|
state.callDepth++;
|
534
591
|
var valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex);
|
592
|
+
|
535
593
|
if (!valid) {
|
536
594
|
return false;
|
537
595
|
}
|
596
|
+
|
538
597
|
state.callDepth--;
|
539
598
|
stackSize = state.stackSize;
|
540
599
|
continue;
|
@@ -544,32 +603,46 @@ var CFFParser = function CFFParserClosure() {
|
|
544
603
|
} else {
|
545
604
|
validationCommand = CharstringValidationData[value];
|
546
605
|
}
|
606
|
+
|
547
607
|
if (validationCommand) {
|
548
608
|
if (validationCommand.stem) {
|
549
609
|
state.hints += stackSize >> 1;
|
610
|
+
|
611
|
+
if (value === 3 || value === 23) {
|
612
|
+
state.hasVStems = true;
|
613
|
+
} else if (state.hasVStems && (value === 1 || value === 18)) {
|
614
|
+
(0, _util.warn)('CFF stem hints are in wrong order');
|
615
|
+
data[j - 1] = value === 1 ? 3 : 23;
|
616
|
+
}
|
550
617
|
}
|
618
|
+
|
551
619
|
if ('min' in validationCommand) {
|
552
620
|
if (!state.undefStack && stackSize < validationCommand.min) {
|
553
621
|
(0, _util.warn)('Not enough parameters for ' + validationCommand.id + '; actual: ' + stackSize + ', expected: ' + validationCommand.min);
|
554
622
|
return false;
|
555
623
|
}
|
556
624
|
}
|
625
|
+
|
557
626
|
if (state.firstStackClearing && validationCommand.stackClearing) {
|
558
627
|
state.firstStackClearing = false;
|
559
628
|
stackSize -= validationCommand.min;
|
629
|
+
|
560
630
|
if (stackSize >= 2 && validationCommand.stem) {
|
561
631
|
stackSize %= 2;
|
562
632
|
} else if (stackSize > 1) {
|
563
633
|
(0, _util.warn)('Found too many parameters for stack-clearing command');
|
564
634
|
}
|
635
|
+
|
565
636
|
if (stackSize > 0 && stack[stackSize - 1] >= 0) {
|
566
637
|
state.width = stack[stackSize - 1];
|
567
638
|
}
|
568
639
|
}
|
640
|
+
|
569
641
|
if ('stackDelta' in validationCommand) {
|
570
642
|
if ('stackFn' in validationCommand) {
|
571
643
|
validationCommand.stackFn(stack, stackSize);
|
572
644
|
}
|
645
|
+
|
573
646
|
stackSize += validationCommand.stackDelta;
|
574
647
|
} else if (validationCommand.stackClearing) {
|
575
648
|
stackSize = 0;
|
@@ -583,6 +656,7 @@ var CFFParser = function CFFParserClosure() {
|
|
583
656
|
}
|
584
657
|
}
|
585
658
|
}
|
659
|
+
|
586
660
|
state.stackSize = stackSize;
|
587
661
|
return true;
|
588
662
|
},
|
@@ -593,10 +667,10 @@ var CFFParser = function CFFParserClosure() {
|
|
593
667
|
fdSelect = _ref.fdSelect,
|
594
668
|
fdArray = _ref.fdArray,
|
595
669
|
privateDict = _ref.privateDict;
|
596
|
-
|
597
670
|
var seacs = [];
|
598
671
|
var widths = [];
|
599
672
|
var count = charStrings.count;
|
673
|
+
|
600
674
|
for (var i = 0; i < count; i++) {
|
601
675
|
var charstring = charStrings.get(i);
|
602
676
|
var state = {
|
@@ -607,21 +681,26 @@ var CFFParser = function CFFParserClosure() {
|
|
607
681
|
hints: 0,
|
608
682
|
firstStackClearing: true,
|
609
683
|
seac: null,
|
610
|
-
width: null
|
684
|
+
width: null,
|
685
|
+
hasVStems: false
|
611
686
|
};
|
612
687
|
var valid = true;
|
613
688
|
var localSubrToUse = null;
|
614
689
|
var privateDictToUse = privateDict;
|
690
|
+
|
615
691
|
if (fdSelect && fdArray.length) {
|
616
692
|
var fdIndex = fdSelect.getFDIndex(i);
|
693
|
+
|
617
694
|
if (fdIndex === -1) {
|
618
695
|
(0, _util.warn)('Glyph index is not in fd select.');
|
619
696
|
valid = false;
|
620
697
|
}
|
698
|
+
|
621
699
|
if (fdIndex >= fdArray.length) {
|
622
700
|
(0, _util.warn)('Invalid fd index for glyph index.');
|
623
701
|
valid = false;
|
624
702
|
}
|
703
|
+
|
625
704
|
if (valid) {
|
626
705
|
privateDictToUse = fdArray[fdIndex].privateDict;
|
627
706
|
localSubrToUse = privateDictToUse.subrsIndex;
|
@@ -629,9 +708,11 @@ var CFFParser = function CFFParserClosure() {
|
|
629
708
|
} else if (localSubrIndex) {
|
630
709
|
localSubrToUse = localSubrIndex;
|
631
710
|
}
|
711
|
+
|
632
712
|
if (valid) {
|
633
713
|
valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex);
|
634
714
|
}
|
715
|
+
|
635
716
|
if (state.width !== null) {
|
636
717
|
var nominalWidth = privateDictToUse.getByName('nominalWidthX');
|
637
718
|
widths[i] = nominalWidth + state.width;
|
@@ -639,20 +720,22 @@ var CFFParser = function CFFParserClosure() {
|
|
639
720
|
var defaultWidth = privateDictToUse.getByName('defaultWidthX');
|
640
721
|
widths[i] = defaultWidth;
|
641
722
|
}
|
723
|
+
|
642
724
|
if (state.seac !== null) {
|
643
725
|
seacs[i] = state.seac;
|
644
726
|
}
|
727
|
+
|
645
728
|
if (!valid) {
|
646
729
|
charStrings.set(i, new Uint8Array([14]));
|
647
730
|
}
|
648
731
|
}
|
732
|
+
|
649
733
|
return {
|
650
734
|
charStrings: charStrings,
|
651
735
|
seacs: seacs,
|
652
736
|
widths: widths
|
653
737
|
};
|
654
738
|
},
|
655
|
-
|
656
739
|
emptyPrivateDictionary: function CFFParser_emptyPrivateDictionary(parentDict) {
|
657
740
|
var privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings);
|
658
741
|
parentDict.setByKey(18, [0, 0]);
|
@@ -663,31 +746,40 @@ var CFFParser = function CFFParserClosure() {
|
|
663
746
|
this.emptyPrivateDictionary(parentDict);
|
664
747
|
return;
|
665
748
|
}
|
749
|
+
|
666
750
|
var privateOffset = parentDict.getByName('Private');
|
751
|
+
|
667
752
|
if (!Array.isArray(privateOffset) || privateOffset.length !== 2) {
|
668
753
|
parentDict.removeByName('Private');
|
669
754
|
return;
|
670
755
|
}
|
756
|
+
|
671
757
|
var size = privateOffset[0];
|
672
758
|
var offset = privateOffset[1];
|
759
|
+
|
673
760
|
if (size === 0 || offset >= this.bytes.length) {
|
674
761
|
this.emptyPrivateDictionary(parentDict);
|
675
762
|
return;
|
676
763
|
}
|
764
|
+
|
677
765
|
var privateDictEnd = offset + size;
|
678
766
|
var dictData = this.bytes.subarray(offset, privateDictEnd);
|
679
767
|
var dict = this.parseDict(dictData);
|
680
768
|
var privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings);
|
681
769
|
parentDict.privateDict = privateDict;
|
770
|
+
|
682
771
|
if (!privateDict.getByName('Subrs')) {
|
683
772
|
return;
|
684
773
|
}
|
774
|
+
|
685
775
|
var subrsOffset = privateDict.getByName('Subrs');
|
686
776
|
var relativeOffset = offset + subrsOffset;
|
777
|
+
|
687
778
|
if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
|
688
779
|
this.emptyPrivateDictionary(parentDict);
|
689
780
|
return;
|
690
781
|
}
|
782
|
+
|
691
783
|
var subrsIndex = this.parseIndex(relativeOffset);
|
692
784
|
privateDict.subrsIndex = subrsIndex.obj;
|
693
785
|
},
|
@@ -699,40 +791,51 @@ var CFFParser = function CFFParserClosure() {
|
|
699
791
|
} else if (pos === 2) {
|
700
792
|
return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, _charsets.ExpertSubsetCharset);
|
701
793
|
}
|
794
|
+
|
702
795
|
var bytes = this.bytes;
|
703
796
|
var start = pos;
|
704
797
|
var format = bytes[pos++];
|
705
798
|
var charset = ['.notdef'];
|
706
799
|
var id, count, i;
|
707
800
|
length -= 1;
|
801
|
+
|
708
802
|
switch (format) {
|
709
803
|
case 0:
|
710
804
|
for (i = 0; i < length; i++) {
|
711
805
|
id = bytes[pos++] << 8 | bytes[pos++];
|
712
806
|
charset.push(cid ? id : strings.get(id));
|
713
807
|
}
|
808
|
+
|
714
809
|
break;
|
810
|
+
|
715
811
|
case 1:
|
716
812
|
while (charset.length <= length) {
|
717
813
|
id = bytes[pos++] << 8 | bytes[pos++];
|
718
814
|
count = bytes[pos++];
|
815
|
+
|
719
816
|
for (i = 0; i <= count; i++) {
|
720
817
|
charset.push(cid ? id++ : strings.get(id++));
|
721
818
|
}
|
722
819
|
}
|
820
|
+
|
723
821
|
break;
|
822
|
+
|
724
823
|
case 2:
|
725
824
|
while (charset.length <= length) {
|
726
825
|
id = bytes[pos++] << 8 | bytes[pos++];
|
727
826
|
count = bytes[pos++] << 8 | bytes[pos++];
|
827
|
+
|
728
828
|
for (i = 0; i <= count; i++) {
|
729
829
|
charset.push(cid ? id++ : strings.get(id++));
|
730
830
|
}
|
731
831
|
}
|
832
|
+
|
732
833
|
break;
|
834
|
+
|
733
835
|
default:
|
734
836
|
throw new _util.FormatError('Unknown charset format');
|
735
837
|
}
|
838
|
+
|
736
839
|
var end = pos;
|
737
840
|
var raw = bytes.subarray(start, end);
|
738
841
|
return new CFFCharset(false, format, charset, raw);
|
@@ -743,20 +846,25 @@ var CFFParser = function CFFParserClosure() {
|
|
743
846
|
var predefined = false;
|
744
847
|
var format, i, ii;
|
745
848
|
var raw = null;
|
849
|
+
|
746
850
|
function readSupplement() {
|
747
851
|
var supplementsCount = bytes[pos++];
|
852
|
+
|
748
853
|
for (i = 0; i < supplementsCount; i++) {
|
749
854
|
var code = bytes[pos++];
|
750
855
|
var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
|
751
856
|
encoding[code] = charset.indexOf(strings.get(sid));
|
752
857
|
}
|
753
858
|
}
|
859
|
+
|
754
860
|
if (pos === 0 || pos === 1) {
|
755
861
|
predefined = true;
|
756
862
|
format = pos;
|
757
863
|
var baseEncoding = pos ? _encodings.ExpertEncoding : _encodings.StandardEncoding;
|
864
|
+
|
758
865
|
for (i = 0, ii = charset.length; i < ii; i++) {
|
759
866
|
var index = baseEncoding.indexOf(charset[i]);
|
867
|
+
|
760
868
|
if (index !== -1) {
|
761
869
|
encoding[index] = i;
|
762
870
|
}
|
@@ -764,34 +872,46 @@ var CFFParser = function CFFParserClosure() {
|
|
764
872
|
} else {
|
765
873
|
var dataStart = pos;
|
766
874
|
format = bytes[pos++];
|
875
|
+
|
767
876
|
switch (format & 0x7f) {
|
768
877
|
case 0:
|
769
878
|
var glyphsCount = bytes[pos++];
|
879
|
+
|
770
880
|
for (i = 1; i <= glyphsCount; i++) {
|
771
881
|
encoding[bytes[pos++]] = i;
|
772
882
|
}
|
883
|
+
|
773
884
|
break;
|
885
|
+
|
774
886
|
case 1:
|
775
887
|
var rangesCount = bytes[pos++];
|
776
888
|
var gid = 1;
|
889
|
+
|
777
890
|
for (i = 0; i < rangesCount; i++) {
|
778
891
|
var start = bytes[pos++];
|
779
892
|
var left = bytes[pos++];
|
893
|
+
|
780
894
|
for (var j = start; j <= start + left; j++) {
|
781
895
|
encoding[j] = gid++;
|
782
896
|
}
|
783
897
|
}
|
898
|
+
|
784
899
|
break;
|
900
|
+
|
785
901
|
default:
|
786
|
-
throw new _util.FormatError(
|
902
|
+
throw new _util.FormatError("Unknown encoding format: ".concat(format, " in CFF"));
|
787
903
|
}
|
904
|
+
|
788
905
|
var dataEnd = pos;
|
906
|
+
|
789
907
|
if (format & 0x80) {
|
790
908
|
bytes[dataStart] &= 0x7f;
|
791
909
|
readSupplement();
|
792
910
|
}
|
911
|
+
|
793
912
|
raw = bytes.subarray(dataStart, dataEnd);
|
794
913
|
}
|
914
|
+
|
795
915
|
format = format & 0x7f;
|
796
916
|
return new CFFEncoding(predefined, format, encoding, raw);
|
797
917
|
},
|
@@ -800,40 +920,54 @@ var CFFParser = function CFFParserClosure() {
|
|
800
920
|
var format = bytes[pos++];
|
801
921
|
var fdSelect = [];
|
802
922
|
var i;
|
923
|
+
|
803
924
|
switch (format) {
|
804
925
|
case 0:
|
805
926
|
for (i = 0; i < length; ++i) {
|
806
927
|
var id = bytes[pos++];
|
807
928
|
fdSelect.push(id);
|
808
929
|
}
|
930
|
+
|
809
931
|
break;
|
932
|
+
|
810
933
|
case 3:
|
811
934
|
var rangesCount = bytes[pos++] << 8 | bytes[pos++];
|
935
|
+
|
812
936
|
for (i = 0; i < rangesCount; ++i) {
|
813
937
|
var first = bytes[pos++] << 8 | bytes[pos++];
|
938
|
+
|
814
939
|
if (i === 0 && first !== 0) {
|
815
940
|
(0, _util.warn)('parseFDSelect: The first range must have a first GID of 0' + ' -- trying to recover.');
|
816
941
|
first = 0;
|
817
942
|
}
|
943
|
+
|
818
944
|
var fdIndex = bytes[pos++];
|
819
945
|
var next = bytes[pos] << 8 | bytes[pos + 1];
|
946
|
+
|
820
947
|
for (var j = first; j < next; ++j) {
|
821
948
|
fdSelect.push(fdIndex);
|
822
949
|
}
|
823
950
|
}
|
951
|
+
|
824
952
|
pos += 2;
|
825
953
|
break;
|
954
|
+
|
826
955
|
default:
|
827
|
-
throw new _util.FormatError(
|
956
|
+
throw new _util.FormatError("parseFDSelect: Unknown format \"".concat(format, "\"."));
|
828
957
|
}
|
958
|
+
|
829
959
|
if (fdSelect.length !== length) {
|
830
960
|
throw new _util.FormatError('parseFDSelect: Invalid font data.');
|
831
961
|
}
|
962
|
+
|
832
963
|
return new CFFFDSelect(format, fdSelect);
|
833
964
|
}
|
834
965
|
};
|
835
966
|
return CFFParser;
|
836
967
|
}();
|
968
|
+
|
969
|
+
exports.CFFParser = CFFParser;
|
970
|
+
|
837
971
|
var CFF = function CFFClosure() {
|
838
972
|
function CFF() {
|
839
973
|
this.header = null;
|
@@ -848,14 +982,17 @@ var CFF = function CFFClosure() {
|
|
848
982
|
this.fdSelect = null;
|
849
983
|
this.isCIDFont = false;
|
850
984
|
}
|
985
|
+
|
851
986
|
CFF.prototype = {
|
852
987
|
duplicateFirstGlyph: function CFF_duplicateFirstGlyph() {
|
853
988
|
if (this.charStrings.count >= 65535) {
|
854
989
|
(0, _util.warn)('Not enough space in charstrings to duplicate first glyph.');
|
855
990
|
return;
|
856
991
|
}
|
992
|
+
|
857
993
|
var glyphZero = this.charStrings.get(0);
|
858
994
|
this.charStrings.add(glyphZero);
|
995
|
+
|
859
996
|
if (this.isCIDFont) {
|
860
997
|
this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]);
|
861
998
|
}
|
@@ -864,12 +1001,16 @@ var CFF = function CFFClosure() {
|
|
864
1001
|
if (id < 0 || id >= this.charStrings.count) {
|
865
1002
|
return false;
|
866
1003
|
}
|
1004
|
+
|
867
1005
|
var glyph = this.charStrings.get(id);
|
868
1006
|
return glyph.length > 0;
|
869
1007
|
}
|
870
1008
|
};
|
871
1009
|
return CFF;
|
872
1010
|
}();
|
1011
|
+
|
1012
|
+
exports.CFF = CFF;
|
1013
|
+
|
873
1014
|
var CFFHeader = function CFFHeaderClosure() {
|
874
1015
|
function CFFHeader(major, minor, hdrSize, offSize) {
|
875
1016
|
this.major = major;
|
@@ -877,36 +1018,49 @@ var CFFHeader = function CFFHeaderClosure() {
|
|
877
1018
|
this.hdrSize = hdrSize;
|
878
1019
|
this.offSize = offSize;
|
879
1020
|
}
|
1021
|
+
|
880
1022
|
return CFFHeader;
|
881
1023
|
}();
|
1024
|
+
|
1025
|
+
exports.CFFHeader = CFFHeader;
|
1026
|
+
|
882
1027
|
var CFFStrings = function CFFStringsClosure() {
|
883
1028
|
function CFFStrings() {
|
884
1029
|
this.strings = [];
|
885
1030
|
}
|
1031
|
+
|
886
1032
|
CFFStrings.prototype = {
|
887
1033
|
get: function CFFStrings_get(index) {
|
888
1034
|
if (index >= 0 && index <= 390) {
|
889
1035
|
return CFFStandardStrings[index];
|
890
1036
|
}
|
1037
|
+
|
891
1038
|
if (index - 391 <= this.strings.length) {
|
892
1039
|
return this.strings[index - 391];
|
893
1040
|
}
|
1041
|
+
|
894
1042
|
return CFFStandardStrings[0];
|
895
1043
|
},
|
896
1044
|
add: function CFFStrings_add(value) {
|
897
1045
|
this.strings.push(value);
|
898
1046
|
},
|
1047
|
+
|
899
1048
|
get count() {
|
900
1049
|
return this.strings.length;
|
901
1050
|
}
|
1051
|
+
|
902
1052
|
};
|
903
1053
|
return CFFStrings;
|
904
1054
|
}();
|
1055
|
+
|
1056
|
+
exports.CFFStrings = CFFStrings;
|
1057
|
+
|
905
1058
|
var CFFIndex = function CFFIndexClosure() {
|
906
1059
|
function CFFIndex() {
|
907
1060
|
this.objects = [];
|
908
1061
|
this.length = 0;
|
909
1062
|
}
|
1063
|
+
|
910
1064
|
CFFIndex.prototype = {
|
911
1065
|
add: function CFFIndex_add(data) {
|
912
1066
|
this.length += data.length;
|
@@ -919,12 +1073,17 @@ var CFFIndex = function CFFIndexClosure() {
|
|
919
1073
|
get: function CFFIndex_get(index) {
|
920
1074
|
return this.objects[index];
|
921
1075
|
},
|
1076
|
+
|
922
1077
|
get count() {
|
923
1078
|
return this.objects.length;
|
924
1079
|
}
|
1080
|
+
|
925
1081
|
};
|
926
1082
|
return CFFIndex;
|
927
1083
|
}();
|
1084
|
+
|
1085
|
+
exports.CFFIndex = CFFIndex;
|
1086
|
+
|
928
1087
|
var CFFDict = function CFFDictClosure() {
|
929
1088
|
function CFFDict(tables, strings) {
|
930
1089
|
this.keyToNameMap = tables.keyToNameMap;
|
@@ -936,32 +1095,40 @@ var CFFDict = function CFFDictClosure() {
|
|
936
1095
|
this.strings = strings;
|
937
1096
|
this.values = Object.create(null);
|
938
1097
|
}
|
1098
|
+
|
939
1099
|
CFFDict.prototype = {
|
940
1100
|
setByKey: function CFFDict_setByKey(key, value) {
|
941
1101
|
if (!(key in this.keyToNameMap)) {
|
942
1102
|
return false;
|
943
1103
|
}
|
1104
|
+
|
944
1105
|
var valueLength = value.length;
|
1106
|
+
|
945
1107
|
if (valueLength === 0) {
|
946
1108
|
return true;
|
947
1109
|
}
|
1110
|
+
|
948
1111
|
for (var i = 0; i < valueLength; i++) {
|
949
1112
|
if (isNaN(value[i])) {
|
950
1113
|
(0, _util.warn)('Invalid CFFDict value: "' + value + '" for key "' + key + '".');
|
951
1114
|
return true;
|
952
1115
|
}
|
953
1116
|
}
|
1117
|
+
|
954
1118
|
var type = this.types[key];
|
1119
|
+
|
955
1120
|
if (type === 'num' || type === 'sid' || type === 'offset') {
|
956
1121
|
value = value[0];
|
957
1122
|
}
|
1123
|
+
|
958
1124
|
this.values[key] = value;
|
959
1125
|
return true;
|
960
1126
|
},
|
961
1127
|
setByName: function CFFDict_setByName(name, value) {
|
962
1128
|
if (!(name in this.nameToKeyMap)) {
|
963
|
-
throw new _util.FormatError(
|
1129
|
+
throw new _util.FormatError("Invalid dictionary name \"".concat(name, "\""));
|
964
1130
|
}
|
1131
|
+
|
965
1132
|
this.values[this.nameToKeyMap[name]] = value;
|
966
1133
|
},
|
967
1134
|
hasName: function CFFDict_hasName(name) {
|
@@ -969,18 +1136,22 @@ var CFFDict = function CFFDictClosure() {
|
|
969
1136
|
},
|
970
1137
|
getByName: function CFFDict_getByName(name) {
|
971
1138
|
if (!(name in this.nameToKeyMap)) {
|
972
|
-
throw new _util.FormatError(
|
1139
|
+
throw new _util.FormatError("Invalid dictionary name ".concat(name, "\""));
|
973
1140
|
}
|
1141
|
+
|
974
1142
|
var key = this.nameToKeyMap[name];
|
1143
|
+
|
975
1144
|
if (!(key in this.values)) {
|
976
1145
|
return this.defaults[key];
|
977
1146
|
}
|
1147
|
+
|
978
1148
|
return this.values[key];
|
979
1149
|
},
|
980
1150
|
removeByName: function CFFDict_removeByName(name) {
|
981
1151
|
delete this.values[this.nameToKeyMap[name]];
|
982
1152
|
}
|
983
1153
|
};
|
1154
|
+
|
984
1155
|
CFFDict.createTables = function CFFDict_createTables(layout) {
|
985
1156
|
var tables = {
|
986
1157
|
keyToNameMap: {},
|
@@ -990,6 +1161,7 @@ var CFFDict = function CFFDictClosure() {
|
|
990
1161
|
opcodes: {},
|
991
1162
|
order: []
|
992
1163
|
};
|
1164
|
+
|
993
1165
|
for (var i = 0, ii = layout.length; i < ii; ++i) {
|
994
1166
|
var entry = layout[i];
|
995
1167
|
var key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
|
@@ -1000,41 +1172,56 @@ var CFFDict = function CFFDictClosure() {
|
|
1000
1172
|
tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]];
|
1001
1173
|
tables.order.push(key);
|
1002
1174
|
}
|
1175
|
+
|
1003
1176
|
return tables;
|
1004
1177
|
};
|
1178
|
+
|
1005
1179
|
return CFFDict;
|
1006
1180
|
}();
|
1181
|
+
|
1007
1182
|
var CFFTopDict = function CFFTopDictClosure() {
|
1008
1183
|
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]];
|
1009
1184
|
var tables = null;
|
1185
|
+
|
1010
1186
|
function CFFTopDict(strings) {
|
1011
1187
|
if (tables === null) {
|
1012
1188
|
tables = CFFDict.createTables(layout);
|
1013
1189
|
}
|
1190
|
+
|
1014
1191
|
CFFDict.call(this, tables, strings);
|
1015
1192
|
this.privateDict = null;
|
1016
1193
|
}
|
1194
|
+
|
1017
1195
|
CFFTopDict.prototype = Object.create(CFFDict.prototype);
|
1018
1196
|
return CFFTopDict;
|
1019
1197
|
}();
|
1198
|
+
|
1199
|
+
exports.CFFTopDict = CFFTopDict;
|
1200
|
+
|
1020
1201
|
var CFFPrivateDict = function CFFPrivateDictClosure() {
|
1021
1202
|
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]];
|
1022
1203
|
var tables = null;
|
1204
|
+
|
1023
1205
|
function CFFPrivateDict(strings) {
|
1024
1206
|
if (tables === null) {
|
1025
1207
|
tables = CFFDict.createTables(layout);
|
1026
1208
|
}
|
1209
|
+
|
1027
1210
|
CFFDict.call(this, tables, strings);
|
1028
1211
|
this.subrsIndex = null;
|
1029
1212
|
}
|
1213
|
+
|
1030
1214
|
CFFPrivateDict.prototype = Object.create(CFFDict.prototype);
|
1031
1215
|
return CFFPrivateDict;
|
1032
1216
|
}();
|
1217
|
+
|
1218
|
+
exports.CFFPrivateDict = CFFPrivateDict;
|
1033
1219
|
var CFFCharsetPredefinedTypes = {
|
1034
1220
|
ISO_ADOBE: 0,
|
1035
1221
|
EXPERT: 1,
|
1036
1222
|
EXPERT_SUBSET: 2
|
1037
1223
|
};
|
1224
|
+
|
1038
1225
|
var CFFCharset = function CFFCharsetClosure() {
|
1039
1226
|
function CFFCharset(predefined, format, charset, raw) {
|
1040
1227
|
this.predefined = predefined;
|
@@ -1042,8 +1229,12 @@ var CFFCharset = function CFFCharsetClosure() {
|
|
1042
1229
|
this.charset = charset;
|
1043
1230
|
this.raw = raw;
|
1044
1231
|
}
|
1232
|
+
|
1045
1233
|
return CFFCharset;
|
1046
1234
|
}();
|
1235
|
+
|
1236
|
+
exports.CFFCharset = CFFCharset;
|
1237
|
+
|
1047
1238
|
var CFFEncoding = function CFFEncodingClosure() {
|
1048
1239
|
function CFFEncoding(predefined, format, encoding, raw) {
|
1049
1240
|
this.predefined = predefined;
|
@@ -1051,35 +1242,44 @@ var CFFEncoding = function CFFEncodingClosure() {
|
|
1051
1242
|
this.encoding = encoding;
|
1052
1243
|
this.raw = raw;
|
1053
1244
|
}
|
1245
|
+
|
1054
1246
|
return CFFEncoding;
|
1055
1247
|
}();
|
1248
|
+
|
1056
1249
|
var CFFFDSelect = function CFFFDSelectClosure() {
|
1057
1250
|
function CFFFDSelect(format, fdSelect) {
|
1058
1251
|
this.format = format;
|
1059
1252
|
this.fdSelect = fdSelect;
|
1060
1253
|
}
|
1254
|
+
|
1061
1255
|
CFFFDSelect.prototype = {
|
1062
1256
|
getFDIndex: function CFFFDSelect_get(glyphIndex) {
|
1063
1257
|
if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {
|
1064
1258
|
return -1;
|
1065
1259
|
}
|
1260
|
+
|
1066
1261
|
return this.fdSelect[glyphIndex];
|
1067
1262
|
}
|
1068
1263
|
};
|
1069
1264
|
return CFFFDSelect;
|
1070
1265
|
}();
|
1266
|
+
|
1267
|
+
exports.CFFFDSelect = CFFFDSelect;
|
1268
|
+
|
1071
1269
|
var CFFOffsetTracker = function CFFOffsetTrackerClosure() {
|
1072
1270
|
function CFFOffsetTracker() {
|
1073
1271
|
this.offsets = Object.create(null);
|
1074
1272
|
}
|
1273
|
+
|
1075
1274
|
CFFOffsetTracker.prototype = {
|
1076
1275
|
isTracking: function CFFOffsetTracker_isTracking(key) {
|
1077
1276
|
return key in this.offsets;
|
1078
1277
|
},
|
1079
1278
|
track: function CFFOffsetTracker_track(key, location) {
|
1080
1279
|
if (key in this.offsets) {
|
1081
|
-
throw new _util.FormatError(
|
1280
|
+
throw new _util.FormatError("Already tracking location of ".concat(key));
|
1082
1281
|
}
|
1282
|
+
|
1083
1283
|
this.offsets[key] = location;
|
1084
1284
|
},
|
1085
1285
|
offset: function CFFOffsetTracker_offset(value) {
|
@@ -1089,20 +1289,24 @@ var CFFOffsetTracker = function CFFOffsetTrackerClosure() {
|
|
1089
1289
|
},
|
1090
1290
|
setEntryLocation: function CFFOffsetTracker_setEntryLocation(key, values, output) {
|
1091
1291
|
if (!(key in this.offsets)) {
|
1092
|
-
throw new _util.FormatError(
|
1292
|
+
throw new _util.FormatError("Not tracking location of ".concat(key));
|
1093
1293
|
}
|
1294
|
+
|
1094
1295
|
var data = output.data;
|
1095
1296
|
var dataOffset = this.offsets[key];
|
1096
1297
|
var size = 5;
|
1298
|
+
|
1097
1299
|
for (var i = 0, ii = values.length; i < ii; ++i) {
|
1098
1300
|
var offset0 = i * size + dataOffset;
|
1099
1301
|
var offset1 = offset0 + 1;
|
1100
1302
|
var offset2 = offset0 + 2;
|
1101
1303
|
var offset3 = offset0 + 3;
|
1102
1304
|
var offset4 = offset0 + 4;
|
1305
|
+
|
1103
1306
|
if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) {
|
1104
1307
|
throw new _util.FormatError('writing to an offset that is not empty');
|
1105
1308
|
}
|
1309
|
+
|
1106
1310
|
var value = values[i];
|
1107
1311
|
data[offset0] = 0x1d;
|
1108
1312
|
data[offset1] = value >> 24 & 0xFF;
|
@@ -1114,10 +1318,12 @@ var CFFOffsetTracker = function CFFOffsetTrackerClosure() {
|
|
1114
1318
|
};
|
1115
1319
|
return CFFOffsetTracker;
|
1116
1320
|
}();
|
1321
|
+
|
1117
1322
|
var CFFCompiler = function CFFCompilerClosure() {
|
1118
1323
|
function CFFCompiler(cff) {
|
1119
1324
|
this.cff = cff;
|
1120
1325
|
}
|
1326
|
+
|
1121
1327
|
CFFCompiler.prototype = {
|
1122
1328
|
compile: function CFFCompiler_compile() {
|
1123
1329
|
var cff = this.cff;
|
@@ -1133,20 +1339,25 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1133
1339
|
output.add(header);
|
1134
1340
|
var nameIndex = this.compileNameIndex(cff.names);
|
1135
1341
|
output.add(nameIndex);
|
1342
|
+
|
1136
1343
|
if (cff.isCIDFont) {
|
1137
1344
|
if (cff.topDict.hasName('FontMatrix')) {
|
1138
1345
|
var base = cff.topDict.getByName('FontMatrix');
|
1139
1346
|
cff.topDict.removeByName('FontMatrix');
|
1347
|
+
|
1140
1348
|
for (var i = 0, ii = cff.fdArray.length; i < ii; i++) {
|
1141
1349
|
var subDict = cff.fdArray[i];
|
1142
1350
|
var matrix = base.slice(0);
|
1351
|
+
|
1143
1352
|
if (subDict.hasName('FontMatrix')) {
|
1144
1353
|
matrix = _util.Util.transform(matrix, subDict.getByName('FontMatrix'));
|
1145
1354
|
}
|
1355
|
+
|
1146
1356
|
subDict.setByName('FontMatrix', matrix);
|
1147
1357
|
}
|
1148
1358
|
}
|
1149
1359
|
}
|
1360
|
+
|
1150
1361
|
cff.topDict.setByName('charset', 0);
|
1151
1362
|
var compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont);
|
1152
1363
|
output.add(compiled.output);
|
@@ -1155,6 +1366,7 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1155
1366
|
output.add(stringIndex);
|
1156
1367
|
var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
|
1157
1368
|
output.add(globalSubrIndex);
|
1369
|
+
|
1158
1370
|
if (cff.encoding && cff.topDict.hasName('Encoding')) {
|
1159
1371
|
if (cff.encoding.predefined) {
|
1160
1372
|
topDictTracker.setEntryLocation('Encoding', [cff.encoding.format], output);
|
@@ -1164,12 +1376,14 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1164
1376
|
output.add(encoding);
|
1165
1377
|
}
|
1166
1378
|
}
|
1379
|
+
|
1167
1380
|
var charset = this.compileCharset(cff.charset);
|
1168
1381
|
topDictTracker.setEntryLocation('charset', [output.length], output);
|
1169
1382
|
output.add(charset);
|
1170
1383
|
var charStrings = this.compileCharStrings(cff.charStrings);
|
1171
1384
|
topDictTracker.setEntryLocation('CharStrings', [output.length], output);
|
1172
1385
|
output.add(charStrings);
|
1386
|
+
|
1173
1387
|
if (cff.isCIDFont) {
|
1174
1388
|
topDictTracker.setEntryLocation('FDSelect', [output.length], output);
|
1175
1389
|
var fdSelect = this.compileFDSelect(cff.fdSelect);
|
@@ -1180,6 +1394,7 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1180
1394
|
var fontDictTrackers = compiled.trackers;
|
1181
1395
|
this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
|
1182
1396
|
}
|
1397
|
+
|
1183
1398
|
this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
|
1184
1399
|
output.add([0]);
|
1185
1400
|
return output.data;
|
@@ -1188,19 +1403,24 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1188
1403
|
if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) {
|
1189
1404
|
return this.encodeInteger(value);
|
1190
1405
|
}
|
1406
|
+
|
1191
1407
|
return this.encodeFloat(value);
|
1192
1408
|
},
|
1193
1409
|
encodeFloat: function CFFCompiler_encodeFloat(num) {
|
1194
1410
|
var value = num.toString();
|
1195
1411
|
var m = /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(value);
|
1412
|
+
|
1196
1413
|
if (m) {
|
1197
1414
|
var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length));
|
1198
1415
|
value = (Math.round(num * epsilon) / epsilon).toString();
|
1199
1416
|
}
|
1417
|
+
|
1200
1418
|
var nibbles = '';
|
1201
1419
|
var i, ii;
|
1420
|
+
|
1202
1421
|
for (i = 0, ii = value.length; i < ii; ++i) {
|
1203
1422
|
var a = value[i];
|
1423
|
+
|
1204
1424
|
if (a === 'e') {
|
1205
1425
|
nibbles += value[++i] === '-' ? 'c' : 'b';
|
1206
1426
|
} else if (a === '.') {
|
@@ -1211,15 +1431,19 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1211
1431
|
nibbles += a;
|
1212
1432
|
}
|
1213
1433
|
}
|
1434
|
+
|
1214
1435
|
nibbles += nibbles.length & 1 ? 'f' : 'ff';
|
1215
1436
|
var out = [30];
|
1437
|
+
|
1216
1438
|
for (i = 0, ii = nibbles.length; i < ii; i += 2) {
|
1217
1439
|
out.push(parseInt(nibbles.substring(i, i + 2), 16));
|
1218
1440
|
}
|
1441
|
+
|
1219
1442
|
return out;
|
1220
1443
|
},
|
1221
1444
|
encodeInteger: function CFFCompiler_encodeInteger(value) {
|
1222
1445
|
var code;
|
1446
|
+
|
1223
1447
|
if (value >= -107 && value <= 107) {
|
1224
1448
|
code = [value + 139];
|
1225
1449
|
} else if (value >= 108 && value <= 1131) {
|
@@ -1233,6 +1457,7 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1233
1457
|
} else {
|
1234
1458
|
code = [0x1d, value >> 24 & 0xFF, value >> 16 & 0xFF, value >> 8 & 0xFF, value & 0xFF];
|
1235
1459
|
}
|
1460
|
+
|
1236
1461
|
return code;
|
1237
1462
|
},
|
1238
1463
|
compileHeader: function CFFCompiler_compileHeader(header) {
|
@@ -1240,30 +1465,40 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1240
1465
|
},
|
1241
1466
|
compileNameIndex: function CFFCompiler_compileNameIndex(names) {
|
1242
1467
|
var nameIndex = new CFFIndex();
|
1468
|
+
|
1243
1469
|
for (var i = 0, ii = names.length; i < ii; ++i) {
|
1244
1470
|
var name = names[i];
|
1245
1471
|
var length = Math.min(name.length, 127);
|
1246
1472
|
var sanitizedName = new Array(length);
|
1473
|
+
|
1247
1474
|
for (var j = 0; j < length; j++) {
|
1248
1475
|
var char = name[j];
|
1476
|
+
|
1249
1477
|
if (char < '!' || char > '~' || char === '[' || char === ']' || char === '(' || char === ')' || char === '{' || char === '}' || char === '<' || char === '>' || char === '/' || char === '%') {
|
1250
1478
|
char = '_';
|
1251
1479
|
}
|
1480
|
+
|
1252
1481
|
sanitizedName[j] = char;
|
1253
1482
|
}
|
1483
|
+
|
1254
1484
|
sanitizedName = sanitizedName.join('');
|
1485
|
+
|
1255
1486
|
if (sanitizedName === '') {
|
1256
1487
|
sanitizedName = 'Bad_Font_Name';
|
1257
1488
|
}
|
1489
|
+
|
1258
1490
|
nameIndex.add((0, _util.stringToBytes)(sanitizedName));
|
1259
1491
|
}
|
1492
|
+
|
1260
1493
|
return this.compileIndex(nameIndex);
|
1261
1494
|
},
|
1262
1495
|
compileTopDicts: function CFFCompiler_compileTopDicts(dicts, length, removeCidKeys) {
|
1263
1496
|
var fontDictTrackers = [];
|
1264
1497
|
var fdArrayIndex = new CFFIndex();
|
1498
|
+
|
1265
1499
|
for (var i = 0, ii = dicts.length; i < ii; ++i) {
|
1266
1500
|
var fontDict = dicts[i];
|
1501
|
+
|
1267
1502
|
if (removeCidKeys) {
|
1268
1503
|
fontDict.removeByName('CIDFontVersion');
|
1269
1504
|
fontDict.removeByName('CIDFontRevision');
|
@@ -1271,12 +1506,14 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1271
1506
|
fontDict.removeByName('CIDCount');
|
1272
1507
|
fontDict.removeByName('UIDBase');
|
1273
1508
|
}
|
1509
|
+
|
1274
1510
|
var fontDictTracker = new CFFOffsetTracker();
|
1275
1511
|
var fontDictData = this.compileDict(fontDict, fontDictTracker);
|
1276
1512
|
fontDictTrackers.push(fontDictTracker);
|
1277
1513
|
fdArrayIndex.add(fontDictData);
|
1278
1514
|
fontDictTracker.offset(length);
|
1279
1515
|
}
|
1516
|
+
|
1280
1517
|
fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
|
1281
1518
|
return {
|
1282
1519
|
trackers: fontDictTrackers,
|
@@ -1287,18 +1524,23 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1287
1524
|
for (var i = 0, ii = dicts.length; i < ii; ++i) {
|
1288
1525
|
var fontDict = dicts[i];
|
1289
1526
|
var privateDict = fontDict.privateDict;
|
1527
|
+
|
1290
1528
|
if (!privateDict || !fontDict.hasName('Private')) {
|
1291
1529
|
throw new _util.FormatError('There must be a private dictionary.');
|
1292
1530
|
}
|
1531
|
+
|
1293
1532
|
var privateDictTracker = new CFFOffsetTracker();
|
1294
1533
|
var privateDictData = this.compileDict(privateDict, privateDictTracker);
|
1295
1534
|
var outputLength = output.length;
|
1296
1535
|
privateDictTracker.offset(outputLength);
|
1536
|
+
|
1297
1537
|
if (!privateDictData.length) {
|
1298
1538
|
outputLength = 0;
|
1299
1539
|
}
|
1540
|
+
|
1300
1541
|
trackers[i].setEntryLocation('Private', [privateDictData.length, outputLength], output);
|
1301
1542
|
output.add(privateDictData);
|
1543
|
+
|
1302
1544
|
if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {
|
1303
1545
|
var subrs = this.compileIndex(privateDict.subrsIndex);
|
1304
1546
|
privateDictTracker.setEntryLocation('Subrs', [privateDictData.length], output);
|
@@ -1309,57 +1551,76 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1309
1551
|
compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {
|
1310
1552
|
var out = [];
|
1311
1553
|
var order = dict.order;
|
1554
|
+
|
1312
1555
|
for (var i = 0; i < order.length; ++i) {
|
1313
1556
|
var key = order[i];
|
1557
|
+
|
1314
1558
|
if (!(key in dict.values)) {
|
1315
1559
|
continue;
|
1316
1560
|
}
|
1561
|
+
|
1317
1562
|
var values = dict.values[key];
|
1318
1563
|
var types = dict.types[key];
|
1564
|
+
|
1319
1565
|
if (!Array.isArray(types)) {
|
1320
1566
|
types = [types];
|
1321
1567
|
}
|
1568
|
+
|
1322
1569
|
if (!Array.isArray(values)) {
|
1323
1570
|
values = [values];
|
1324
1571
|
}
|
1572
|
+
|
1325
1573
|
if (values.length === 0) {
|
1326
1574
|
continue;
|
1327
1575
|
}
|
1576
|
+
|
1328
1577
|
for (var j = 0, jj = types.length; j < jj; ++j) {
|
1329
1578
|
var type = types[j];
|
1330
1579
|
var value = values[j];
|
1580
|
+
|
1331
1581
|
switch (type) {
|
1332
1582
|
case 'num':
|
1333
1583
|
case 'sid':
|
1334
1584
|
out = out.concat(this.encodeNumber(value));
|
1335
1585
|
break;
|
1586
|
+
|
1336
1587
|
case 'offset':
|
1337
1588
|
var name = dict.keyToNameMap[key];
|
1589
|
+
|
1338
1590
|
if (!offsetTracker.isTracking(name)) {
|
1339
1591
|
offsetTracker.track(name, out.length);
|
1340
1592
|
}
|
1593
|
+
|
1341
1594
|
out = out.concat([0x1d, 0, 0, 0, 0]);
|
1342
1595
|
break;
|
1596
|
+
|
1343
1597
|
case 'array':
|
1344
1598
|
case 'delta':
|
1345
1599
|
out = out.concat(this.encodeNumber(value));
|
1600
|
+
|
1346
1601
|
for (var k = 1, kk = values.length; k < kk; ++k) {
|
1347
1602
|
out = out.concat(this.encodeNumber(values[k]));
|
1348
1603
|
}
|
1604
|
+
|
1349
1605
|
break;
|
1606
|
+
|
1350
1607
|
default:
|
1351
|
-
throw new _util.FormatError(
|
1608
|
+
throw new _util.FormatError("Unknown data type of ".concat(type));
|
1352
1609
|
}
|
1353
1610
|
}
|
1611
|
+
|
1354
1612
|
out = out.concat(dict.opcodes[key]);
|
1355
1613
|
}
|
1614
|
+
|
1356
1615
|
return out;
|
1357
1616
|
},
|
1358
1617
|
compileStringIndex: function CFFCompiler_compileStringIndex(strings) {
|
1359
1618
|
var stringIndex = new CFFIndex();
|
1619
|
+
|
1360
1620
|
for (var i = 0, ii = strings.length; i < ii; ++i) {
|
1361
1621
|
stringIndex.add((0, _util.stringToBytes)(strings[i]));
|
1362
1622
|
}
|
1623
|
+
|
1363
1624
|
return this.compileIndex(stringIndex);
|
1364
1625
|
},
|
1365
1626
|
compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {
|
@@ -1368,14 +1629,18 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1368
1629
|
},
|
1369
1630
|
compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {
|
1370
1631
|
var charStringsIndex = new CFFIndex();
|
1632
|
+
|
1371
1633
|
for (var i = 0; i < charStrings.count; i++) {
|
1372
1634
|
var glyph = charStrings.get(i);
|
1635
|
+
|
1373
1636
|
if (glyph.length === 0) {
|
1374
1637
|
charStringsIndex.add(new Uint8Array([0x8B, 0x0E]));
|
1375
1638
|
continue;
|
1376
1639
|
}
|
1640
|
+
|
1377
1641
|
charStringsIndex.add(glyph);
|
1378
1642
|
}
|
1643
|
+
|
1379
1644
|
return this.compileIndex(charStringsIndex);
|
1380
1645
|
},
|
1381
1646
|
compileCharset: function CFFCompiler_compileCharset(charset) {
|
@@ -1388,27 +1653,33 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1388
1653
|
},
|
1389
1654
|
compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {
|
1390
1655
|
var format = fdSelect.format;
|
1391
|
-
var out
|
1392
|
-
|
1656
|
+
var out, i;
|
1657
|
+
|
1393
1658
|
switch (format) {
|
1394
1659
|
case 0:
|
1395
1660
|
out = new Uint8Array(1 + fdSelect.fdSelect.length);
|
1396
1661
|
out[0] = format;
|
1662
|
+
|
1397
1663
|
for (i = 0; i < fdSelect.fdSelect.length; i++) {
|
1398
1664
|
out[i + 1] = fdSelect.fdSelect[i];
|
1399
1665
|
}
|
1666
|
+
|
1400
1667
|
break;
|
1668
|
+
|
1401
1669
|
case 3:
|
1402
1670
|
var start = 0;
|
1403
1671
|
var lastFD = fdSelect.fdSelect[0];
|
1404
1672
|
var ranges = [format, 0, 0, start >> 8 & 0xFF, start & 0xFF, lastFD];
|
1673
|
+
|
1405
1674
|
for (i = 1; i < fdSelect.fdSelect.length; i++) {
|
1406
1675
|
var currentFD = fdSelect.fdSelect[i];
|
1676
|
+
|
1407
1677
|
if (currentFD !== lastFD) {
|
1408
1678
|
ranges.push(i >> 8 & 0xFF, i & 0xFF, currentFD);
|
1409
1679
|
lastFD = currentFD;
|
1410
1680
|
}
|
1411
1681
|
}
|
1682
|
+
|
1412
1683
|
var numRanges = (ranges.length - 3) / 3;
|
1413
1684
|
ranges[1] = numRanges >> 8 & 0xFF;
|
1414
1685
|
ranges[2] = numRanges & 0xFF;
|
@@ -1416,29 +1687,37 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1416
1687
|
out = new Uint8Array(ranges);
|
1417
1688
|
break;
|
1418
1689
|
}
|
1690
|
+
|
1419
1691
|
return this.compileTypedArray(out);
|
1420
1692
|
},
|
1421
1693
|
compileTypedArray: function CFFCompiler_compileTypedArray(data) {
|
1422
1694
|
var out = [];
|
1695
|
+
|
1423
1696
|
for (var i = 0, ii = data.length; i < ii; ++i) {
|
1424
1697
|
out[i] = data[i];
|
1425
1698
|
}
|
1699
|
+
|
1426
1700
|
return out;
|
1427
1701
|
},
|
1428
1702
|
compileIndex: function CFFCompiler_compileIndex(index, trackers) {
|
1429
1703
|
trackers = trackers || [];
|
1430
1704
|
var objects = index.objects;
|
1431
1705
|
var count = objects.length;
|
1706
|
+
|
1432
1707
|
if (count === 0) {
|
1433
1708
|
return [0, 0, 0];
|
1434
1709
|
}
|
1710
|
+
|
1435
1711
|
var data = [count >> 8 & 0xFF, count & 0xff];
|
1436
1712
|
var lastOffset = 1,
|
1437
1713
|
i;
|
1714
|
+
|
1438
1715
|
for (i = 0; i < count; ++i) {
|
1439
1716
|
lastOffset += objects[i].length;
|
1440
1717
|
}
|
1718
|
+
|
1441
1719
|
var offsetSize;
|
1720
|
+
|
1442
1721
|
if (lastOffset < 0x100) {
|
1443
1722
|
offsetSize = 1;
|
1444
1723
|
} else if (lastOffset < 0x10000) {
|
@@ -1448,8 +1727,10 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1448
1727
|
} else {
|
1449
1728
|
offsetSize = 4;
|
1450
1729
|
}
|
1730
|
+
|
1451
1731
|
data.push(offsetSize);
|
1452
1732
|
var relativeOffset = 1;
|
1733
|
+
|
1453
1734
|
for (i = 0; i < count + 1; i++) {
|
1454
1735
|
if (offsetSize === 1) {
|
1455
1736
|
data.push(relativeOffset & 0xFF);
|
@@ -1460,31 +1741,26 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1460
1741
|
} else {
|
1461
1742
|
data.push(relativeOffset >>> 24 & 0xFF, relativeOffset >> 16 & 0xFF, relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF);
|
1462
1743
|
}
|
1744
|
+
|
1463
1745
|
if (objects[i]) {
|
1464
1746
|
relativeOffset += objects[i].length;
|
1465
1747
|
}
|
1466
1748
|
}
|
1749
|
+
|
1467
1750
|
for (i = 0; i < count; i++) {
|
1468
1751
|
if (trackers[i]) {
|
1469
1752
|
trackers[i].offset(data.length);
|
1470
1753
|
}
|
1754
|
+
|
1471
1755
|
for (var j = 0, jj = objects[i].length; j < jj; j++) {
|
1472
1756
|
data.push(objects[i][j]);
|
1473
1757
|
}
|
1474
1758
|
}
|
1759
|
+
|
1475
1760
|
return data;
|
1476
1761
|
}
|
1477
1762
|
};
|
1478
1763
|
return CFFCompiler;
|
1479
1764
|
}();
|
1480
|
-
|
1481
|
-
exports.
|
1482
|
-
exports.CFF = CFF;
|
1483
|
-
exports.CFFHeader = CFFHeader;
|
1484
|
-
exports.CFFStrings = CFFStrings;
|
1485
|
-
exports.CFFIndex = CFFIndex;
|
1486
|
-
exports.CFFCharset = CFFCharset;
|
1487
|
-
exports.CFFTopDict = CFFTopDict;
|
1488
|
-
exports.CFFPrivateDict = CFFPrivateDict;
|
1489
|
-
exports.CFFCompiler = CFFCompiler;
|
1490
|
-
exports.CFFFDSelect = CFFFDSelect;
|
1765
|
+
|
1766
|
+
exports.CFFCompiler = CFFCompiler;
|