@cornerstonejs/dicom-image-loader 2.0.0-beta.2 → 2.0.0-beta.21

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