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.

Files changed (161) hide show
  1. package/bower.json +1 -1
  2. package/build/pdf.js +15564 -9476
  3. package/build/pdf.js.map +1 -1
  4. package/build/pdf.min.js +1 -1
  5. package/build/pdf.worker.js +46644 -36309
  6. package/build/pdf.worker.js.map +1 -1
  7. package/build/pdf.worker.min.js +1 -1
  8. package/external/url/url-lib.js +627 -0
  9. package/image_decoders/pdf.image_decoders.js +11430 -0
  10. package/image_decoders/pdf.image_decoders.js.map +1 -0
  11. package/image_decoders/pdf.image_decoders.min.js +1 -0
  12. package/lib/core/annotation.js +406 -131
  13. package/lib/core/arithmetic_decoder.js +275 -245
  14. package/lib/core/bidi.js +65 -6
  15. package/lib/core/ccitt.js +173 -18
  16. package/lib/core/ccitt_stream.js +15 -6
  17. package/lib/core/cff_parser.js +376 -53
  18. package/lib/core/charsets.js +5 -4
  19. package/lib/core/chunked_stream.js +387 -149
  20. package/lib/core/cmap.js +310 -75
  21. package/lib/core/colorspace.js +874 -594
  22. package/lib/core/crypto.js +290 -45
  23. package/lib/core/document.js +545 -260
  24. package/lib/core/encodings.js +19 -10
  25. package/lib/core/evaluator.js +725 -147
  26. package/lib/core/font_renderer.js +360 -91
  27. package/lib/core/fonts.js +791 -186
  28. package/lib/core/function.js +284 -71
  29. package/lib/core/glyphlist.js +3 -2
  30. package/lib/core/image.js +168 -61
  31. package/lib/core/jbig2.js +479 -66
  32. package/lib/core/jbig2_stream.js +19 -8
  33. package/lib/core/jpeg_stream.js +38 -13
  34. package/lib/core/jpg.js +252 -29
  35. package/lib/core/jpx.js +396 -6
  36. package/lib/core/jpx_stream.js +18 -6
  37. package/lib/core/metrics.js +4 -4
  38. package/lib/core/murmurhash3.js +24 -6
  39. package/lib/core/obj.js +1137 -475
  40. package/lib/core/operator_list.js +108 -6
  41. package/lib/core/parser.js +321 -68
  42. package/lib/core/pattern.js +145 -13
  43. package/lib/core/pdf_manager.js +321 -133
  44. package/lib/core/primitives.js +75 -22
  45. package/lib/core/ps_parser.js +134 -45
  46. package/lib/core/standard_fonts.js +10 -10
  47. package/lib/core/stream.js +313 -34
  48. package/lib/core/type1_parser.js +143 -13
  49. package/lib/core/unicode.js +31 -4
  50. package/lib/core/worker.js +210 -66
  51. package/lib/display/annotation_layer.js +361 -123
  52. package/lib/display/api.js +1454 -729
  53. package/lib/display/api_compatibility.js +11 -13
  54. package/lib/display/canvas.js +324 -29
  55. package/lib/display/content_disposition.js +83 -32
  56. package/lib/display/dom_utils.js +226 -41
  57. package/lib/display/fetch_stream.js +208 -84
  58. package/lib/display/font_loader.js +465 -236
  59. package/lib/display/metadata.js +38 -16
  60. package/lib/display/network.js +216 -51
  61. package/lib/display/network_utils.js +32 -19
  62. package/lib/display/node_stream.js +352 -169
  63. package/lib/display/pattern_helper.js +58 -7
  64. package/lib/display/svg.js +242 -29
  65. package/lib/display/text_layer.js +132 -18
  66. package/lib/display/transport_stream.js +171 -42
  67. package/lib/display/webgl.js +64 -18
  68. package/lib/display/worker_options.js +5 -4
  69. package/lib/display/xml_parser.js +166 -53
  70. package/lib/examples/node/domstubs.js +57 -4
  71. package/lib/pdf.js +21 -4
  72. package/lib/pdf.worker.js +5 -3
  73. package/lib/shared/compatibility.js +158 -564
  74. package/lib/shared/global_scope.js +2 -2
  75. package/lib/shared/is_node.js +4 -4
  76. package/lib/shared/message_handler.js +521 -0
  77. package/lib/shared/streams_polyfill.js +21 -17
  78. package/lib/shared/url_polyfill.js +56 -0
  79. package/lib/shared/util.js +295 -650
  80. package/lib/test/unit/annotation_spec.js +629 -345
  81. package/lib/test/unit/api_spec.js +555 -253
  82. package/lib/test/unit/bidi_spec.js +7 -7
  83. package/lib/test/unit/cff_parser_spec.js +40 -11
  84. package/lib/test/unit/clitests_helper.js +9 -7
  85. package/lib/test/unit/cmap_spec.js +80 -26
  86. package/lib/test/unit/colorspace_spec.js +99 -52
  87. package/lib/test/unit/crypto_spec.js +17 -5
  88. package/lib/test/unit/custom_spec.js +41 -53
  89. package/lib/test/unit/display_svg_spec.js +33 -17
  90. package/lib/test/unit/document_spec.js +3 -3
  91. package/lib/test/unit/dom_utils_spec.js +9 -9
  92. package/lib/test/unit/encodings_spec.js +25 -45
  93. package/lib/test/unit/evaluator_spec.js +34 -9
  94. package/lib/test/unit/function_spec.js +17 -5
  95. package/lib/test/unit/jasmine-boot.js +31 -18
  96. package/lib/test/unit/{util_stream_spec.js → message_handler_spec.js} +41 -69
  97. package/lib/test/unit/metadata_spec.js +71 -11
  98. package/lib/test/unit/murmurhash3_spec.js +3 -3
  99. package/lib/test/unit/network_spec.js +20 -5
  100. package/lib/test/unit/network_utils_spec.js +41 -14
  101. package/lib/test/unit/node_stream_spec.js +51 -27
  102. package/lib/test/unit/parser_spec.js +35 -8
  103. package/lib/test/unit/pdf_find_controller_spec.js +230 -0
  104. package/lib/test/unit/pdf_find_utils_spec.js +63 -0
  105. package/lib/test/unit/pdf_history_spec.js +21 -9
  106. package/lib/test/unit/primitives_spec.js +24 -4
  107. package/lib/test/unit/stream_spec.js +12 -4
  108. package/lib/test/unit/test_utils.js +90 -27
  109. package/lib/test/unit/testreporter.js +21 -3
  110. package/lib/test/unit/type1_parser_spec.js +8 -6
  111. package/lib/test/unit/ui_utils_spec.js +452 -14
  112. package/lib/test/unit/unicode_spec.js +14 -11
  113. package/lib/test/unit/util_spec.js +131 -9
  114. package/lib/web/annotation_layer_builder.js +39 -22
  115. package/lib/web/app.js +1240 -582
  116. package/lib/web/app_options.js +71 -41
  117. package/lib/web/base_viewer.js +508 -179
  118. package/lib/web/chromecom.js +261 -117
  119. package/lib/web/debugger.js +166 -22
  120. package/lib/web/download_manager.js +31 -13
  121. package/lib/web/firefox_print_service.js +17 -9
  122. package/lib/web/firefoxcom.js +283 -79
  123. package/lib/web/genericcom.js +89 -30
  124. package/lib/web/genericl10n.js +142 -30
  125. package/lib/web/grab_to_pan.js +26 -4
  126. package/lib/web/interfaces.js +170 -47
  127. package/lib/web/overlay_manager.js +235 -85
  128. package/lib/web/password_prompt.js +21 -13
  129. package/lib/web/pdf_attachment_viewer.js +38 -18
  130. package/lib/web/pdf_cursor_tools.js +39 -16
  131. package/lib/web/pdf_document_properties.js +80 -30
  132. package/lib/web/pdf_find_bar.js +84 -40
  133. package/lib/web/pdf_find_controller.js +495 -184
  134. package/lib/web/pdf_find_utils.js +111 -0
  135. package/lib/web/pdf_history.js +190 -53
  136. package/lib/web/pdf_link_service.js +137 -76
  137. package/lib/web/pdf_outline_viewer.js +73 -22
  138. package/lib/web/pdf_page_view.js +196 -63
  139. package/lib/web/pdf_presentation_mode.js +99 -34
  140. package/lib/web/pdf_print_service.js +57 -11
  141. package/lib/web/pdf_rendering_queue.js +27 -5
  142. package/lib/web/pdf_sidebar.js +120 -67
  143. package/lib/web/pdf_sidebar_resizer.js +42 -16
  144. package/lib/web/pdf_single_page_viewer.js +74 -66
  145. package/lib/web/pdf_thumbnail_view.js +103 -32
  146. package/lib/web/pdf_thumbnail_viewer.js +64 -24
  147. package/lib/web/pdf_viewer.component.js +112 -32
  148. package/lib/web/pdf_viewer.js +91 -52
  149. package/lib/web/preferences.js +275 -80
  150. package/lib/web/secondary_toolbar.js +165 -40
  151. package/lib/web/text_layer_builder.js +162 -65
  152. package/lib/web/toolbar.js +78 -43
  153. package/lib/web/ui_utils.js +462 -136
  154. package/lib/web/view_history.js +215 -67
  155. package/lib/web/viewer_compatibility.js +4 -13
  156. package/package.json +5 -4
  157. package/web/pdf_viewer.css +58 -1
  158. package/web/pdf_viewer.js +6346 -3919
  159. package/web/pdf_viewer.js.map +1 -1
  160. package/lib/test/unit/fonts_spec.js +0 -81
  161. package/lib/web/dom_events.js +0 -137
@@ -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 2017 Mozilla Foundation
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
- 'use strict';
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 = undefined;
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('../shared/util');
29
+ var _util = require("../shared/util");
30
30
 
31
- var _charsets = require('./charsets');
31
+ var _charsets = require("./charsets");
32
32
 
33
- var _encodings = require('./encodings');
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('Unknown encoding format: ' + format + ' in CFF');
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
- rawBytes;
804
- var i,
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
- rawBytes = bytes.subarray(start, pos);
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('parseFDSelect: Unknown format "' + format + '".');
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
- return new CFFFDSelect(fdSelect, rawBytes);
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('Invalid dictionary name "' + name + '"');
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('Invalid dictionary name ' + name + '"');
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(fdSelect, raw) {
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('Already tracking location of ' + key);
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('Not tracking location of ' + key);
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
- if (cff.charset && cff.topDict.hasName('charset')) {
1156
- if (cff.charset.predefined) {
1157
- topDictTracker.setEntryLocation('charset', [cff.charset.format], output);
1158
- } else {
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.raw);
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.substr(i, 2), 16));
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('Unknown data type of ' + type);
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
- return this.compileIndex(charStrings);
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
- return this.compileTypedArray(charset.raw);
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
- return this.compileTypedArray(fdSelect);
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
- exports.CFFStandardStrings = CFFStandardStrings;
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;