drtis-dicom-image-loader 2.19.7

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.
Files changed (225) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +173 -0
  3. package/dist/esm/codecs/jpeg.d.ts +29 -0
  4. package/dist/esm/codecs/jpeg.js +884 -0
  5. package/dist/esm/codecs/jpegLossless.d.ts +157 -0
  6. package/dist/esm/codecs/jpegLossless.js +808 -0
  7. package/dist/esm/constants/index.d.ts +2 -0
  8. package/dist/esm/constants/index.js +2 -0
  9. package/dist/esm/constants/transferSyntaxes.d.ts +46 -0
  10. package/dist/esm/constants/transferSyntaxes.js +46 -0
  11. package/dist/esm/decodeImageFrameWorker.d.ts +1 -0
  12. package/dist/esm/decodeImageFrameWorker.js +269 -0
  13. package/dist/esm/imageLoader/colorSpaceConverters/convertPALETTECOLOR.d.ts +3 -0
  14. package/dist/esm/imageLoader/colorSpaceConverters/convertPALETTECOLOR.js +77 -0
  15. package/dist/esm/imageLoader/colorSpaceConverters/convertRGBColorByPixel.d.ts +2 -0
  16. package/dist/esm/imageLoader/colorSpaceConverters/convertRGBColorByPixel.js +21 -0
  17. package/dist/esm/imageLoader/colorSpaceConverters/convertRGBColorByPlane.d.ts +2 -0
  18. package/dist/esm/imageLoader/colorSpaceConverters/convertRGBColorByPlane.js +28 -0
  19. package/dist/esm/imageLoader/colorSpaceConverters/convertYBRFull422ByPixel.d.ts +2 -0
  20. package/dist/esm/imageLoader/colorSpaceConverters/convertYBRFull422ByPixel.js +44 -0
  21. package/dist/esm/imageLoader/colorSpaceConverters/convertYBRFullByPixel.d.ts +2 -0
  22. package/dist/esm/imageLoader/colorSpaceConverters/convertYBRFullByPixel.js +33 -0
  23. package/dist/esm/imageLoader/colorSpaceConverters/convertYBRFullByPlane.d.ts +2 -0
  24. package/dist/esm/imageLoader/colorSpaceConverters/convertYBRFullByPlane.js +35 -0
  25. package/dist/esm/imageLoader/colorSpaceConverters/index.d.ts +7 -0
  26. package/dist/esm/imageLoader/colorSpaceConverters/index.js +7 -0
  27. package/dist/esm/imageLoader/convertColorSpace.d.ts +1 -0
  28. package/dist/esm/imageLoader/convertColorSpace.js +40 -0
  29. package/dist/esm/imageLoader/createImage.d.ts +5 -0
  30. package/dist/esm/imageLoader/createImage.js +245 -0
  31. package/dist/esm/imageLoader/decodeImageFrame.d.ts +3 -0
  32. package/dist/esm/imageLoader/decodeImageFrame.js +63 -0
  33. package/dist/esm/imageLoader/decodeJPEGBaseline8BitColor.d.ts +4 -0
  34. package/dist/esm/imageLoader/decodeJPEGBaseline8BitColor.js +64 -0
  35. package/dist/esm/imageLoader/getImageFrame.d.ts +3 -0
  36. package/dist/esm/imageLoader/getImageFrame.js +25 -0
  37. package/dist/esm/imageLoader/getInstanceModule.d.ts +3 -0
  38. package/dist/esm/imageLoader/getInstanceModule.js +40 -0
  39. package/dist/esm/imageLoader/getMinMax.d.ts +4 -0
  40. package/dist/esm/imageLoader/getMinMax.js +15 -0
  41. package/dist/esm/imageLoader/getScalingParameters.d.ts +6 -0
  42. package/dist/esm/imageLoader/getScalingParameters.js +16 -0
  43. package/dist/esm/imageLoader/imageIdToURI.d.ts +1 -0
  44. package/dist/esm/imageLoader/imageIdToURI.js +4 -0
  45. package/dist/esm/imageLoader/index.d.ts +91 -0
  46. package/dist/esm/imageLoader/index.js +34 -0
  47. package/dist/esm/imageLoader/internal/index.d.ts +10 -0
  48. package/dist/esm/imageLoader/internal/index.js +10 -0
  49. package/dist/esm/imageLoader/internal/options.d.ts +3 -0
  50. package/dist/esm/imageLoader/internal/options.js +19 -0
  51. package/dist/esm/imageLoader/internal/rangeRequest.d.ts +9 -0
  52. package/dist/esm/imageLoader/internal/rangeRequest.js +121 -0
  53. package/dist/esm/imageLoader/internal/streamRequest.d.ts +2 -0
  54. package/dist/esm/imageLoader/internal/streamRequest.js +93 -0
  55. package/dist/esm/imageLoader/internal/xhrRequest.d.ts +3 -0
  56. package/dist/esm/imageLoader/internal/xhrRequest.js +108 -0
  57. package/dist/esm/imageLoader/isColorConversionRequired.d.ts +1 -0
  58. package/dist/esm/imageLoader/isColorConversionRequired.js +25 -0
  59. package/dist/esm/imageLoader/isJPEGBaseline8BitColor.d.ts +3 -0
  60. package/dist/esm/imageLoader/isJPEGBaseline8BitColor.js +9 -0
  61. package/dist/esm/imageLoader/isNMReconstructable.d.ts +1 -0
  62. package/dist/esm/imageLoader/isNMReconstructable.js +3 -0
  63. package/dist/esm/imageLoader/registerLoaders.d.ts +2 -0
  64. package/dist/esm/imageLoader/registerLoaders.js +7 -0
  65. package/dist/esm/imageLoader/wadors/combineFrameInstance.d.ts +12 -0
  66. package/dist/esm/imageLoader/wadors/combineFrameInstance.js +44 -0
  67. package/dist/esm/imageLoader/wadors/extractMultipart.d.ts +23 -0
  68. package/dist/esm/imageLoader/wadors/extractMultipart.js +73 -0
  69. package/dist/esm/imageLoader/wadors/findIndexOfString.d.ts +2 -0
  70. package/dist/esm/imageLoader/wadors/findIndexOfString.js +32 -0
  71. package/dist/esm/imageLoader/wadors/getImageQualityStatus.d.ts +3 -0
  72. package/dist/esm/imageLoader/wadors/getImageQualityStatus.js +8 -0
  73. package/dist/esm/imageLoader/wadors/getPixelData.d.ts +26 -0
  74. package/dist/esm/imageLoader/wadors/getPixelData.js +35 -0
  75. package/dist/esm/imageLoader/wadors/getTagValue.d.ts +1 -0
  76. package/dist/esm/imageLoader/wadors/getTagValue.js +9 -0
  77. package/dist/esm/imageLoader/wadors/index.d.ts +38 -0
  78. package/dist/esm/imageLoader/wadors/index.js +26 -0
  79. package/dist/esm/imageLoader/wadors/loadImage.d.ts +25 -0
  80. package/dist/esm/imageLoader/wadors/loadImage.js +124 -0
  81. package/dist/esm/imageLoader/wadors/loadImage_test.d.ts +1 -0
  82. package/dist/esm/imageLoader/wadors/loadImage_test.js +41 -0
  83. package/dist/esm/imageLoader/wadors/metaData/NMHelpers.d.ts +5 -0
  84. package/dist/esm/imageLoader/wadors/metaData/NMHelpers.js +38 -0
  85. package/dist/esm/imageLoader/wadors/metaData/USHelpers.d.ts +19 -0
  86. package/dist/esm/imageLoader/wadors/metaData/USHelpers.js +46 -0
  87. package/dist/esm/imageLoader/wadors/metaData/extractPositioningFromMetadata.d.ts +3 -0
  88. package/dist/esm/imageLoader/wadors/metaData/extractPositioningFromMetadata.js +18 -0
  89. package/dist/esm/imageLoader/wadors/metaData/getFirstNumberValue.d.ts +2 -0
  90. package/dist/esm/imageLoader/wadors/metaData/getFirstNumberValue.js +6 -0
  91. package/dist/esm/imageLoader/wadors/metaData/getNumberString.d.ts +3 -0
  92. package/dist/esm/imageLoader/wadors/metaData/getNumberString.js +9 -0
  93. package/dist/esm/imageLoader/wadors/metaData/getNumberValue.d.ts +3 -0
  94. package/dist/esm/imageLoader/wadors/metaData/getNumberValue.js +9 -0
  95. package/dist/esm/imageLoader/wadors/metaData/getNumberValues.d.ts +3 -0
  96. package/dist/esm/imageLoader/wadors/metaData/getNumberValues.js +20 -0
  97. package/dist/esm/imageLoader/wadors/metaData/getOverlayPlaneModule.d.ts +4 -0
  98. package/dist/esm/imageLoader/wadors/metaData/getOverlayPlaneModule.js +38 -0
  99. package/dist/esm/imageLoader/wadors/metaData/getSequenceItems.d.ts +3 -0
  100. package/dist/esm/imageLoader/wadors/metaData/getSequenceItems.js +14 -0
  101. package/dist/esm/imageLoader/wadors/metaData/getValue.d.ts +3 -0
  102. package/dist/esm/imageLoader/wadors/metaData/getValue.js +14 -0
  103. package/dist/esm/imageLoader/wadors/metaData/index.d.ts +7 -0
  104. package/dist/esm/imageLoader/wadors/metaData/index.js +7 -0
  105. package/dist/esm/imageLoader/wadors/metaData/metaDataProvider.d.ts +14 -0
  106. package/dist/esm/imageLoader/wadors/metaData/metaDataProvider.js +278 -0
  107. package/dist/esm/imageLoader/wadors/metaDataManager.d.ts +19 -0
  108. package/dist/esm/imageLoader/wadors/metaDataManager.js +68 -0
  109. package/dist/esm/imageLoader/wadors/register.d.ts +1 -0
  110. package/dist/esm/imageLoader/wadors/register.js +7 -0
  111. package/dist/esm/imageLoader/wadouri/combineFrameInstanceDataset.d.ts +22 -0
  112. package/dist/esm/imageLoader/wadouri/combineFrameInstanceDataset.js +69 -0
  113. package/dist/esm/imageLoader/wadouri/dataSetCacheManager.d.ts +28 -0
  114. package/dist/esm/imageLoader/wadouri/dataSetCacheManager.js +141 -0
  115. package/dist/esm/imageLoader/wadouri/dataSetCacheManager_test.d.ts +1 -0
  116. package/dist/esm/imageLoader/wadouri/dataSetCacheManager_test.js +10 -0
  117. package/dist/esm/imageLoader/wadouri/dataset-from-partial-content.d.ts +6 -0
  118. package/dist/esm/imageLoader/wadouri/dataset-from-partial-content.js +55 -0
  119. package/dist/esm/imageLoader/wadouri/fileManager.d.ts +11 -0
  120. package/dist/esm/imageLoader/wadouri/fileManager.js +20 -0
  121. package/dist/esm/imageLoader/wadouri/getEncapsulatedImageFrame.d.ts +2 -0
  122. package/dist/esm/imageLoader/wadouri/getEncapsulatedImageFrame.js +31 -0
  123. package/dist/esm/imageLoader/wadouri/getPixelData.d.ts +3 -0
  124. package/dist/esm/imageLoader/wadouri/getPixelData.js +13 -0
  125. package/dist/esm/imageLoader/wadouri/getUncompressedImageFrame.d.ts +3 -0
  126. package/dist/esm/imageLoader/wadouri/getUncompressedImageFrame.js +47 -0
  127. package/dist/esm/imageLoader/wadouri/index.d.ts +56 -0
  128. package/dist/esm/imageLoader/wadouri/index.js +35 -0
  129. package/dist/esm/imageLoader/wadouri/loadFileRequest.d.ts +2 -0
  130. package/dist/esm/imageLoader/wadouri/loadFileRequest.js +17 -0
  131. package/dist/esm/imageLoader/wadouri/loadImage.d.ts +9 -0
  132. package/dist/esm/imageLoader/wadouri/loadImage.js +108 -0
  133. package/dist/esm/imageLoader/wadouri/loadedDataSets.d.ts +7 -0
  134. package/dist/esm/imageLoader/wadouri/loadedDataSets.js +5 -0
  135. package/dist/esm/imageLoader/wadouri/metaData/USHelpers.d.ts +2 -0
  136. package/dist/esm/imageLoader/wadouri/metaData/USHelpers.js +44 -0
  137. package/dist/esm/imageLoader/wadouri/metaData/extractPositioningFromDataset.d.ts +6 -0
  138. package/dist/esm/imageLoader/wadouri/metaData/extractPositioningFromDataset.js +80 -0
  139. package/dist/esm/imageLoader/wadouri/metaData/getImagePixelModule.d.ts +4 -0
  140. package/dist/esm/imageLoader/wadouri/metaData/getImagePixelModule.js +79 -0
  141. package/dist/esm/imageLoader/wadouri/metaData/getLUTs.d.ts +4 -0
  142. package/dist/esm/imageLoader/wadouri/metaData/getLUTs.js +44 -0
  143. package/dist/esm/imageLoader/wadouri/metaData/getModalityLUTOutputPixelRepresentation.d.ts +3 -0
  144. package/dist/esm/imageLoader/wadouri/metaData/getModalityLUTOutputPixelRepresentation.js +30 -0
  145. package/dist/esm/imageLoader/wadouri/metaData/getNumberValues.d.ts +3 -0
  146. package/dist/esm/imageLoader/wadouri/metaData/getNumberValues.js +16 -0
  147. package/dist/esm/imageLoader/wadouri/metaData/getOverlayPlaneModule.d.ts +4 -0
  148. package/dist/esm/imageLoader/wadouri/metaData/getOverlayPlaneModule.js +36 -0
  149. package/dist/esm/imageLoader/wadouri/metaData/index.d.ts +5 -0
  150. package/dist/esm/imageLoader/wadouri/metaData/index.js +5 -0
  151. package/dist/esm/imageLoader/wadouri/metaData/metaDataProvider.d.ts +4 -0
  152. package/dist/esm/imageLoader/wadouri/metaData/metaDataProvider.js +228 -0
  153. package/dist/esm/imageLoader/wadouri/parseImageId.d.ts +8 -0
  154. package/dist/esm/imageLoader/wadouri/parseImageId.js +20 -0
  155. package/dist/esm/imageLoader/wadouri/register.d.ts +1 -0
  156. package/dist/esm/imageLoader/wadouri/register.js +9 -0
  157. package/dist/esm/imageLoader/wadouri/retrieveMultiframeDataset.d.ts +17 -0
  158. package/dist/esm/imageLoader/wadouri/retrieveMultiframeDataset.js +57 -0
  159. package/dist/esm/imageLoader/wadouri/unpackBinaryFrame.d.ts +3 -0
  160. package/dist/esm/imageLoader/wadouri/unpackBinaryFrame.js +14 -0
  161. package/dist/esm/index.d.ts +97 -0
  162. package/dist/esm/index.js +38 -0
  163. package/dist/esm/init.d.ts +3 -0
  164. package/dist/esm/init.js +23 -0
  165. package/dist/esm/shared/decoders/decodeBigEndian.d.ts +4 -0
  166. package/dist/esm/shared/decoders/decodeBigEndian.js +28 -0
  167. package/dist/esm/shared/decoders/decodeHTJ2K.d.ts +5 -0
  168. package/dist/esm/shared/decoders/decodeHTJ2K.js +109 -0
  169. package/dist/esm/shared/decoders/decodeJPEG2000.d.ts +5 -0
  170. package/dist/esm/shared/decoders/decodeJPEG2000.js +93 -0
  171. package/dist/esm/shared/decoders/decodeJPEGBaseline12Bit-js.d.ts +6 -0
  172. package/dist/esm/shared/decoders/decodeJPEGBaseline12Bit-js.js +36 -0
  173. package/dist/esm/shared/decoders/decodeJPEGBaseline12Bit-wasm-not-yet-working.d.ts +1 -0
  174. package/dist/esm/shared/decoders/decodeJPEGBaseline12Bit-wasm-not-yet-working.js +0 -0
  175. package/dist/esm/shared/decoders/decodeJPEGBaseline8Bit.d.ts +3 -0
  176. package/dist/esm/shared/decoders/decodeJPEGBaseline8Bit.js +62 -0
  177. package/dist/esm/shared/decoders/decodeJPEGLS.d.ts +5 -0
  178. package/dist/esm/shared/decoders/decodeJPEGLS.js +84 -0
  179. package/dist/esm/shared/decoders/decodeJPEGLossless copy.d.ts +6 -0
  180. package/dist/esm/shared/decoders/decodeJPEGLossless copy.js +39 -0
  181. package/dist/esm/shared/decoders/decodeJPEGLossless.d.ts +6 -0
  182. package/dist/esm/shared/decoders/decodeJPEGLossless.js +39 -0
  183. package/dist/esm/shared/decoders/decodeLittleEndian.d.ts +4 -0
  184. package/dist/esm/shared/decoders/decodeLittleEndian.js +29 -0
  185. package/dist/esm/shared/decoders/decodeRLE.d.ts +4 -0
  186. package/dist/esm/shared/decoders/decodeRLE.js +128 -0
  187. package/dist/esm/shared/getMinMax.d.ts +6 -0
  188. package/dist/esm/shared/getMinMax.js +16 -0
  189. package/dist/esm/shared/getMinMax_test.d.ts +1 -0
  190. package/dist/esm/shared/getMinMax_test.js +9 -0
  191. package/dist/esm/shared/getPixelDataTypeFromMinMax.d.ts +3 -0
  192. package/dist/esm/shared/getPixelDataTypeFromMinMax.js +26 -0
  193. package/dist/esm/shared/isColorImage.d.ts +1 -0
  194. package/dist/esm/shared/isColorImage.js +10 -0
  195. package/dist/esm/shared/scaling/bilinear.d.ts +1 -0
  196. package/dist/esm/shared/scaling/bilinear.js +32 -0
  197. package/dist/esm/shared/scaling/replicate.d.ts +1 -0
  198. package/dist/esm/shared/scaling/replicate.js +20 -0
  199. package/dist/esm/shared/scaling/scaleArray.d.ts +2 -0
  200. package/dist/esm/shared/scaling/scaleArray.js +17 -0
  201. package/dist/esm/types/DICOMLoaderDataSetWithFetchMore.d.ts +9 -0
  202. package/dist/esm/types/DICOMLoaderDataSetWithFetchMore.js +0 -0
  203. package/dist/esm/types/DICOMLoaderIImage.d.ts +11 -0
  204. package/dist/esm/types/DICOMLoaderIImage.js +0 -0
  205. package/dist/esm/types/DICOMLoaderImageOptions.d.ts +23 -0
  206. package/dist/esm/types/DICOMLoaderImageOptions.js +0 -0
  207. package/dist/esm/types/LoadRequestFunction.d.ts +1 -0
  208. package/dist/esm/types/LoadRequestFunction.js +0 -0
  209. package/dist/esm/types/LoaderDecodeOptions.d.ts +2 -0
  210. package/dist/esm/types/LoaderDecodeOptions.js +0 -0
  211. package/dist/esm/types/LoaderOptions.d.ts +16 -0
  212. package/dist/esm/types/LoaderOptions.js +0 -0
  213. package/dist/esm/types/LutType.d.ts +6 -0
  214. package/dist/esm/types/LutType.js +0 -0
  215. package/dist/esm/types/WADORSMetaData.d.ts +4 -0
  216. package/dist/esm/types/WADORSMetaData.js +0 -0
  217. package/dist/esm/types/WebWorkerTypes.d.ts +64 -0
  218. package/dist/esm/types/WebWorkerTypes.js +0 -0
  219. package/dist/esm/types/XHRRequest.d.ts +16 -0
  220. package/dist/esm/types/XHRRequest.js +0 -0
  221. package/dist/esm/types/index.d.ts +11 -0
  222. package/dist/esm/types/index.js +0 -0
  223. package/dist/esm/version.d.ts +2 -0
  224. package/dist/esm/version.js +1 -0
  225. package/package.json +134 -0
@@ -0,0 +1,884 @@
1
+ var ColorSpace = { Unkown: 0, Grayscale: 1, AdobeRGB: 2, RGB: 3, CYMK: 4 };
2
+ var dctZigZag = new Int32Array([
3
+ 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40,
4
+ 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29,
5
+ 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54,
6
+ 47, 55, 62, 63,
7
+ ]);
8
+ var dctCos1 = 4017;
9
+ var dctSin1 = 799;
10
+ var dctCos3 = 3406;
11
+ var dctSin3 = 2276;
12
+ var dctCos6 = 1567;
13
+ var dctSin6 = 3784;
14
+ var dctSqrt2 = 5793;
15
+ var dctSqrt1d2 = 2896;
16
+ function buildHuffmanTable(codeLengths, values) {
17
+ var k = 0, code = [], i, j, length = 16;
18
+ while (length > 0 && !codeLengths[length - 1])
19
+ length--;
20
+ code.push({ children: [], index: 0 });
21
+ var p = code[0], q;
22
+ for (i = 0; i < length; i++) {
23
+ for (j = 0; j < codeLengths[i]; j++) {
24
+ p = code.pop();
25
+ p.children[p.index] = values[k];
26
+ while (p.index > 0) {
27
+ p = code.pop();
28
+ }
29
+ p.index++;
30
+ code.push(p);
31
+ while (code.length <= i) {
32
+ code.push((q = { children: [], index: 0 }));
33
+ p.children[p.index] = q.children;
34
+ p = q;
35
+ }
36
+ k++;
37
+ }
38
+ if (i + 1 < length) {
39
+ code.push((q = { children: [], index: 0 }));
40
+ p.children[p.index] = q.children;
41
+ p = q;
42
+ }
43
+ }
44
+ return code[0].children;
45
+ }
46
+ function getBlockBufferOffset(component, row, col) {
47
+ return 64 * ((component.blocksPerLine + 1) * row + col);
48
+ }
49
+ function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) {
50
+ var precision = frame.precision;
51
+ var samplesPerLine = frame.samplesPerLine;
52
+ var scanLines = frame.scanLines;
53
+ var mcusPerLine = frame.mcusPerLine;
54
+ var progressive = frame.progressive;
55
+ var maxH = frame.maxH, maxV = frame.maxV;
56
+ var startOffset = offset, bitsData = 0, bitsCount = 0;
57
+ function readBit() {
58
+ if (bitsCount > 0) {
59
+ bitsCount--;
60
+ return (bitsData >> bitsCount) & 1;
61
+ }
62
+ bitsData = data[offset++];
63
+ if (bitsData == 0xff) {
64
+ var nextByte = data[offset++];
65
+ if (nextByte) {
66
+ throw 'unexpected marker: ' + ((bitsData << 8) | nextByte).toString(16);
67
+ }
68
+ }
69
+ bitsCount = 7;
70
+ return bitsData >>> 7;
71
+ }
72
+ function decodeHuffman(tree) {
73
+ var node = tree;
74
+ var bit;
75
+ while ((bit = readBit()) !== null) {
76
+ node = node[bit];
77
+ if (typeof node === 'number')
78
+ return node;
79
+ if (typeof node !== 'object')
80
+ throw 'invalid huffman sequence';
81
+ }
82
+ return null;
83
+ }
84
+ function receive(length) {
85
+ var n = 0;
86
+ while (length > 0) {
87
+ var bit = readBit();
88
+ if (bit === null)
89
+ return;
90
+ n = (n << 1) | bit;
91
+ length--;
92
+ }
93
+ return n;
94
+ }
95
+ function receiveAndExtend(length) {
96
+ var n = receive(length);
97
+ if (n >= 1 << (length - 1))
98
+ return n;
99
+ return n + (-1 << length) + 1;
100
+ }
101
+ function decodeBaseline(component, offset) {
102
+ var t = decodeHuffman(component.huffmanTableDC);
103
+ var diff = t === 0 ? 0 : receiveAndExtend(t);
104
+ component.blockData[offset] = component.pred += diff;
105
+ var k = 1;
106
+ while (k < 64) {
107
+ var rs = decodeHuffman(component.huffmanTableAC);
108
+ var s = rs & 15, r = rs >> 4;
109
+ if (s === 0) {
110
+ if (r < 15)
111
+ break;
112
+ k += 16;
113
+ continue;
114
+ }
115
+ k += r;
116
+ var z = dctZigZag[k];
117
+ component.blockData[offset + z] = receiveAndExtend(s);
118
+ k++;
119
+ }
120
+ }
121
+ function decodeDCFirst(component, offset) {
122
+ var t = decodeHuffman(component.huffmanTableDC);
123
+ var diff = t === 0 ? 0 : receiveAndExtend(t) << successive;
124
+ component.blockData[offset] = component.pred += diff;
125
+ }
126
+ function decodeDCSuccessive(component, offset) {
127
+ component.blockData[offset] |= readBit() << successive;
128
+ }
129
+ var eobrun = 0;
130
+ function decodeACFirst(component, offset) {
131
+ if (eobrun > 0) {
132
+ eobrun--;
133
+ return;
134
+ }
135
+ var k = spectralStart, e = spectralEnd;
136
+ while (k <= e) {
137
+ var rs = decodeHuffman(component.huffmanTableAC);
138
+ var s = rs & 15, r = rs >> 4;
139
+ if (s === 0) {
140
+ if (r < 15) {
141
+ eobrun = receive(r) + (1 << r) - 1;
142
+ break;
143
+ }
144
+ k += 16;
145
+ continue;
146
+ }
147
+ k += r;
148
+ var z = dctZigZag[k];
149
+ component.blockData[offset + z] = receiveAndExtend(s) * (1 << successive);
150
+ k++;
151
+ }
152
+ }
153
+ var successiveACState = 0, successiveACNextValue;
154
+ function decodeACSuccessive(component, offset) {
155
+ var k = spectralStart, e = spectralEnd, r = 0;
156
+ while (k <= e) {
157
+ var z = dctZigZag[k];
158
+ switch (successiveACState) {
159
+ case 0:
160
+ var rs = decodeHuffman(component.huffmanTableAC);
161
+ var s = rs & 15;
162
+ r = rs >> 4;
163
+ if (s === 0) {
164
+ if (r < 15) {
165
+ eobrun = receive(r) + (1 << r);
166
+ successiveACState = 4;
167
+ }
168
+ else {
169
+ r = 16;
170
+ successiveACState = 1;
171
+ }
172
+ }
173
+ else {
174
+ if (s !== 1)
175
+ throw 'invalid ACn encoding';
176
+ successiveACNextValue = receiveAndExtend(s);
177
+ successiveACState = r ? 2 : 3;
178
+ }
179
+ continue;
180
+ case 1:
181
+ case 2:
182
+ if (component.blockData[offset + z]) {
183
+ component.blockData[offset + z] += readBit() << successive;
184
+ }
185
+ else {
186
+ r--;
187
+ if (r === 0)
188
+ successiveACState = successiveACState == 2 ? 3 : 0;
189
+ }
190
+ break;
191
+ case 3:
192
+ if (component.blockData[offset + z]) {
193
+ component.blockData[offset + z] += readBit() << successive;
194
+ }
195
+ else {
196
+ component.blockData[offset + z] =
197
+ successiveACNextValue << successive;
198
+ successiveACState = 0;
199
+ }
200
+ break;
201
+ case 4:
202
+ if (component.blockData[offset + z]) {
203
+ component.blockData[offset + z] += readBit() << successive;
204
+ }
205
+ break;
206
+ }
207
+ k++;
208
+ }
209
+ if (successiveACState === 4) {
210
+ eobrun--;
211
+ if (eobrun === 0)
212
+ successiveACState = 0;
213
+ }
214
+ }
215
+ function decodeMcu(component, decode, mcu, row, col) {
216
+ var mcuRow = (mcu / mcusPerLine) | 0;
217
+ var mcuCol = mcu % mcusPerLine;
218
+ var blockRow = mcuRow * component.v + row;
219
+ var blockCol = mcuCol * component.h + col;
220
+ var offset = getBlockBufferOffset(component, blockRow, blockCol);
221
+ decode(component, offset);
222
+ }
223
+ function decodeBlock(component, decode, mcu) {
224
+ var blockRow = (mcu / component.blocksPerLine) | 0;
225
+ var blockCol = mcu % component.blocksPerLine;
226
+ var offset = getBlockBufferOffset(component, blockRow, blockCol);
227
+ decode(component, offset);
228
+ }
229
+ var componentsLength = components.length;
230
+ var component, i, j, k, n;
231
+ var decodeFn;
232
+ if (progressive) {
233
+ if (spectralStart === 0)
234
+ decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
235
+ else
236
+ decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
237
+ }
238
+ else {
239
+ decodeFn = decodeBaseline;
240
+ }
241
+ var mcu = 0, marker;
242
+ var mcuExpected;
243
+ if (componentsLength == 1) {
244
+ mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
245
+ }
246
+ else {
247
+ mcuExpected = mcusPerLine * frame.mcusPerColumn;
248
+ }
249
+ if (!resetInterval) {
250
+ resetInterval = mcuExpected;
251
+ }
252
+ var h, v;
253
+ while (mcu < mcuExpected) {
254
+ for (i = 0; i < componentsLength; i++) {
255
+ components[i].pred = 0;
256
+ }
257
+ eobrun = 0;
258
+ if (componentsLength == 1) {
259
+ component = components[0];
260
+ for (n = 0; n < resetInterval; n++) {
261
+ decodeBlock(component, decodeFn, mcu);
262
+ mcu++;
263
+ }
264
+ }
265
+ else {
266
+ for (n = 0; n < resetInterval; n++) {
267
+ for (i = 0; i < componentsLength; i++) {
268
+ component = components[i];
269
+ h = component.h;
270
+ v = component.v;
271
+ for (j = 0; j < v; j++) {
272
+ for (k = 0; k < h; k++) {
273
+ decodeMcu(component, decodeFn, mcu, j, k);
274
+ }
275
+ }
276
+ }
277
+ mcu++;
278
+ }
279
+ }
280
+ bitsCount = 0;
281
+ marker = (data[offset] << 8) | data[offset + 1];
282
+ if (marker <= 0xff00) {
283
+ throw 'marker was not found';
284
+ }
285
+ if (marker >= 0xffd0 && marker <= 0xffd7) {
286
+ offset += 2;
287
+ }
288
+ else {
289
+ break;
290
+ }
291
+ }
292
+ return offset - startOffset;
293
+ }
294
+ function quantizeAndInverse(component, blockBufferOffset, p) {
295
+ var qt = component.quantizationTable;
296
+ var v0, v1, v2, v3, v4, v5, v6, v7, t;
297
+ var i;
298
+ for (i = 0; i < 64; i++) {
299
+ p[i] = component.blockData[blockBufferOffset + i] * qt[i];
300
+ }
301
+ for (i = 0; i < 8; ++i) {
302
+ var row = 8 * i;
303
+ if (p[1 + row] === 0 &&
304
+ p[2 + row] === 0 &&
305
+ p[3 + row] === 0 &&
306
+ p[4 + row] === 0 &&
307
+ p[5 + row] === 0 &&
308
+ p[6 + row] === 0 &&
309
+ p[7 + row] === 0) {
310
+ t = (dctSqrt2 * p[0 + row] + 512) >> 10;
311
+ p[0 + row] = t;
312
+ p[1 + row] = t;
313
+ p[2 + row] = t;
314
+ p[3 + row] = t;
315
+ p[4 + row] = t;
316
+ p[5 + row] = t;
317
+ p[6 + row] = t;
318
+ p[7 + row] = t;
319
+ continue;
320
+ }
321
+ v0 = (dctSqrt2 * p[0 + row] + 128) >> 8;
322
+ v1 = (dctSqrt2 * p[4 + row] + 128) >> 8;
323
+ v2 = p[2 + row];
324
+ v3 = p[6 + row];
325
+ v4 = (dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128) >> 8;
326
+ v7 = (dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128) >> 8;
327
+ v5 = p[3 + row] << 4;
328
+ v6 = p[5 + row] << 4;
329
+ t = (v0 - v1 + 1) >> 1;
330
+ v0 = (v0 + v1 + 1) >> 1;
331
+ v1 = t;
332
+ t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;
333
+ v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;
334
+ v3 = t;
335
+ t = (v4 - v6 + 1) >> 1;
336
+ v4 = (v4 + v6 + 1) >> 1;
337
+ v6 = t;
338
+ t = (v7 + v5 + 1) >> 1;
339
+ v5 = (v7 - v5 + 1) >> 1;
340
+ v7 = t;
341
+ t = (v0 - v3 + 1) >> 1;
342
+ v0 = (v0 + v3 + 1) >> 1;
343
+ v3 = t;
344
+ t = (v1 - v2 + 1) >> 1;
345
+ v1 = (v1 + v2 + 1) >> 1;
346
+ v2 = t;
347
+ t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
348
+ v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
349
+ v7 = t;
350
+ t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
351
+ v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
352
+ v6 = t;
353
+ p[0 + row] = v0 + v7;
354
+ p[7 + row] = v0 - v7;
355
+ p[1 + row] = v1 + v6;
356
+ p[6 + row] = v1 - v6;
357
+ p[2 + row] = v2 + v5;
358
+ p[5 + row] = v2 - v5;
359
+ p[3 + row] = v3 + v4;
360
+ p[4 + row] = v3 - v4;
361
+ }
362
+ for (i = 0; i < 8; ++i) {
363
+ var col = i;
364
+ if (p[1 * 8 + col] === 0 &&
365
+ p[2 * 8 + col] === 0 &&
366
+ p[3 * 8 + col] === 0 &&
367
+ p[4 * 8 + col] === 0 &&
368
+ p[5 * 8 + col] === 0 &&
369
+ p[6 * 8 + col] === 0 &&
370
+ p[7 * 8 + col] === 0) {
371
+ t = (dctSqrt2 * p[i + 0] + 8192) >> 14;
372
+ p[0 * 8 + col] = t;
373
+ p[1 * 8 + col] = t;
374
+ p[2 * 8 + col] = t;
375
+ p[3 * 8 + col] = t;
376
+ p[4 * 8 + col] = t;
377
+ p[5 * 8 + col] = t;
378
+ p[6 * 8 + col] = t;
379
+ p[7 * 8 + col] = t;
380
+ continue;
381
+ }
382
+ v0 = (dctSqrt2 * p[0 * 8 + col] + 2048) >> 12;
383
+ v1 = (dctSqrt2 * p[4 * 8 + col] + 2048) >> 12;
384
+ v2 = p[2 * 8 + col];
385
+ v3 = p[6 * 8 + col];
386
+ v4 = (dctSqrt1d2 * (p[1 * 8 + col] - p[7 * 8 + col]) + 2048) >> 12;
387
+ v7 = (dctSqrt1d2 * (p[1 * 8 + col] + p[7 * 8 + col]) + 2048) >> 12;
388
+ v5 = p[3 * 8 + col];
389
+ v6 = p[5 * 8 + col];
390
+ t = (v0 - v1 + 1) >> 1;
391
+ v0 = (v0 + v1 + 1) >> 1;
392
+ v1 = t;
393
+ t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;
394
+ v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;
395
+ v3 = t;
396
+ t = (v4 - v6 + 1) >> 1;
397
+ v4 = (v4 + v6 + 1) >> 1;
398
+ v6 = t;
399
+ t = (v7 + v5 + 1) >> 1;
400
+ v5 = (v7 - v5 + 1) >> 1;
401
+ v7 = t;
402
+ t = (v0 - v3 + 1) >> 1;
403
+ v0 = (v0 + v3 + 1) >> 1;
404
+ v3 = t;
405
+ t = (v1 - v2 + 1) >> 1;
406
+ v1 = (v1 + v2 + 1) >> 1;
407
+ v2 = t;
408
+ t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
409
+ v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
410
+ v7 = t;
411
+ t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
412
+ v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
413
+ v6 = t;
414
+ p[0 * 8 + col] = v0 + v7;
415
+ p[7 * 8 + col] = v0 - v7;
416
+ p[1 * 8 + col] = v1 + v6;
417
+ p[6 * 8 + col] = v1 - v6;
418
+ p[2 * 8 + col] = v2 + v5;
419
+ p[5 * 8 + col] = v2 - v5;
420
+ p[3 * 8 + col] = v3 + v4;
421
+ p[4 * 8 + col] = v3 - v4;
422
+ }
423
+ for (i = 0; i < 64; ++i) {
424
+ var index = blockBufferOffset + i;
425
+ var q = p[i];
426
+ q =
427
+ q <= -2056 / component.bitConversion
428
+ ? 0
429
+ : q >= 2024 / component.bitConversion
430
+ ? 255 / component.bitConversion
431
+ : (q + 2056 / component.bitConversion) >> 4;
432
+ component.blockData[index] = q;
433
+ }
434
+ }
435
+ function buildComponentData(frame, component) {
436
+ var lines = [];
437
+ var blocksPerLine = component.blocksPerLine;
438
+ var blocksPerColumn = component.blocksPerColumn;
439
+ var samplesPerLine = blocksPerLine << 3;
440
+ var computationBuffer = new Int32Array(64);
441
+ var i, j, ll = 0;
442
+ for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
443
+ for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
444
+ var offset = getBlockBufferOffset(component, blockRow, blockCol);
445
+ quantizeAndInverse(component, offset, computationBuffer);
446
+ }
447
+ }
448
+ return component.blockData;
449
+ }
450
+ function clampToUint8(a) {
451
+ return a <= 0 ? 0 : a >= 255 ? 255 : a | 0;
452
+ }
453
+ class JpegImage {
454
+ constructor() { }
455
+ load(path) {
456
+ var handleData = function (data) {
457
+ this.parse(data);
458
+ if (this.onload)
459
+ this.onload();
460
+ }.bind(this);
461
+ if (path.indexOf('data:') > -1) {
462
+ var offset = path.indexOf('base64,') + 7;
463
+ var data = atob(path.substring(offset));
464
+ var arr = new Uint8Array(data.length);
465
+ for (var i = data.length - 1; i >= 0; i--) {
466
+ arr[i] = data.charCodeAt(i);
467
+ }
468
+ handleData(data);
469
+ }
470
+ else {
471
+ var xhr = new XMLHttpRequest();
472
+ xhr.open('GET', path, true);
473
+ xhr.responseType = 'arraybuffer';
474
+ xhr.onload = function () {
475
+ var data = new Uint8Array(xhr.response);
476
+ handleData(data);
477
+ }.bind(this);
478
+ xhr.send(null);
479
+ }
480
+ }
481
+ parse(data) {
482
+ function readUint16() {
483
+ var value = (data[offset] << 8) | data[offset + 1];
484
+ offset += 2;
485
+ return value;
486
+ }
487
+ function readDataBlock() {
488
+ var length = readUint16();
489
+ var array = data.subarray(offset, offset + length - 2);
490
+ offset += array.length;
491
+ return array;
492
+ }
493
+ function prepareComponents(frame) {
494
+ var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);
495
+ var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);
496
+ for (var i = 0; i < frame.components.length; i++) {
497
+ component = frame.components[i];
498
+ var blocksPerLine = Math.ceil((Math.ceil(frame.samplesPerLine / 8) * component.h) / frame.maxH);
499
+ var blocksPerColumn = Math.ceil((Math.ceil(frame.scanLines / 8) * component.v) / frame.maxV);
500
+ var blocksPerLineForMcu = mcusPerLine * component.h;
501
+ var blocksPerColumnForMcu = mcusPerColumn * component.v;
502
+ var blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1);
503
+ component.blockData = new Int16Array(blocksBufferSize);
504
+ component.blocksPerLine = blocksPerLine;
505
+ component.blocksPerColumn = blocksPerColumn;
506
+ }
507
+ frame.mcusPerLine = mcusPerLine;
508
+ frame.mcusPerColumn = mcusPerColumn;
509
+ }
510
+ var offset = 0, length = data.length;
511
+ var jfif = null;
512
+ var adobe = null;
513
+ var pixels = null;
514
+ var frame, resetInterval;
515
+ var quantizationTables = [];
516
+ var huffmanTablesAC = [], huffmanTablesDC = [];
517
+ var fileMarker = readUint16();
518
+ if (fileMarker != 0xffd8) {
519
+ throw 'SOI not found';
520
+ }
521
+ fileMarker = readUint16();
522
+ while (fileMarker != 0xffd9) {
523
+ var i, j, l;
524
+ switch (fileMarker) {
525
+ case 0xffe0:
526
+ case 0xffe1:
527
+ case 0xffe2:
528
+ case 0xffe3:
529
+ case 0xffe4:
530
+ case 0xffe5:
531
+ case 0xffe6:
532
+ case 0xffe7:
533
+ case 0xffe8:
534
+ case 0xffe9:
535
+ case 0xffea:
536
+ case 0xffeb:
537
+ case 0xffec:
538
+ case 0xffed:
539
+ case 0xffee:
540
+ case 0xffef:
541
+ case 0xfffe:
542
+ var appData = readDataBlock();
543
+ if (fileMarker === 0xffe0) {
544
+ if (appData[0] === 0x4a &&
545
+ appData[1] === 0x46 &&
546
+ appData[2] === 0x49 &&
547
+ appData[3] === 0x46 &&
548
+ appData[4] === 0) {
549
+ jfif = {
550
+ version: { major: appData[5], minor: appData[6] },
551
+ densityUnits: appData[7],
552
+ xDensity: (appData[8] << 8) | appData[9],
553
+ yDensity: (appData[10] << 8) | appData[11],
554
+ thumbWidth: appData[12],
555
+ thumbHeight: appData[13],
556
+ thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13]),
557
+ };
558
+ }
559
+ }
560
+ if (fileMarker === 0xffee) {
561
+ if (appData[0] === 0x41 &&
562
+ appData[1] === 0x64 &&
563
+ appData[2] === 0x6f &&
564
+ appData[3] === 0x62 &&
565
+ appData[4] === 0x65 &&
566
+ appData[5] === 0) {
567
+ adobe = {
568
+ version: appData[6],
569
+ flags0: (appData[7] << 8) | appData[8],
570
+ flags1: (appData[9] << 8) | appData[10],
571
+ transformCode: appData[11],
572
+ };
573
+ }
574
+ }
575
+ break;
576
+ case 0xffdb:
577
+ var quantizationTablesLength = readUint16();
578
+ var quantizationTablesEnd = quantizationTablesLength + offset - 2;
579
+ while (offset < quantizationTablesEnd) {
580
+ var quantizationTableSpec = data[offset++];
581
+ var tableData = new Int32Array(64);
582
+ if (quantizationTableSpec >> 4 === 0) {
583
+ for (j = 0; j < 64; j++) {
584
+ var z = dctZigZag[j];
585
+ tableData[z] = data[offset++];
586
+ }
587
+ }
588
+ else if (quantizationTableSpec >> 4 === 1) {
589
+ for (j = 0; j < 64; j++) {
590
+ var zz = dctZigZag[j];
591
+ tableData[zz] = readUint16();
592
+ }
593
+ }
594
+ else
595
+ throw 'DQT: invalid table spec';
596
+ quantizationTables[quantizationTableSpec & 15] = tableData;
597
+ }
598
+ break;
599
+ case 0xffc0:
600
+ case 0xffc1:
601
+ case 0xffc2:
602
+ if (frame) {
603
+ throw 'Only single frame JPEGs supported';
604
+ }
605
+ readUint16();
606
+ frame = {};
607
+ frame.extended = fileMarker === 0xffc1;
608
+ frame.progressive = fileMarker === 0xffc2;
609
+ frame.precision = data[offset++];
610
+ frame.scanLines = readUint16();
611
+ frame.samplesPerLine = readUint16();
612
+ frame.components = [];
613
+ frame.componentIds = {};
614
+ var componentsCount = data[offset++], componentId;
615
+ var maxH = 0, maxV = 0;
616
+ for (i = 0; i < componentsCount; i++) {
617
+ componentId = data[offset];
618
+ var h = data[offset + 1] >> 4;
619
+ var v = data[offset + 1] & 15;
620
+ if (maxH < h)
621
+ maxH = h;
622
+ if (maxV < v)
623
+ maxV = v;
624
+ var qId = data[offset + 2];
625
+ l = frame.components.push({
626
+ h: h,
627
+ v: v,
628
+ quantizationTable: quantizationTables[qId],
629
+ quantizationTableId: qId,
630
+ bitConversion: 255 / ((1 << frame.precision) - 1),
631
+ });
632
+ frame.componentIds[componentId] = l - 1;
633
+ offset += 3;
634
+ }
635
+ frame.maxH = maxH;
636
+ frame.maxV = maxV;
637
+ prepareComponents(frame);
638
+ break;
639
+ case 0xffc4:
640
+ var huffmanLength = readUint16();
641
+ for (i = 2; i < huffmanLength;) {
642
+ var huffmanTableSpec = data[offset++];
643
+ var codeLengths = new Uint8Array(16);
644
+ var codeLengthSum = 0;
645
+ for (j = 0; j < 16; j++, offset++)
646
+ codeLengthSum += codeLengths[j] = data[offset];
647
+ var huffmanValues = new Uint8Array(codeLengthSum);
648
+ for (j = 0; j < codeLengthSum; j++, offset++)
649
+ huffmanValues[j] = data[offset];
650
+ i += 17 + codeLengthSum;
651
+ (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues);
652
+ }
653
+ break;
654
+ case 0xffdd:
655
+ readUint16();
656
+ resetInterval = readUint16();
657
+ break;
658
+ case 0xffda:
659
+ var scanLength = readUint16();
660
+ var selectorsCount = data[offset++];
661
+ var components = [], component;
662
+ for (i = 0; i < selectorsCount; i++) {
663
+ var componentIndex = frame.componentIds[data[offset++]];
664
+ component = frame.components[componentIndex];
665
+ var tableSpec = data[offset++];
666
+ component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
667
+ component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
668
+ components.push(component);
669
+ }
670
+ var spectralStart = data[offset++];
671
+ var spectralEnd = data[offset++];
672
+ var successiveApproximation = data[offset++];
673
+ var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15);
674
+ offset += processed;
675
+ break;
676
+ case 0xffff:
677
+ if (data[offset] !== 0xff) {
678
+ offset--;
679
+ }
680
+ break;
681
+ default:
682
+ if (data[offset - 3] == 0xff &&
683
+ data[offset - 2] >= 0xc0 &&
684
+ data[offset - 2] <= 0xfe) {
685
+ offset -= 3;
686
+ break;
687
+ }
688
+ throw 'unknown JPEG marker ' + fileMarker.toString(16);
689
+ }
690
+ fileMarker = readUint16();
691
+ }
692
+ this.width = frame.samplesPerLine;
693
+ this.height = frame.scanLines;
694
+ this.jfif = jfif;
695
+ this.adobe = adobe;
696
+ this.components = [];
697
+ switch (frame.components.length) {
698
+ case 1:
699
+ this.colorspace = ColorSpace.Grayscale;
700
+ break;
701
+ case 3:
702
+ if (this.adobe)
703
+ this.colorspace = ColorSpace.AdobeRGB;
704
+ else
705
+ this.colorspace = ColorSpace.RGB;
706
+ break;
707
+ case 4:
708
+ this.colorspace = ColorSpace.CYMK;
709
+ break;
710
+ default:
711
+ this.colorspace = ColorSpace.Unknown;
712
+ }
713
+ for (var i = 0; i < frame.components.length; i++) {
714
+ var component = frame.components[i];
715
+ if (!component.quantizationTable &&
716
+ component.quantizationTableId !== null)
717
+ component.quantizationTable =
718
+ quantizationTables[component.quantizationTableId];
719
+ this.components.push({
720
+ output: buildComponentData(frame, component),
721
+ scaleX: component.h / frame.maxH,
722
+ scaleY: component.v / frame.maxV,
723
+ blocksPerLine: component.blocksPerLine,
724
+ blocksPerColumn: component.blocksPerColumn,
725
+ bitConversion: component.bitConversion,
726
+ });
727
+ }
728
+ }
729
+ getData16(width, height) {
730
+ if (this.components.length !== 1)
731
+ throw 'Unsupported color mode';
732
+ var scaleX = this.width / width, scaleY = this.height / height;
733
+ var component, componentScaleX, componentScaleY;
734
+ var x, y, i;
735
+ var offset = 0;
736
+ var numComponents = this.components.length;
737
+ var dataLength = width * height * numComponents;
738
+ var data = new Uint16Array(dataLength);
739
+ var componentLine;
740
+ var lineData = new Uint16Array((this.components[0].blocksPerLine << 3) *
741
+ this.components[0].blocksPerColumn *
742
+ 8);
743
+ for (i = 0; i < numComponents; i++) {
744
+ component = this.components[i];
745
+ var blocksPerLine = component.blocksPerLine;
746
+ var blocksPerColumn = component.blocksPerColumn;
747
+ var samplesPerLine = blocksPerLine << 3;
748
+ var j, k, ll = 0;
749
+ var lineOffset = 0;
750
+ for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
751
+ var scanLine = blockRow << 3;
752
+ for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
753
+ var bufferOffset = getBlockBufferOffset(component, blockRow, blockCol);
754
+ var offset = 0, sample = blockCol << 3;
755
+ for (j = 0; j < 8; j++) {
756
+ var lineOffset = (scanLine + j) * samplesPerLine;
757
+ for (k = 0; k < 8; k++) {
758
+ lineData[lineOffset + sample + k] =
759
+ component.output[bufferOffset + offset++];
760
+ }
761
+ }
762
+ }
763
+ }
764
+ componentScaleX = component.scaleX * scaleX;
765
+ componentScaleY = component.scaleY * scaleY;
766
+ offset = i;
767
+ var cx, cy;
768
+ var index;
769
+ for (y = 0; y < height; y++) {
770
+ for (x = 0; x < width; x++) {
771
+ cy = 0 | (y * componentScaleY);
772
+ cx = 0 | (x * componentScaleX);
773
+ index = cy * samplesPerLine + cx;
774
+ data[offset] = lineData[index];
775
+ offset += numComponents;
776
+ }
777
+ }
778
+ }
779
+ return data;
780
+ }
781
+ getData(width, height) {
782
+ var scaleX = this.width / width, scaleY = this.height / height;
783
+ var component, componentScaleX, componentScaleY;
784
+ var x, y, i;
785
+ var offset = 0;
786
+ var Y, Cb, Cr, K, C, M, Ye, R, G, B;
787
+ var colorTransform;
788
+ var numComponents = this.components.length;
789
+ var dataLength = width * height * numComponents;
790
+ var data = new Uint8Array(dataLength);
791
+ var componentLine;
792
+ var lineData = new Uint8Array((this.components[0].blocksPerLine << 3) *
793
+ this.components[0].blocksPerColumn *
794
+ 8);
795
+ for (i = 0; i < numComponents; i++) {
796
+ component = this.components[i];
797
+ var blocksPerLine = component.blocksPerLine;
798
+ var blocksPerColumn = component.blocksPerColumn;
799
+ var samplesPerLine = blocksPerLine << 3;
800
+ var j, k, ll = 0;
801
+ var lineOffset = 0;
802
+ for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
803
+ var scanLine = blockRow << 3;
804
+ for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
805
+ var bufferOffset = getBlockBufferOffset(component, blockRow, blockCol);
806
+ var offset = 0, sample = blockCol << 3;
807
+ for (j = 0; j < 8; j++) {
808
+ var lineOffset = (scanLine + j) * samplesPerLine;
809
+ for (k = 0; k < 8; k++) {
810
+ lineData[lineOffset + sample + k] =
811
+ component.output[bufferOffset + offset++] *
812
+ component.bitConversion;
813
+ }
814
+ }
815
+ }
816
+ }
817
+ componentScaleX = component.scaleX * scaleX;
818
+ componentScaleY = component.scaleY * scaleY;
819
+ offset = i;
820
+ var cx, cy;
821
+ var index;
822
+ for (y = 0; y < height; y++) {
823
+ for (x = 0; x < width; x++) {
824
+ cy = 0 | (y * componentScaleY);
825
+ cx = 0 | (x * componentScaleX);
826
+ index = cy * samplesPerLine + cx;
827
+ data[offset] = lineData[index];
828
+ offset += numComponents;
829
+ }
830
+ }
831
+ }
832
+ switch (numComponents) {
833
+ case 1:
834
+ case 2:
835
+ break;
836
+ case 3:
837
+ colorTransform = true;
838
+ if (this.adobe && this.adobe.transformCode)
839
+ colorTransform = true;
840
+ else if (typeof this.colorTransform !== 'undefined')
841
+ colorTransform = !!this.colorTransform;
842
+ if (colorTransform) {
843
+ for (i = 0; i < dataLength; i += numComponents) {
844
+ Y = data[i];
845
+ Cb = data[i + 1];
846
+ Cr = data[i + 2];
847
+ R = clampToUint8(Y - 179.456 + 1.402 * Cr);
848
+ G = clampToUint8(Y + 135.459 - 0.344 * Cb - 0.714 * Cr);
849
+ B = clampToUint8(Y - 226.816 + 1.772 * Cb);
850
+ data[i] = R;
851
+ data[i + 1] = G;
852
+ data[i + 2] = B;
853
+ }
854
+ }
855
+ break;
856
+ case 4:
857
+ if (!this.adobe)
858
+ throw 'Unsupported color mode (4 components)';
859
+ colorTransform = false;
860
+ if (this.adobe && this.adobe.transformCode)
861
+ colorTransform = true;
862
+ else if (typeof this.colorTransform !== 'undefined')
863
+ colorTransform = !!this.colorTransform;
864
+ if (colorTransform) {
865
+ for (i = 0; i < dataLength; i += numComponents) {
866
+ Y = data[i];
867
+ Cb = data[i + 1];
868
+ Cr = data[i + 2];
869
+ C = clampToUint8(434.456 - Y - 1.402 * Cr);
870
+ M = clampToUint8(119.541 - Y + 0.344 * Cb + 0.714 * Cr);
871
+ Y = clampToUint8(481.816 - Y - 1.772 * Cb);
872
+ data[i] = C;
873
+ data[i + 1] = M;
874
+ data[i + 2] = Y;
875
+ }
876
+ }
877
+ break;
878
+ default:
879
+ throw 'Unsupported color mode';
880
+ }
881
+ return data;
882
+ }
883
+ }
884
+ export default JpegImage;