pdfjs-dist 2.0.489 → 2.2.228

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 (169) hide show
  1. package/CODE_OF_CONDUCT.md +15 -0
  2. package/bower.json +1 -1
  3. package/build/pdf.js +18515 -11402
  4. package/build/pdf.js.map +1 -1
  5. package/build/pdf.min.js +1 -1
  6. package/build/pdf.worker.js +48266 -37137
  7. package/build/pdf.worker.js.map +1 -1
  8. package/build/pdf.worker.min.js +1 -1
  9. package/external/url/url-lib.js +627 -0
  10. package/image_decoders/pdf.image_decoders.js +11350 -0
  11. package/image_decoders/pdf.image_decoders.js.map +1 -0
  12. package/image_decoders/pdf.image_decoders.min.js +1 -0
  13. package/lib/core/annotation.js +587 -242
  14. package/lib/core/arithmetic_decoder.js +275 -245
  15. package/lib/core/bidi.js +65 -6
  16. package/lib/core/ccitt.js +173 -18
  17. package/lib/core/ccitt_stream.js +15 -6
  18. package/lib/core/cff_parser.js +433 -61
  19. package/lib/core/charsets.js +5 -4
  20. package/lib/core/chunked_stream.js +400 -152
  21. package/lib/core/cmap.js +326 -87
  22. package/lib/core/colorspace.js +874 -594
  23. package/lib/core/core_utils.js +147 -0
  24. package/lib/core/crypto.js +290 -45
  25. package/lib/core/document.js +560 -268
  26. package/lib/core/encodings.js +19 -10
  27. package/lib/core/evaluator.js +1005 -360
  28. package/lib/core/font_renderer.js +331 -97
  29. package/lib/core/fonts.js +812 -195
  30. package/lib/core/function.js +284 -71
  31. package/lib/core/glyphlist.js +4 -3
  32. package/lib/core/image.js +169 -62
  33. package/lib/core/image_utils.js +111 -0
  34. package/lib/core/jbig2.js +479 -66
  35. package/lib/core/jbig2_stream.js +19 -8
  36. package/lib/core/jpeg_stream.js +38 -13
  37. package/lib/core/jpg.js +253 -29
  38. package/lib/core/jpx.js +396 -6
  39. package/lib/core/jpx_stream.js +18 -6
  40. package/lib/core/metrics.js +15 -15
  41. package/lib/core/murmurhash3.js +56 -34
  42. package/lib/core/obj.js +1354 -488
  43. package/lib/core/operator_list.js +144 -31
  44. package/lib/core/parser.js +539 -191
  45. package/lib/core/pattern.js +148 -14
  46. package/lib/core/pdf_manager.js +323 -133
  47. package/lib/core/primitives.js +111 -24
  48. package/lib/core/ps_parser.js +134 -45
  49. package/lib/core/standard_fonts.js +17 -17
  50. package/lib/core/stream.js +313 -34
  51. package/lib/core/type1_parser.js +143 -13
  52. package/lib/core/unicode.js +32 -5
  53. package/lib/core/worker.js +217 -190
  54. package/lib/core/worker_stream.js +277 -0
  55. package/lib/display/annotation_layer.js +450 -133
  56. package/lib/display/api.js +1597 -784
  57. package/lib/display/api_compatibility.js +11 -13
  58. package/lib/display/canvas.js +360 -44
  59. package/lib/display/content_disposition.js +83 -32
  60. package/lib/display/display_utils.js +747 -0
  61. package/lib/display/fetch_stream.js +221 -90
  62. package/lib/display/font_loader.js +468 -236
  63. package/lib/display/metadata.js +38 -16
  64. package/lib/display/network.js +635 -428
  65. package/lib/display/network_utils.js +32 -19
  66. package/lib/display/node_stream.js +367 -175
  67. package/lib/display/pattern_helper.js +81 -31
  68. package/lib/display/svg.js +1235 -519
  69. package/lib/display/text_layer.js +153 -29
  70. package/lib/display/transport_stream.js +345 -94
  71. package/lib/display/webgl.js +64 -18
  72. package/lib/display/worker_options.js +5 -4
  73. package/lib/display/xml_parser.js +166 -53
  74. package/lib/examples/node/domstubs.js +60 -4
  75. package/lib/pdf.js +36 -14
  76. package/lib/pdf.worker.js +5 -3
  77. package/lib/shared/compatibility.js +158 -564
  78. package/lib/shared/global_scope.js +2 -2
  79. package/lib/shared/is_node.js +4 -4
  80. package/lib/shared/message_handler.js +521 -0
  81. package/lib/shared/streams_polyfill.js +21 -17
  82. package/lib/shared/url_polyfill.js +56 -0
  83. package/lib/shared/util.js +243 -710
  84. package/lib/test/unit/annotation_spec.js +870 -401
  85. package/lib/test/unit/api_spec.js +657 -345
  86. package/lib/test/unit/bidi_spec.js +7 -7
  87. package/lib/test/unit/cff_parser_spec.js +54 -11
  88. package/lib/test/unit/clitests_helper.js +10 -8
  89. package/lib/test/unit/cmap_spec.js +95 -41
  90. package/lib/test/unit/colorspace_spec.js +115 -63
  91. package/lib/test/unit/core_utils_spec.js +191 -0
  92. package/lib/test/unit/crypto_spec.js +17 -5
  93. package/lib/test/unit/custom_spec.js +43 -55
  94. package/lib/test/unit/display_svg_spec.js +34 -18
  95. package/lib/test/unit/display_utils_spec.js +273 -0
  96. package/lib/test/unit/document_spec.js +8 -13
  97. package/lib/test/unit/encodings_spec.js +25 -45
  98. package/lib/test/unit/evaluator_spec.js +38 -15
  99. package/lib/test/unit/fetch_stream_spec.js +109 -0
  100. package/lib/test/unit/function_spec.js +17 -5
  101. package/lib/test/unit/jasmine-boot.js +33 -20
  102. package/lib/test/unit/{util_stream_spec.js → message_handler_spec.js} +41 -69
  103. package/lib/test/unit/metadata_spec.js +71 -11
  104. package/lib/test/unit/murmurhash3_spec.js +3 -3
  105. package/lib/test/unit/network_spec.js +19 -54
  106. package/lib/test/unit/network_utils_spec.js +91 -14
  107. package/lib/test/unit/node_stream_spec.js +56 -32
  108. package/lib/test/unit/parser_spec.js +162 -71
  109. package/lib/test/unit/pdf_find_controller_spec.js +230 -0
  110. package/lib/test/unit/pdf_find_utils_spec.js +63 -0
  111. package/lib/test/unit/pdf_history_spec.js +21 -9
  112. package/lib/test/unit/primitives_spec.js +53 -20
  113. package/lib/test/unit/stream_spec.js +12 -4
  114. package/lib/test/unit/test_utils.js +273 -56
  115. package/lib/test/unit/testreporter.js +21 -3
  116. package/lib/test/unit/type1_parser_spec.js +8 -6
  117. package/lib/test/unit/ui_utils_spec.js +454 -16
  118. package/lib/test/unit/unicode_spec.js +18 -15
  119. package/lib/test/unit/util_spec.js +87 -128
  120. package/lib/web/annotation_layer_builder.js +39 -22
  121. package/lib/web/app.js +1290 -588
  122. package/lib/web/app_options.js +100 -62
  123. package/lib/web/base_viewer.js +511 -182
  124. package/lib/web/chromecom.js +261 -117
  125. package/lib/web/debugger.js +166 -22
  126. package/lib/web/download_manager.js +32 -13
  127. package/lib/web/firefox_print_service.js +20 -10
  128. package/lib/web/firefoxcom.js +315 -80
  129. package/lib/web/genericcom.js +89 -30
  130. package/lib/web/genericl10n.js +142 -30
  131. package/lib/web/grab_to_pan.js +28 -4
  132. package/lib/web/interfaces.js +170 -47
  133. package/lib/web/overlay_manager.js +235 -85
  134. package/lib/web/password_prompt.js +22 -14
  135. package/lib/web/pdf_attachment_viewer.js +38 -18
  136. package/lib/web/pdf_cursor_tools.js +39 -16
  137. package/lib/web/pdf_document_properties.js +255 -136
  138. package/lib/web/pdf_find_bar.js +84 -40
  139. package/lib/web/pdf_find_controller.js +495 -184
  140. package/lib/web/pdf_find_utils.js +111 -0
  141. package/lib/web/pdf_history.js +190 -53
  142. package/lib/web/pdf_link_service.js +138 -77
  143. package/lib/web/pdf_outline_viewer.js +122 -46
  144. package/lib/web/pdf_page_view.js +191 -67
  145. package/lib/web/pdf_presentation_mode.js +99 -34
  146. package/lib/web/pdf_print_service.js +61 -13
  147. package/lib/web/pdf_rendering_queue.js +28 -9
  148. package/lib/web/pdf_sidebar.js +141 -81
  149. package/lib/web/pdf_sidebar_resizer.js +42 -16
  150. package/lib/web/pdf_single_page_viewer.js +74 -66
  151. package/lib/web/pdf_thumbnail_view.js +104 -33
  152. package/lib/web/pdf_thumbnail_viewer.js +66 -26
  153. package/lib/web/pdf_viewer.component.js +112 -32
  154. package/lib/web/pdf_viewer.js +91 -52
  155. package/lib/web/preferences.js +284 -89
  156. package/lib/web/secondary_toolbar.js +165 -40
  157. package/lib/web/text_layer_builder.js +134 -59
  158. package/lib/web/toolbar.js +78 -43
  159. package/lib/web/ui_utils.js +462 -136
  160. package/lib/web/view_history.js +215 -67
  161. package/lib/web/viewer_compatibility.js +4 -13
  162. package/package.json +5 -4
  163. package/web/pdf_viewer.css +79 -11
  164. package/web/pdf_viewer.js +6107 -3748
  165. package/web/pdf_viewer.js.map +1 -1
  166. package/lib/display/dom_utils.js +0 -309
  167. package/lib/test/unit/dom_utils_spec.js +0 -89
  168. package/lib/test/unit/fonts_spec.js +0 -81
  169. package/lib/web/dom_events.js +0 -137
package/lib/core/image.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 2017 Mozilla Foundation
5
+ * Copyright 2019 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,41 +19,50 @@
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.PDFImage = undefined;
27
+ exports.PDFImage = void 0;
28
28
 
29
- var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
29
+ var _util = require("../shared/util");
30
30
 
31
- var _util = require('../shared/util');
31
+ var _primitives = require("./primitives");
32
32
 
33
- var _primitives = require('./primitives');
33
+ var _colorspace = require("./colorspace");
34
34
 
35
- var _colorspace = require('./colorspace');
35
+ var _stream = require("./stream");
36
36
 
37
- var _stream = require('./stream');
37
+ var _jpeg_stream = require("./jpeg_stream");
38
38
 
39
- var _jpeg_stream = require('./jpeg_stream');
39
+ var _jpx = require("./jpx");
40
40
 
41
- var _jpx = require('./jpx');
41
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
42
+
43
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
44
+
45
+ function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
46
+
47
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
42
48
 
43
49
  var PDFImage = function PDFImageClosure() {
44
50
  function handleImageData(image, nativeDecoder) {
45
51
  if (nativeDecoder && nativeDecoder.canDecode(image)) {
46
- return nativeDecoder.decode(image).catch(function (reason) {
52
+ return nativeDecoder.decode(image)["catch"](function (reason) {
47
53
  (0, _util.warn)('Native image decoding failed -- trying to recover: ' + (reason && reason.message));
48
54
  return image;
49
55
  });
50
56
  }
57
+
51
58
  return Promise.resolve(image);
52
59
  }
60
+
53
61
  function decodeAndClamp(value, addend, coefficient, max) {
54
62
  value = addend + value * coefficient;
55
63
  return value < 0 ? 0 : value > max ? max : value;
56
64
  }
65
+
57
66
  function resizeImageMask(src, bpc, w1, h1, w2, h2) {
58
67
  var length = w2 * h2;
59
68
  var dest = bpc <= 8 ? new Uint8Array(length) : bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
@@ -66,103 +75,140 @@ var PDFImage = function PDFImageClosure() {
66
75
  oldIndex;
67
76
  var xScaled = new Uint16Array(w2);
68
77
  var w1Scanline = w1;
78
+
69
79
  for (i = 0; i < w2; i++) {
70
80
  xScaled[i] = Math.floor(i * xRatio);
71
81
  }
82
+
72
83
  for (i = 0; i < h2; i++) {
73
84
  py = Math.floor(i * yRatio) * w1Scanline;
85
+
74
86
  for (j = 0; j < w2; j++) {
75
87
  oldIndex = py + xScaled[j];
76
88
  dest[newIndex++] = src[oldIndex];
77
89
  }
78
90
  }
91
+
79
92
  return dest;
80
93
  }
94
+
81
95
  function PDFImage(_ref) {
82
96
  var xref = _ref.xref,
83
97
  res = _ref.res,
84
98
  image = _ref.image,
85
99
  _ref$isInline = _ref.isInline,
86
- isInline = _ref$isInline === undefined ? false : _ref$isInline,
100
+ isInline = _ref$isInline === void 0 ? false : _ref$isInline,
87
101
  _ref$smask = _ref.smask,
88
- smask = _ref$smask === undefined ? null : _ref$smask,
102
+ smask = _ref$smask === void 0 ? null : _ref$smask,
89
103
  _ref$mask = _ref.mask,
90
- mask = _ref$mask === undefined ? null : _ref$mask,
104
+ mask = _ref$mask === void 0 ? null : _ref$mask,
91
105
  _ref$isMask = _ref.isMask,
92
- isMask = _ref$isMask === undefined ? false : _ref$isMask,
106
+ isMask = _ref$isMask === void 0 ? false : _ref$isMask,
93
107
  pdfFunctionFactory = _ref.pdfFunctionFactory;
94
-
95
108
  this.image = image;
96
109
  var dict = image.dict;
97
- if (dict.has('Filter')) {
98
- var filter = dict.get('Filter').name;
99
- if (filter === 'JPXDecode') {
100
- var jpxImage = new _jpx.JpxImage();
101
- jpxImage.parseImageProperties(image.stream);
102
- image.stream.reset();
103
- image.bitsPerComponent = jpxImage.bitsPerComponent;
104
- image.numComps = jpxImage.componentsCount;
105
- } else if (filter === 'JBIG2Decode') {
106
- image.bitsPerComponent = 1;
107
- image.numComps = 1;
110
+ var filter = dict.get('Filter');
111
+
112
+ if ((0, _primitives.isName)(filter)) {
113
+ switch (filter.name) {
114
+ case 'JPXDecode':
115
+ var jpxImage = new _jpx.JpxImage();
116
+ jpxImage.parseImageProperties(image.stream);
117
+ image.stream.reset();
118
+ image.width = jpxImage.width;
119
+ image.height = jpxImage.height;
120
+ image.bitsPerComponent = jpxImage.bitsPerComponent;
121
+ image.numComps = jpxImage.componentsCount;
122
+ break;
123
+
124
+ case 'JBIG2Decode':
125
+ image.bitsPerComponent = 1;
126
+ image.numComps = 1;
127
+ break;
108
128
  }
109
129
  }
110
- this.width = dict.get('Width', 'W');
111
- this.height = dict.get('Height', 'H');
112
- if (this.width < 1 || this.height < 1) {
113
- throw new _util.FormatError('Invalid image width: ' + this.width + ' or ' + ('height: ' + this.height));
130
+
131
+ var width = dict.get('Width', 'W');
132
+ var height = dict.get('Height', 'H');
133
+
134
+ if (Number.isInteger(image.width) && image.width > 0 && Number.isInteger(image.height) && image.height > 0 && (image.width !== width || image.height !== height)) {
135
+ (0, _util.warn)('PDFImage - using the Width/Height of the image data, ' + 'rather than the image dictionary.');
136
+ width = image.width;
137
+ height = image.height;
114
138
  }
139
+
140
+ if (width < 1 || height < 1) {
141
+ throw new _util.FormatError("Invalid image width: ".concat(width, " or ") + "height: ".concat(height));
142
+ }
143
+
144
+ this.width = width;
145
+ this.height = height;
115
146
  this.interpolate = dict.get('Interpolate', 'I') || false;
116
147
  this.imageMask = dict.get('ImageMask', 'IM') || false;
117
148
  this.matte = dict.get('Matte') || false;
118
149
  var bitsPerComponent = image.bitsPerComponent;
150
+
119
151
  if (!bitsPerComponent) {
120
152
  bitsPerComponent = dict.get('BitsPerComponent', 'BPC');
153
+
121
154
  if (!bitsPerComponent) {
122
155
  if (this.imageMask) {
123
156
  bitsPerComponent = 1;
124
157
  } else {
125
- throw new _util.FormatError('Bits per component missing in image: ' + this.imageMask);
158
+ throw new _util.FormatError("Bits per component missing in image: ".concat(this.imageMask));
126
159
  }
127
160
  }
128
161
  }
162
+
129
163
  this.bpc = bitsPerComponent;
164
+
130
165
  if (!this.imageMask) {
131
166
  var colorSpace = dict.get('ColorSpace', 'CS');
167
+
132
168
  if (!colorSpace) {
133
169
  (0, _util.info)('JPX images (which do not require color spaces)');
170
+
134
171
  switch (image.numComps) {
135
172
  case 1:
136
173
  colorSpace = _primitives.Name.get('DeviceGray');
137
174
  break;
175
+
138
176
  case 3:
139
177
  colorSpace = _primitives.Name.get('DeviceRGB');
140
178
  break;
179
+
141
180
  case 4:
142
181
  colorSpace = _primitives.Name.get('DeviceCMYK');
143
182
  break;
183
+
144
184
  default:
145
- throw new Error('JPX images with ' + this.numComps + ' ' + 'color components not supported.');
185
+ throw new Error("JPX images with ".concat(image.numComps, " ") + 'color components not supported.');
146
186
  }
147
187
  }
188
+
148
189
  var resources = isInline ? res : null;
149
190
  this.colorSpace = _colorspace.ColorSpace.parse(colorSpace, xref, resources, pdfFunctionFactory);
150
191
  this.numComps = this.colorSpace.numComps;
151
192
  }
193
+
152
194
  this.decode = dict.getArray('Decode', 'D');
153
195
  this.needsDecode = false;
154
- if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode) || isMask && !_colorspace.ColorSpace.isDefaultDecode(this.decode, 1))) {
196
+
197
+ if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent) || isMask && !_colorspace.ColorSpace.isDefaultDecode(this.decode, 1))) {
155
198
  this.needsDecode = true;
156
199
  var max = (1 << bitsPerComponent) - 1;
157
200
  this.decodeCoefficients = [];
158
201
  this.decodeAddends = [];
202
+ var isIndexed = this.colorSpace && this.colorSpace.name === 'Indexed';
203
+
159
204
  for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
160
205
  var dmin = this.decode[i];
161
206
  var dmax = this.decode[i + 1];
162
- this.decodeCoefficients[j] = dmax - dmin;
163
- this.decodeAddends[j] = max * dmin;
207
+ this.decodeCoefficients[j] = isIndexed ? (dmax - dmin) / max : dmax - dmin;
208
+ this.decodeAddends[j] = isIndexed ? dmin : max * dmin;
164
209
  }
165
210
  }
211
+
166
212
  if (smask) {
167
213
  this.smask = new PDFImage({
168
214
  xref: xref,
@@ -175,6 +221,7 @@ var PDFImage = function PDFImageClosure() {
175
221
  if ((0, _primitives.isStream)(mask)) {
176
222
  var maskDict = mask.dict,
177
223
  imageMask = maskDict.get('ImageMask', 'IM');
224
+
178
225
  if (!imageMask) {
179
226
  (0, _util.warn)('Ignoring /Mask in image without /ImageMask.');
180
227
  } else {
@@ -192,27 +239,29 @@ var PDFImage = function PDFImageClosure() {
192
239
  }
193
240
  }
194
241
  }
242
+
195
243
  PDFImage.buildImage = function (_ref2) {
196
244
  var handler = _ref2.handler,
197
245
  xref = _ref2.xref,
198
246
  res = _ref2.res,
199
247
  image = _ref2.image,
200
248
  _ref2$isInline = _ref2.isInline,
201
- isInline = _ref2$isInline === undefined ? false : _ref2$isInline,
249
+ isInline = _ref2$isInline === void 0 ? false : _ref2$isInline,
202
250
  _ref2$nativeDecoder = _ref2.nativeDecoder,
203
- nativeDecoder = _ref2$nativeDecoder === undefined ? null : _ref2$nativeDecoder,
251
+ nativeDecoder = _ref2$nativeDecoder === void 0 ? null : _ref2$nativeDecoder,
204
252
  pdfFunctionFactory = _ref2.pdfFunctionFactory;
205
-
206
253
  var imagePromise = handleImageData(image, nativeDecoder);
207
254
  var smaskPromise;
208
255
  var maskPromise;
209
256
  var smask = image.dict.get('SMask');
210
257
  var mask = image.dict.get('Mask');
258
+
211
259
  if (smask) {
212
260
  smaskPromise = handleImageData(smask, nativeDecoder);
213
261
  maskPromise = Promise.resolve(null);
214
262
  } else {
215
263
  smaskPromise = Promise.resolve(null);
264
+
216
265
  if (mask) {
217
266
  if ((0, _primitives.isStream)(mask)) {
218
267
  maskPromise = handleImageData(mask, nativeDecoder);
@@ -226,6 +275,7 @@ var PDFImage = function PDFImageClosure() {
226
275
  maskPromise = Promise.resolve(null);
227
276
  }
228
277
  }
278
+
229
279
  return Promise.all([imagePromise, smaskPromise, maskPromise]).then(function (_ref3) {
230
280
  var _ref4 = _slicedToArray(_ref3, 3),
231
281
  imageData = _ref4[0],
@@ -243,47 +293,54 @@ var PDFImage = function PDFImageClosure() {
243
293
  });
244
294
  });
245
295
  };
296
+
246
297
  PDFImage.createMask = function (_ref5) {
247
298
  var imgArray = _ref5.imgArray,
248
299
  width = _ref5.width,
249
300
  height = _ref5.height,
250
301
  imageIsFromDecodeStream = _ref5.imageIsFromDecodeStream,
251
302
  inverseDecode = _ref5.inverseDecode;
252
-
253
303
  var computedLength = (width + 7 >> 3) * height;
254
304
  var actualLength = imgArray.byteLength;
255
305
  var haveFullData = computedLength === actualLength;
256
306
  var data, i;
307
+
257
308
  if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {
258
309
  data = imgArray;
259
310
  } else if (!inverseDecode) {
260
- data = new Uint8Array(actualLength);
311
+ data = new Uint8ClampedArray(actualLength);
261
312
  data.set(imgArray);
262
313
  } else {
263
- data = new Uint8Array(computedLength);
314
+ data = new Uint8ClampedArray(computedLength);
264
315
  data.set(imgArray);
316
+
265
317
  for (i = actualLength; i < computedLength; i++) {
266
318
  data[i] = 0xff;
267
319
  }
268
320
  }
321
+
269
322
  if (inverseDecode) {
270
323
  for (i = 0; i < actualLength; i++) {
271
324
  data[i] ^= 0xFF;
272
325
  }
273
326
  }
327
+
274
328
  return {
275
329
  data: data,
276
330
  width: width,
277
331
  height: height
278
332
  };
279
333
  };
334
+
280
335
  PDFImage.prototype = {
281
336
  get drawWidth() {
282
337
  return Math.max(this.width, this.smask && this.smask.width || 0, this.mask && this.mask.width || 0);
283
338
  },
339
+
284
340
  get drawHeight() {
285
341
  return Math.max(this.height, this.smask && this.smask.height || 0, this.mask && this.mask.height || 0);
286
342
  },
343
+
287
344
  decodeBuffer: function decodeBuffer(buffer) {
288
345
  var bpc = this.bpc;
289
346
  var numComps = this.numComps;
@@ -291,13 +348,17 @@ var PDFImage = function PDFImageClosure() {
291
348
  var decodeCoefficients = this.decodeCoefficients;
292
349
  var max = (1 << bpc) - 1;
293
350
  var i, ii;
351
+
294
352
  if (bpc === 1) {
295
353
  for (i = 0, ii = buffer.length; i < ii; i++) {
296
354
  buffer[i] = +!buffer[i];
297
355
  }
356
+
298
357
  return;
299
358
  }
359
+
300
360
  var index = 0;
361
+
301
362
  for (i = 0, ii = this.width * this.height; i < ii; i++) {
302
363
  for (var j = 0; j < numComps; j++) {
303
364
  buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max);
@@ -307,9 +368,11 @@ var PDFImage = function PDFImageClosure() {
307
368
  },
308
369
  getComponents: function getComponents(buffer) {
309
370
  var bpc = this.bpc;
371
+
310
372
  if (bpc === 8) {
311
373
  return buffer;
312
374
  }
375
+
313
376
  var width = this.width;
314
377
  var height = this.height;
315
378
  var numComps = this.numComps;
@@ -321,11 +384,14 @@ var PDFImage = function PDFImageClosure() {
321
384
  var i = 0,
322
385
  ii,
323
386
  buf;
387
+
324
388
  if (bpc === 1) {
325
389
  var mask, loop1End, loop2End;
390
+
326
391
  for (var j = 0; j < height; j++) {
327
392
  loop1End = i + (rowComps & ~7);
328
393
  loop2End = i + rowComps;
394
+
329
395
  while (i < loop1End) {
330
396
  buf = buffer[bufferPos++];
331
397
  output[i] = buf >> 7 & 1;
@@ -338,9 +404,11 @@ var PDFImage = function PDFImageClosure() {
338
404
  output[i + 7] = buf & 1;
339
405
  i += 8;
340
406
  }
407
+
341
408
  if (i < loop2End) {
342
409
  buf = buffer[bufferPos++];
343
410
  mask = 128;
411
+
344
412
  while (i < loop2End) {
345
413
  output[i++] = +!!(buf & mask);
346
414
  mask >>= 1;
@@ -350,15 +418,18 @@ var PDFImage = function PDFImageClosure() {
350
418
  } else {
351
419
  var bits = 0;
352
420
  buf = 0;
421
+
353
422
  for (i = 0, ii = length; i < ii; ++i) {
354
423
  if (i % rowComps === 0) {
355
424
  buf = 0;
356
425
  bits = 0;
357
426
  }
427
+
358
428
  while (bits < bpc) {
359
429
  buf = buf << 8 | buffer[bufferPos++];
360
430
  bits += 8;
361
431
  }
432
+
362
433
  var remainingBits = bits - bpc;
363
434
  var value = buf >> remainingBits;
364
435
  output[i] = value < 0 ? 0 : value > max ? max : value;
@@ -366,17 +437,20 @@ var PDFImage = function PDFImageClosure() {
366
437
  bits = remainingBits;
367
438
  }
368
439
  }
440
+
369
441
  return output;
370
442
  },
371
443
  fillOpacity: function fillOpacity(rgbaBuf, width, height, actualHeight, image) {
372
444
  var smask = this.smask;
373
445
  var mask = this.mask;
374
446
  var alphaBuf, sw, sh, i, ii, j;
447
+
375
448
  if (smask) {
376
449
  sw = smask.width;
377
450
  sh = smask.height;
378
- alphaBuf = new Uint8Array(sw * sh);
451
+ alphaBuf = new Uint8ClampedArray(sw * sh);
379
452
  smask.fillGrayBuffer(alphaBuf);
453
+
380
454
  if (sw !== width || sh !== height) {
381
455
  alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height);
382
456
  }
@@ -384,35 +458,42 @@ var PDFImage = function PDFImageClosure() {
384
458
  if (mask instanceof PDFImage) {
385
459
  sw = mask.width;
386
460
  sh = mask.height;
387
- alphaBuf = new Uint8Array(sw * sh);
461
+ alphaBuf = new Uint8ClampedArray(sw * sh);
388
462
  mask.numComps = 1;
389
463
  mask.fillGrayBuffer(alphaBuf);
464
+
390
465
  for (i = 0, ii = sw * sh; i < ii; ++i) {
391
466
  alphaBuf[i] = 255 - alphaBuf[i];
392
467
  }
468
+
393
469
  if (sw !== width || sh !== height) {
394
470
  alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height);
395
471
  }
396
472
  } else if (Array.isArray(mask)) {
397
- alphaBuf = new Uint8Array(width * height);
473
+ alphaBuf = new Uint8ClampedArray(width * height);
398
474
  var numComps = this.numComps;
475
+
399
476
  for (i = 0, ii = width * height; i < ii; ++i) {
400
477
  var opacity = 0;
401
478
  var imageOffset = i * numComps;
479
+
402
480
  for (j = 0; j < numComps; ++j) {
403
481
  var color = image[imageOffset + j];
404
482
  var maskOffset = j * 2;
483
+
405
484
  if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {
406
485
  opacity = 255;
407
486
  break;
408
487
  }
409
488
  }
489
+
410
490
  alphaBuf[i] = opacity;
411
491
  }
412
492
  } else {
413
493
  throw new _util.FormatError('Unknown mask format.');
414
494
  }
415
495
  }
496
+
416
497
  if (alphaBuf) {
417
498
  for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
418
499
  rgbaBuf[j] = alphaBuf[i];
@@ -425,40 +506,42 @@ var PDFImage = function PDFImageClosure() {
425
506
  },
426
507
  undoPreblend: function undoPreblend(buffer, width, height) {
427
508
  var matte = this.smask && this.smask.matte;
509
+
428
510
  if (!matte) {
429
511
  return;
430
512
  }
513
+
431
514
  var matteRgb = this.colorSpace.getRgb(matte, 0);
432
515
  var matteR = matteRgb[0];
433
516
  var matteG = matteRgb[1];
434
517
  var matteB = matteRgb[2];
435
518
  var length = width * height * 4;
436
- var r, g, b;
519
+
437
520
  for (var i = 0; i < length; i += 4) {
438
521
  var alpha = buffer[i + 3];
522
+
439
523
  if (alpha === 0) {
440
524
  buffer[i] = 255;
441
525
  buffer[i + 1] = 255;
442
526
  buffer[i + 2] = 255;
443
527
  continue;
444
528
  }
529
+
445
530
  var k = 255 / alpha;
446
- r = (buffer[i] - matteR) * k + matteR;
447
- g = (buffer[i + 1] - matteG) * k + matteG;
448
- b = (buffer[i + 2] - matteB) * k + matteB;
449
- buffer[i] = r <= 0 ? 0 : r >= 255 ? 255 : r | 0;
450
- buffer[i + 1] = g <= 0 ? 0 : g >= 255 ? 255 : g | 0;
451
- buffer[i + 2] = b <= 0 ? 0 : b >= 255 ? 255 : b | 0;
531
+ buffer[i] = (buffer[i] - matteR) * k + matteR;
532
+ buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG;
533
+ buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB;
452
534
  }
453
535
  },
454
536
  createImageData: function createImageData() {
455
537
  var forceRGBA = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
456
-
457
538
  var drawWidth = this.drawWidth;
458
539
  var drawHeight = this.drawHeight;
459
540
  var imgData = {
460
541
  width: drawWidth,
461
- height: drawHeight
542
+ height: drawHeight,
543
+ kind: 0,
544
+ data: null
462
545
  };
463
546
  var numComps = this.numComps;
464
547
  var originalWidth = this.width;
@@ -466,37 +549,47 @@ var PDFImage = function PDFImageClosure() {
466
549
  var bpc = this.bpc;
467
550
  var rowBytes = originalWidth * numComps * bpc + 7 >> 3;
468
551
  var imgArray;
552
+
469
553
  if (!forceRGBA) {
470
554
  var kind;
555
+
471
556
  if (this.colorSpace.name === 'DeviceGray' && bpc === 1) {
472
557
  kind = _util.ImageKind.GRAYSCALE_1BPP;
473
558
  } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 && !this.needsDecode) {
474
559
  kind = _util.ImageKind.RGB_24BPP;
475
560
  }
561
+
476
562
  if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) {
477
563
  imgData.kind = kind;
478
564
  imgArray = this.getImageBytes(originalHeight * rowBytes);
565
+
479
566
  if (this.image instanceof _stream.DecodeStream) {
480
567
  imgData.data = imgArray;
481
568
  } else {
482
- var newArray = new Uint8Array(imgArray.length);
569
+ var newArray = new Uint8ClampedArray(imgArray.length);
483
570
  newArray.set(imgArray);
484
571
  imgData.data = newArray;
485
572
  }
573
+
486
574
  if (this.needsDecode) {
487
- (0, _util.assert)(kind === _util.ImageKind.GRAYSCALE_1BPP);
575
+ (0, _util.assert)(kind === _util.ImageKind.GRAYSCALE_1BPP, 'PDFImage.createImageData: The image must be grayscale.');
488
576
  var buffer = imgData.data;
577
+
489
578
  for (var i = 0, ii = buffer.length; i < ii; i++) {
490
579
  buffer[i] ^= 0xff;
491
580
  }
492
581
  }
582
+
493
583
  return imgData;
494
584
  }
585
+
495
586
  if (this.image instanceof _jpeg_stream.JpegStream && !this.smask && !this.mask) {
496
587
  var imageLength = originalHeight * rowBytes;
588
+
497
589
  switch (this.colorSpace.name) {
498
590
  case 'DeviceGray':
499
591
  imageLength *= 3;
592
+
500
593
  case 'DeviceRGB':
501
594
  case 'DeviceCMYK':
502
595
  imgData.kind = _util.ImageKind.RGB_24BPP;
@@ -505,36 +598,44 @@ var PDFImage = function PDFImageClosure() {
505
598
  }
506
599
  }
507
600
  }
601
+
508
602
  imgArray = this.getImageBytes(originalHeight * rowBytes);
509
603
  var actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight;
510
604
  var comps = this.getComponents(imgArray);
511
605
  var alpha01, maybeUndoPreblend;
606
+
512
607
  if (!forceRGBA && !this.smask && !this.mask) {
513
608
  imgData.kind = _util.ImageKind.RGB_24BPP;
514
- imgData.data = new Uint8Array(drawWidth * drawHeight * 3);
609
+ imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 3);
515
610
  alpha01 = 0;
516
611
  maybeUndoPreblend = false;
517
612
  } else {
518
613
  imgData.kind = _util.ImageKind.RGBA_32BPP;
519
- imgData.data = new Uint8Array(drawWidth * drawHeight * 4);
614
+ imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 4);
520
615
  alpha01 = 1;
521
616
  maybeUndoPreblend = true;
522
617
  this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, comps);
523
618
  }
619
+
524
620
  if (this.needsDecode) {
525
621
  this.decodeBuffer(comps);
526
622
  }
623
+
527
624
  this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01);
625
+
528
626
  if (maybeUndoPreblend) {
529
627
  this.undoPreblend(imgData.data, drawWidth, actualHeight);
530
628
  }
629
+
531
630
  return imgData;
532
631
  },
533
632
  fillGrayBuffer: function fillGrayBuffer(buffer) {
534
633
  var numComps = this.numComps;
634
+
535
635
  if (numComps !== 1) {
536
- throw new _util.FormatError('Reading gray scale from a color image: ' + numComps);
636
+ throw new _util.FormatError("Reading gray scale from a color image: ".concat(numComps));
537
637
  }
638
+
538
639
  var width = this.width;
539
640
  var height = this.height;
540
641
  var bpc = this.bpc;
@@ -542,8 +643,10 @@ var PDFImage = function PDFImageClosure() {
542
643
  var imgArray = this.getImageBytes(height * rowBytes);
543
644
  var comps = this.getComponents(imgArray);
544
645
  var i, length;
646
+
545
647
  if (bpc === 1) {
546
648
  length = width * height;
649
+
547
650
  if (this.needsDecode) {
548
651
  for (i = 0; i < length; ++i) {
549
652
  buffer[i] = comps[i] - 1 & 255;
@@ -553,27 +656,31 @@ var PDFImage = function PDFImageClosure() {
553
656
  buffer[i] = -comps[i] & 255;
554
657
  }
555
658
  }
659
+
556
660
  return;
557
661
  }
662
+
558
663
  if (this.needsDecode) {
559
664
  this.decodeBuffer(comps);
560
665
  }
666
+
561
667
  length = width * height;
562
668
  var scale = 255 / ((1 << bpc) - 1);
669
+
563
670
  for (i = 0; i < length; ++i) {
564
- buffer[i] = scale * comps[i] | 0;
671
+ buffer[i] = scale * comps[i];
565
672
  }
566
673
  },
567
674
  getImageBytes: function getImageBytes(length, drawWidth, drawHeight) {
568
675
  var forceRGB = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
569
-
570
676
  this.image.reset();
571
677
  this.image.drawWidth = drawWidth || this.width;
572
678
  this.image.drawHeight = drawHeight || this.height;
573
679
  this.image.forceRGB = !!forceRGB;
574
- return this.image.getBytes(length);
680
+ return this.image.getBytes(length, true);
575
681
  }
576
682
  };
577
683
  return PDFImage;
578
684
  }();
685
+
579
686
  exports.PDFImage = PDFImage;