pdfjs-dist 2.0.487 → 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 +15564 -9476
- package/build/pdf.js.map +1 -1
- package/build/pdf.min.js +1 -1
- package/build/pdf.worker.js +46644 -36309
- package/build/pdf.worker.js.map +1 -1
- package/build/pdf.worker.min.js +1 -1
- package/external/url/url-lib.js +627 -0
- package/image_decoders/pdf.image_decoders.js +11430 -0
- package/image_decoders/pdf.image_decoders.js.map +1 -0
- package/image_decoders/pdf.image_decoders.min.js +1 -0
- package/lib/core/annotation.js +406 -131
- package/lib/core/arithmetic_decoder.js +275 -245
- package/lib/core/bidi.js +65 -6
- package/lib/core/ccitt.js +173 -18
- package/lib/core/ccitt_stream.js +15 -6
- package/lib/core/cff_parser.js +376 -53
- package/lib/core/charsets.js +5 -4
- package/lib/core/chunked_stream.js +387 -149
- package/lib/core/cmap.js +310 -75
- package/lib/core/colorspace.js +874 -594
- package/lib/core/crypto.js +290 -45
- package/lib/core/document.js +545 -260
- package/lib/core/encodings.js +19 -10
- package/lib/core/evaluator.js +725 -147
- package/lib/core/font_renderer.js +360 -91
- package/lib/core/fonts.js +791 -186
- package/lib/core/function.js +284 -71
- package/lib/core/glyphlist.js +3 -2
- package/lib/core/image.js +168 -61
- package/lib/core/jbig2.js +479 -66
- package/lib/core/jbig2_stream.js +19 -8
- package/lib/core/jpeg_stream.js +38 -13
- package/lib/core/jpg.js +252 -29
- package/lib/core/jpx.js +396 -6
- package/lib/core/jpx_stream.js +18 -6
- package/lib/core/metrics.js +4 -4
- package/lib/core/murmurhash3.js +24 -6
- package/lib/core/obj.js +1137 -475
- package/lib/core/operator_list.js +108 -6
- package/lib/core/parser.js +321 -68
- package/lib/core/pattern.js +145 -13
- package/lib/core/pdf_manager.js +321 -133
- package/lib/core/primitives.js +75 -22
- package/lib/core/ps_parser.js +134 -45
- package/lib/core/standard_fonts.js +10 -10
- package/lib/core/stream.js +313 -34
- package/lib/core/type1_parser.js +143 -13
- package/lib/core/unicode.js +31 -4
- package/lib/core/worker.js +210 -66
- package/lib/display/annotation_layer.js +361 -123
- package/lib/display/api.js +1454 -729
- package/lib/display/api_compatibility.js +11 -13
- package/lib/display/canvas.js +324 -29
- package/lib/display/content_disposition.js +83 -32
- package/lib/display/dom_utils.js +226 -41
- package/lib/display/fetch_stream.js +208 -84
- package/lib/display/font_loader.js +465 -236
- package/lib/display/metadata.js +38 -16
- package/lib/display/network.js +216 -51
- package/lib/display/network_utils.js +32 -19
- package/lib/display/node_stream.js +352 -169
- package/lib/display/pattern_helper.js +58 -7
- package/lib/display/svg.js +242 -29
- package/lib/display/text_layer.js +132 -18
- package/lib/display/transport_stream.js +171 -42
- package/lib/display/webgl.js +64 -18
- package/lib/display/worker_options.js +5 -4
- package/lib/display/xml_parser.js +166 -53
- package/lib/examples/node/domstubs.js +57 -4
- package/lib/pdf.js +21 -4
- package/lib/pdf.worker.js +5 -3
- package/lib/shared/compatibility.js +158 -564
- package/lib/shared/global_scope.js +2 -2
- package/lib/shared/is_node.js +4 -4
- package/lib/shared/message_handler.js +521 -0
- package/lib/shared/streams_polyfill.js +21 -17
- package/lib/shared/url_polyfill.js +56 -0
- package/lib/shared/util.js +295 -650
- package/lib/test/unit/annotation_spec.js +629 -345
- package/lib/test/unit/api_spec.js +555 -253
- package/lib/test/unit/bidi_spec.js +7 -7
- package/lib/test/unit/cff_parser_spec.js +40 -11
- package/lib/test/unit/clitests_helper.js +9 -7
- package/lib/test/unit/cmap_spec.js +80 -26
- package/lib/test/unit/colorspace_spec.js +99 -52
- package/lib/test/unit/crypto_spec.js +17 -5
- package/lib/test/unit/custom_spec.js +41 -53
- package/lib/test/unit/display_svg_spec.js +33 -17
- package/lib/test/unit/document_spec.js +3 -3
- package/lib/test/unit/dom_utils_spec.js +9 -9
- package/lib/test/unit/encodings_spec.js +25 -45
- package/lib/test/unit/evaluator_spec.js +34 -9
- package/lib/test/unit/function_spec.js +17 -5
- package/lib/test/unit/jasmine-boot.js +31 -18
- package/lib/test/unit/{util_stream_spec.js → message_handler_spec.js} +41 -69
- package/lib/test/unit/metadata_spec.js +71 -11
- package/lib/test/unit/murmurhash3_spec.js +3 -3
- package/lib/test/unit/network_spec.js +20 -5
- package/lib/test/unit/network_utils_spec.js +41 -14
- package/lib/test/unit/node_stream_spec.js +51 -27
- package/lib/test/unit/parser_spec.js +35 -8
- package/lib/test/unit/pdf_find_controller_spec.js +230 -0
- package/lib/test/unit/pdf_find_utils_spec.js +63 -0
- package/lib/test/unit/pdf_history_spec.js +21 -9
- package/lib/test/unit/primitives_spec.js +24 -4
- package/lib/test/unit/stream_spec.js +12 -4
- package/lib/test/unit/test_utils.js +90 -27
- package/lib/test/unit/testreporter.js +21 -3
- package/lib/test/unit/type1_parser_spec.js +8 -6
- package/lib/test/unit/ui_utils_spec.js +452 -14
- package/lib/test/unit/unicode_spec.js +14 -11
- package/lib/test/unit/util_spec.js +131 -9
- package/lib/web/annotation_layer_builder.js +39 -22
- package/lib/web/app.js +1240 -582
- package/lib/web/app_options.js +71 -41
- package/lib/web/base_viewer.js +508 -179
- package/lib/web/chromecom.js +261 -117
- package/lib/web/debugger.js +166 -22
- package/lib/web/download_manager.js +31 -13
- package/lib/web/firefox_print_service.js +17 -9
- package/lib/web/firefoxcom.js +283 -79
- package/lib/web/genericcom.js +89 -30
- package/lib/web/genericl10n.js +142 -30
- package/lib/web/grab_to_pan.js +26 -4
- package/lib/web/interfaces.js +170 -47
- package/lib/web/overlay_manager.js +235 -85
- package/lib/web/password_prompt.js +21 -13
- package/lib/web/pdf_attachment_viewer.js +38 -18
- package/lib/web/pdf_cursor_tools.js +39 -16
- package/lib/web/pdf_document_properties.js +80 -30
- package/lib/web/pdf_find_bar.js +84 -40
- package/lib/web/pdf_find_controller.js +495 -184
- package/lib/web/pdf_find_utils.js +111 -0
- package/lib/web/pdf_history.js +190 -53
- package/lib/web/pdf_link_service.js +137 -76
- package/lib/web/pdf_outline_viewer.js +73 -22
- package/lib/web/pdf_page_view.js +196 -63
- package/lib/web/pdf_presentation_mode.js +99 -34
- package/lib/web/pdf_print_service.js +57 -11
- package/lib/web/pdf_rendering_queue.js +27 -5
- package/lib/web/pdf_sidebar.js +120 -67
- package/lib/web/pdf_sidebar_resizer.js +42 -16
- package/lib/web/pdf_single_page_viewer.js +74 -66
- package/lib/web/pdf_thumbnail_view.js +103 -32
- package/lib/web/pdf_thumbnail_viewer.js +64 -24
- package/lib/web/pdf_viewer.component.js +112 -32
- package/lib/web/pdf_viewer.js +91 -52
- package/lib/web/preferences.js +275 -80
- package/lib/web/secondary_toolbar.js +165 -40
- package/lib/web/text_layer_builder.js +162 -65
- package/lib/web/toolbar.js +78 -43
- package/lib/web/ui_utils.js +462 -136
- package/lib/web/view_history.js +215 -67
- package/lib/web/viewer_compatibility.js +4 -13
- package/package.json +5 -4
- package/web/pdf_viewer.css +58 -1
- package/web/pdf_viewer.js +6346 -3919
- package/web/pdf_viewer.js.map +1 -1
- package/lib/test/unit/fonts_spec.js +0 -81
- package/lib/web/dom_events.js +0 -137
package/lib/core/cff_parser.js
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
* @licstart The following is the entire license notice for the
|
3
3
|
* Javascript code in this page
|
4
4
|
*
|
5
|
-
* Copyright
|
5
|
+
* Copyright 2018 Mozilla Foundation
|
6
6
|
*
|
7
7
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
8
8
|
* you may not use this file except in compliance with the License.
|
@@ -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.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,85 +872,102 @@ 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
|
},
|
798
918
|
parseFDSelect: function CFFParser_parseFDSelect(pos, length) {
|
799
|
-
var start = pos;
|
800
919
|
var bytes = this.bytes;
|
801
920
|
var format = bytes[pos++];
|
802
|
-
var fdSelect = []
|
803
|
-
|
804
|
-
|
805
|
-
invalidFirstGID = false;
|
921
|
+
var fdSelect = [];
|
922
|
+
var i;
|
923
|
+
|
806
924
|
switch (format) {
|
807
925
|
case 0:
|
808
926
|
for (i = 0; i < length; ++i) {
|
809
927
|
var id = bytes[pos++];
|
810
928
|
fdSelect.push(id);
|
811
929
|
}
|
812
|
-
|
930
|
+
|
813
931
|
break;
|
932
|
+
|
814
933
|
case 3:
|
815
934
|
var rangesCount = bytes[pos++] << 8 | bytes[pos++];
|
935
|
+
|
816
936
|
for (i = 0; i < rangesCount; ++i) {
|
817
937
|
var first = bytes[pos++] << 8 | bytes[pos++];
|
938
|
+
|
818
939
|
if (i === 0 && first !== 0) {
|
819
940
|
(0, _util.warn)('parseFDSelect: The first range must have a first GID of 0' + ' -- trying to recover.');
|
820
|
-
invalidFirstGID = true;
|
821
941
|
first = 0;
|
822
942
|
}
|
943
|
+
|
823
944
|
var fdIndex = bytes[pos++];
|
824
945
|
var next = bytes[pos] << 8 | bytes[pos + 1];
|
946
|
+
|
825
947
|
for (var j = first; j < next; ++j) {
|
826
948
|
fdSelect.push(fdIndex);
|
827
949
|
}
|
828
950
|
}
|
951
|
+
|
829
952
|
pos += 2;
|
830
|
-
rawBytes = bytes.subarray(start, pos);
|
831
|
-
if (invalidFirstGID) {
|
832
|
-
rawBytes[3] = rawBytes[4] = 0;
|
833
|
-
}
|
834
953
|
break;
|
954
|
+
|
835
955
|
default:
|
836
|
-
throw new _util.FormatError(
|
956
|
+
throw new _util.FormatError("parseFDSelect: Unknown format \"".concat(format, "\"."));
|
837
957
|
}
|
958
|
+
|
838
959
|
if (fdSelect.length !== length) {
|
839
960
|
throw new _util.FormatError('parseFDSelect: Invalid font data.');
|
840
961
|
}
|
841
|
-
|
962
|
+
|
963
|
+
return new CFFFDSelect(format, fdSelect);
|
842
964
|
}
|
843
965
|
};
|
844
966
|
return CFFParser;
|
845
967
|
}();
|
968
|
+
|
969
|
+
exports.CFFParser = CFFParser;
|
970
|
+
|
846
971
|
var CFF = function CFFClosure() {
|
847
972
|
function CFF() {
|
848
973
|
this.header = null;
|
@@ -857,8 +982,35 @@ var CFF = function CFFClosure() {
|
|
857
982
|
this.fdSelect = null;
|
858
983
|
this.isCIDFont = false;
|
859
984
|
}
|
985
|
+
|
986
|
+
CFF.prototype = {
|
987
|
+
duplicateFirstGlyph: function CFF_duplicateFirstGlyph() {
|
988
|
+
if (this.charStrings.count >= 65535) {
|
989
|
+
(0, _util.warn)('Not enough space in charstrings to duplicate first glyph.');
|
990
|
+
return;
|
991
|
+
}
|
992
|
+
|
993
|
+
var glyphZero = this.charStrings.get(0);
|
994
|
+
this.charStrings.add(glyphZero);
|
995
|
+
|
996
|
+
if (this.isCIDFont) {
|
997
|
+
this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]);
|
998
|
+
}
|
999
|
+
},
|
1000
|
+
hasGlyphId: function CFF_hasGlyphID(id) {
|
1001
|
+
if (id < 0 || id >= this.charStrings.count) {
|
1002
|
+
return false;
|
1003
|
+
}
|
1004
|
+
|
1005
|
+
var glyph = this.charStrings.get(id);
|
1006
|
+
return glyph.length > 0;
|
1007
|
+
}
|
1008
|
+
};
|
860
1009
|
return CFF;
|
861
1010
|
}();
|
1011
|
+
|
1012
|
+
exports.CFF = CFF;
|
1013
|
+
|
862
1014
|
var CFFHeader = function CFFHeaderClosure() {
|
863
1015
|
function CFFHeader(major, minor, hdrSize, offSize) {
|
864
1016
|
this.major = major;
|
@@ -866,36 +1018,49 @@ var CFFHeader = function CFFHeaderClosure() {
|
|
866
1018
|
this.hdrSize = hdrSize;
|
867
1019
|
this.offSize = offSize;
|
868
1020
|
}
|
1021
|
+
|
869
1022
|
return CFFHeader;
|
870
1023
|
}();
|
1024
|
+
|
1025
|
+
exports.CFFHeader = CFFHeader;
|
1026
|
+
|
871
1027
|
var CFFStrings = function CFFStringsClosure() {
|
872
1028
|
function CFFStrings() {
|
873
1029
|
this.strings = [];
|
874
1030
|
}
|
1031
|
+
|
875
1032
|
CFFStrings.prototype = {
|
876
1033
|
get: function CFFStrings_get(index) {
|
877
1034
|
if (index >= 0 && index <= 390) {
|
878
1035
|
return CFFStandardStrings[index];
|
879
1036
|
}
|
1037
|
+
|
880
1038
|
if (index - 391 <= this.strings.length) {
|
881
1039
|
return this.strings[index - 391];
|
882
1040
|
}
|
1041
|
+
|
883
1042
|
return CFFStandardStrings[0];
|
884
1043
|
},
|
885
1044
|
add: function CFFStrings_add(value) {
|
886
1045
|
this.strings.push(value);
|
887
1046
|
},
|
1047
|
+
|
888
1048
|
get count() {
|
889
1049
|
return this.strings.length;
|
890
1050
|
}
|
1051
|
+
|
891
1052
|
};
|
892
1053
|
return CFFStrings;
|
893
1054
|
}();
|
1055
|
+
|
1056
|
+
exports.CFFStrings = CFFStrings;
|
1057
|
+
|
894
1058
|
var CFFIndex = function CFFIndexClosure() {
|
895
1059
|
function CFFIndex() {
|
896
1060
|
this.objects = [];
|
897
1061
|
this.length = 0;
|
898
1062
|
}
|
1063
|
+
|
899
1064
|
CFFIndex.prototype = {
|
900
1065
|
add: function CFFIndex_add(data) {
|
901
1066
|
this.length += data.length;
|
@@ -908,12 +1073,17 @@ var CFFIndex = function CFFIndexClosure() {
|
|
908
1073
|
get: function CFFIndex_get(index) {
|
909
1074
|
return this.objects[index];
|
910
1075
|
},
|
1076
|
+
|
911
1077
|
get count() {
|
912
1078
|
return this.objects.length;
|
913
1079
|
}
|
1080
|
+
|
914
1081
|
};
|
915
1082
|
return CFFIndex;
|
916
1083
|
}();
|
1084
|
+
|
1085
|
+
exports.CFFIndex = CFFIndex;
|
1086
|
+
|
917
1087
|
var CFFDict = function CFFDictClosure() {
|
918
1088
|
function CFFDict(tables, strings) {
|
919
1089
|
this.keyToNameMap = tables.keyToNameMap;
|
@@ -925,32 +1095,40 @@ var CFFDict = function CFFDictClosure() {
|
|
925
1095
|
this.strings = strings;
|
926
1096
|
this.values = Object.create(null);
|
927
1097
|
}
|
1098
|
+
|
928
1099
|
CFFDict.prototype = {
|
929
1100
|
setByKey: function CFFDict_setByKey(key, value) {
|
930
1101
|
if (!(key in this.keyToNameMap)) {
|
931
1102
|
return false;
|
932
1103
|
}
|
1104
|
+
|
933
1105
|
var valueLength = value.length;
|
1106
|
+
|
934
1107
|
if (valueLength === 0) {
|
935
1108
|
return true;
|
936
1109
|
}
|
1110
|
+
|
937
1111
|
for (var i = 0; i < valueLength; i++) {
|
938
1112
|
if (isNaN(value[i])) {
|
939
1113
|
(0, _util.warn)('Invalid CFFDict value: "' + value + '" for key "' + key + '".');
|
940
1114
|
return true;
|
941
1115
|
}
|
942
1116
|
}
|
1117
|
+
|
943
1118
|
var type = this.types[key];
|
1119
|
+
|
944
1120
|
if (type === 'num' || type === 'sid' || type === 'offset') {
|
945
1121
|
value = value[0];
|
946
1122
|
}
|
1123
|
+
|
947
1124
|
this.values[key] = value;
|
948
1125
|
return true;
|
949
1126
|
},
|
950
1127
|
setByName: function CFFDict_setByName(name, value) {
|
951
1128
|
if (!(name in this.nameToKeyMap)) {
|
952
|
-
throw new _util.FormatError(
|
1129
|
+
throw new _util.FormatError("Invalid dictionary name \"".concat(name, "\""));
|
953
1130
|
}
|
1131
|
+
|
954
1132
|
this.values[this.nameToKeyMap[name]] = value;
|
955
1133
|
},
|
956
1134
|
hasName: function CFFDict_hasName(name) {
|
@@ -958,18 +1136,22 @@ var CFFDict = function CFFDictClosure() {
|
|
958
1136
|
},
|
959
1137
|
getByName: function CFFDict_getByName(name) {
|
960
1138
|
if (!(name in this.nameToKeyMap)) {
|
961
|
-
throw new _util.FormatError(
|
1139
|
+
throw new _util.FormatError("Invalid dictionary name ".concat(name, "\""));
|
962
1140
|
}
|
1141
|
+
|
963
1142
|
var key = this.nameToKeyMap[name];
|
1143
|
+
|
964
1144
|
if (!(key in this.values)) {
|
965
1145
|
return this.defaults[key];
|
966
1146
|
}
|
1147
|
+
|
967
1148
|
return this.values[key];
|
968
1149
|
},
|
969
1150
|
removeByName: function CFFDict_removeByName(name) {
|
970
1151
|
delete this.values[this.nameToKeyMap[name]];
|
971
1152
|
}
|
972
1153
|
};
|
1154
|
+
|
973
1155
|
CFFDict.createTables = function CFFDict_createTables(layout) {
|
974
1156
|
var tables = {
|
975
1157
|
keyToNameMap: {},
|
@@ -979,6 +1161,7 @@ var CFFDict = function CFFDictClosure() {
|
|
979
1161
|
opcodes: {},
|
980
1162
|
order: []
|
981
1163
|
};
|
1164
|
+
|
982
1165
|
for (var i = 0, ii = layout.length; i < ii; ++i) {
|
983
1166
|
var entry = layout[i];
|
984
1167
|
var key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
|
@@ -989,41 +1172,56 @@ var CFFDict = function CFFDictClosure() {
|
|
989
1172
|
tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]];
|
990
1173
|
tables.order.push(key);
|
991
1174
|
}
|
1175
|
+
|
992
1176
|
return tables;
|
993
1177
|
};
|
1178
|
+
|
994
1179
|
return CFFDict;
|
995
1180
|
}();
|
1181
|
+
|
996
1182
|
var CFFTopDict = function CFFTopDictClosure() {
|
997
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]];
|
998
1184
|
var tables = null;
|
1185
|
+
|
999
1186
|
function CFFTopDict(strings) {
|
1000
1187
|
if (tables === null) {
|
1001
1188
|
tables = CFFDict.createTables(layout);
|
1002
1189
|
}
|
1190
|
+
|
1003
1191
|
CFFDict.call(this, tables, strings);
|
1004
1192
|
this.privateDict = null;
|
1005
1193
|
}
|
1194
|
+
|
1006
1195
|
CFFTopDict.prototype = Object.create(CFFDict.prototype);
|
1007
1196
|
return CFFTopDict;
|
1008
1197
|
}();
|
1198
|
+
|
1199
|
+
exports.CFFTopDict = CFFTopDict;
|
1200
|
+
|
1009
1201
|
var CFFPrivateDict = function CFFPrivateDictClosure() {
|
1010
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]];
|
1011
1203
|
var tables = null;
|
1204
|
+
|
1012
1205
|
function CFFPrivateDict(strings) {
|
1013
1206
|
if (tables === null) {
|
1014
1207
|
tables = CFFDict.createTables(layout);
|
1015
1208
|
}
|
1209
|
+
|
1016
1210
|
CFFDict.call(this, tables, strings);
|
1017
1211
|
this.subrsIndex = null;
|
1018
1212
|
}
|
1213
|
+
|
1019
1214
|
CFFPrivateDict.prototype = Object.create(CFFDict.prototype);
|
1020
1215
|
return CFFPrivateDict;
|
1021
1216
|
}();
|
1217
|
+
|
1218
|
+
exports.CFFPrivateDict = CFFPrivateDict;
|
1022
1219
|
var CFFCharsetPredefinedTypes = {
|
1023
1220
|
ISO_ADOBE: 0,
|
1024
1221
|
EXPERT: 1,
|
1025
1222
|
EXPERT_SUBSET: 2
|
1026
1223
|
};
|
1224
|
+
|
1027
1225
|
var CFFCharset = function CFFCharsetClosure() {
|
1028
1226
|
function CFFCharset(predefined, format, charset, raw) {
|
1029
1227
|
this.predefined = predefined;
|
@@ -1031,8 +1229,12 @@ var CFFCharset = function CFFCharsetClosure() {
|
|
1031
1229
|
this.charset = charset;
|
1032
1230
|
this.raw = raw;
|
1033
1231
|
}
|
1232
|
+
|
1034
1233
|
return CFFCharset;
|
1035
1234
|
}();
|
1235
|
+
|
1236
|
+
exports.CFFCharset = CFFCharset;
|
1237
|
+
|
1036
1238
|
var CFFEncoding = function CFFEncodingClosure() {
|
1037
1239
|
function CFFEncoding(predefined, format, encoding, raw) {
|
1038
1240
|
this.predefined = predefined;
|
@@ -1040,35 +1242,44 @@ var CFFEncoding = function CFFEncodingClosure() {
|
|
1040
1242
|
this.encoding = encoding;
|
1041
1243
|
this.raw = raw;
|
1042
1244
|
}
|
1245
|
+
|
1043
1246
|
return CFFEncoding;
|
1044
1247
|
}();
|
1248
|
+
|
1045
1249
|
var CFFFDSelect = function CFFFDSelectClosure() {
|
1046
|
-
function CFFFDSelect(
|
1250
|
+
function CFFFDSelect(format, fdSelect) {
|
1251
|
+
this.format = format;
|
1047
1252
|
this.fdSelect = fdSelect;
|
1048
|
-
this.raw = raw;
|
1049
1253
|
}
|
1254
|
+
|
1050
1255
|
CFFFDSelect.prototype = {
|
1051
1256
|
getFDIndex: function CFFFDSelect_get(glyphIndex) {
|
1052
1257
|
if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {
|
1053
1258
|
return -1;
|
1054
1259
|
}
|
1260
|
+
|
1055
1261
|
return this.fdSelect[glyphIndex];
|
1056
1262
|
}
|
1057
1263
|
};
|
1058
1264
|
return CFFFDSelect;
|
1059
1265
|
}();
|
1266
|
+
|
1267
|
+
exports.CFFFDSelect = CFFFDSelect;
|
1268
|
+
|
1060
1269
|
var CFFOffsetTracker = function CFFOffsetTrackerClosure() {
|
1061
1270
|
function CFFOffsetTracker() {
|
1062
1271
|
this.offsets = Object.create(null);
|
1063
1272
|
}
|
1273
|
+
|
1064
1274
|
CFFOffsetTracker.prototype = {
|
1065
1275
|
isTracking: function CFFOffsetTracker_isTracking(key) {
|
1066
1276
|
return key in this.offsets;
|
1067
1277
|
},
|
1068
1278
|
track: function CFFOffsetTracker_track(key, location) {
|
1069
1279
|
if (key in this.offsets) {
|
1070
|
-
throw new _util.FormatError(
|
1280
|
+
throw new _util.FormatError("Already tracking location of ".concat(key));
|
1071
1281
|
}
|
1282
|
+
|
1072
1283
|
this.offsets[key] = location;
|
1073
1284
|
},
|
1074
1285
|
offset: function CFFOffsetTracker_offset(value) {
|
@@ -1078,20 +1289,24 @@ var CFFOffsetTracker = function CFFOffsetTrackerClosure() {
|
|
1078
1289
|
},
|
1079
1290
|
setEntryLocation: function CFFOffsetTracker_setEntryLocation(key, values, output) {
|
1080
1291
|
if (!(key in this.offsets)) {
|
1081
|
-
throw new _util.FormatError(
|
1292
|
+
throw new _util.FormatError("Not tracking location of ".concat(key));
|
1082
1293
|
}
|
1294
|
+
|
1083
1295
|
var data = output.data;
|
1084
1296
|
var dataOffset = this.offsets[key];
|
1085
1297
|
var size = 5;
|
1298
|
+
|
1086
1299
|
for (var i = 0, ii = values.length; i < ii; ++i) {
|
1087
1300
|
var offset0 = i * size + dataOffset;
|
1088
1301
|
var offset1 = offset0 + 1;
|
1089
1302
|
var offset2 = offset0 + 2;
|
1090
1303
|
var offset3 = offset0 + 3;
|
1091
1304
|
var offset4 = offset0 + 4;
|
1305
|
+
|
1092
1306
|
if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) {
|
1093
1307
|
throw new _util.FormatError('writing to an offset that is not empty');
|
1094
1308
|
}
|
1309
|
+
|
1095
1310
|
var value = values[i];
|
1096
1311
|
data[offset0] = 0x1d;
|
1097
1312
|
data[offset1] = value >> 24 & 0xFF;
|
@@ -1103,10 +1318,12 @@ var CFFOffsetTracker = function CFFOffsetTrackerClosure() {
|
|
1103
1318
|
};
|
1104
1319
|
return CFFOffsetTracker;
|
1105
1320
|
}();
|
1321
|
+
|
1106
1322
|
var CFFCompiler = function CFFCompilerClosure() {
|
1107
1323
|
function CFFCompiler(cff) {
|
1108
1324
|
this.cff = cff;
|
1109
1325
|
}
|
1326
|
+
|
1110
1327
|
CFFCompiler.prototype = {
|
1111
1328
|
compile: function CFFCompiler_compile() {
|
1112
1329
|
var cff = this.cff;
|
@@ -1122,20 +1339,26 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1122
1339
|
output.add(header);
|
1123
1340
|
var nameIndex = this.compileNameIndex(cff.names);
|
1124
1341
|
output.add(nameIndex);
|
1342
|
+
|
1125
1343
|
if (cff.isCIDFont) {
|
1126
1344
|
if (cff.topDict.hasName('FontMatrix')) {
|
1127
1345
|
var base = cff.topDict.getByName('FontMatrix');
|
1128
1346
|
cff.topDict.removeByName('FontMatrix');
|
1347
|
+
|
1129
1348
|
for (var i = 0, ii = cff.fdArray.length; i < ii; i++) {
|
1130
1349
|
var subDict = cff.fdArray[i];
|
1131
1350
|
var matrix = base.slice(0);
|
1351
|
+
|
1132
1352
|
if (subDict.hasName('FontMatrix')) {
|
1133
1353
|
matrix = _util.Util.transform(matrix, subDict.getByName('FontMatrix'));
|
1134
1354
|
}
|
1355
|
+
|
1135
1356
|
subDict.setByName('FontMatrix', matrix);
|
1136
1357
|
}
|
1137
1358
|
}
|
1138
1359
|
}
|
1360
|
+
|
1361
|
+
cff.topDict.setByName('charset', 0);
|
1139
1362
|
var compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont);
|
1140
1363
|
output.add(compiled.output);
|
1141
1364
|
var topDictTracker = compiled.trackers[0];
|
@@ -1143,6 +1366,7 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1143
1366
|
output.add(stringIndex);
|
1144
1367
|
var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
|
1145
1368
|
output.add(globalSubrIndex);
|
1369
|
+
|
1146
1370
|
if (cff.encoding && cff.topDict.hasName('Encoding')) {
|
1147
1371
|
if (cff.encoding.predefined) {
|
1148
1372
|
topDictTracker.setEntryLocation('Encoding', [cff.encoding.format], output);
|
@@ -1152,21 +1376,17 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1152
1376
|
output.add(encoding);
|
1153
1377
|
}
|
1154
1378
|
}
|
1155
|
-
|
1156
|
-
|
1157
|
-
|
1158
|
-
|
1159
|
-
var charset = this.compileCharset(cff.charset);
|
1160
|
-
topDictTracker.setEntryLocation('charset', [output.length], output);
|
1161
|
-
output.add(charset);
|
1162
|
-
}
|
1163
|
-
}
|
1379
|
+
|
1380
|
+
var charset = this.compileCharset(cff.charset);
|
1381
|
+
topDictTracker.setEntryLocation('charset', [output.length], output);
|
1382
|
+
output.add(charset);
|
1164
1383
|
var charStrings = this.compileCharStrings(cff.charStrings);
|
1165
1384
|
topDictTracker.setEntryLocation('CharStrings', [output.length], output);
|
1166
1385
|
output.add(charStrings);
|
1386
|
+
|
1167
1387
|
if (cff.isCIDFont) {
|
1168
1388
|
topDictTracker.setEntryLocation('FDSelect', [output.length], output);
|
1169
|
-
var fdSelect = this.compileFDSelect(cff.fdSelect
|
1389
|
+
var fdSelect = this.compileFDSelect(cff.fdSelect);
|
1170
1390
|
output.add(fdSelect);
|
1171
1391
|
compiled = this.compileTopDicts(cff.fdArray, output.length, true);
|
1172
1392
|
topDictTracker.setEntryLocation('FDArray', [output.length], output);
|
@@ -1174,6 +1394,7 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1174
1394
|
var fontDictTrackers = compiled.trackers;
|
1175
1395
|
this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
|
1176
1396
|
}
|
1397
|
+
|
1177
1398
|
this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
|
1178
1399
|
output.add([0]);
|
1179
1400
|
return output.data;
|
@@ -1182,19 +1403,24 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1182
1403
|
if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) {
|
1183
1404
|
return this.encodeInteger(value);
|
1184
1405
|
}
|
1406
|
+
|
1185
1407
|
return this.encodeFloat(value);
|
1186
1408
|
},
|
1187
1409
|
encodeFloat: function CFFCompiler_encodeFloat(num) {
|
1188
1410
|
var value = num.toString();
|
1189
1411
|
var m = /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(value);
|
1412
|
+
|
1190
1413
|
if (m) {
|
1191
1414
|
var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length));
|
1192
1415
|
value = (Math.round(num * epsilon) / epsilon).toString();
|
1193
1416
|
}
|
1417
|
+
|
1194
1418
|
var nibbles = '';
|
1195
1419
|
var i, ii;
|
1420
|
+
|
1196
1421
|
for (i = 0, ii = value.length; i < ii; ++i) {
|
1197
1422
|
var a = value[i];
|
1423
|
+
|
1198
1424
|
if (a === 'e') {
|
1199
1425
|
nibbles += value[++i] === '-' ? 'c' : 'b';
|
1200
1426
|
} else if (a === '.') {
|
@@ -1205,15 +1431,19 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1205
1431
|
nibbles += a;
|
1206
1432
|
}
|
1207
1433
|
}
|
1434
|
+
|
1208
1435
|
nibbles += nibbles.length & 1 ? 'f' : 'ff';
|
1209
1436
|
var out = [30];
|
1437
|
+
|
1210
1438
|
for (i = 0, ii = nibbles.length; i < ii; i += 2) {
|
1211
|
-
out.push(parseInt(nibbles.
|
1439
|
+
out.push(parseInt(nibbles.substring(i, i + 2), 16));
|
1212
1440
|
}
|
1441
|
+
|
1213
1442
|
return out;
|
1214
1443
|
},
|
1215
1444
|
encodeInteger: function CFFCompiler_encodeInteger(value) {
|
1216
1445
|
var code;
|
1446
|
+
|
1217
1447
|
if (value >= -107 && value <= 107) {
|
1218
1448
|
code = [value + 139];
|
1219
1449
|
} else if (value >= 108 && value <= 1131) {
|
@@ -1227,6 +1457,7 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1227
1457
|
} else {
|
1228
1458
|
code = [0x1d, value >> 24 & 0xFF, value >> 16 & 0xFF, value >> 8 & 0xFF, value & 0xFF];
|
1229
1459
|
}
|
1460
|
+
|
1230
1461
|
return code;
|
1231
1462
|
},
|
1232
1463
|
compileHeader: function CFFCompiler_compileHeader(header) {
|
@@ -1234,30 +1465,40 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1234
1465
|
},
|
1235
1466
|
compileNameIndex: function CFFCompiler_compileNameIndex(names) {
|
1236
1467
|
var nameIndex = new CFFIndex();
|
1468
|
+
|
1237
1469
|
for (var i = 0, ii = names.length; i < ii; ++i) {
|
1238
1470
|
var name = names[i];
|
1239
1471
|
var length = Math.min(name.length, 127);
|
1240
1472
|
var sanitizedName = new Array(length);
|
1473
|
+
|
1241
1474
|
for (var j = 0; j < length; j++) {
|
1242
1475
|
var char = name[j];
|
1476
|
+
|
1243
1477
|
if (char < '!' || char > '~' || char === '[' || char === ']' || char === '(' || char === ')' || char === '{' || char === '}' || char === '<' || char === '>' || char === '/' || char === '%') {
|
1244
1478
|
char = '_';
|
1245
1479
|
}
|
1480
|
+
|
1246
1481
|
sanitizedName[j] = char;
|
1247
1482
|
}
|
1483
|
+
|
1248
1484
|
sanitizedName = sanitizedName.join('');
|
1485
|
+
|
1249
1486
|
if (sanitizedName === '') {
|
1250
1487
|
sanitizedName = 'Bad_Font_Name';
|
1251
1488
|
}
|
1489
|
+
|
1252
1490
|
nameIndex.add((0, _util.stringToBytes)(sanitizedName));
|
1253
1491
|
}
|
1492
|
+
|
1254
1493
|
return this.compileIndex(nameIndex);
|
1255
1494
|
},
|
1256
1495
|
compileTopDicts: function CFFCompiler_compileTopDicts(dicts, length, removeCidKeys) {
|
1257
1496
|
var fontDictTrackers = [];
|
1258
1497
|
var fdArrayIndex = new CFFIndex();
|
1498
|
+
|
1259
1499
|
for (var i = 0, ii = dicts.length; i < ii; ++i) {
|
1260
1500
|
var fontDict = dicts[i];
|
1501
|
+
|
1261
1502
|
if (removeCidKeys) {
|
1262
1503
|
fontDict.removeByName('CIDFontVersion');
|
1263
1504
|
fontDict.removeByName('CIDFontRevision');
|
@@ -1265,12 +1506,14 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1265
1506
|
fontDict.removeByName('CIDCount');
|
1266
1507
|
fontDict.removeByName('UIDBase');
|
1267
1508
|
}
|
1509
|
+
|
1268
1510
|
var fontDictTracker = new CFFOffsetTracker();
|
1269
1511
|
var fontDictData = this.compileDict(fontDict, fontDictTracker);
|
1270
1512
|
fontDictTrackers.push(fontDictTracker);
|
1271
1513
|
fdArrayIndex.add(fontDictData);
|
1272
1514
|
fontDictTracker.offset(length);
|
1273
1515
|
}
|
1516
|
+
|
1274
1517
|
fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
|
1275
1518
|
return {
|
1276
1519
|
trackers: fontDictTrackers,
|
@@ -1281,18 +1524,23 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1281
1524
|
for (var i = 0, ii = dicts.length; i < ii; ++i) {
|
1282
1525
|
var fontDict = dicts[i];
|
1283
1526
|
var privateDict = fontDict.privateDict;
|
1527
|
+
|
1284
1528
|
if (!privateDict || !fontDict.hasName('Private')) {
|
1285
1529
|
throw new _util.FormatError('There must be a private dictionary.');
|
1286
1530
|
}
|
1531
|
+
|
1287
1532
|
var privateDictTracker = new CFFOffsetTracker();
|
1288
1533
|
var privateDictData = this.compileDict(privateDict, privateDictTracker);
|
1289
1534
|
var outputLength = output.length;
|
1290
1535
|
privateDictTracker.offset(outputLength);
|
1536
|
+
|
1291
1537
|
if (!privateDictData.length) {
|
1292
1538
|
outputLength = 0;
|
1293
1539
|
}
|
1540
|
+
|
1294
1541
|
trackers[i].setEntryLocation('Private', [privateDictData.length, outputLength], output);
|
1295
1542
|
output.add(privateDictData);
|
1543
|
+
|
1296
1544
|
if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {
|
1297
1545
|
var subrs = this.compileIndex(privateDict.subrsIndex);
|
1298
1546
|
privateDictTracker.setEntryLocation('Subrs', [privateDictData.length], output);
|
@@ -1303,57 +1551,76 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1303
1551
|
compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {
|
1304
1552
|
var out = [];
|
1305
1553
|
var order = dict.order;
|
1554
|
+
|
1306
1555
|
for (var i = 0; i < order.length; ++i) {
|
1307
1556
|
var key = order[i];
|
1557
|
+
|
1308
1558
|
if (!(key in dict.values)) {
|
1309
1559
|
continue;
|
1310
1560
|
}
|
1561
|
+
|
1311
1562
|
var values = dict.values[key];
|
1312
1563
|
var types = dict.types[key];
|
1564
|
+
|
1313
1565
|
if (!Array.isArray(types)) {
|
1314
1566
|
types = [types];
|
1315
1567
|
}
|
1568
|
+
|
1316
1569
|
if (!Array.isArray(values)) {
|
1317
1570
|
values = [values];
|
1318
1571
|
}
|
1572
|
+
|
1319
1573
|
if (values.length === 0) {
|
1320
1574
|
continue;
|
1321
1575
|
}
|
1576
|
+
|
1322
1577
|
for (var j = 0, jj = types.length; j < jj; ++j) {
|
1323
1578
|
var type = types[j];
|
1324
1579
|
var value = values[j];
|
1580
|
+
|
1325
1581
|
switch (type) {
|
1326
1582
|
case 'num':
|
1327
1583
|
case 'sid':
|
1328
1584
|
out = out.concat(this.encodeNumber(value));
|
1329
1585
|
break;
|
1586
|
+
|
1330
1587
|
case 'offset':
|
1331
1588
|
var name = dict.keyToNameMap[key];
|
1589
|
+
|
1332
1590
|
if (!offsetTracker.isTracking(name)) {
|
1333
1591
|
offsetTracker.track(name, out.length);
|
1334
1592
|
}
|
1593
|
+
|
1335
1594
|
out = out.concat([0x1d, 0, 0, 0, 0]);
|
1336
1595
|
break;
|
1596
|
+
|
1337
1597
|
case 'array':
|
1338
1598
|
case 'delta':
|
1339
1599
|
out = out.concat(this.encodeNumber(value));
|
1600
|
+
|
1340
1601
|
for (var k = 1, kk = values.length; k < kk; ++k) {
|
1341
1602
|
out = out.concat(this.encodeNumber(values[k]));
|
1342
1603
|
}
|
1604
|
+
|
1343
1605
|
break;
|
1606
|
+
|
1344
1607
|
default:
|
1345
|
-
throw new _util.FormatError(
|
1608
|
+
throw new _util.FormatError("Unknown data type of ".concat(type));
|
1346
1609
|
}
|
1347
1610
|
}
|
1611
|
+
|
1348
1612
|
out = out.concat(dict.opcodes[key]);
|
1349
1613
|
}
|
1614
|
+
|
1350
1615
|
return out;
|
1351
1616
|
},
|
1352
1617
|
compileStringIndex: function CFFCompiler_compileStringIndex(strings) {
|
1353
1618
|
var stringIndex = new CFFIndex();
|
1619
|
+
|
1354
1620
|
for (var i = 0, ii = strings.length; i < ii; ++i) {
|
1355
1621
|
stringIndex.add((0, _util.stringToBytes)(strings[i]));
|
1356
1622
|
}
|
1623
|
+
|
1357
1624
|
return this.compileIndex(stringIndex);
|
1358
1625
|
},
|
1359
1626
|
compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {
|
@@ -1361,38 +1628,96 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1361
1628
|
this.out.writeByteArray(this.compileIndex(globalSubrIndex));
|
1362
1629
|
},
|
1363
1630
|
compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {
|
1364
|
-
|
1631
|
+
var charStringsIndex = new CFFIndex();
|
1632
|
+
|
1633
|
+
for (var i = 0; i < charStrings.count; i++) {
|
1634
|
+
var glyph = charStrings.get(i);
|
1635
|
+
|
1636
|
+
if (glyph.length === 0) {
|
1637
|
+
charStringsIndex.add(new Uint8Array([0x8B, 0x0E]));
|
1638
|
+
continue;
|
1639
|
+
}
|
1640
|
+
|
1641
|
+
charStringsIndex.add(glyph);
|
1642
|
+
}
|
1643
|
+
|
1644
|
+
return this.compileIndex(charStringsIndex);
|
1365
1645
|
},
|
1366
1646
|
compileCharset: function CFFCompiler_compileCharset(charset) {
|
1367
|
-
|
1647
|
+
var length = 1 + (this.cff.charStrings.count - 1) * 2;
|
1648
|
+
var out = new Uint8Array(length);
|
1649
|
+
return this.compileTypedArray(out);
|
1368
1650
|
},
|
1369
1651
|
compileEncoding: function CFFCompiler_compileEncoding(encoding) {
|
1370
1652
|
return this.compileTypedArray(encoding.raw);
|
1371
1653
|
},
|
1372
1654
|
compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {
|
1373
|
-
|
1655
|
+
var format = fdSelect.format;
|
1656
|
+
var out, i;
|
1657
|
+
|
1658
|
+
switch (format) {
|
1659
|
+
case 0:
|
1660
|
+
out = new Uint8Array(1 + fdSelect.fdSelect.length);
|
1661
|
+
out[0] = format;
|
1662
|
+
|
1663
|
+
for (i = 0; i < fdSelect.fdSelect.length; i++) {
|
1664
|
+
out[i + 1] = fdSelect.fdSelect[i];
|
1665
|
+
}
|
1666
|
+
|
1667
|
+
break;
|
1668
|
+
|
1669
|
+
case 3:
|
1670
|
+
var start = 0;
|
1671
|
+
var lastFD = fdSelect.fdSelect[0];
|
1672
|
+
var ranges = [format, 0, 0, start >> 8 & 0xFF, start & 0xFF, lastFD];
|
1673
|
+
|
1674
|
+
for (i = 1; i < fdSelect.fdSelect.length; i++) {
|
1675
|
+
var currentFD = fdSelect.fdSelect[i];
|
1676
|
+
|
1677
|
+
if (currentFD !== lastFD) {
|
1678
|
+
ranges.push(i >> 8 & 0xFF, i & 0xFF, currentFD);
|
1679
|
+
lastFD = currentFD;
|
1680
|
+
}
|
1681
|
+
}
|
1682
|
+
|
1683
|
+
var numRanges = (ranges.length - 3) / 3;
|
1684
|
+
ranges[1] = numRanges >> 8 & 0xFF;
|
1685
|
+
ranges[2] = numRanges & 0xFF;
|
1686
|
+
ranges.push(i >> 8 & 0xFF, i & 0xFF);
|
1687
|
+
out = new Uint8Array(ranges);
|
1688
|
+
break;
|
1689
|
+
}
|
1690
|
+
|
1691
|
+
return this.compileTypedArray(out);
|
1374
1692
|
},
|
1375
1693
|
compileTypedArray: function CFFCompiler_compileTypedArray(data) {
|
1376
1694
|
var out = [];
|
1695
|
+
|
1377
1696
|
for (var i = 0, ii = data.length; i < ii; ++i) {
|
1378
1697
|
out[i] = data[i];
|
1379
1698
|
}
|
1699
|
+
|
1380
1700
|
return out;
|
1381
1701
|
},
|
1382
1702
|
compileIndex: function CFFCompiler_compileIndex(index, trackers) {
|
1383
1703
|
trackers = trackers || [];
|
1384
1704
|
var objects = index.objects;
|
1385
1705
|
var count = objects.length;
|
1706
|
+
|
1386
1707
|
if (count === 0) {
|
1387
1708
|
return [0, 0, 0];
|
1388
1709
|
}
|
1710
|
+
|
1389
1711
|
var data = [count >> 8 & 0xFF, count & 0xff];
|
1390
1712
|
var lastOffset = 1,
|
1391
1713
|
i;
|
1714
|
+
|
1392
1715
|
for (i = 0; i < count; ++i) {
|
1393
1716
|
lastOffset += objects[i].length;
|
1394
1717
|
}
|
1718
|
+
|
1395
1719
|
var offsetSize;
|
1720
|
+
|
1396
1721
|
if (lastOffset < 0x100) {
|
1397
1722
|
offsetSize = 1;
|
1398
1723
|
} else if (lastOffset < 0x10000) {
|
@@ -1402,8 +1727,10 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1402
1727
|
} else {
|
1403
1728
|
offsetSize = 4;
|
1404
1729
|
}
|
1730
|
+
|
1405
1731
|
data.push(offsetSize);
|
1406
1732
|
var relativeOffset = 1;
|
1733
|
+
|
1407
1734
|
for (i = 0; i < count + 1; i++) {
|
1408
1735
|
if (offsetSize === 1) {
|
1409
1736
|
data.push(relativeOffset & 0xFF);
|
@@ -1414,30 +1741,26 @@ var CFFCompiler = function CFFCompilerClosure() {
|
|
1414
1741
|
} else {
|
1415
1742
|
data.push(relativeOffset >>> 24 & 0xFF, relativeOffset >> 16 & 0xFF, relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF);
|
1416
1743
|
}
|
1744
|
+
|
1417
1745
|
if (objects[i]) {
|
1418
1746
|
relativeOffset += objects[i].length;
|
1419
1747
|
}
|
1420
1748
|
}
|
1749
|
+
|
1421
1750
|
for (i = 0; i < count; i++) {
|
1422
1751
|
if (trackers[i]) {
|
1423
1752
|
trackers[i].offset(data.length);
|
1424
1753
|
}
|
1754
|
+
|
1425
1755
|
for (var j = 0, jj = objects[i].length; j < jj; j++) {
|
1426
1756
|
data.push(objects[i][j]);
|
1427
1757
|
}
|
1428
1758
|
}
|
1759
|
+
|
1429
1760
|
return data;
|
1430
1761
|
}
|
1431
1762
|
};
|
1432
1763
|
return CFFCompiler;
|
1433
1764
|
}();
|
1434
|
-
|
1435
|
-
exports.CFFParser = CFFParser;
|
1436
|
-
exports.CFF = CFF;
|
1437
|
-
exports.CFFHeader = CFFHeader;
|
1438
|
-
exports.CFFStrings = CFFStrings;
|
1439
|
-
exports.CFFIndex = CFFIndex;
|
1440
|
-
exports.CFFCharset = CFFCharset;
|
1441
|
-
exports.CFFTopDict = CFFTopDict;
|
1442
|
-
exports.CFFPrivateDict = CFFPrivateDict;
|
1765
|
+
|
1443
1766
|
exports.CFFCompiler = CFFCompiler;
|