pdfjs-dist 2.2.228 → 2.6.347

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 (229) hide show
  1. package/README.md +4 -0
  2. package/bower.json +1 -1
  3. package/build/pdf.js +8816 -19300
  4. package/build/pdf.js.map +1 -1
  5. package/build/pdf.min.js +22 -1
  6. package/build/pdf.worker.entry.js +5 -3
  7. package/build/pdf.worker.js +27185 -35746
  8. package/build/pdf.worker.js.map +1 -1
  9. package/build/pdf.worker.min.js +22 -1
  10. package/es5/build/pdf.js +26665 -0
  11. package/es5/build/pdf.js.map +1 -0
  12. package/es5/build/pdf.min.js +22 -0
  13. package/{lib/shared/global_scope.js → es5/build/pdf.worker.entry.js} +5 -10
  14. package/es5/build/pdf.worker.js +61231 -0
  15. package/es5/build/pdf.worker.js.map +1 -0
  16. package/es5/build/pdf.worker.min.js +22 -0
  17. package/es5/image_decoders/pdf.image_decoders.js +12529 -0
  18. package/es5/image_decoders/pdf.image_decoders.js.map +1 -0
  19. package/es5/image_decoders/pdf.image_decoders.min.js +22 -0
  20. package/es5/web/images/annotation-check.svg +11 -0
  21. package/es5/web/images/annotation-comment.svg +16 -0
  22. package/es5/web/images/annotation-help.svg +26 -0
  23. package/es5/web/images/annotation-insert.svg +10 -0
  24. package/es5/web/images/annotation-key.svg +11 -0
  25. package/es5/web/images/annotation-newparagraph.svg +11 -0
  26. package/es5/web/images/annotation-noicon.svg +7 -0
  27. package/es5/web/images/annotation-note.svg +42 -0
  28. package/es5/web/images/annotation-paragraph.svg +16 -0
  29. package/es5/web/images/loading-icon.gif +0 -0
  30. package/es5/web/images/shadow.png +0 -0
  31. package/es5/web/pdf_viewer.css +406 -0
  32. package/es5/web/pdf_viewer.js +7886 -0
  33. package/es5/web/pdf_viewer.js.map +1 -0
  34. package/image_decoders/pdf.image_decoders.js +1498 -4832
  35. package/image_decoders/pdf.image_decoders.js.map +1 -1
  36. package/image_decoders/pdf.image_decoders.min.js +22 -1
  37. package/lib/README.md +7 -0
  38. package/lib/core/annotation.js +1144 -927
  39. package/lib/core/arithmetic_decoder.js +81 -97
  40. package/lib/core/bidi.js +54 -46
  41. package/lib/core/ccitt.js +88 -81
  42. package/lib/core/ccitt_stream.js +15 -14
  43. package/lib/core/cff_parser.js +747 -716
  44. package/lib/core/charsets.js +4 -4
  45. package/lib/core/chunked_stream.js +462 -553
  46. package/lib/core/cmap.js +231 -277
  47. package/lib/core/colorspace.js +715 -857
  48. package/lib/core/core_utils.js +57 -52
  49. package/lib/core/crypto.js +416 -437
  50. package/lib/core/document.js +629 -670
  51. package/lib/core/encodings.js +15 -15
  52. package/lib/core/evaluator.js +3229 -2800
  53. package/lib/core/font_renderer.js +135 -178
  54. package/lib/core/fonts.js +602 -534
  55. package/lib/core/function.js +355 -279
  56. package/lib/core/glyphlist.js +4527 -4526
  57. package/lib/core/image.js +442 -439
  58. package/lib/core/image_utils.js +221 -61
  59. package/lib/core/jbig2.js +325 -316
  60. package/lib/core/jbig2_stream.js +18 -17
  61. package/lib/core/jpeg_stream.js +21 -26
  62. package/lib/core/jpg.js +289 -233
  63. package/lib/core/jpx.js +161 -143
  64. package/lib/core/jpx_stream.js +28 -28
  65. package/lib/core/metrics.js +2928 -2928
  66. package/lib/core/murmurhash3.js +87 -102
  67. package/lib/core/obj.js +1343 -1300
  68. package/lib/core/operator_list.js +90 -67
  69. package/lib/core/parser.js +990 -987
  70. package/lib/core/pattern.js +105 -77
  71. package/lib/core/pdf_manager.js +149 -316
  72. package/lib/core/primitives.js +156 -104
  73. package/lib/core/ps_parser.js +175 -214
  74. package/lib/core/standard_fonts.js +237 -236
  75. package/lib/core/stream.js +94 -74
  76. package/lib/core/type1_parser.js +89 -69
  77. package/lib/core/unicode.js +1654 -1654
  78. package/lib/core/worker.js +275 -290
  79. package/lib/core/worker_stream.js +101 -210
  80. package/lib/core/writer.js +242 -0
  81. package/lib/display/annotation_layer.js +772 -1041
  82. package/lib/display/annotation_storage.js +89 -0
  83. package/lib/display/api.js +1575 -1868
  84. package/lib/display/api_compatibility.js +12 -17
  85. package/lib/display/canvas.js +370 -222
  86. package/lib/display/content_disposition.js +40 -59
  87. package/lib/display/display_utils.js +341 -536
  88. package/lib/display/fetch_stream.js +188 -304
  89. package/lib/display/font_loader.js +282 -414
  90. package/lib/display/metadata.js +81 -99
  91. package/lib/display/network.js +362 -511
  92. package/lib/display/network_utils.js +25 -18
  93. package/lib/display/node_stream.js +283 -465
  94. package/lib/display/node_utils.js +87 -0
  95. package/lib/display/optional_content_config.js +184 -0
  96. package/lib/display/pattern_helper.js +93 -44
  97. package/lib/display/svg.js +1163 -1401
  98. package/lib/display/text_layer.js +154 -137
  99. package/lib/display/transport_stream.js +237 -375
  100. package/lib/display/webgl.js +70 -83
  101. package/lib/display/worker_options.js +3 -3
  102. package/lib/display/xml_parser.js +303 -392
  103. package/lib/examples/node/domstubs.js +37 -37
  104. package/lib/pdf.js +220 -58
  105. package/lib/pdf.worker.js +14 -6
  106. package/lib/shared/compatibility.js +3 -246
  107. package/lib/shared/is_node.js +7 -6
  108. package/lib/shared/message_handler.js +327 -332
  109. package/lib/shared/util.js +271 -306
  110. package/lib/test/unit/annotation_spec.js +1902 -763
  111. package/lib/test/unit/annotation_storage_spec.js +83 -0
  112. package/lib/test/unit/api_spec.js +790 -592
  113. package/lib/test/unit/bidi_spec.js +7 -7
  114. package/lib/test/unit/cff_parser_spec.js +73 -72
  115. package/lib/test/unit/clitests_helper.js +7 -9
  116. package/lib/test/unit/cmap_spec.js +86 -88
  117. package/lib/test/unit/colorspace_spec.js +346 -154
  118. package/lib/test/unit/core_utils_spec.js +125 -105
  119. package/lib/test/unit/crypto_spec.js +232 -185
  120. package/lib/test/unit/custom_spec.js +150 -24
  121. package/lib/test/unit/display_svg_spec.js +34 -39
  122. package/lib/test/unit/display_utils_spec.js +139 -149
  123. package/lib/test/unit/document_spec.js +128 -17
  124. package/lib/test/unit/encodings_spec.js +12 -34
  125. package/lib/test/unit/evaluator_spec.js +112 -91
  126. package/lib/test/unit/fetch_stream_spec.js +31 -29
  127. package/lib/test/unit/function_spec.js +206 -204
  128. package/lib/test/unit/jasmine-boot.js +48 -32
  129. package/lib/test/unit/message_handler_spec.js +173 -159
  130. package/lib/test/unit/metadata_spec.js +71 -71
  131. package/lib/test/unit/murmurhash3_spec.js +12 -12
  132. package/lib/test/unit/network_spec.js +13 -11
  133. package/lib/test/unit/network_utils_spec.js +158 -144
  134. package/lib/test/unit/node_stream_spec.js +76 -90
  135. package/lib/test/unit/parser_spec.js +108 -114
  136. package/lib/test/unit/pdf_find_controller_spec.js +55 -86
  137. package/lib/test/unit/pdf_find_utils_spec.js +32 -32
  138. package/lib/test/unit/pdf_history_spec.js +32 -32
  139. package/lib/test/unit/primitives_spec.js +337 -156
  140. package/lib/test/unit/stream_spec.js +16 -14
  141. package/lib/test/unit/test_utils.js +91 -304
  142. package/lib/test/unit/testreporter.js +33 -22
  143. package/lib/test/unit/type1_parser_spec.js +42 -42
  144. package/lib/test/unit/ui_utils_spec.js +299 -461
  145. package/lib/test/unit/unicode_spec.js +42 -42
  146. package/lib/test/unit/util_spec.js +129 -149
  147. package/lib/test/unit/writer_spec.js +84 -0
  148. package/lib/web/annotation_layer_builder.js +78 -111
  149. package/lib/web/app.js +1542 -1267
  150. package/lib/web/app_options.js +76 -91
  151. package/lib/web/base_tree_viewer.js +100 -0
  152. package/lib/web/base_viewer.js +869 -834
  153. package/lib/web/chromecom.js +165 -252
  154. package/lib/web/debugger.js +149 -205
  155. package/lib/web/download_manager.js +34 -58
  156. package/lib/web/firefox_print_service.js +62 -34
  157. package/lib/web/firefoxcom.js +206 -374
  158. package/lib/web/genericcom.js +26 -108
  159. package/lib/web/genericl10n.js +24 -153
  160. package/lib/web/grab_to_pan.js +30 -30
  161. package/lib/web/interfaces.js +80 -254
  162. package/lib/web/overlay_manager.js +70 -246
  163. package/lib/web/password_prompt.js +38 -64
  164. package/lib/web/pdf_attachment_viewer.js +150 -126
  165. package/lib/web/pdf_cursor_tools.js +75 -102
  166. package/lib/web/pdf_document_properties.js +229 -383
  167. package/lib/web/pdf_find_bar.js +136 -170
  168. package/lib/web/pdf_find_controller.js +492 -548
  169. package/lib/web/pdf_find_utils.js +13 -13
  170. package/lib/web/pdf_history.js +397 -406
  171. package/lib/web/pdf_layer_viewer.js +208 -0
  172. package/lib/web/pdf_link_service.js +304 -348
  173. package/lib/web/pdf_outline_viewer.js +119 -212
  174. package/lib/web/pdf_page_view.js +474 -513
  175. package/lib/web/pdf_presentation_mode.js +308 -357
  176. package/lib/web/pdf_print_service.js +96 -110
  177. package/lib/web/pdf_rendering_queue.js +87 -108
  178. package/lib/web/pdf_sidebar.js +286 -302
  179. package/lib/web/pdf_sidebar_resizer.js +92 -119
  180. package/lib/web/pdf_single_page_viewer.js +77 -126
  181. package/lib/web/pdf_thumbnail_view.js +289 -297
  182. package/lib/web/pdf_thumbnail_viewer.js +202 -206
  183. package/lib/web/pdf_viewer.component.js +20 -21
  184. package/lib/web/pdf_viewer.js +55 -115
  185. package/lib/web/preferences.js +69 -273
  186. package/lib/web/secondary_toolbar.js +164 -196
  187. package/lib/web/text_layer_builder.js +284 -319
  188. package/lib/web/toolbar.js +217 -210
  189. package/lib/web/ui_utils.js +274 -421
  190. package/lib/web/view_history.js +52 -226
  191. package/lib/web/viewer_compatibility.js +21 -6
  192. package/package.json +4 -9
  193. package/types/display/annotation_layer.d.ts +61 -0
  194. package/types/display/annotation_storage.d.ts +36 -0
  195. package/types/display/api.d.ts +1107 -0
  196. package/types/display/api_compatibility.d.ts +1 -0
  197. package/types/display/canvas.d.ts +4 -0
  198. package/types/display/content_disposition.d.ts +7 -0
  199. package/types/display/display_utils.d.ts +243 -0
  200. package/types/display/fetch_stream.d.ts +67 -0
  201. package/types/display/font_loader.d.ts +19 -0
  202. package/types/display/metadata.d.ts +9 -0
  203. package/types/display/network.d.ts +80 -0
  204. package/types/display/network_utils.d.ts +14 -0
  205. package/types/display/node_stream.d.ts +72 -0
  206. package/types/display/node_utils.d.ts +6 -0
  207. package/types/display/optional_content_config.d.ts +12 -0
  208. package/types/display/pattern_helper.d.ts +5 -0
  209. package/types/display/svg.d.ts +2 -0
  210. package/types/display/text_layer.d.ts +83 -0
  211. package/types/display/transport_stream.d.ts +57 -0
  212. package/types/display/webgl.d.ts +20 -0
  213. package/types/display/worker_options.d.ts +27 -0
  214. package/types/display/xml_parser.d.ts +35 -0
  215. package/types/pdf.d.ts +33 -0
  216. package/types/shared/compatibility.d.ts +1 -0
  217. package/types/shared/is_node.d.ts +1 -0
  218. package/types/shared/message_handler.d.ts +62 -0
  219. package/types/shared/util.d.ts +421 -0
  220. package/web/images/shadow.png +0 -0
  221. package/web/pdf_viewer.css +29 -27
  222. package/web/pdf_viewer.js +3524 -4746
  223. package/web/pdf_viewer.js.map +1 -1
  224. package/webpack.js +6 -5
  225. package/external/streams/streams-lib.js +0 -3962
  226. package/external/url/url-lib.js +0 -627
  227. package/lib/shared/streams_polyfill.js +0 -43
  228. package/lib/shared/url_polyfill.js +0 -56
  229. package/web/images/texture.png +0 -0
package/lib/core/jpg.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 2019 Mozilla Foundation
5
+ * Copyright 2020 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.
@@ -26,43 +26,26 @@ Object.defineProperty(exports, "__esModule", {
26
26
  });
27
27
  exports.JpegImage = void 0;
28
28
 
29
- var _util = require("../shared/util");
29
+ var _util = require("../shared/util.js");
30
30
 
31
- function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
31
+ var _core_utils = require("./core_utils.js");
32
32
 
33
- var JpegError = function JpegErrorClosure() {
34
- function JpegError(msg) {
35
- this.message = 'JPEG error: ' + msg;
33
+ class JpegError extends _util.BaseException {
34
+ constructor(msg) {
35
+ super(`JPEG error: ${msg}`);
36
36
  }
37
37
 
38
- JpegError.prototype = new Error();
39
- JpegError.prototype.name = 'JpegError';
40
- JpegError.constructor = JpegError;
41
- return JpegError;
42
- }();
38
+ }
43
39
 
44
- var DNLMarkerError = function DNLMarkerErrorClosure() {
45
- function DNLMarkerError(message, scanLines) {
46
- this.message = message;
40
+ class DNLMarkerError extends _util.BaseException {
41
+ constructor(message, scanLines) {
42
+ super(message);
47
43
  this.scanLines = scanLines;
48
44
  }
49
45
 
50
- DNLMarkerError.prototype = new Error();
51
- DNLMarkerError.prototype.name = 'DNLMarkerError';
52
- DNLMarkerError.constructor = DNLMarkerError;
53
- return DNLMarkerError;
54
- }();
55
-
56
- var EOIMarkerError = function EOIMarkerErrorClosure() {
57
- function EOIMarkerError(message) {
58
- this.message = message;
59
- }
46
+ }
60
47
 
61
- EOIMarkerError.prototype = new Error();
62
- EOIMarkerError.prototype.name = 'EOIMarkerError';
63
- EOIMarkerError.constructor = EOIMarkerError;
64
- return EOIMarkerError;
65
- }();
48
+ class EOIMarkerError extends _util.BaseException {}
66
49
 
67
50
  var JpegImage = function JpegImageClosure() {
68
51
  var dctZigZag = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]);
@@ -75,13 +58,10 @@ var JpegImage = function JpegImageClosure() {
75
58
  var dctSqrt2 = 5793;
76
59
  var dctSqrt1d2 = 2896;
77
60
 
78
- function JpegImage() {
79
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
80
- _ref$decodeTransform = _ref.decodeTransform,
81
- decodeTransform = _ref$decodeTransform === void 0 ? null : _ref$decodeTransform,
82
- _ref$colorTransform = _ref.colorTransform,
83
- colorTransform = _ref$colorTransform === void 0 ? -1 : _ref$colorTransform;
84
-
61
+ function JpegImage({
62
+ decodeTransform = null,
63
+ colorTransform = -1
64
+ } = {}) {
85
65
  this._decodeTransform = decodeTransform;
86
66
  this._colorTransform = colorTransform;
87
67
  }
@@ -145,12 +125,11 @@ var JpegImage = function JpegImageClosure() {
145
125
  return 64 * ((component.blocksPerLine + 1) * row + col);
146
126
  }
147
127
 
148
- function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) {
149
- var parseDNLMarker = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : false;
128
+ function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive, parseDNLMarker = false) {
150
129
  var mcusPerLine = frame.mcusPerLine;
151
130
  var progressive = frame.progressive;
152
- var startOffset = offset,
153
- bitsData = 0,
131
+ const startOffset = offset;
132
+ let bitsData = 0,
154
133
  bitsCount = 0;
155
134
 
156
135
  function readBit() {
@@ -161,22 +140,31 @@ var JpegImage = function JpegImageClosure() {
161
140
 
162
141
  bitsData = data[offset++];
163
142
 
164
- if (bitsData === 0xFF) {
143
+ if (bitsData === 0xff) {
165
144
  var nextByte = data[offset++];
166
145
 
167
146
  if (nextByte) {
168
- if (nextByte === 0xDC && parseDNLMarker) {
147
+ if (nextByte === 0xdc && parseDNLMarker) {
148
+ offset += 2;
149
+ const scanLines = (0, _core_utils.readUint16)(data, offset);
169
150
  offset += 2;
170
- var scanLines = data[offset++] << 8 | data[offset++];
171
151
 
172
152
  if (scanLines > 0 && scanLines !== frame.scanLines) {
173
- throw new DNLMarkerError('Found DNL marker (0xFFDC) while parsing scan data', scanLines);
153
+ throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data", scanLines);
174
154
  }
175
- } else if (nextByte === 0xD9) {
176
- throw new EOIMarkerError('Found EOI marker (0xFFD9) while parsing scan data');
155
+ } else if (nextByte === 0xd9) {
156
+ if (parseDNLMarker) {
157
+ const maybeScanLines = blockRow * (frame.precision === 8 ? 8 : 0);
158
+
159
+ if (maybeScanLines > 0 && Math.round(frame.scanLines / maybeScanLines) >= 10) {
160
+ throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, " + "possibly caused by incorrect `scanLines` parameter", maybeScanLines);
161
+ }
162
+ }
163
+
164
+ throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data");
177
165
  }
178
166
 
179
- throw new JpegError("unexpected marker ".concat((bitsData << 8 | nextByte).toString(16)));
167
+ throw new JpegError(`unexpected marker ${(bitsData << 8 | nextByte).toString(16)}`);
180
168
  }
181
169
  }
182
170
 
@@ -190,13 +178,15 @@ var JpegImage = function JpegImageClosure() {
190
178
  while (true) {
191
179
  node = node[readBit()];
192
180
 
193
- if (typeof node === 'number') {
194
- return node;
195
- }
181
+ switch (typeof node) {
182
+ case "number":
183
+ return node;
196
184
 
197
- if (_typeof(node) !== 'object') {
198
- throw new JpegError('invalid huffman sequence');
185
+ case "object":
186
+ continue;
199
187
  }
188
+
189
+ throw new JpegError("invalid huffman sequence");
200
190
  }
201
191
  }
202
192
 
@@ -225,10 +215,10 @@ var JpegImage = function JpegImageClosure() {
225
215
  return n + (-1 << length) + 1;
226
216
  }
227
217
 
228
- function decodeBaseline(component, offset) {
218
+ function decodeBaseline(component, blockOffset) {
229
219
  var t = decodeHuffman(component.huffmanTableDC);
230
220
  var diff = t === 0 ? 0 : receiveAndExtend(t);
231
- component.blockData[offset] = component.pred += diff;
221
+ component.blockData[blockOffset] = component.pred += diff;
232
222
  var k = 1;
233
223
 
234
224
  while (k < 64) {
@@ -247,24 +237,24 @@ var JpegImage = function JpegImageClosure() {
247
237
 
248
238
  k += r;
249
239
  var z = dctZigZag[k];
250
- component.blockData[offset + z] = receiveAndExtend(s);
240
+ component.blockData[blockOffset + z] = receiveAndExtend(s);
251
241
  k++;
252
242
  }
253
243
  }
254
244
 
255
- function decodeDCFirst(component, offset) {
245
+ function decodeDCFirst(component, blockOffset) {
256
246
  var t = decodeHuffman(component.huffmanTableDC);
257
247
  var diff = t === 0 ? 0 : receiveAndExtend(t) << successive;
258
- component.blockData[offset] = component.pred += diff;
248
+ component.blockData[blockOffset] = component.pred += diff;
259
249
  }
260
250
 
261
- function decodeDCSuccessive(component, offset) {
262
- component.blockData[offset] |= readBit() << successive;
251
+ function decodeDCSuccessive(component, blockOffset) {
252
+ component.blockData[blockOffset] |= readBit() << successive;
263
253
  }
264
254
 
265
255
  var eobrun = 0;
266
256
 
267
- function decodeACFirst(component, offset) {
257
+ function decodeACFirst(component, blockOffset) {
268
258
  if (eobrun > 0) {
269
259
  eobrun--;
270
260
  return;
@@ -290,7 +280,7 @@ var JpegImage = function JpegImageClosure() {
290
280
 
291
281
  k += r;
292
282
  var z = dctZigZag[k];
293
- component.blockData[offset + z] = receiveAndExtend(s) * (1 << successive);
283
+ component.blockData[blockOffset + z] = receiveAndExtend(s) * (1 << successive);
294
284
  k++;
295
285
  }
296
286
  }
@@ -298,7 +288,7 @@ var JpegImage = function JpegImageClosure() {
298
288
  var successiveACState = 0,
299
289
  successiveACNextValue;
300
290
 
301
- function decodeACSuccessive(component, offset) {
291
+ function decodeACSuccessive(component, blockOffset) {
302
292
  var k = spectralStart;
303
293
  var e = spectralEnd;
304
294
  var r = 0;
@@ -306,8 +296,8 @@ var JpegImage = function JpegImageClosure() {
306
296
  var rs;
307
297
 
308
298
  while (k <= e) {
309
- var offsetZ = offset + dctZigZag[k];
310
- var sign = component.blockData[offsetZ] < 0 ? -1 : 1;
299
+ const offsetZ = blockOffset + dctZigZag[k];
300
+ const sign = component.blockData[offsetZ] < 0 ? -1 : 1;
311
301
 
312
302
  switch (successiveACState) {
313
303
  case 0:
@@ -325,7 +315,7 @@ var JpegImage = function JpegImageClosure() {
325
315
  }
326
316
  } else {
327
317
  if (s !== 1) {
328
- throw new JpegError('invalid ACn encoding');
318
+ throw new JpegError("invalid ACn encoding");
329
319
  }
330
320
 
331
321
  successiveACNextValue = receiveAndExtend(s);
@@ -378,20 +368,22 @@ var JpegImage = function JpegImageClosure() {
378
368
  }
379
369
  }
380
370
 
371
+ let blockRow = 0;
372
+
381
373
  function decodeMcu(component, decode, mcu, row, col) {
382
374
  var mcuRow = mcu / mcusPerLine | 0;
383
375
  var mcuCol = mcu % mcusPerLine;
384
- var blockRow = mcuRow * component.v + row;
376
+ blockRow = mcuRow * component.v + row;
385
377
  var blockCol = mcuCol * component.h + col;
386
- var offset = getBlockBufferOffset(component, blockRow, blockCol);
387
- decode(component, offset);
378
+ const blockOffset = getBlockBufferOffset(component, blockRow, blockCol);
379
+ decode(component, blockOffset);
388
380
  }
389
381
 
390
382
  function decodeBlock(component, decode, mcu) {
391
- var blockRow = mcu / component.blocksPerLine | 0;
383
+ blockRow = mcu / component.blocksPerLine | 0;
392
384
  var blockCol = mcu % component.blocksPerLine;
393
- var offset = getBlockBufferOffset(component, blockRow, blockCol);
394
- decode(component, offset);
385
+ const blockOffset = getBlockBufferOffset(component, blockRow, blockCol);
386
+ decode(component, blockOffset);
395
387
  }
396
388
 
397
389
  var componentsLength = components.length;
@@ -420,68 +412,62 @@ var JpegImage = function JpegImageClosure() {
420
412
 
421
413
  var h, v;
422
414
 
423
- while (mcu < mcuExpected) {
415
+ while (mcu <= mcuExpected) {
424
416
  var mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected;
425
417
 
426
- for (i = 0; i < componentsLength; i++) {
427
- components[i].pred = 0;
428
- }
418
+ if (mcuToRead > 0) {
419
+ for (i = 0; i < componentsLength; i++) {
420
+ components[i].pred = 0;
421
+ }
429
422
 
430
- eobrun = 0;
423
+ eobrun = 0;
431
424
 
432
- if (componentsLength === 1) {
433
- component = components[0];
425
+ if (componentsLength === 1) {
426
+ component = components[0];
434
427
 
435
- for (n = 0; n < mcuToRead; n++) {
436
- decodeBlock(component, decodeFn, mcu);
437
- mcu++;
438
- }
439
- } else {
440
- for (n = 0; n < mcuToRead; n++) {
441
- for (i = 0; i < componentsLength; i++) {
442
- component = components[i];
443
- h = component.h;
444
- v = component.v;
445
-
446
- for (j = 0; j < v; j++) {
447
- for (k = 0; k < h; k++) {
448
- decodeMcu(component, decodeFn, mcu, j, k);
428
+ for (n = 0; n < mcuToRead; n++) {
429
+ decodeBlock(component, decodeFn, mcu);
430
+ mcu++;
431
+ }
432
+ } else {
433
+ for (n = 0; n < mcuToRead; n++) {
434
+ for (i = 0; i < componentsLength; i++) {
435
+ component = components[i];
436
+ h = component.h;
437
+ v = component.v;
438
+
439
+ for (j = 0; j < v; j++) {
440
+ for (k = 0; k < h; k++) {
441
+ decodeMcu(component, decodeFn, mcu, j, k);
442
+ }
449
443
  }
450
444
  }
451
- }
452
445
 
453
- mcu++;
446
+ mcu++;
447
+ }
454
448
  }
455
449
  }
456
450
 
457
451
  bitsCount = 0;
458
452
  fileMarker = findNextFileMarker(data, offset);
459
453
 
460
- if (fileMarker && fileMarker.invalid) {
461
- (0, _util.warn)('decodeScan - unexpected MCU data, current marker is: ' + fileMarker.invalid);
462
- offset = fileMarker.offset;
454
+ if (!fileMarker) {
455
+ break;
463
456
  }
464
457
 
465
- var marker = fileMarker && fileMarker.marker;
466
-
467
- if (!marker || marker <= 0xFF00) {
468
- throw new JpegError('marker was not found');
458
+ if (fileMarker.invalid) {
459
+ const partialMsg = mcuToRead > 0 ? "unexpected" : "excessive";
460
+ (0, _util.warn)(`decodeScan - ${partialMsg} MCU data, current marker is: ${fileMarker.invalid}`);
461
+ offset = fileMarker.offset;
469
462
  }
470
463
 
471
- if (marker >= 0xFFD0 && marker <= 0xFFD7) {
464
+ if (fileMarker.marker >= 0xffd0 && fileMarker.marker <= 0xffd7) {
472
465
  offset += 2;
473
466
  } else {
474
467
  break;
475
468
  }
476
469
  }
477
470
 
478
- fileMarker = findNextFileMarker(data, offset);
479
-
480
- if (fileMarker && fileMarker.invalid) {
481
- (0, _util.warn)('decodeScan - unexpected Scan data, current marker is: ' + fileMarker.invalid);
482
- offset = fileMarker.offset;
483
- }
484
-
485
471
  return offset - startOffset;
486
472
  }
487
473
 
@@ -493,7 +479,7 @@ var JpegImage = function JpegImageClosure() {
493
479
  var t;
494
480
 
495
481
  if (!qt) {
496
- throw new JpegError('missing required Quantization Table.');
482
+ throw new JpegError("missing required Quantization Table.");
497
483
  }
498
484
 
499
485
  for (var row = 0; row < 64; row += 8) {
@@ -576,7 +562,15 @@ var JpegImage = function JpegImageClosure() {
576
562
 
577
563
  if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
578
564
  t = dctSqrt2 * p0 + 8192 >> 14;
579
- t = t < -2040 ? 0 : t >= 2024 ? 255 : t + 2056 >> 4;
565
+
566
+ if (t < -2040) {
567
+ t = 0;
568
+ } else if (t >= 2024) {
569
+ t = 255;
570
+ } else {
571
+ t = t + 2056 >> 4;
572
+ }
573
+
580
574
  blockData[blockBufferOffset + col] = t;
581
575
  blockData[blockBufferOffset + col + 8] = t;
582
576
  blockData[blockBufferOffset + col + 16] = t;
@@ -623,14 +617,71 @@ var JpegImage = function JpegImageClosure() {
623
617
  p5 = v2 - v5;
624
618
  p3 = v3 + v4;
625
619
  p4 = v3 - v4;
626
- p0 = p0 < 16 ? 0 : p0 >= 4080 ? 255 : p0 >> 4;
627
- p1 = p1 < 16 ? 0 : p1 >= 4080 ? 255 : p1 >> 4;
628
- p2 = p2 < 16 ? 0 : p2 >= 4080 ? 255 : p2 >> 4;
629
- p3 = p3 < 16 ? 0 : p3 >= 4080 ? 255 : p3 >> 4;
630
- p4 = p4 < 16 ? 0 : p4 >= 4080 ? 255 : p4 >> 4;
631
- p5 = p5 < 16 ? 0 : p5 >= 4080 ? 255 : p5 >> 4;
632
- p6 = p6 < 16 ? 0 : p6 >= 4080 ? 255 : p6 >> 4;
633
- p7 = p7 < 16 ? 0 : p7 >= 4080 ? 255 : p7 >> 4;
620
+
621
+ if (p0 < 16) {
622
+ p0 = 0;
623
+ } else if (p0 >= 4080) {
624
+ p0 = 255;
625
+ } else {
626
+ p0 >>= 4;
627
+ }
628
+
629
+ if (p1 < 16) {
630
+ p1 = 0;
631
+ } else if (p1 >= 4080) {
632
+ p1 = 255;
633
+ } else {
634
+ p1 >>= 4;
635
+ }
636
+
637
+ if (p2 < 16) {
638
+ p2 = 0;
639
+ } else if (p2 >= 4080) {
640
+ p2 = 255;
641
+ } else {
642
+ p2 >>= 4;
643
+ }
644
+
645
+ if (p3 < 16) {
646
+ p3 = 0;
647
+ } else if (p3 >= 4080) {
648
+ p3 = 255;
649
+ } else {
650
+ p3 >>= 4;
651
+ }
652
+
653
+ if (p4 < 16) {
654
+ p4 = 0;
655
+ } else if (p4 >= 4080) {
656
+ p4 = 255;
657
+ } else {
658
+ p4 >>= 4;
659
+ }
660
+
661
+ if (p5 < 16) {
662
+ p5 = 0;
663
+ } else if (p5 >= 4080) {
664
+ p5 = 255;
665
+ } else {
666
+ p5 >>= 4;
667
+ }
668
+
669
+ if (p6 < 16) {
670
+ p6 = 0;
671
+ } else if (p6 >= 4080) {
672
+ p6 = 255;
673
+ } else {
674
+ p6 >>= 4;
675
+ }
676
+
677
+ if (p7 < 16) {
678
+ p7 = 0;
679
+ } else if (p7 >= 4080) {
680
+ p7 = 255;
681
+ } else {
682
+ p7 >>= 4;
683
+ }
684
+
634
685
  blockData[blockBufferOffset + col] = p0;
635
686
  blockData[blockBufferOffset + col + 8] = p1;
636
687
  blockData[blockBufferOffset + col + 16] = p2;
@@ -657,23 +708,17 @@ var JpegImage = function JpegImageClosure() {
657
708
  return component.blockData;
658
709
  }
659
710
 
660
- function findNextFileMarker(data, currentPos) {
661
- var startPos = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : currentPos;
662
-
663
- function peekUint16(pos) {
664
- return data[pos] << 8 | data[pos + 1];
665
- }
666
-
667
- var maxPos = data.length - 1;
711
+ function findNextFileMarker(data, currentPos, startPos = currentPos) {
712
+ const maxPos = data.length - 1;
668
713
  var newPos = startPos < currentPos ? startPos : currentPos;
669
714
 
670
715
  if (currentPos >= maxPos) {
671
716
  return null;
672
717
  }
673
718
 
674
- var currentMarker = peekUint16(currentPos);
719
+ var currentMarker = (0, _core_utils.readUint16)(data, currentPos);
675
720
 
676
- if (currentMarker >= 0xFFC0 && currentMarker <= 0xFFFE) {
721
+ if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) {
677
722
  return {
678
723
  invalid: null,
679
724
  marker: currentMarker,
@@ -681,14 +726,14 @@ var JpegImage = function JpegImageClosure() {
681
726
  };
682
727
  }
683
728
 
684
- var newMarker = peekUint16(newPos);
729
+ var newMarker = (0, _core_utils.readUint16)(data, newPos);
685
730
 
686
- while (!(newMarker >= 0xFFC0 && newMarker <= 0xFFFE)) {
731
+ while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) {
687
732
  if (++newPos >= maxPos) {
688
733
  return null;
689
734
  }
690
735
 
691
- newMarker = peekUint16(newPos);
736
+ newMarker = (0, _core_utils.readUint16)(data, newPos);
692
737
  }
693
738
 
694
739
  return {
@@ -699,24 +744,17 @@ var JpegImage = function JpegImageClosure() {
699
744
  }
700
745
 
701
746
  JpegImage.prototype = {
702
- parse: function parse(data) {
703
- var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
704
- _ref2$dnlScanLines = _ref2.dnlScanLines,
705
- dnlScanLines = _ref2$dnlScanLines === void 0 ? null : _ref2$dnlScanLines;
706
-
707
- function readUint16() {
708
- var value = data[offset] << 8 | data[offset + 1];
709
- offset += 2;
710
- return value;
711
- }
712
-
747
+ parse(data, {
748
+ dnlScanLines = null
749
+ } = {}) {
713
750
  function readDataBlock() {
714
- var length = readUint16();
715
- var endOffset = offset + length - 2;
751
+ const length = (0, _core_utils.readUint16)(data, offset);
752
+ offset += 2;
753
+ let endOffset = offset + length - 2;
716
754
  var fileMarker = findNextFileMarker(data, endOffset, offset);
717
755
 
718
756
  if (fileMarker && fileMarker.invalid) {
719
- (0, _util.warn)('readDataBlock - incorrect length, current marker is: ' + fileMarker.invalid);
757
+ (0, _util.warn)("readDataBlock - incorrect length, current marker is: " + fileMarker.invalid);
720
758
  endOffset = fileMarker.offset;
721
759
  }
722
760
 
@@ -749,43 +787,45 @@ var JpegImage = function JpegImageClosure() {
749
787
  var jfif = null;
750
788
  var adobe = null;
751
789
  var frame, resetInterval;
752
- var numSOSMarkers = 0;
790
+ let numSOSMarkers = 0;
753
791
  var quantizationTables = [];
754
792
  var huffmanTablesAC = [],
755
793
  huffmanTablesDC = [];
756
- var fileMarker = readUint16();
794
+ let fileMarker = (0, _core_utils.readUint16)(data, offset);
795
+ offset += 2;
757
796
 
758
- if (fileMarker !== 0xFFD8) {
759
- throw new JpegError('SOI not found');
797
+ if (fileMarker !== 0xffd8) {
798
+ throw new JpegError("SOI not found");
760
799
  }
761
800
 
762
- fileMarker = readUint16();
801
+ fileMarker = (0, _core_utils.readUint16)(data, offset);
802
+ offset += 2;
763
803
 
764
- markerLoop: while (fileMarker !== 0xFFD9) {
804
+ markerLoop: while (fileMarker !== 0xffd9) {
765
805
  var i, j, l;
766
806
 
767
807
  switch (fileMarker) {
768
- case 0xFFE0:
769
- case 0xFFE1:
770
- case 0xFFE2:
771
- case 0xFFE3:
772
- case 0xFFE4:
773
- case 0xFFE5:
774
- case 0xFFE6:
775
- case 0xFFE7:
776
- case 0xFFE8:
777
- case 0xFFE9:
778
- case 0xFFEA:
779
- case 0xFFEB:
780
- case 0xFFEC:
781
- case 0xFFED:
782
- case 0xFFEE:
783
- case 0xFFEF:
784
- case 0xFFFE:
808
+ case 0xffe0:
809
+ case 0xffe1:
810
+ case 0xffe2:
811
+ case 0xffe3:
812
+ case 0xffe4:
813
+ case 0xffe5:
814
+ case 0xffe6:
815
+ case 0xffe7:
816
+ case 0xffe8:
817
+ case 0xffe9:
818
+ case 0xffea:
819
+ case 0xffeb:
820
+ case 0xffec:
821
+ case 0xffed:
822
+ case 0xffee:
823
+ case 0xffef:
824
+ case 0xfffe:
785
825
  var appData = readDataBlock();
786
826
 
787
- if (fileMarker === 0xFFE0) {
788
- if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) {
827
+ if (fileMarker === 0xffe0) {
828
+ if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) {
789
829
  jfif = {
790
830
  version: {
791
831
  major: appData[5],
@@ -801,8 +841,8 @@ var JpegImage = function JpegImageClosure() {
801
841
  }
802
842
  }
803
843
 
804
- if (fileMarker === 0xFFEE) {
805
- if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F && appData[3] === 0x62 && appData[4] === 0x65) {
844
+ if (fileMarker === 0xffee) {
845
+ if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6f && appData[3] === 0x62 && appData[4] === 0x65) {
806
846
  adobe = {
807
847
  version: appData[5] << 8 | appData[6],
808
848
  flags0: appData[7] << 8 | appData[8],
@@ -814,8 +854,9 @@ var JpegImage = function JpegImageClosure() {
814
854
 
815
855
  break;
816
856
 
817
- case 0xFFDB:
818
- var quantizationTablesLength = readUint16();
857
+ case 0xffdb:
858
+ const quantizationTablesLength = (0, _core_utils.readUint16)(data, offset);
859
+ offset += 2;
819
860
  var quantizationTablesEnd = quantizationTablesLength + offset - 2;
820
861
  var z;
821
862
 
@@ -831,10 +872,11 @@ var JpegImage = function JpegImageClosure() {
831
872
  } else if (quantizationTableSpec >> 4 === 1) {
832
873
  for (j = 0; j < 64; j++) {
833
874
  z = dctZigZag[j];
834
- tableData[z] = readUint16();
875
+ tableData[z] = (0, _core_utils.readUint16)(data, offset);
876
+ offset += 2;
835
877
  }
836
878
  } else {
837
- throw new JpegError('DQT - invalid table spec');
879
+ throw new JpegError("DQT - invalid table spec");
838
880
  }
839
881
 
840
882
  quantizationTables[quantizationTableSpec & 15] = tableData;
@@ -842,21 +884,23 @@ var JpegImage = function JpegImageClosure() {
842
884
 
843
885
  break;
844
886
 
845
- case 0xFFC0:
846
- case 0xFFC1:
847
- case 0xFFC2:
887
+ case 0xffc0:
888
+ case 0xffc1:
889
+ case 0xffc2:
848
890
  if (frame) {
849
- throw new JpegError('Only single frame JPEGs supported');
891
+ throw new JpegError("Only single frame JPEGs supported");
850
892
  }
851
893
 
852
- readUint16();
894
+ offset += 2;
853
895
  frame = {};
854
- frame.extended = fileMarker === 0xFFC1;
855
- frame.progressive = fileMarker === 0xFFC2;
896
+ frame.extended = fileMarker === 0xffc1;
897
+ frame.progressive = fileMarker === 0xffc2;
856
898
  frame.precision = data[offset++];
857
- var sofScanLines = readUint16();
899
+ const sofScanLines = (0, _core_utils.readUint16)(data, offset);
900
+ offset += 2;
858
901
  frame.scanLines = dnlScanLines || sofScanLines;
859
- frame.samplesPerLine = readUint16();
902
+ frame.samplesPerLine = (0, _core_utils.readUint16)(data, offset);
903
+ offset += 2;
860
904
  frame.components = [];
861
905
  frame.componentIds = {};
862
906
  var componentsCount = data[offset++],
@@ -879,8 +923,8 @@ var JpegImage = function JpegImageClosure() {
879
923
 
880
924
  var qId = data[offset + 2];
881
925
  l = frame.components.push({
882
- h: h,
883
- v: v,
926
+ h,
927
+ v,
884
928
  quantizationId: qId,
885
929
  quantizationTable: null
886
930
  });
@@ -893,8 +937,9 @@ var JpegImage = function JpegImageClosure() {
893
937
  prepareComponents(frame);
894
938
  break;
895
939
 
896
- case 0xFFC4:
897
- var huffmanLength = readUint16();
940
+ case 0xffc4:
941
+ const huffmanLength = (0, _core_utils.readUint16)(data, offset);
942
+ offset += 2;
898
943
 
899
944
  for (i = 2; i < huffmanLength;) {
900
945
  var huffmanTableSpec = data[offset++];
@@ -917,21 +962,24 @@ var JpegImage = function JpegImageClosure() {
917
962
 
918
963
  break;
919
964
 
920
- case 0xFFDD:
921
- readUint16();
922
- resetInterval = readUint16();
965
+ case 0xffdd:
966
+ offset += 2;
967
+ resetInterval = (0, _core_utils.readUint16)(data, offset);
968
+ offset += 2;
923
969
  break;
924
970
 
925
- case 0xFFDA:
926
- var parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines;
927
- readUint16();
971
+ case 0xffda:
972
+ const parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines;
973
+ offset += 2;
928
974
  var selectorsCount = data[offset++];
929
975
  var components = [],
930
976
  component;
931
977
 
932
978
  for (i = 0; i < selectorsCount; i++) {
933
- var componentIndex = frame.componentIds[data[offset++]];
979
+ const index = data[offset++];
980
+ var componentIndex = frame.componentIds[index];
934
981
  component = frame.components[componentIndex];
982
+ component.index = index;
935
983
  var tableSpec = data[offset++];
936
984
  component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
937
985
  component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
@@ -947,12 +995,12 @@ var JpegImage = function JpegImageClosure() {
947
995
  offset += processed;
948
996
  } catch (ex) {
949
997
  if (ex instanceof DNLMarkerError) {
950
- (0, _util.warn)("".concat(ex.message, " -- attempting to re-parse the JPEG image."));
998
+ (0, _util.warn)(`${ex.message} -- attempting to re-parse the JPEG image.`);
951
999
  return this.parse(data, {
952
1000
  dnlScanLines: ex.scanLines
953
1001
  });
954
1002
  } else if (ex instanceof EOIMarkerError) {
955
- (0, _util.warn)("".concat(ex.message, " -- ignoring the rest of the image data."));
1003
+ (0, _util.warn)(`${ex.message} -- ignoring the rest of the image data.`);
956
1004
  break markerLoop;
957
1005
  }
958
1006
 
@@ -961,35 +1009,36 @@ var JpegImage = function JpegImageClosure() {
961
1009
 
962
1010
  break;
963
1011
 
964
- case 0xFFDC:
1012
+ case 0xffdc:
965
1013
  offset += 4;
966
1014
  break;
967
1015
 
968
- case 0xFFFF:
969
- if (data[offset] !== 0xFF) {
1016
+ case 0xffff:
1017
+ if (data[offset] !== 0xff) {
970
1018
  offset--;
971
1019
  }
972
1020
 
973
1021
  break;
974
1022
 
975
1023
  default:
976
- if (data[offset - 3] === 0xFF && data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {
977
- offset -= 3;
978
- break;
979
- }
980
-
981
- var nextFileMarker = findNextFileMarker(data, offset - 2);
1024
+ const nextFileMarker = findNextFileMarker(data, offset - 2, offset - 3);
982
1025
 
983
1026
  if (nextFileMarker && nextFileMarker.invalid) {
984
- (0, _util.warn)('JpegImage.parse - unexpected data, current marker is: ' + nextFileMarker.invalid);
1027
+ (0, _util.warn)("JpegImage.parse - unexpected data, current marker is: " + nextFileMarker.invalid);
985
1028
  offset = nextFileMarker.offset;
986
1029
  break;
987
1030
  }
988
1031
 
989
- throw new JpegError('unknown marker ' + fileMarker.toString(16));
1032
+ if (offset >= data.length - 1) {
1033
+ (0, _util.warn)("JpegImage.parse - reached the end of the image data " + "without finding an EOI marker (0xFFD9).");
1034
+ break markerLoop;
1035
+ }
1036
+
1037
+ throw new JpegError("JpegImage.parse - unknown marker: " + fileMarker.toString(16));
990
1038
  }
991
1039
 
992
- fileMarker = readUint16();
1040
+ fileMarker = (0, _core_utils.readUint16)(data, offset);
1041
+ offset += 2;
993
1042
  }
994
1043
 
995
1044
  this.width = frame.samplesPerLine;
@@ -1007,6 +1056,7 @@ var JpegImage = function JpegImageClosure() {
1007
1056
  }
1008
1057
 
1009
1058
  this.components.push({
1059
+ index: component.index,
1010
1060
  output: buildComponentData(frame, component),
1011
1061
  scaleX: component.h / frame.maxH,
1012
1062
  scaleY: component.v / frame.maxV,
@@ -1018,8 +1068,8 @@ var JpegImage = function JpegImageClosure() {
1018
1068
  this.numComponents = this.components.length;
1019
1069
  return undefined;
1020
1070
  },
1021
- _getLinearizedBlockData: function _getLinearizedBlockData(width, height) {
1022
- var isSourcePDF = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1071
+
1072
+ _getLinearizedBlockData(width, height, isSourcePDF = false) {
1023
1073
  var scaleX = this.width / width,
1024
1074
  scaleY = this.height / height;
1025
1075
  var component, componentScaleX, componentScaleY, blocksPerScanline;
@@ -1032,6 +1082,7 @@ var JpegImage = function JpegImageClosure() {
1032
1082
  var data = new Uint8ClampedArray(dataLength);
1033
1083
  var xScaleBlockOffset = new Uint32Array(width);
1034
1084
  var mask3LSB = 0xfffffff8;
1085
+ let lastComponentScaleX;
1035
1086
 
1036
1087
  for (i = 0; i < numComponents; i++) {
1037
1088
  component = this.components[i];
@@ -1041,9 +1092,13 @@ var JpegImage = function JpegImageClosure() {
1041
1092
  output = component.output;
1042
1093
  blocksPerScanline = component.blocksPerLine + 1 << 3;
1043
1094
 
1044
- for (x = 0; x < width; x++) {
1045
- j = 0 | x * componentScaleX;
1046
- xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7;
1095
+ if (componentScaleX !== lastComponentScaleX) {
1096
+ for (x = 0; x < width; x++) {
1097
+ j = 0 | x * componentScaleX;
1098
+ xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7;
1099
+ }
1100
+
1101
+ lastComponentScaleX = componentScaleX;
1047
1102
  }
1048
1103
 
1049
1104
  for (y = 0; y < height; y++) {
@@ -1057,7 +1112,7 @@ var JpegImage = function JpegImageClosure() {
1057
1112
  }
1058
1113
  }
1059
1114
 
1060
- var transform = this._decodeTransform;
1115
+ let transform = this._decodeTransform;
1061
1116
 
1062
1117
  if (!isSourcePDF && numComponents === 4 && !transform) {
1063
1118
  transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]);
@@ -1082,6 +1137,8 @@ var JpegImage = function JpegImageClosure() {
1082
1137
  if (this.numComponents === 3) {
1083
1138
  if (this._colorTransform === 0) {
1084
1139
  return false;
1140
+ } else if (this.components[0].index === 0x52 && this.components[1].index === 0x47 && this.components[2].index === 0x42) {
1141
+ return false;
1085
1142
  }
1086
1143
 
1087
1144
  return true;
@@ -1141,30 +1198,28 @@ var JpegImage = function JpegImageClosure() {
1141
1198
  _convertCmykToRgb: function convertCmykToRgb(data) {
1142
1199
  var c, m, y, k;
1143
1200
  var offset = 0;
1144
- var scale = 1 / 255;
1145
1201
 
1146
1202
  for (var i = 0, length = data.length; i < length; i += 4) {
1147
- c = data[i] * scale;
1148
- m = data[i + 1] * scale;
1149
- y = data[i + 2] * scale;
1150
- k = data[i + 3] * scale;
1151
- data[offset++] = 255 + c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k - 285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y - 17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) - k * (21.86122147463605 * k + 189.48180835922747);
1152
- data[offset++] = 255 + c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k - 79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) - k * (20.737325471181034 * k + 187.80453709719578);
1153
- data[offset++] = 255 + c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k - 14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k - 193.58209356861505) - k * (22.33816807309886 * k + 180.12613974708367);
1203
+ c = data[i];
1204
+ m = data[i + 1];
1205
+ y = data[i + 2];
1206
+ k = data[i + 3];
1207
+ data[offset++] = 255 + c * (-0.00006747147073602441 * c + 0.0008379262121013727 * m + 0.0002894718188643294 * y + 0.003264231057537806 * k - 1.1185611867203937) + m * (0.000026374107616089405 * m - 0.00008626949158638572 * y - 0.0002748769067499491 * k - 0.02155688794978967) + y * (-0.00003878099212869363 * y - 0.0003267808279485286 * k + 0.0686742238595345) - k * (0.0003361971776183937 * k + 0.7430659151342254);
1208
+ data[offset++] = 255 + c * (0.00013596372813588848 * c + 0.000924537132573585 * m + 0.00010567359618683593 * y + 0.0004791864687436512 * k - 0.3109689587515875) + m * (-0.00023545346108370344 * m + 0.0002702845253534714 * y + 0.0020200308977307156 * k - 0.7488052167015494) + y * (0.00006834815998235662 * y + 0.00015168452363460973 * k - 0.09751927774728933) - k * (0.00031891311758832814 * k + 0.7364883807733168);
1209
+ data[offset++] = 255 + c * (0.000013598650411385307 * c + 0.00012423956175490851 * m + 0.0004751985097583589 * y - 0.0000036729317476630422 * k - 0.05562186980264034) + m * (0.00016141380598724676 * m + 0.0009692239130725186 * y + 0.0007782692450036253 * k - 0.44015232367526463) + y * (5.068882914068769e-7 * y + 0.0017778369011375071 * k - 0.7591454649749609) - k * (0.0003435319965105553 * k + 0.7063770186160144);
1154
1210
  }
1155
1211
 
1156
1212
  return data.subarray(0, offset);
1157
1213
  },
1158
- getData: function getData(_ref3) {
1159
- var width = _ref3.width,
1160
- height = _ref3.height,
1161
- _ref3$forceRGB = _ref3.forceRGB,
1162
- forceRGB = _ref3$forceRGB === void 0 ? false : _ref3$forceRGB,
1163
- _ref3$isSourcePDF = _ref3.isSourcePDF,
1164
- isSourcePDF = _ref3$isSourcePDF === void 0 ? false : _ref3$isSourcePDF;
1165
1214
 
1215
+ getData({
1216
+ width,
1217
+ height,
1218
+ forceRGB = false,
1219
+ isSourcePDF = false
1220
+ }) {
1166
1221
  if (this.numComponents > 4) {
1167
- throw new JpegError('Unsupported color mode');
1222
+ throw new JpegError("Unsupported color mode");
1168
1223
  }
1169
1224
 
1170
1225
  var data = this._getLinearizedBlockData(width, height, isSourcePDF);
@@ -1198,6 +1253,7 @@ var JpegImage = function JpegImageClosure() {
1198
1253
 
1199
1254
  return data;
1200
1255
  }
1256
+
1201
1257
  };
1202
1258
  return JpegImage;
1203
1259
  }();