x_ite 4.7.12 → 5.0.0

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 (759) hide show
  1. package/.vscode/settings.json +9 -2
  2. package/Makefile +27 -24
  3. package/build/bin/version-number.pl +1 -1
  4. package/build/bin/version.pl +3 -3
  5. package/build/parts/default.start.frag.js +2 -2
  6. package/build/parts/x_ite.end.frag.js +1 -2
  7. package/build/parts/x_ite.start.frag.js +4 -7
  8. package/dist/assets/components/annotation.js +312 -312
  9. package/dist/assets/components/annotation.min.js +1 -1
  10. package/dist/assets/components/cad-geometry.js +536 -538
  11. package/dist/assets/components/cad-geometry.min.js +1 -1
  12. package/dist/assets/components/cube-map-texturing.js +797 -796
  13. package/dist/assets/components/cube-map-texturing.min.js +1 -1
  14. package/dist/assets/components/dis.js +487 -472
  15. package/dist/assets/components/dis.min.js +1 -1
  16. package/dist/assets/components/event-utilities.js +486 -505
  17. package/dist/assets/components/event-utilities.min.js +1 -1
  18. package/dist/assets/components/geometry2d.js +1221 -1271
  19. package/dist/assets/components/geometry2d.min.js +1 -1
  20. package/dist/assets/components/geospatial.js +2657 -2653
  21. package/dist/assets/components/geospatial.min.js +1 -2
  22. package/dist/assets/components/h-anim.js +640 -640
  23. package/dist/assets/components/h-anim.min.js +1 -1
  24. package/dist/assets/components/key-device-sensor.js +547 -549
  25. package/dist/assets/components/key-device-sensor.min.js +1 -1
  26. package/dist/assets/components/layout.js +1435 -1433
  27. package/dist/assets/components/layout.min.js +1 -1
  28. package/dist/assets/components/nurbs.js +3942 -3964
  29. package/dist/assets/components/nurbs.min.js +1 -2
  30. package/dist/assets/components/particle-systems.js +3227 -3238
  31. package/dist/assets/components/particle-systems.min.js +1 -2
  32. package/dist/assets/components/picking.js +1704 -1712
  33. package/dist/assets/components/picking.min.js +1 -1
  34. package/dist/assets/components/projective-texture-mapping.js +553 -553
  35. package/dist/assets/components/projective-texture-mapping.min.js +1 -1
  36. package/dist/assets/components/rigid-body-physics.js +3255 -3265
  37. package/dist/assets/components/rigid-body-physics.min.js +1 -59
  38. package/dist/assets/components/scripting.js +544 -549
  39. package/dist/assets/components/scripting.min.js +1 -1
  40. package/dist/assets/components/texturing-3d.js +2716 -2651
  41. package/dist/assets/components/texturing-3d.min.js +131 -48
  42. package/dist/assets/components/volume-rendering.js +2815 -2804
  43. package/dist/assets/components/volume-rendering.min.js +1 -3
  44. package/dist/assets/components/x_ite.js +142 -144
  45. package/dist/assets/components/x_ite.min.js +1 -1
  46. package/dist/assets/shaders/webgl1/Gouraud.fs +52 -15
  47. package/dist/assets/shaders/webgl1/Gouraud.vs +8 -9
  48. package/dist/assets/shaders/webgl1/{Wireframe.fs → Line.fs} +0 -0
  49. package/dist/assets/shaders/webgl1/{Wireframe.vs → Line.vs} +1 -1
  50. package/dist/assets/shaders/webgl1/PBR.fs +785 -0
  51. package/dist/assets/shaders/webgl1/PBR.vs +37 -0
  52. package/dist/assets/shaders/webgl1/Phong.fs +204 -32
  53. package/dist/assets/shaders/webgl1/Phong.vs +2 -3
  54. package/dist/assets/shaders/webgl1/{PointSet.fs → Point.fs} +59 -33
  55. package/dist/assets/shaders/webgl1/{PointSet.vs → Point.vs} +2 -2
  56. package/dist/assets/shaders/webgl1/Unlit.fs +73 -18
  57. package/dist/assets/shaders/webgl1/Unlit.vs +2 -3
  58. package/dist/assets/shaders/webgl2/Gouraud.fs +31 -19
  59. package/dist/assets/shaders/webgl2/Gouraud.vs +8 -9
  60. package/dist/assets/shaders/webgl2/{Wireframe.fs → Line.fs} +0 -0
  61. package/dist/assets/shaders/webgl2/{Wireframe.vs → Line.vs} +1 -1
  62. package/dist/assets/shaders/webgl2/PBR.fs +913 -0
  63. package/dist/assets/shaders/webgl2/PBR.vs +37 -0
  64. package/dist/assets/shaders/webgl2/Phong.fs +196 -35
  65. package/dist/assets/shaders/webgl2/Phong.vs +2 -3
  66. package/dist/assets/shaders/webgl2/{PointSet.fs → Point.fs} +87 -86
  67. package/dist/assets/shaders/webgl2/{PointSet.vs → Point.vs} +2 -2
  68. package/dist/assets/shaders/webgl2/Unlit.fs +55 -22
  69. package/dist/assets/shaders/webgl2/Unlit.vs +2 -3
  70. package/dist/example.html +2 -2
  71. package/dist/x_ite.css +316 -328
  72. package/dist/x_ite.js +55663 -52034
  73. package/dist/x_ite.min.js +79 -41
  74. package/dist/x_ite.zip +0 -0
  75. package/docs/Custom-Shaders.md +4 -3
  76. package/docs/_config.yml +1 -1
  77. package/docs/index.md +60 -7
  78. package/package.json +20 -20
  79. package/src/assets/components/annotation.js +24 -24
  80. package/src/assets/components/cad-geometry.js +24 -25
  81. package/src/assets/components/cube-map-texturing.js +18 -19
  82. package/src/assets/components/dis.js +22 -23
  83. package/src/assets/components/event-utilities.js +28 -29
  84. package/src/assets/components/geometry2d.js +28 -29
  85. package/src/assets/components/geospatial.js +34 -35
  86. package/src/assets/components/h-anim.js +22 -22
  87. package/src/assets/components/key-device-sensor.js +18 -19
  88. package/src/assets/components/layout.js +24 -25
  89. package/src/assets/components/nurbs.js +44 -45
  90. package/src/assets/components/particle-systems.js +36 -37
  91. package/src/assets/components/picking.js +25 -25
  92. package/src/assets/components/projective-texture-mapping.js +16 -16
  93. package/src/assets/components/rigid-body-physics.js +48 -48
  94. package/src/assets/components/scripting.js +14 -15
  95. package/src/assets/components/texturing-3d.js +26 -27
  96. package/src/assets/components/volume-rendering.js +46 -46
  97. package/src/assets/components/x_ite.js +12 -12
  98. package/src/assets/shaders/Types.glsl +230 -51
  99. package/src/assets/shaders/webgl1/Background.fs +2 -2
  100. package/src/assets/shaders/webgl1/Background.vs +4 -4
  101. package/src/assets/shaders/webgl1/Depth.fs +2 -2
  102. package/src/assets/shaders/webgl1/Depth.vs +3 -3
  103. package/src/assets/shaders/webgl1/Fallback.fs +15 -15
  104. package/src/assets/shaders/webgl1/Fallback.vs +5 -5
  105. package/src/assets/shaders/webgl1/FallbackUnlit.fs +4 -4
  106. package/src/assets/shaders/webgl1/FallbackUnlit.vs +3 -3
  107. package/src/assets/shaders/webgl1/Gouraud.fs +14 -14
  108. package/src/assets/shaders/webgl1/Gouraud.vs +54 -69
  109. package/src/assets/shaders/webgl1/Line.fs +74 -0
  110. package/src/assets/shaders/webgl1/Line.vs +63 -0
  111. package/src/assets/shaders/webgl1/PBR.fs +364 -0
  112. package/src/assets/shaders/webgl1/PBR.vs +46 -0
  113. package/src/assets/shaders/webgl1/Phong.fs +207 -84
  114. package/src/assets/shaders/webgl1/Phong.vs +17 -18
  115. package/src/assets/shaders/webgl1/Point.fs +88 -0
  116. package/src/assets/shaders/webgl1/Point.vs +70 -0
  117. package/src/assets/shaders/webgl1/Unlit.fs +53 -28
  118. package/src/assets/shaders/webgl1/Unlit.vs +17 -18
  119. package/src/assets/shaders/webgl1/include/ClipPlanes.glsl +7 -7
  120. package/src/assets/shaders/webgl1/include/Colors.glsl +27 -0
  121. package/src/assets/shaders/webgl1/include/Fog.glsl +17 -17
  122. package/src/assets/shaders/webgl1/include/Hatch.glsl +8 -8
  123. package/src/assets/shaders/webgl1/include/Normal.glsl +44 -0
  124. package/src/assets/shaders/webgl1/include/Pack.glsl +11 -11
  125. package/src/assets/shaders/webgl1/include/Perlin.glsl +19 -19
  126. package/src/assets/shaders/webgl1/include/Shadow.glsl +212 -212
  127. package/src/assets/shaders/webgl1/include/SpotFactor.glsl +12 -0
  128. package/src/assets/shaders/webgl1/include/Texture.glsl +444 -393
  129. package/src/assets/shaders/webgl2/Background.fs +2 -2
  130. package/src/assets/shaders/webgl2/Background.vs +4 -4
  131. package/src/assets/shaders/webgl2/Depth.fs +2 -2
  132. package/src/assets/shaders/webgl2/Depth.vs +3 -3
  133. package/src/assets/shaders/webgl2/Gouraud.fs +14 -14
  134. package/src/assets/shaders/webgl2/Gouraud.vs +54 -69
  135. package/src/assets/shaders/webgl2/Line.fs +73 -0
  136. package/src/assets/shaders/webgl2/Line.vs +64 -0
  137. package/src/assets/shaders/webgl2/PBR.fs +370 -0
  138. package/src/assets/shaders/webgl2/PBR.vs +48 -0
  139. package/src/assets/shaders/webgl2/Phong.fs +219 -84
  140. package/src/assets/shaders/webgl2/Phong.vs +17 -18
  141. package/src/assets/shaders/webgl2/Point.fs +87 -0
  142. package/src/assets/shaders/webgl2/Point.vs +71 -0
  143. package/src/assets/shaders/webgl2/Unlit.fs +56 -28
  144. package/src/assets/shaders/webgl2/Unlit.vs +17 -18
  145. package/src/assets/shaders/webgl2/include/ClipPlanes.glsl +7 -7
  146. package/src/assets/shaders/webgl2/include/Colors.glsl +27 -0
  147. package/src/assets/shaders/webgl2/include/Fog.glsl +34 -34
  148. package/src/assets/shaders/webgl2/include/Hatch.glsl +8 -8
  149. package/src/assets/shaders/webgl2/include/Normal.glsl +46 -0
  150. package/src/assets/shaders/webgl2/include/Pack.glsl +11 -11
  151. package/src/assets/shaders/webgl2/include/Perlin.glsl +19 -20
  152. package/src/assets/shaders/webgl2/include/Shadow.glsl +226 -226
  153. package/src/assets/shaders/webgl2/include/SpotFactor.glsl +12 -0
  154. package/src/assets/shaders/webgl2/include/Texture.glsl +557 -537
  155. package/src/bookmarks.js +92 -92
  156. package/src/examples.js +147 -147
  157. package/src/lib/ammojs/AmmoJS.js +2 -2
  158. package/src/lib/ammojs/Makefile +14 -15
  159. package/src/lib/jquery.fullscreen-min.js +2 -2
  160. package/src/lib/nurbs/extras/sample.js +215 -215
  161. package/src/lib/nurbs/nurbs.js +326 -326
  162. package/src/lib/nurbs/src/evaluate.js +405 -405
  163. package/src/lib/nurbs/src/numerical-derivative.js +48 -48
  164. package/src/lib/nurbs/src/support.js +143 -143
  165. package/src/lib/nurbs/src/transform.js +70 -70
  166. package/src/lib/nurbs/src/utils/accessor-preamble.js +23 -23
  167. package/src/lib/nurbs/src/utils/bisection-search.js +18 -18
  168. package/src/lib/nurbs/src/utils/cache-key.js +49 -50
  169. package/src/lib/nurbs/src/utils/create-accessors.js +101 -101
  170. package/src/lib/nurbs/src/utils/infer-type.js +43 -43
  171. package/src/lib/nurbs/src/utils/is-array-like.js +5 -5
  172. package/src/lib/nurbs/src/utils/is-ndarray-like.js +11 -11
  173. package/src/lib/nurbs/src/utils/is-ndarray.js +13 -13
  174. package/src/lib/nurbs/src/utils/ndloop.js +18 -18
  175. package/src/lib/nurbs/src/utils/size-getter.js +15 -15
  176. package/src/lib/nurbs/src/utils/variable.js +25 -25
  177. package/src/lib/opentype.js/bin/ot +27 -27
  178. package/src/lib/opentype.js/dist/opentype.js +5 -5
  179. package/src/lib/opentype.js/font-inspector.html +1 -1
  180. package/src/lib/opentype.js/site.css +1 -3
  181. package/src/locale/gettext.js +73 -73
  182. package/src/spinner.css +40 -43
  183. package/src/standard/Geospatial/Geodetic.js +195 -195
  184. package/src/standard/Geospatial/ReferenceEllipsoids.js +43 -43
  185. package/src/standard/Geospatial/UniversalTransverseMercator.js +159 -159
  186. package/src/standard/Math/Algorithm.js +199 -187
  187. package/src/standard/Math/Algorithms/Bezier.js +80 -80
  188. package/src/standard/Math/Algorithms/MergeSort.js +49 -49
  189. package/src/standard/Math/Algorithms/PartialSort.js +36 -36
  190. package/src/standard/Math/Algorithms/QuickSort.js +51 -51
  191. package/src/standard/Math/Algorithms/SAT.js +62 -62
  192. package/src/standard/Math/Algorithms/eigendecomposition.js +141 -141
  193. package/src/standard/Math/Geometry/Box2.js +205 -205
  194. package/src/standard/Math/Geometry/Box3.js +624 -624
  195. package/src/standard/Math/Geometry/Camera.js +68 -68
  196. package/src/standard/Math/Geometry/Cylinder3.js +112 -112
  197. package/src/standard/Math/Geometry/Line3.js +188 -153
  198. package/src/standard/Math/Geometry/Plane3.js +120 -120
  199. package/src/standard/Math/Geometry/Sphere3.js +148 -148
  200. package/src/standard/Math/Geometry/Spheroid3.js +38 -38
  201. package/src/standard/Math/Geometry/Triangle2.js +19 -19
  202. package/src/standard/Math/Geometry/Triangle3.js +148 -148
  203. package/src/standard/Math/Geometry/ViewVolume.js +359 -359
  204. package/src/standard/Math/Numbers/Color3.js +219 -214
  205. package/src/standard/Math/Numbers/Color4.js +148 -142
  206. package/src/standard/Math/Numbers/Complex.js +139 -139
  207. package/src/standard/Math/Numbers/Matrix2.js +193 -193
  208. package/src/standard/Math/Numbers/Matrix3.js +679 -679
  209. package/src/standard/Math/Numbers/Matrix4.js +883 -883
  210. package/src/standard/Math/Numbers/Quaternion.js +496 -496
  211. package/src/standard/Math/Numbers/Rotation4.js +421 -415
  212. package/src/standard/Math/Numbers/Vector2.js +220 -220
  213. package/src/standard/Math/Numbers/Vector3.js +280 -280
  214. package/src/standard/Math/Numbers/Vector4.js +296 -296
  215. package/src/standard/Math/Utility/BVH.js +303 -303
  216. package/src/standard/Math/Utility/MatrixStack.js +64 -64
  217. package/src/standard/Networking/BinaryTransport.js +67 -67
  218. package/src/standard/Time/MicroTime.js +22 -22
  219. package/src/standard/Utility/DataStorage.js +85 -81
  220. package/src/standard/Utility/MapUtilities.js +14 -1
  221. package/src/standard/Utility/ObjectCache.js +24 -24
  222. package/src/standard/Utility/Shuffle.js +13 -13
  223. package/src/tests.js +355 -384
  224. package/src/x_ite/Base/Events.js +64 -55
  225. package/src/x_ite/{Basic/X3DArrayField.js → Base/FieldArray.js} +19 -12
  226. package/src/x_ite/Base/FieldDefinitionArray.js +75 -0
  227. package/src/x_ite/{Basic/FieldDefinitionArray.js → Base/X3DArrayField.js} +35 -59
  228. package/src/x_ite/Base/X3DBaseNode.js +588 -0
  229. package/src/x_ite/{Bits → Base}/X3DCast.js +23 -22
  230. package/src/x_ite/Base/X3DChildObject.js +68 -62
  231. package/src/x_ite/{Bits → Base}/X3DConstants.js +85 -85
  232. package/src/x_ite/Base/X3DEventObject.js +73 -68
  233. package/src/x_ite/Base/X3DField.js +450 -0
  234. package/src/x_ite/Base/X3DFieldDefinition.js +78 -0
  235. package/src/x_ite/Base/X3DInfoArray.js +291 -0
  236. package/src/x_ite/Base/X3DObject.js +152 -109
  237. package/src/x_ite/Base/X3DObjectArrayField.js +573 -0
  238. package/src/x_ite/Base/X3DTypedArrayField.js +866 -0
  239. package/src/x_ite/Browser/Core/BrowserOptions.js +376 -394
  240. package/src/x_ite/Browser/Core/BrowserProperties.js +38 -38
  241. package/src/x_ite/Browser/Core/BrowserTimings.js +173 -172
  242. package/src/x_ite/Browser/Core/ContextMenu.js +547 -551
  243. package/src/x_ite/Browser/Core/Notification.js +57 -56
  244. package/src/x_ite/Browser/Core/PrimitiveQuality.js +8 -8
  245. package/src/x_ite/Browser/Core/RenderingProperties.js +55 -55
  246. package/src/x_ite/Browser/Core/Shading.js +10 -10
  247. package/src/x_ite/Browser/Core/TextureQuality.js +8 -8
  248. package/src/x_ite/Browser/Core/X3DCoreContext.js +746 -724
  249. package/src/x_ite/Browser/EnvironmentalEffects/X3DEnvironmentalEffectsContext.js +33 -25
  250. package/src/x_ite/Browser/Followers/X3DArrayChaserTemplate.js +23 -23
  251. package/src/x_ite/Browser/Followers/X3DArrayFollowerTemplate.js +127 -127
  252. package/src/x_ite/Browser/Geometry2D/Arc2DOptions.js +25 -25
  253. package/src/x_ite/Browser/Geometry2D/ArcClose2DOptions.js +25 -25
  254. package/src/x_ite/Browser/Geometry2D/Circle2DOptions.js +56 -55
  255. package/src/x_ite/Browser/Geometry2D/Disk2DOptions.js +116 -116
  256. package/src/x_ite/Browser/Geometry2D/Rectangle2DOptions.js +59 -59
  257. package/src/x_ite/Browser/Geometry2D/X3DGeometry2DContext.js +80 -77
  258. package/src/x_ite/Browser/Geometry3D/BoxOptions.js +70 -70
  259. package/src/x_ite/Browser/Geometry3D/ConeOptions.js +26 -26
  260. package/src/x_ite/Browser/Geometry3D/CylinderOptions.js +27 -27
  261. package/src/x_ite/Browser/Geometry3D/IcoSphere.js +357 -357
  262. package/src/x_ite/Browser/Geometry3D/IcoSphereOptions.js +61 -61
  263. package/src/x_ite/Browser/Geometry3D/QuadSphereOptions.js +243 -241
  264. package/src/x_ite/Browser/Geometry3D/X3DGeometry3DContext.js +37 -34
  265. package/src/x_ite/Browser/Geospatial/Geocentric.js +27 -27
  266. package/src/x_ite/Browser/Geospatial/Geospatial.js +157 -156
  267. package/src/x_ite/Browser/Grouping/X3DGroupingContext.js +38 -33
  268. package/src/x_ite/Browser/Interpolation/CatmullRomSplineInterpolator.js +128 -130
  269. package/src/x_ite/Browser/Interpolation/CatmullRomSplineInterpolator1.js +39 -41
  270. package/src/x_ite/Browser/Interpolation/CatmullRomSplineInterpolator2.js +3 -3
  271. package/src/x_ite/Browser/Interpolation/CatmullRomSplineInterpolator3.js +3 -3
  272. package/src/x_ite/Browser/Interpolation/CatmullRomSplineInterpolatorTemplate.js +54 -56
  273. package/src/x_ite/Browser/Interpolation/SquatInterpolator.js +54 -56
  274. package/src/x_ite/Browser/KeyDeviceSensor/X3DKeyDeviceSensorContext.js +44 -41
  275. package/src/x_ite/Browser/Layering/X3DLayeringContext.js +20 -18
  276. package/src/x_ite/Browser/Layout/ScreenText.js +406 -405
  277. package/src/x_ite/Browser/Layout/X3DLayoutContext.js +36 -30
  278. package/src/x_ite/Browser/Lighting/X3DLightingContext.js +54 -50
  279. package/src/x_ite/Browser/NURBS/NURBS.js +417 -417
  280. package/src/x_ite/Browser/Navigation/ExamineViewer.js +753 -753
  281. package/src/x_ite/Browser/Navigation/FlyViewer.js +39 -39
  282. package/src/x_ite/Browser/Navigation/LookAtViewer.js +461 -461
  283. package/src/x_ite/Browser/Navigation/NoneViewer.js +18 -18
  284. package/src/x_ite/Browser/Navigation/PlaneViewer.js +193 -193
  285. package/src/x_ite/Browser/Navigation/WalkViewer.js +61 -61
  286. package/src/x_ite/Browser/Navigation/X3DFlyViewer.js +709 -710
  287. package/src/x_ite/Browser/Navigation/X3DNavigationContext.js +188 -182
  288. package/src/x_ite/Browser/Navigation/X3DViewer.js +160 -160
  289. package/src/x_ite/Browser/Networking/X3DNetworkingContext.js +152 -143
  290. package/src/x_ite/Browser/Networking/urls.js +31 -31
  291. package/src/x_ite/Browser/ParticleSystems/X3DParticleSystemsContext.js +17 -13
  292. package/src/x_ite/Browser/Picking/IntersectionType.js +7 -7
  293. package/src/x_ite/Browser/Picking/MatchCriterion.js +8 -8
  294. package/src/x_ite/Browser/Picking/SortOrder.js +9 -9
  295. package/src/x_ite/Browser/Picking/VolumePicker.js +138 -138
  296. package/src/x_ite/Browser/Picking/X3DPickingContext.js +80 -69
  297. package/src/x_ite/Browser/PointingDeviceSensor/PointingDevice.js +208 -209
  298. package/src/x_ite/Browser/PointingDeviceSensor/PointingDeviceSensorContainer.js +34 -34
  299. package/src/x_ite/Browser/PointingDeviceSensor/X3DPointingDeviceSensorContext.js +269 -263
  300. package/src/x_ite/Browser/Rendering/X3DRenderingContext.js +132 -119
  301. package/src/x_ite/Browser/RigidBodyPhysics/AppliedParametersType.js +14 -14
  302. package/src/x_ite/Browser/Scripting/X3DScriptingContext.js +20 -19
  303. package/src/x_ite/Browser/Scripting/evaluate.js +7 -7
  304. package/src/x_ite/Browser/Shaders/Shader.js +152 -159
  305. package/src/x_ite/Browser/Shaders/ShaderSource.js +81 -63
  306. package/src/x_ite/Browser/Shaders/ShaderTest.js +97 -98
  307. package/src/x_ite/Browser/Shaders/X3DShadersContext.js +256 -249
  308. package/src/x_ite/Browser/Shape/AlphaMode.js +9 -9
  309. package/src/x_ite/Browser/Shape/X3DShapeContext.js +111 -89
  310. package/src/x_ite/Browser/Sound/X3DSoundContext.js +11 -11
  311. package/src/x_ite/Browser/Text/PolygonText.js +319 -319
  312. package/src/x_ite/Browser/Text/TextAlignment.js +9 -9
  313. package/src/x_ite/Browser/Text/X3DTextContext.js +72 -65
  314. package/src/x_ite/Browser/Text/X3DTextGeometry.js +506 -506
  315. package/src/x_ite/Browser/Texturing/MultiTextureFunctionType.js +8 -8
  316. package/src/x_ite/Browser/Texturing/MultiTextureModeType.js +25 -25
  317. package/src/x_ite/Browser/Texturing/MultiTextureSourceType.js +9 -9
  318. package/src/x_ite/Browser/Texturing/TextureCoordinateGeneratorModeType.js +17 -17
  319. package/src/x_ite/Browser/Texturing/X3DTexturingContext.js +259 -224
  320. package/src/x_ite/Browser/Texturing3D/DICOMParser.js +1066 -1066
  321. package/src/x_ite/Browser/Texturing3D/NRRDParser.js +641 -630
  322. package/src/x_ite/Browser/Time/X3DTimeContext.js +54 -37
  323. package/src/x_ite/Browser/VERSION.js +1 -1
  324. package/src/x_ite/Browser/VolumeRendering/VolumeStyle.fs +55 -55
  325. package/src/x_ite/Browser/VolumeRendering/VolumeStyle.vs +5 -5
  326. package/src/x_ite/Browser/VolumeRendering/X3DVolumeRenderingContext.js +52 -41
  327. package/src/x_ite/Browser/X3DBrowser.js +819 -755
  328. package/src/x_ite/Browser/X3DBrowserContext.js +253 -220
  329. package/src/x_ite/Components/Annotation/AnnotationLayer.js +43 -43
  330. package/src/x_ite/Components/Annotation/AnnotationTarget.js +38 -38
  331. package/src/x_ite/Components/Annotation/GroupAnnotation.js +48 -48
  332. package/src/x_ite/Components/Annotation/IconAnnotation.js +46 -46
  333. package/src/x_ite/Components/Annotation/TextAnnotation.js +39 -39
  334. package/src/x_ite/Components/Annotation/URLAnnotation.js +38 -38
  335. package/src/x_ite/Components/Annotation/X3DAnnotationNode.js +16 -16
  336. package/src/x_ite/Components/CADGeometry/CADAssembly.js +41 -41
  337. package/src/x_ite/Components/CADGeometry/CADFace.js +189 -189
  338. package/src/x_ite/Components/CADGeometry/CADLayer.js +38 -38
  339. package/src/x_ite/Components/CADGeometry/CADPart.js +46 -46
  340. package/src/x_ite/Components/CADGeometry/IndexedQuadSet.js +67 -67
  341. package/src/x_ite/Components/CADGeometry/QuadSet.js +64 -63
  342. package/src/x_ite/Components/CADGeometry/X3DProductStructureChildNode.js +13 -15
  343. package/src/x_ite/Components/Core/MetadataBoolean.js +38 -40
  344. package/src/x_ite/Components/Core/MetadataDouble.js +38 -40
  345. package/src/x_ite/Components/Core/MetadataFloat.js +38 -40
  346. package/src/x_ite/Components/Core/MetadataInteger.js +38 -40
  347. package/src/x_ite/Components/Core/MetadataSet.js +38 -40
  348. package/src/x_ite/Components/Core/MetadataString.js +38 -40
  349. package/src/x_ite/Components/Core/WorldInfo.js +42 -42
  350. package/src/x_ite/Components/Core/X3DBindableNode.js +20 -20
  351. package/src/x_ite/Components/Core/X3DChildNode.js +38 -40
  352. package/src/x_ite/Components/Core/X3DInfoNode.js +13 -15
  353. package/src/x_ite/Components/Core/X3DMetadataObject.js +11 -13
  354. package/src/x_ite/Components/Core/X3DNode.js +795 -14
  355. package/src/x_ite/Components/Core/X3DPrototypeInstance.js +585 -479
  356. package/src/x_ite/Components/Core/X3DSensorNode.js +13 -15
  357. package/src/x_ite/Components/Core.js +39 -39
  358. package/src/x_ite/Components/CubeMapTexturing/ComposedCubeMapTexture.js +193 -200
  359. package/src/x_ite/Components/CubeMapTexturing/GeneratedCubeMapTexture.js +209 -206
  360. package/src/x_ite/Components/CubeMapTexturing/ImageCubeMapTexture.js +213 -219
  361. package/src/x_ite/Components/CubeMapTexturing/X3DEnvironmentTextureNode.js +69 -60
  362. package/src/x_ite/Components/DIS/DISEntityManager.js +38 -40
  363. package/src/x_ite/Components/DIS/DISEntityTypeMapping.js +59 -41
  364. package/src/x_ite/Components/DIS/EspduTransform.js +128 -128
  365. package/src/x_ite/Components/DIS/ReceiverPdu.js +68 -68
  366. package/src/x_ite/Components/DIS/SignalPdu.js +68 -68
  367. package/src/x_ite/Components/DIS/TransmitterPdu.js +84 -84
  368. package/src/x_ite/Components/EnvironmentalEffects/Background.js +87 -89
  369. package/src/x_ite/Components/EnvironmentalEffects/Fog.js +59 -59
  370. package/src/x_ite/Components/EnvironmentalEffects/FogCoordinate.js +78 -78
  371. package/src/x_ite/Components/EnvironmentalEffects/LocalFog.js +56 -56
  372. package/src/x_ite/Components/EnvironmentalEffects/TextureBackground.js +86 -88
  373. package/src/x_ite/Components/EnvironmentalEffects/X3DBackgroundNode.js +582 -589
  374. package/src/x_ite/Components/EnvironmentalEffects/X3DFogObject.js +105 -105
  375. package/src/x_ite/Components/EnvironmentalEffects.js +25 -25
  376. package/src/x_ite/Components/EnvironmentalSensor/ProximitySensor.js +229 -229
  377. package/src/x_ite/Components/EnvironmentalSensor/TransformSensor.js +256 -256
  378. package/src/x_ite/Components/EnvironmentalSensor/VisibilitySensor.js +114 -114
  379. package/src/x_ite/Components/EnvironmentalSensor/X3DEnvironmentalSensorNode.js +71 -71
  380. package/src/x_ite/Components/EnvironmentalSensor.js +19 -19
  381. package/src/x_ite/Components/EventUtilities/BooleanFilter.js +50 -52
  382. package/src/x_ite/Components/EventUtilities/BooleanSequencer.js +50 -52
  383. package/src/x_ite/Components/EventUtilities/BooleanToggle.js +43 -45
  384. package/src/x_ite/Components/EventUtilities/BooleanTrigger.js +42 -44
  385. package/src/x_ite/Components/EventUtilities/IntegerSequencer.js +50 -52
  386. package/src/x_ite/Components/EventUtilities/IntegerTrigger.js +43 -45
  387. package/src/x_ite/Components/EventUtilities/TimeTrigger.js +43 -45
  388. package/src/x_ite/Components/EventUtilities/X3DSequencerNode.js +92 -94
  389. package/src/x_ite/Components/EventUtilities/X3DTriggerNode.js +13 -15
  390. package/src/x_ite/Components/Followers/ColorChaser.js +78 -78
  391. package/src/x_ite/Components/Followers/ColorDamper.js +78 -78
  392. package/src/x_ite/Components/Followers/CoordinateChaser.js +46 -46
  393. package/src/x_ite/Components/Followers/CoordinateDamper.js +48 -48
  394. package/src/x_ite/Components/Followers/OrientationChaser.js +64 -64
  395. package/src/x_ite/Components/Followers/OrientationDamper.js +61 -61
  396. package/src/x_ite/Components/Followers/PositionChaser.js +42 -42
  397. package/src/x_ite/Components/Followers/PositionChaser2D.js +42 -42
  398. package/src/x_ite/Components/Followers/PositionDamper.js +44 -44
  399. package/src/x_ite/Components/Followers/PositionDamper2D.js +44 -44
  400. package/src/x_ite/Components/Followers/ScalarChaser.js +70 -70
  401. package/src/x_ite/Components/Followers/ScalarDamper.js +60 -60
  402. package/src/x_ite/Components/Followers/TexCoordChaser2D.js +46 -46
  403. package/src/x_ite/Components/Followers/TexCoordDamper2D.js +48 -48
  404. package/src/x_ite/Components/Followers/X3DChaserNode.js +194 -194
  405. package/src/x_ite/Components/Followers/X3DDamperNode.js +120 -120
  406. package/src/x_ite/Components/Followers/X3DFollowerNode.js +83 -83
  407. package/src/x_ite/Components/Followers.js +45 -45
  408. package/src/x_ite/Components/Geometry2D/Arc2D.js +99 -113
  409. package/src/x_ite/Components/Geometry2D/ArcClose2D.js +164 -166
  410. package/src/x_ite/Components/Geometry2D/Circle2D.js +59 -67
  411. package/src/x_ite/Components/Geometry2D/Disk2D.js +207 -211
  412. package/src/x_ite/Components/Geometry2D/Polyline2D.js +43 -52
  413. package/src/x_ite/Components/Geometry2D/Polypoint2D.js +43 -60
  414. package/src/x_ite/Components/Geometry2D/Rectangle2D.js +76 -73
  415. package/src/x_ite/Components/Geometry2D/TriangleSet2D.js +69 -71
  416. package/src/x_ite/Components/Geometry3D/Box.js +90 -86
  417. package/src/x_ite/Components/Geometry3D/Cone.js +185 -187
  418. package/src/x_ite/Components/Geometry3D/Cylinder.js +246 -246
  419. package/src/x_ite/Components/Geometry3D/ElevationGrid.js +383 -384
  420. package/src/x_ite/Components/Geometry3D/Extrusion.js +653 -647
  421. package/src/x_ite/Components/Geometry3D/IndexedFaceSet.js +437 -445
  422. package/src/x_ite/Components/Geometry3D/Sphere.js +72 -74
  423. package/src/x_ite/Components/Geometry3D.js +25 -25
  424. package/src/x_ite/Components/Geospatial/GeoCoordinate.js +189 -191
  425. package/src/x_ite/Components/Geospatial/GeoElevationGrid.js +381 -383
  426. package/src/x_ite/Components/Geospatial/GeoLOD.js +397 -397
  427. package/src/x_ite/Components/Geospatial/GeoLocation.js +56 -56
  428. package/src/x_ite/Components/Geospatial/GeoMetadata.js +54 -36
  429. package/src/x_ite/Components/Geospatial/GeoOrigin.js +50 -52
  430. package/src/x_ite/Components/Geospatial/GeoPositionInterpolator.js +81 -83
  431. package/src/x_ite/Components/Geospatial/GeoProximitySensor.js +95 -97
  432. package/src/x_ite/Components/Geospatial/GeoTouchSensor.js +77 -79
  433. package/src/x_ite/Components/Geospatial/GeoTransform.js +79 -79
  434. package/src/x_ite/Components/Geospatial/GeoViewpoint.js +278 -278
  435. package/src/x_ite/Components/Geospatial/X3DGeospatialObject.js +216 -218
  436. package/src/x_ite/Components/Grouping/Group.js +37 -37
  437. package/src/x_ite/Components/Grouping/StaticGroup.js +245 -245
  438. package/src/x_ite/Components/Grouping/Switch.js +234 -234
  439. package/src/x_ite/Components/Grouping/Transform.js +42 -42
  440. package/src/x_ite/Components/Grouping/X3DBoundedObject.js +93 -93
  441. package/src/x_ite/Components/Grouping/X3DGroupingNode.js +654 -649
  442. package/src/x_ite/Components/Grouping/X3DTransformMatrix3DNode.js +99 -99
  443. package/src/x_ite/Components/Grouping/X3DTransformNode.js +31 -31
  444. package/src/x_ite/Components/Grouping.js +27 -27
  445. package/src/x_ite/Components/HAnim/HAnimDisplacer.js +35 -35
  446. package/src/x_ite/Components/HAnim/HAnimHumanoid.js +293 -293
  447. package/src/x_ite/Components/HAnim/HAnimJoint.js +137 -137
  448. package/src/x_ite/Components/HAnim/HAnimMotion.js +50 -50
  449. package/src/x_ite/Components/HAnim/HAnimSegment.js +44 -44
  450. package/src/x_ite/Components/HAnim/HAnimSite.js +43 -43
  451. package/src/x_ite/Components/Interpolation/ColorInterpolator.js +61 -63
  452. package/src/x_ite/Components/Interpolation/CoordinateInterpolator.js +60 -62
  453. package/src/x_ite/Components/Interpolation/CoordinateInterpolator2D.js +57 -59
  454. package/src/x_ite/Components/Interpolation/EaseInEaseOut.js +79 -80
  455. package/src/x_ite/Components/Interpolation/NormalInterpolator.js +96 -93
  456. package/src/x_ite/Components/Interpolation/OrientationInterpolator.js +70 -70
  457. package/src/x_ite/Components/Interpolation/PositionInterpolator.js +57 -59
  458. package/src/x_ite/Components/Interpolation/PositionInterpolator2D.js +57 -59
  459. package/src/x_ite/Components/Interpolation/ScalarInterpolator.js +53 -55
  460. package/src/x_ite/Components/Interpolation/SplinePositionInterpolator.js +78 -80
  461. package/src/x_ite/Components/Interpolation/SplinePositionInterpolator2D.js +77 -79
  462. package/src/x_ite/Components/Interpolation/SplineScalarInterpolator.js +78 -80
  463. package/src/x_ite/Components/Interpolation/SquadOrientationInterpolator.js +66 -66
  464. package/src/x_ite/Components/Interpolation/X3DInterpolatorNode.js +67 -69
  465. package/src/x_ite/Components/Interpolation.js +39 -39
  466. package/src/x_ite/Components/KeyDeviceSensor/KeySensor.js +304 -306
  467. package/src/x_ite/Components/KeyDeviceSensor/StringSensor.js +102 -104
  468. package/src/x_ite/Components/KeyDeviceSensor/X3DKeyDeviceSensorNode.js +51 -51
  469. package/src/x_ite/Components/Layering/Layer.js +50 -50
  470. package/src/x_ite/Components/Layering/LayerSet.js +160 -161
  471. package/src/x_ite/Components/Layering/Viewport.js +118 -118
  472. package/src/x_ite/Components/Layering/X3DLayerNode.js +322 -322
  473. package/src/x_ite/Components/Layering/X3DViewportNode.js +13 -13
  474. package/src/x_ite/Components/Layering.js +21 -21
  475. package/src/x_ite/Components/Layout/Layout.js +576 -578
  476. package/src/x_ite/Components/Layout/LayoutGroup.js +126 -126
  477. package/src/x_ite/Components/Layout/LayoutLayer.js +53 -53
  478. package/src/x_ite/Components/Layout/ScreenFontStyle.js +48 -48
  479. package/src/x_ite/Components/Layout/ScreenGroup.js +136 -136
  480. package/src/x_ite/Components/Layout/X3DLayoutNode.js +12 -14
  481. package/src/x_ite/Components/Lighting/DirectionalLight.js +239 -246
  482. package/src/x_ite/Components/Lighting/PointLight.js +296 -303
  483. package/src/x_ite/Components/Lighting/SpotLight.js +321 -316
  484. package/src/x_ite/Components/Lighting/X3DLightNode.js +153 -153
  485. package/src/x_ite/Components/Lighting.js +19 -19
  486. package/src/x_ite/Components/NURBS/Contour2D.js +81 -83
  487. package/src/x_ite/Components/NURBS/ContourPolyline2D.js +100 -102
  488. package/src/x_ite/Components/NURBS/CoordinateDouble.js +32 -34
  489. package/src/x_ite/Components/NURBS/NurbsCurve.js +167 -169
  490. package/src/x_ite/Components/NURBS/NurbsCurve2D.js +149 -149
  491. package/src/x_ite/Components/NURBS/NurbsOrientationInterpolator.js +166 -166
  492. package/src/x_ite/Components/NURBS/NurbsPatchSurface.js +45 -47
  493. package/src/x_ite/Components/NURBS/NurbsPositionInterpolator.js +154 -154
  494. package/src/x_ite/Components/NURBS/NurbsSet.js +125 -125
  495. package/src/x_ite/Components/NURBS/NurbsSurfaceInterpolator.js +128 -130
  496. package/src/x_ite/Components/NURBS/NurbsSweptSurface.js +120 -122
  497. package/src/x_ite/Components/NURBS/NurbsSwungSurface.js +120 -122
  498. package/src/x_ite/Components/NURBS/NurbsTextureCoordinate.js +93 -93
  499. package/src/x_ite/Components/NURBS/NurbsTrimmedSurface.js +88 -90
  500. package/src/x_ite/Components/NURBS/X3DNurbsControlCurveNode.js +13 -15
  501. package/src/x_ite/Components/NURBS/X3DNurbsSurfaceGeometryNode.js +339 -339
  502. package/src/x_ite/Components/NURBS/X3DParametricGeometryNode.js +18 -20
  503. package/src/x_ite/Components/Navigation/Billboard.js +132 -132
  504. package/src/x_ite/Components/Navigation/Collision.js +116 -116
  505. package/src/x_ite/Components/Navigation/LOD.js +308 -308
  506. package/src/x_ite/Components/Navigation/NavigationInfo.js +279 -285
  507. package/src/x_ite/Components/Navigation/OrthoViewpoint.js +258 -258
  508. package/src/x_ite/Components/Navigation/Viewpoint.js +137 -137
  509. package/src/x_ite/Components/Navigation/ViewpointGroup.js +169 -171
  510. package/src/x_ite/Components/Navigation/X3DViewpointNode.js +450 -453
  511. package/src/x_ite/Components/Navigation.js +27 -27
  512. package/src/x_ite/Components/Networking/Anchor.js +140 -128
  513. package/src/x_ite/Components/Networking/Inline.js +156 -197
  514. package/src/x_ite/Components/Networking/LoadSensor.js +193 -195
  515. package/src/x_ite/Components/Networking/X3DNetworkSensorNode.js +13 -15
  516. package/src/x_ite/Components/Networking/X3DUrlObject.js +170 -116
  517. package/src/x_ite/Components/Networking.js +21 -21
  518. package/src/x_ite/Components/ParticleSystems/BoundedPhysicsModel.js +62 -64
  519. package/src/x_ite/Components/ParticleSystems/ConeEmitter.js +81 -83
  520. package/src/x_ite/Components/ParticleSystems/ExplosionEmitter.js +59 -61
  521. package/src/x_ite/Components/ParticleSystems/ForcePhysicsModel.js +42 -44
  522. package/src/x_ite/Components/ParticleSystems/ParticleSystem.js +1433 -1433
  523. package/src/x_ite/Components/ParticleSystems/PointEmitter.js +77 -79
  524. package/src/x_ite/Components/ParticleSystems/PolylineEmitter.js +196 -196
  525. package/src/x_ite/Components/ParticleSystems/SurfaceEmitter.js +195 -195
  526. package/src/x_ite/Components/ParticleSystems/VolumeEmitter.js +250 -250
  527. package/src/x_ite/Components/ParticleSystems/WindPhysicsModel.js +69 -71
  528. package/src/x_ite/Components/ParticleSystems/X3DParticleEmitterNode.js +346 -346
  529. package/src/x_ite/Components/ParticleSystems/X3DParticlePhysicsModelNode.js +15 -17
  530. package/src/x_ite/Components/Picking/LinePickSensor.js +284 -286
  531. package/src/x_ite/Components/Picking/PickableGroup.js +155 -155
  532. package/src/x_ite/Components/Picking/PointPickSensor.js +272 -272
  533. package/src/x_ite/Components/Picking/PrimitivePickSensor.js +207 -209
  534. package/src/x_ite/Components/Picking/VolumePickSensor.js +182 -184
  535. package/src/x_ite/Components/Picking/X3DPickSensorNode.js +382 -382
  536. package/src/x_ite/Components/Picking/X3DPickableObject.js +28 -30
  537. package/src/x_ite/Components/PointingDeviceSensor/CylinderSensor.js +257 -259
  538. package/src/x_ite/Components/PointingDeviceSensor/PlaneSensor.js +245 -247
  539. package/src/x_ite/Components/PointingDeviceSensor/SphereSensor.js +173 -175
  540. package/src/x_ite/Components/PointingDeviceSensor/TouchSensor.js +61 -63
  541. package/src/x_ite/Components/PointingDeviceSensor/X3DDragSensorNode.js +14 -16
  542. package/src/x_ite/Components/PointingDeviceSensor/X3DPointingDeviceSensorNode.js +57 -59
  543. package/src/x_ite/Components/PointingDeviceSensor/X3DTouchSensorNode.js +19 -21
  544. package/src/x_ite/Components/PointingDeviceSensor.js +25 -25
  545. package/src/x_ite/Components/ProjectiveTextureMapping/TextureProjectorParallel.js +191 -191
  546. package/src/x_ite/Components/ProjectiveTextureMapping/TextureProjectorPerspective.js +162 -162
  547. package/src/x_ite/Components/ProjectiveTextureMapping/X3DTextureProjectorNode.js +156 -156
  548. package/src/x_ite/Components/Rendering/ClipPlane.js +120 -120
  549. package/src/x_ite/Components/Rendering/Color.js +112 -112
  550. package/src/x_ite/Components/Rendering/ColorRGBA.js +114 -114
  551. package/src/x_ite/Components/Rendering/Coordinate.js +33 -35
  552. package/src/x_ite/Components/Rendering/IndexedLineSet.js +236 -243
  553. package/src/x_ite/Components/Rendering/IndexedTriangleFanSet.js +102 -102
  554. package/src/x_ite/Components/Rendering/IndexedTriangleSet.js +55 -55
  555. package/src/x_ite/Components/Rendering/IndexedTriangleStripSet.js +110 -110
  556. package/src/x_ite/Components/Rendering/LineSet.js +172 -179
  557. package/src/x_ite/Components/Rendering/Normal.js +100 -100
  558. package/src/x_ite/Components/Rendering/PointSet.js +142 -154
  559. package/src/x_ite/Components/Rendering/TriangleFanSet.js +73 -73
  560. package/src/x_ite/Components/Rendering/TriangleSet.js +51 -53
  561. package/src/x_ite/Components/Rendering/TriangleStripSet.js +76 -76
  562. package/src/x_ite/Components/Rendering/X3DColorNode.js +25 -27
  563. package/src/x_ite/Components/Rendering/X3DComposedGeometryNode.js +318 -321
  564. package/src/x_ite/Components/Rendering/X3DCoordinateNode.js +132 -132
  565. package/src/x_ite/Components/Rendering/X3DGeometricPropertyNode.js +13 -15
  566. package/src/x_ite/Components/Rendering/X3DGeometryNode.js +1190 -1171
  567. package/src/x_ite/Components/Rendering/X3DLineGeometryNode.js +231 -189
  568. package/src/x_ite/Components/Rendering/X3DNormalNode.js +13 -15
  569. package/src/x_ite/Components/Rendering/X3DPointGeometryNode.js +267 -0
  570. package/src/x_ite/Components/Rendering.js +53 -53
  571. package/src/x_ite/Components/RigidBodyPhysics/BallJoint.js +149 -149
  572. package/src/x_ite/Components/RigidBodyPhysics/CollidableOffset.js +229 -229
  573. package/src/x_ite/Components/RigidBodyPhysics/CollidableShape.js +465 -465
  574. package/src/x_ite/Components/RigidBodyPhysics/CollisionCollection.js +152 -154
  575. package/src/x_ite/Components/RigidBodyPhysics/CollisionSensor.js +223 -223
  576. package/src/x_ite/Components/RigidBodyPhysics/CollisionSpace.js +117 -117
  577. package/src/x_ite/Components/RigidBodyPhysics/Contact.js +54 -56
  578. package/src/x_ite/Components/RigidBodyPhysics/DoubleAxisHingeJoint.js +245 -245
  579. package/src/x_ite/Components/RigidBodyPhysics/MotorJoint.js +68 -70
  580. package/src/x_ite/Components/RigidBodyPhysics/RigidBody.js +453 -453
  581. package/src/x_ite/Components/RigidBodyPhysics/RigidBodyCollection.js +326 -326
  582. package/src/x_ite/Components/RigidBodyPhysics/SingleAxisHingeJoint.js +171 -171
  583. package/src/x_ite/Components/RigidBodyPhysics/SliderJoint.js +169 -169
  584. package/src/x_ite/Components/RigidBodyPhysics/UniversalJoint.js +50 -52
  585. package/src/x_ite/Components/RigidBodyPhysics/X3DNBodyCollidableNode.js +101 -101
  586. package/src/x_ite/Components/RigidBodyPhysics/X3DNBodyCollisionSpaceNode.js +15 -15
  587. package/src/x_ite/Components/RigidBodyPhysics/X3DRigidJointNode.js +161 -163
  588. package/src/x_ite/Components/Scripting/Script.js +506 -510
  589. package/src/x_ite/Components/Scripting/X3DScriptNode.js +15 -15
  590. package/src/x_ite/Components/Shaders/ComposedShader.js +215 -178
  591. package/src/x_ite/Components/Shaders/FloatVertexAttribute.js +84 -83
  592. package/src/x_ite/Components/Shaders/Matrix3VertexAttribute.js +74 -74
  593. package/src/x_ite/Components/Shaders/Matrix4VertexAttribute.js +73 -73
  594. package/src/x_ite/Components/Shaders/PackagedShader.js +52 -49
  595. package/src/x_ite/Components/Shaders/ProgramShader.js +36 -38
  596. package/src/x_ite/Components/Shaders/ShaderPart.js +135 -147
  597. package/src/x_ite/Components/Shaders/ShaderProgram.js +49 -46
  598. package/src/x_ite/Components/Shaders/X3DProgrammableShaderObject.js +1259 -1255
  599. package/src/x_ite/Components/Shaders/X3DShaderNode.js +83 -93
  600. package/src/x_ite/Components/Shaders/X3DVertexAttributeNode.js +13 -15
  601. package/src/x_ite/Components/Shaders.js +33 -33
  602. package/src/x_ite/{Execution/ExportedNode.js → Components/Shape/AcousticProperties.js} +41 -71
  603. package/src/x_ite/Components/Shape/Appearance.js +331 -318
  604. package/src/x_ite/Components/Shape/FillProperties.js +101 -98
  605. package/src/x_ite/Components/Shape/LineProperties.js +71 -69
  606. package/src/x_ite/Components/Shape/Material.js +344 -116
  607. package/src/x_ite/Components/Shape/PhysicalMaterial.js +310 -0
  608. package/src/x_ite/Components/Shape/PointProperties.js +79 -95
  609. package/src/x_ite/Components/Shape/Shape.js +178 -181
  610. package/src/x_ite/Components/Shape/TwoSidedMaterial.js +200 -200
  611. package/src/x_ite/Components/Shape/UnlitMaterial.js +93 -46
  612. package/src/x_ite/Components/Shape/X3DAppearanceChildNode.js +13 -15
  613. package/src/x_ite/Components/Shape/X3DAppearanceNode.js +24 -24
  614. package/src/x_ite/Components/Shape/X3DMaterialNode.js +24 -24
  615. package/src/x_ite/Components/Shape/X3DOneSidedMaterialNode.js +158 -54
  616. package/src/x_ite/Components/Shape/X3DShapeNode.js +147 -147
  617. package/src/x_ite/Components/Shape.js +43 -37
  618. package/src/x_ite/Components/Sound/AudioClip.js +135 -140
  619. package/src/x_ite/Components/Sound/Sound.js +246 -246
  620. package/src/x_ite/Components/Sound/X3DSoundNode.js +13 -15
  621. package/src/x_ite/Components/Sound/X3DSoundSourceNode.js +165 -179
  622. package/src/x_ite/Components/Sound.js +19 -19
  623. package/src/x_ite/Components/Text/FontStyle.js +49 -49
  624. package/src/x_ite/Components/Text/Text.js +135 -135
  625. package/src/x_ite/Components/Text/X3DFontStyleNode.js +207 -205
  626. package/src/x_ite/Components/Text.js +17 -17
  627. package/src/x_ite/Components/Texturing/ImageTexture.js +181 -194
  628. package/src/x_ite/Components/Texturing/MovieTexture.js +180 -190
  629. package/src/x_ite/Components/Texturing/MultiTexture.js +255 -262
  630. package/src/x_ite/Components/Texturing/MultiTextureCoordinate.js +124 -118
  631. package/src/x_ite/Components/Texturing/MultiTextureTransform.js +82 -76
  632. package/src/x_ite/Components/Texturing/PixelTexture.js +222 -221
  633. package/src/x_ite/Components/Texturing/TextureCoordinate.js +116 -116
  634. package/src/x_ite/Components/Texturing/TextureCoordinateGenerator.js +90 -90
  635. package/src/x_ite/Components/Texturing/TextureProperties.js +158 -160
  636. package/src/x_ite/Components/Texturing/TextureTransform.js +99 -99
  637. package/src/x_ite/Components/Texturing/X3DSingleTextureCoordinateNode.js +33 -28
  638. package/src/x_ite/Components/Texturing/X3DSingleTextureNode.js +54 -54
  639. package/src/x_ite/Components/Texturing/X3DSingleTextureTransformNode.js +22 -17
  640. package/src/x_ite/Components/Texturing/X3DTexture2DNode.js +135 -124
  641. package/src/x_ite/Components/Texturing/X3DTextureCoordinateNode.js +16 -16
  642. package/src/x_ite/Components/Texturing/X3DTextureNode.js +24 -24
  643. package/src/x_ite/Components/Texturing/X3DTextureTransformNode.js +22 -22
  644. package/src/x_ite/Components/Texturing.js +45 -45
  645. package/src/x_ite/Components/Texturing3D/ComposedTexture3D.js +125 -123
  646. package/src/x_ite/Components/Texturing3D/ImageTexture3D.js +115 -131
  647. package/src/x_ite/Components/Texturing3D/PixelTexture3D.js +158 -160
  648. package/src/x_ite/Components/Texturing3D/TextureCoordinate3D.js +116 -116
  649. package/src/x_ite/Components/Texturing3D/TextureCoordinate4D.js +116 -116
  650. package/src/x_ite/Components/Texturing3D/TextureTransform3D.js +88 -88
  651. package/src/x_ite/Components/Texturing3D/TextureTransformMatrix3D.js +46 -46
  652. package/src/x_ite/Components/Texturing3D/X3DTexture3DNode.js +135 -121
  653. package/src/x_ite/Components/Time/TimeSensor.js +155 -152
  654. package/src/x_ite/Components/Time/X3DTimeDependentNode.js +299 -302
  655. package/src/x_ite/Components/Time.js +15 -15
  656. package/src/x_ite/Components/VolumeRendering/BlendedVolumeStyle.js +338 -338
  657. package/src/x_ite/Components/VolumeRendering/BoundaryEnhancementVolumeStyle.js +80 -80
  658. package/src/x_ite/Components/VolumeRendering/CartoonVolumeStyle.js +228 -228
  659. package/src/x_ite/Components/VolumeRendering/ComposedVolumeStyle.js +163 -163
  660. package/src/x_ite/Components/VolumeRendering/EdgeEnhancementVolumeStyle.js +117 -117
  661. package/src/x_ite/Components/VolumeRendering/IsoSurfaceVolumeData.js +334 -334
  662. package/src/x_ite/Components/VolumeRendering/OpacityMapVolumeStyle.js +116 -116
  663. package/src/x_ite/Components/VolumeRendering/ProjectionVolumeStyle.js +167 -167
  664. package/src/x_ite/Components/VolumeRendering/SegmentedVolumeData.js +247 -247
  665. package/src/x_ite/Components/VolumeRendering/ShadedVolumeStyle.js +198 -198
  666. package/src/x_ite/Components/VolumeRendering/SilhouetteEnhancementVolumeStyle.js +116 -116
  667. package/src/x_ite/Components/VolumeRendering/ToneMappedVolumeStyle.js +126 -126
  668. package/src/x_ite/Components/VolumeRendering/VolumeData.js +173 -173
  669. package/src/x_ite/Components/VolumeRendering/X3DComposableVolumeRenderStyleNode.js +12 -12
  670. package/src/x_ite/Components/VolumeRendering/X3DVolumeDataNode.js +167 -167
  671. package/src/x_ite/Components/VolumeRendering/X3DVolumeRenderStyleNode.js +70 -70
  672. package/src/x_ite/Components/X_ITE/BlendMode.js +143 -145
  673. package/src/x_ite/Components.js +47 -47
  674. package/src/x_ite/Configuration/ComponentInfo.js +47 -42
  675. package/src/x_ite/Configuration/ComponentInfoArray.js +21 -19
  676. package/src/x_ite/Configuration/ProfileInfo.js +33 -23
  677. package/src/x_ite/Configuration/ProfileInfoArray.js +26 -16
  678. package/src/x_ite/Configuration/SupportedComponents.js +311 -311
  679. package/src/x_ite/Configuration/SupportedNodes.js +53 -38
  680. package/src/x_ite/Configuration/SupportedProfiles.js +190 -190
  681. package/src/x_ite/Configuration/UnitInfo.js +60 -51
  682. package/src/x_ite/Configuration/UnitInfoArray.js +17 -10
  683. package/src/x_ite/DEBUG.js +2 -2
  684. package/src/x_ite/Execution/BindableList.js +146 -149
  685. package/src/x_ite/Execution/BindableStack.js +130 -123
  686. package/src/x_ite/Execution/ExportedNodesArray.js +75 -0
  687. package/src/x_ite/Execution/ImportedNodesArray.js +75 -0
  688. package/src/x_ite/{Basic/X3DFieldDefinition.js → Execution/NamedNodesArray.js} +20 -10
  689. package/src/x_ite/Execution/Scene.js +93 -90
  690. package/src/x_ite/Execution/X3DExecutionContext.js +957 -781
  691. package/src/x_ite/Execution/X3DExportedNode.js +152 -0
  692. package/src/x_ite/Execution/X3DImportedNode.js +393 -0
  693. package/src/x_ite/Execution/X3DScene.js +546 -493
  694. package/src/x_ite/Execution/X3DWorld.js +171 -0
  695. package/src/x_ite/Fallback.js +31 -31
  696. package/src/x_ite/Fields/ArrayFields.js +463 -443
  697. package/src/x_ite/Fields/SFBool.js +50 -47
  698. package/src/x_ite/Fields/SFColor.js +163 -160
  699. package/src/x_ite/Fields/SFColorRGBA.js +155 -152
  700. package/src/x_ite/Fields/SFDouble.js +51 -48
  701. package/src/x_ite/Fields/SFFloat.js +51 -48
  702. package/src/x_ite/Fields/SFImage.js +216 -213
  703. package/src/x_ite/Fields/SFInt32.js +47 -44
  704. package/src/x_ite/Fields/SFMatrix3.js +74 -71
  705. package/src/x_ite/Fields/SFMatrix4.js +68 -65
  706. package/src/x_ite/Fields/SFMatrixPrototypeTemplate.js +98 -98
  707. package/src/x_ite/Fields/SFNode.js +392 -299
  708. package/src/x_ite/Fields/SFNodeCache.js +22 -33
  709. package/src/x_ite/Fields/SFRotation.js +178 -175
  710. package/src/x_ite/Fields/SFString.js +71 -68
  711. package/src/x_ite/Fields/SFTime.js +47 -44
  712. package/src/x_ite/Fields/SFVec2.js +73 -70
  713. package/src/x_ite/Fields/SFVec3.js +105 -102
  714. package/src/x_ite/Fields/SFVec4.js +118 -115
  715. package/src/x_ite/Fields/SFVecPrototypeTemplate.js +94 -94
  716. package/src/x_ite/Fields.js +44 -44
  717. package/src/x_ite/InputOutput/FileLoader.js +426 -531
  718. package/src/x_ite/InputOutput/Generator.js +379 -376
  719. package/src/x_ite/{Configuration/X3DInfoArray.js → Parser/GoldenGate.js} +54 -86
  720. package/src/x_ite/Parser/HTMLSupport.js +28 -6
  721. package/src/x_ite/Parser/JSONParser.js +414 -388
  722. package/src/x_ite/Parser/VRMLParser.js +2964 -0
  723. package/src/x_ite/Parser/X3DParser.js +128 -128
  724. package/src/x_ite/Parser/XMLParser.js +1231 -1178
  725. package/src/x_ite/Prototype/ExternProtoDeclarationArray.js +17 -27
  726. package/src/x_ite/Prototype/ProtoDeclarationArray.js +17 -27
  727. package/src/x_ite/Prototype/X3DExternProtoDeclaration.js +279 -297
  728. package/src/x_ite/Prototype/X3DProtoDeclaration.js +264 -263
  729. package/src/x_ite/Prototype/X3DProtoDeclarationNode.js +58 -35
  730. package/src/x_ite/Rendering/DependentRenderer.js +83 -80
  731. package/src/x_ite/Rendering/TextureBuffer.js +171 -168
  732. package/src/x_ite/{Bits → Rendering}/TraverseType.js +11 -11
  733. package/src/x_ite/Rendering/X3DRenderObject.js +895 -906
  734. package/src/x_ite/Routing/RouteArray.js +19 -71
  735. package/src/x_ite/Routing/X3DRoute.js +185 -179
  736. package/src/x_ite/Routing/X3DRoutingContext.js +60 -54
  737. package/src/x_ite/X3D.js +191 -175
  738. package/src/x_ite.config.js +83 -83
  739. package/src/x_ite.css +279 -288
  740. package/src/x_ite.html +226 -193
  741. package/src/x_ite.js +100 -127
  742. package/x_ite.min.html +220 -187
  743. package/src/assets/shaders/webgl1/PointSet.fs +0 -100
  744. package/src/assets/shaders/webgl1/PointSet.vs +0 -70
  745. package/src/assets/shaders/webgl1/Wireframe.fs +0 -74
  746. package/src/assets/shaders/webgl1/Wireframe.vs +0 -63
  747. package/src/assets/shaders/webgl2/PointSet.fs +0 -99
  748. package/src/assets/shaders/webgl2/PointSet.vs +0 -71
  749. package/src/assets/shaders/webgl2/Wireframe.fs +0 -73
  750. package/src/assets/shaders/webgl2/Wireframe.vs +0 -64
  751. package/src/x_ite/Basic/X3DBaseNode.js +0 -1253
  752. package/src/x_ite/Basic/X3DField.js +0 -370
  753. package/src/x_ite/Basic/X3DObjectArrayField.js +0 -545
  754. package/src/x_ite/Basic/X3DTypedArrayField.js +0 -839
  755. package/src/x_ite/Browser/Core/X3DCoreContext.js.~1~ +0 -714
  756. package/src/x_ite/Components/Texturing/X3DTexture2DNode.js.~1~ +0 -209
  757. package/src/x_ite/Execution/ImportedNode.js +0 -375
  758. package/src/x_ite/Execution/World.js +0 -162
  759. package/src/x_ite/Parser/Parser.js +0 -2944
@@ -48,1079 +48,1079 @@
48
48
 
49
49
 
50
50
  define ([
51
- "dicom-parser",
52
- "lib/jpeg/jpeg",
53
- "jpegLossless",
54
- "CharLS",
55
- "OpenJPEG",
56
- "x_ite/DEBUG",
51
+ "dicom-parser",
52
+ "lib/jpeg/jpeg",
53
+ "jpegLossless",
54
+ "CharLS",
55
+ "OpenJPEG",
56
+ "x_ite/DEBUG",
57
57
  ],
58
58
  function (dicomParser,
59
59
  jpeg,
60
60
  jpegLossless,
61
- charLS,
61
+ charLS,
62
62
  openJPEG,
63
63
  DEBUG)
64
64
  {
65
65
  "use strict";
66
66
 
67
- // Global instances of JPEG libraries.
68
-
69
- var
70
- charLS = undefined,
71
- openJPEG = undefined;
72
-
73
- // DicomParser
74
-
75
- function DicomParser ()
76
- {
77
- this .dicom = { dicom: false };
78
- }
79
-
80
- DicomParser .prototype =
81
- {
82
- parse: function (input)
83
- {
84
- try
85
- {
86
- var inputArray = new Uint8Array (input .length);
87
-
88
- for (var i = 0, length = input .length; i < length; ++ i)
89
- inputArray [i] = input .charCodeAt (i);
90
-
91
- this .dataSet = dicomParser .parseDicom (inputArray);
92
- this .dicom .dicom = true;
93
- }
94
- catch (error)
95
- {
96
- console .log (error);
97
- this .dicom .dicom = false;
98
- return this .dicom;
99
- }
100
-
101
- this .getPhotometricInterpretation ();
102
- this .getComponents ();
103
- this .getWidth ();
104
- this .getHeight ();
105
- this .getDepth ();
106
- this .getBitsAllocated ();
107
- this .getBitsStored ();
108
- this .getPixelRepresentation ();
109
- this .getPlanarConfiguration ();
110
- this .getTansferSyntax ();
111
- this .getPixelData ();
112
-
113
- if (DEBUG)
114
- console .log (this);
115
-
116
- return this .dicom;
117
- },
118
- getPhotometricInterpretation: function ()
119
- {
120
- // https://dicom.innolitics.com/ciods/ct-image/image-pixel/00280004
121
- this .photometricInterpretation = this .dataSet .string ("x00280004");
122
- },
123
- getComponents: function ()
124
- {
125
- // https://dicom.innolitics.com/ciods/ct-image/image-pixel/00280002
126
- this .dicom .components = this .dataSet .uint16 ("x00280002");
127
- },
128
- getWidth: function ()
129
- {
130
- this .dicom .width = this .dataSet .uint16 ("x00280011");
131
- },
132
- getHeight: function ()
133
- {
134
- this .dicom .height = this .dataSet .uint16 ("x00280010");
135
- },
136
- getDepth: function ()
137
- {
138
- if (this .dataSet .elements .x00280008)
139
- {
140
- this .dicom .depth = this .dataSet .intString ("x00280008");
141
- }
142
- else
143
- this .dicom .depth = 1;
144
- },
145
- getBitsAllocated: function ()
146
- {
147
- this .bitsAllocated = this .dataSet .uint16 ("x00280100");
148
- },
149
- getBitsStored: function ()
150
- {
151
- this .bitsStored = this .dataSet .uint16 ("x00280101");
152
- },
153
- getPixelRepresentation: function ()
154
- {
155
- this .pixelRepresentation = this .dataSet .uint16 ("x00280103") || 0;
156
- },
157
- getPlanarConfiguration: function ()
158
- {
159
- this .planarConfiguration = this .dataSet .uint16 ("x00280006") || 0;
160
- },
161
- getTansferSyntax: function ()
162
- {
163
- this .transferSyntax = this .dataSet .string ("x00020010");
164
- },
165
- getPixelData: function ()
166
- {
167
- var
168
- dicom = this .dicom,
169
- pixelElement = this .dataSet .elements .x7fe00010 || this .dataSet .elements .x7fe00008, // pixel or float pixel
170
- components = this .photometricInterpretation === "PALETTE COLOR" ? 3 : this .dicom .components,
171
- imageLength = dicom .width * dicom .height * components,
172
- byteLength = imageLength * dicom .depth,
173
- bytes = new Uint8Array (byteLength),
174
- frames = this .getFrames (pixelElement);
175
-
176
- frames .forEach (function (frame, f)
177
- {
178
- // Handle transfer syntax.
179
-
180
- // https://www.dicomlibrary.com/dicom/transfer-syntax/
181
-
182
- switch (this .transferSyntax)
183
- {
184
- case "1.2.840.10008.1.2": // Implicit VR Little Endian
185
- case "1.2.840.10008.1.2.1": // Explicit VR Little Endian
186
- case "1.2.840.10008.1.2.1.99": // Deflated Explicit VR Little Endian
187
- {
188
- frame = this .decodeLittleEndian (frame);
189
- break;
190
- }
191
- case "1.2.840.10008.1.2.2": // Explicit VR Big Endian (retired)
192
- {
193
- frame = this .decodeBigEndian (frame);
194
- break;
195
- }
196
- case "1.2.840.10008.1.2.5": // RLE Lossless
197
- {
198
- frame = this .decodeRLE (frame);
199
- break;
200
- }
201
- case "1.2.840.10008.1.2.4.50": // JPEG Baseline lossy process 1 (8 bit)
202
- case "1.2.840.10008.1.2.4.51": // JPEG Baseline lossy process 2 & 4 (12 bit)
203
- {
204
- frame = this .decodeJPEGBaseline (frame);
205
- break;
206
- }
207
- case "1.2.840.10008.1.2.4.57": // JPEG Lossless, Nonhierarchical (Processes 14)
208
- case "1.2.840.10008.1.2.4.70": // JPEG Lossless, Nonhierarchical (Processes 14 [Selection 1])
209
- {
210
- frame = this .decodeJPEGLossless (frame);
211
- break;
212
- }
213
- case "1.2.840.10008.1.2.4.80": // JPEG-LS Lossless Image Compression
214
- case "1.2.840.10008.1.2.4.81": // JPEG-LS Lossy (Near-Lossless) Image Compression
215
- {
216
- frame = this .decodeJPEGLS (frame);
217
- break;
218
- }
219
- case "1.2.840.10008.1.2.4.90": // JPEG 2000 Lossless
220
- case "1.2.840.10008.1.2.4.91": // JPEG 2000 Lossy
221
- {
222
- frame = this .decodeJPEG2000 (frame);
223
- break;
224
- }
225
- case "1.2.840.10008.1.2.4.52":
226
- case "1.2.840.10008.1.2.4.53":
227
- case "1.2.840.10008.1.2.4.54":
228
- case "1.2.840.10008.1.2.4.55":
229
- case "1.2.840.10008.1.2.4.56":
230
- case "1.2.840.10008.1.2.4.58":
231
- case "1.2.840.10008.1.2.4.59":
232
- case "1.2.840.10008.1.2.4.60":
233
- case "1.2.840.10008.1.2.4.61":
234
- case "1.2.840.10008.1.2.4.62":
235
- case "1.2.840.10008.1.2.4.63":
236
- case "1.2.840.10008.1.2.4.64":
237
- case "1.2.840.10008.1.2.4.65":
238
- case "1.2.840.10008.1.2.4.66":
239
- case "1.2.840.10008.1.2.4.92":
240
- case "1.2.840.10008.1.2.4.93":
241
- {
242
- // JPEG
243
- throw new Error ("DICOM: this JPEG encoding (" + this .transferSyntax + ") is not supported.");
244
- }
245
- default:
246
- {
247
- throw new Error ("DICOM: unsupported transfer syntax '" + this .transferSyntax + "'.");
248
- }
249
- }
250
-
251
- // Convert to stored type array (int, uint, float, 8/16 bit).
252
-
253
- frame = this .getTypedArray (frame);
254
-
255
- // Handle bits stored.
256
-
257
- if (this .pixelRepresentation === 1 && this .bitsStored !== undefined)
258
- {
259
- var shift = 32 - this .bitsStored;
260
-
261
- for (var i = 0, length = frame .length; i < length; ++ i)
262
- frame [i] = frame [i] << shift >> shift;
263
- }
264
-
265
- // Handle photometric interpretation.
266
-
267
- switch (this .photometricInterpretation)
268
- {
269
- case "MONOCHROME1":
270
- case "MONOCHROME2":
271
- {
272
- break;
273
- }
274
- case "RGB":
275
- case "YBR_RCT":
276
- case "YBR_ICT":
277
- case "YBR_FULL_422":
278
- {
279
- if (this .planarConfiguration === 1)
280
- frame = this .convertRGBColorByPlane (frame);
281
-
282
- break;
283
- }
284
- case "YBR_FULL":
285
- {
286
- if (this .planarConfiguration === 0)
287
- frame = this .convertYBRFullByPixel (frame);
288
- else
289
- frame = this .convertYBRFullByPlane (frame);
290
-
291
- break;
292
- }
293
- case "PALETTE COLOR":
294
- {
295
- frame = this .convertPaletteColor (frame);
296
- break;
297
- }
298
- default:
299
- {
300
- throw new Error ("DICOM: unsupported image type '" + this .photometricInterpretation + "'.");
301
- }
302
- }
303
-
304
- // Normalize frame pixel data in the range [0, 255], and assign to image block;
305
-
306
- frame = this .flipImage (frame, components);
307
-
308
- var
309
- normalize = this .getNormalizeOffsetAndFactor (frame),
310
- b = f * imageLength;
311
-
312
- for (var i = 0, length = frame .length; i < length; ++ i, ++ b)
313
- bytes [b] = (frame [i] - normalize .offset) * normalize .factor;
314
- },
315
- this);
316
-
317
- // Invert MONOCHROME1 pixels.
318
-
319
- if (this .photometricInterpretation === "MONOCHROME1")
320
- {
321
- for (var i = 0, length = bytes .length; i < length; ++ i)
322
- bytes [i] = 255 - bytes [i];
323
- }
324
-
325
- // Set Uint8Array.
326
-
327
- dicom .components = components;
328
- dicom .data = bytes;
329
- },
330
- getFrames: function (pixelElement)
331
- {
332
- var frames = [ ];
333
-
334
- if (pixelElement .encapsulatedPixelData)
335
- {
336
- if (pixelElement .basicOffsetTable .length)
337
- {
338
- for (var i = 0, length = this .dicom .depth; i < length; ++ i)
339
- frames .push (dicomParser .readEncapsulatedImageFrame (this .dataSet, pixelElement, i));
340
- }
341
- else if (this .dicom .depth !== pixelElement .fragments .length)
342
- {
343
- var basicOffsetTable = dicomParser .createJPEGBasicOffsetTable (this .dataSet, pixelElement);
344
-
345
- for (var i = 0, length = this .dicom .depth; i < length; ++ i)
346
- frames .push (dicomParser .readEncapsulatedImageFrame (this .dataSet, pixelElement, i, basicOffsetTable));
347
- }
348
- else
349
- {
350
- for (var i = 0, length = this .dicom .depth; i < length; ++ i)
351
- frames .push (dicomParser .readEncapsulatedPixelDataFromFragments (this .dataSet, pixelElement, i));
352
- }
353
- }
354
- else
355
- {
356
- var pixelsPerFrame = this .dicom .width * this .dicom .height * this .dicom .components;
357
-
358
- switch (this .bitsAllocated)
359
- {
360
- case 1:
361
- {
362
- for (var i = 0, length = this .dicom .depth; i < length; ++ i)
363
- {
364
- var frameOffset = pixelElement .dataOffset + i * pixelsPerFrame / 8;
365
-
366
- frames .push (this .unpackBinaryFrame (this .dataSet .byteArray, frameOffset, pixelsPerFrame));
367
- }
368
-
369
- this .bitsAllocated = 8;
370
- break;
371
- }
372
- case 8:
373
- case 16:
374
- case 32:
375
- {
376
- var bytesAllocated = this .bitsAllocated / 8;
377
-
378
- for (var i = 0, length = this .dicom .depth; i < length; ++ i)
379
- {
380
- var frameOffset = pixelElement .dataOffset + i * pixelsPerFrame * bytesAllocated;
381
-
382
- frames .push (new Uint8Array (this .dataSet .byteArray .buffer, frameOffset, pixelsPerFrame * bytesAllocated));
383
- }
384
-
385
- break;
386
- }
387
- default:
388
- throw new Error ("DICOM: unsupported pixel format.");
389
- }
390
- }
391
-
392
- return frames;
393
- },
394
- getTypedArray: function (frame)
395
- {
396
- switch (this .bitsAllocated)
397
- {
398
- case 8:
399
- return new (this .pixelRepresentation ? Int8Array : Uint8Array) (frame .buffer, frame .byteOffset, frame .length);
400
- case 16:
401
- return new (this .pixelRepresentation ? Int16Array : Uint16Array) (frame .buffer, frame .byteOffset, frame .length / 2);
402
- case 32:
403
- return new Float32Array (frame .buffer, frame .byteOffset, frame .length / 4);
404
- default:
405
- throw new Error ("DICOM: unsupported pixel format.");
406
- }
407
- },
408
- flipImage: function (frame, components)
409
- {
410
- var
411
- width = this .dicom .width,
412
- height = this .dicom .height,
413
- out = new (frame .constructor) (frame .length);
414
-
415
- for (var y = 0; y < height; ++ y)
416
- {
417
- var
418
- inputRow = components * width * (height - 1 - y),
419
- outputRow = components * width * y;
420
-
421
- for (var x = 0, w = components * width; x < w; ++ x)
422
- {
423
- out [outputRow + x] = frame [inputRow + x];
424
- }
425
- }
426
-
427
- return out;
428
- },
429
- getNormalizeOffsetAndFactor: function (data)
430
- {
431
- var
432
- min = Number .POSITIVE_INFINITY,
433
- max = Number .NEGATIVE_INFINITY;
434
-
435
- for (var i = 0, length = data .length; i < length; ++ i)
436
- {
437
- min = Math .min (min, data [i]);
438
- max = Math .max (max, data [i]);
439
- }
440
-
441
- var diverence = max - min;
442
-
443
- return { offset: min, factor: diverence ? 1 / diverence * 255 : 0 };
444
- },
445
- unpackBinaryFrame: function (byteArray, frameOffset, pixelsPerFrame)
446
- {
447
- function isBitSet (byte, bitPos)
448
- {
449
- return byte & (1 << bitPos);
450
- }
451
-
452
- // Create a new pixel array given the image size
453
- var pixelData = new Uint8Array (pixelsPerFrame);
454
-
455
- for (var i = 0; i < pixelsPerFrame; ++ i)
456
- {
457
- // Compute byte position
458
- var bytePos = Math .floor (i / 8);
459
-
460
- // Get the current byte
461
- var byte = byteArray [bytePos + frameOffset];
462
-
463
- // Bit position (0-7) within byte
464
- var bitPos = (i % 8);
465
-
466
- // Check whether bit at bitpos is set
467
- pixelData [i] = isBitSet (byte, bitPos) ? 1 : 0;
468
- }
469
-
470
- return pixelData;
471
- },
472
- decodeLittleEndian: function (pixelData)
473
- {
474
- var
475
- buffer = pixelData .buffer,
476
- offset = pixelData .byteOffset,
477
- length = pixelData .length;
478
-
479
- if (this .bitsAllocated === 16)
480
- {
481
- // if pixel data is not aligned on even boundary, shift it so we can create the 16 bit array
482
- // buffers on it
483
-
484
- if (offset % 2)
485
- {
486
- buffer = buffer .slice (offset);
487
- offset = 0;
488
- }
489
-
490
- return new Uint8Array (buffer, offset, length);
491
-
492
- }
493
- else if (this .bitsAllocated === 32)
494
- {
495
- // if pixel data is not aligned on even boundary, shift it
496
- if (offset % 4)
497
- {
498
- buffer = buffer .slice (offset);
499
- offset = 0;
500
- }
501
-
502
- return new Uint8Array (buffer, offset, length);
503
- }
504
-
505
- return pixelData;
506
- },
507
- decodeBigEndian: function (pixelData)
508
- {
509
- function swap16 (value)
510
- {
511
- return ((value & 0xFF) << 8) | ((value >> 8) & 0xFF);
512
- }
513
-
514
- if (this .bitsAllocated === 16)
515
- {
516
- var
517
- buffer = pixelData .buffer,
518
- offset = pixelData .byteOffset,
519
- length = pixelData .length;
520
-
521
- // if pixel data is not aligned on even boundary, shift it so we can create the 16 bit array
522
- // buffers on it
523
-
524
- if (offset % 2)
525
- {
526
- buffer = buffer .slice (offset);
527
- offset = 0;
528
- }
529
-
530
- pixelData = new Uint16Array (buffer, offset, length / 2);
531
-
532
- // Do the byte swap
533
- for (var i = 0, l = pixelData .length; i < l; ++ i)
534
- pixelData [i] = swap16 (pixelData [i]);
535
-
536
- return new Uint8Array (buffer, offset, length);
537
- }
538
-
539
- return pixelData;
540
- },
541
- decodeRLE: function (pixelData)
542
- {
543
- if (this .bitsAllocated === 8)
544
- {
545
- if (this .planarConfiguration)
546
- return this .decodeRLE8Planar (pixelData);
547
-
548
- return this .decodeRLE8 (pixelData);
549
- }
550
-
551
- if (this .bitsAllocated === 16)
552
- return this .decodeRLE16 (pixelData);
553
-
554
- throw new Error ("DICOM: unsupported pixel format for RLE.");
555
- },
556
- decodeRLE8: function (pixelData)
557
- {
558
- const frameData = pixelData;
559
- const frameSize = this .dicom .width * this .dicom .height;
560
- const components = this .dicom .components;
561
- const outFrame = new ArrayBuffer (frameSize * this .dicom .components);
562
- const header = new DataView (frameData .buffer, frameData .byteOffset);
563
- const data = new Int8Array(frameData .buffer, frameData .byteOffset);
564
- const out = new Int8Array (outFrame);
565
-
566
- let outIndex = 0;
567
- const numSegments = header .getInt32 (0, true);
568
-
569
- for (let s = 0; s < numSegments; ++ s)
570
- {
571
- outIndex = s;
572
-
573
- let inIndex = header .getInt32 ((s + 1) * 4, true);
574
- let maxIndex = header .getInt32 ((s + 2) * 4, true);
575
-
576
- if (maxIndex === 0)
577
- maxIndex = frameData.length;
578
-
579
- const endOfSegment = frameSize * numSegments;
580
-
581
- while (inIndex < maxIndex)
582
- {
583
- const n = data [inIndex ++];
584
-
585
- if (n >= 0 && n <= 127)
586
- {
587
- // copy n bytes
588
- for (let i = 0; i < n + 1 && outIndex < endOfSegment; ++ i)
589
- {
590
- out [outIndex] = data [inIndex ++];
591
- outIndex += components;
592
- }
593
- }
594
- else if (n <= -1 && n >= -127)
595
- {
596
- const value = data [inIndex ++];
597
-
598
- // run of n bytes
599
- for (let j = 0; j < -n + 1 && outIndex < endOfSegment; ++ j)
600
- {
601
- out [outIndex] = value;
602
- outIndex += components;
603
- }
604
- }
605
- }
606
- }
607
-
608
- return out;
609
- },
610
- decodeRLE8Planar: function (pixelData)
611
- {
612
- const frameData = pixelData;
613
- const frameSize = this .dicom .width * this .dicom .height;
614
- const outFrame = new ArrayBuffer (frameSize * this .dicom .components);
615
- const header = new DataView (frameData .buffer, frameData .byteOffset);
616
- const data = new Int8Array (frameData .buffer, frameData .byteOffset);
617
- const out = new Int8Array (outFrame);
618
-
619
- let outIndex = 0;
620
- const numSegments = header .getInt32 (0, true);
621
-
622
- for (let s = 0; s < numSegments; ++ s)
623
- {
624
- outIndex = s * frameSize;
625
-
626
- let inIndex = header .getInt32 ((s + 1) * 4, true);
627
- let maxIndex = header .getInt32 ((s + 2) * 4, true);
628
-
629
- if (maxIndex === 0)
630
- maxIndex = frameData .length;
631
-
632
- const endOfSegment = frameSize * numSegments;
633
-
634
- while (inIndex < maxIndex)
635
- {
636
- const n = data [inIndex ++];
637
-
638
- if (n >= 0 && n <= 127)
639
- {
640
- // copy n bytes
641
- for (let i = 0; i < n + 1 && outIndex < endOfSegment; ++ i)
642
- {
643
- out [outIndex] = data [inIndex ++];
644
- ++ outIndex;
645
- }
646
- }
647
- else if (n <= -1 && n >= -127)
648
- {
649
- const value = data[inIndex++];
650
-
651
- // run of n bytes
652
- for (let j = 0; j < -n + 1 && outIndex < endOfSegment; ++ j)
653
- {
654
- out [outIndex] = value;
655
- ++ outIndex;
656
- }
657
- }
658
- }
659
- }
660
-
661
- return out;
662
- },
663
- decodeRLE16: function (pixelData)
664
- {
665
- const frameData = pixelData;
666
- const frameSize = this .dicom .width * this .dicom .height;
667
- const outFrame = new ArrayBuffer (frameSize * this .dicom .components * 2);
668
- const header = new DataView (frameData.buffer, frameData.byteOffset);
669
- const data = new Int8Array (frameData.buffer, frameData.byteOffset);
670
- const out = new Int8Array (outFrame);
671
-
672
- const numSegments = header .getInt32 (0, true);
673
-
674
- for (let s = 0; s < numSegments; ++ s)
675
- {
676
- let outIndex = 0;
677
- const highByte = (s === 0 ? 1 : 0);
678
-
679
- let inIndex = header .getInt32 ((s + 1) * 4, true);
680
- let maxIndex = header .getInt32 ((s + 2) * 4, true);
681
-
682
- if (maxIndex === 0)
683
- maxIndex = frameData.length;
684
-
685
- while (inIndex < maxIndex)
686
- {
687
- const n = data [inIndex ++];
688
-
689
- if (n >= 0 && n <= 127)
690
- {
691
- for (let i = 0; i < n + 1 && outIndex < frameSize; ++ i)
692
- {
693
- out[(outIndex * 2) + highByte] = data[inIndex++];
694
- ++ outIndex;
695
- }
696
- }
697
- else if (n <= -1 && n >= -127)
698
- {
699
- const value = data [inIndex ++];
700
-
701
- for (let j = 0; j < -n + 1 && outIndex < frameSize; ++ j)
702
- {
703
- out [(outIndex * 2) + highByte] = value;
704
- ++ outIndex;
705
- }
706
- }
707
- }
708
- }
709
-
710
- return out;
711
- },
712
- decodeJPEGBaseline: function (pixelData)
713
- {
714
- var jpeg = new JpegImage ();
715
-
716
- jpeg .parse (pixelData);
717
-
718
- jpeg .colorTransform = true; // default is true
719
-
720
- var data = jpeg .getData (this .dicom .width, this .dicom .height);
721
-
722
- this .bitsAllocated = 8;
723
-
724
- return data;
725
- },
726
- decodeJPEGLossless: function (pixelData)
727
- {
728
- var
729
- decoder = new jpegLossless .lossless .Decoder (),
730
- buffer = decoder .decompress (pixelData);
731
-
732
- return new Uint8Array (buffer);
733
- },
734
- decodeJPEGLS: function (pixelData)
735
- {
736
- var image = this .jpegLSDecode (pixelData, this .pixelRepresentation === 1);
737
-
738
- // throw error if not success or too much data
739
- if (image .result !== 0 && image .result !== 6)
740
- throw new Error (`DICOM: JPEG-LS decoder failed to decode frame (error code ${image.result}).`);
741
-
742
- return new Uint8Array (image .pixelData .buffer);
743
- },
744
- jpegLSDecode: function (data, isSigned)
745
- {
746
- // Init global instance.
747
- charLS = charLS || CharLS ();
748
-
749
- // prepare input parameters
750
- const dataPtr = charLS._malloc(data.length);
751
-
752
- charLS.writeArrayToMemory(data, dataPtr);
753
-
754
- // prepare output parameters
755
- const imagePtrPtr = charLS._malloc(4);
756
- const imageSizePtr = charLS._malloc(4);
757
- const widthPtr = charLS._malloc(4);
758
- const heightPtr = charLS._malloc(4);
759
- const bitsPerSamplePtr = charLS._malloc(4);
760
- const stridePtr = charLS._malloc(4);
761
- const allowedLossyErrorPtr = charLS._malloc(4);
762
- const componentsPtr = charLS._malloc(4);
763
- const interleaveModePtr = charLS._malloc(4);
764
-
765
- // Decode the image
766
- const result = charLS.ccall(
767
- 'jpegls_decode',
768
- 'number',
769
- ['number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number'],
770
- [dataPtr, data.length, imagePtrPtr, imageSizePtr, widthPtr, heightPtr, bitsPerSamplePtr, stridePtr, componentsPtr, allowedLossyErrorPtr, interleaveModePtr]
771
- );
772
-
773
- // Extract result values into object
774
- const image = {
775
- result,
776
- width: charLS.getValue(widthPtr, 'i32'),
777
- height: charLS.getValue(heightPtr, 'i32'),
778
- bitsPerSample: charLS.getValue(bitsPerSamplePtr, 'i32'),
779
- stride: charLS.getValue(stridePtr, 'i32'),
780
- components: charLS.getValue(componentsPtr, 'i32'),
781
- allowedLossyError: charLS.getValue(allowedLossyErrorPtr, 'i32'),
782
- interleaveMode: charLS.getValue(interleaveModePtr, 'i32'),
783
- pixelData: undefined
784
- };
785
-
786
- // Copy image from emscripten heap into appropriate array buffer type
787
- const imagePtr = charLS.getValue(imagePtrPtr, '*');
788
-
789
- if (image.bitsPerSample <= 8) {
790
- image.pixelData = new Uint8Array(image.width * image.height * image.components);
791
- image.pixelData.set(new Uint8Array(charLS.HEAP8.buffer, imagePtr, image.pixelData.length));
792
- } else if (isSigned) {
793
- image.pixelData = new Int16Array(image.width * image.height * image.components);
794
- image.pixelData.set(new Int16Array(charLS.HEAP16.buffer, imagePtr, image.pixelData.length));
795
- } else {
796
- image.pixelData = new Uint16Array(image.width * image.height * image.components);
797
- image.pixelData.set(new Uint16Array(charLS.HEAP16.buffer, imagePtr, image.pixelData.length));
798
- }
799
-
800
- // free memory and return image object
801
- charLS._free(dataPtr);
802
- charLS._free(imagePtr);
803
- charLS._free(imagePtrPtr);
804
- charLS._free(imageSizePtr);
805
- charLS._free(widthPtr);
806
- charLS._free(heightPtr);
807
- charLS._free(bitsPerSamplePtr);
808
- charLS._free(stridePtr);
809
- charLS._free(componentsPtr);
810
- charLS._free(interleaveModePtr);
811
-
812
- return image;
813
- },
814
- decodeJPEG2000: function (pixelData)
815
- {
816
- var
817
- bytesPerPixel = this .bitsAllocated <= 8 ? 1 : 2,
818
- signed = this .pixelRepresentation === 1,
819
- image = this .decodeOpenJPEG (pixelData, bytesPerPixel, signed);
820
-
821
- if (image .nbChannels > 1)
822
- this .photometricInterpretation = "RGB";
823
-
824
- return new Uint8Array (image .pixelData .buffer);
825
- },
826
- decodeOpenJPEG: function (data, bytesPerPixel, signed)
827
- {
828
- // Init global instance.
829
- openJPEG = openJPEG || OpenJPEG ();
830
-
831
- const dataPtr = openJPEG._malloc(data.length);
832
-
833
- openJPEG.writeArrayToMemory(data, dataPtr);
834
-
835
- // create param outpout
836
- const imagePtrPtr = openJPEG._malloc(4);
837
- const imageSizePtr = openJPEG._malloc(4);
838
- const imageSizeXPtr = openJPEG._malloc(4);
839
- const imageSizeYPtr = openJPEG._malloc(4);
840
- const imageSizeCompPtr = openJPEG._malloc(4);
841
-
842
- const t0 = new Date().getTime();
843
- const ret = openJPEG.ccall('jp2_decode', 'number', ['number', 'number', 'number', 'number', 'number', 'number', 'number'],
844
- [dataPtr, data.length, imagePtrPtr, imageSizePtr, imageSizeXPtr, imageSizeYPtr, imageSizeCompPtr]);
845
- // add num vomp..etc
846
-
847
- if (ret !== 0) {
848
- console.log('[opj_decode] decoding failed!');
849
- openJPEG._free(dataPtr);
850
- openJPEG._free(openJPEG.getValue(imagePtrPtr, '*'));
851
- openJPEG._free(imageSizeXPtr);
852
- openJPEG._free(imageSizeYPtr);
853
- openJPEG._free(imageSizePtr);
854
- openJPEG._free(imageSizeCompPtr);
855
-
856
- return;
857
- }
858
-
859
- const imagePtr = openJPEG.getValue(imagePtrPtr, '*');
860
-
861
- const image = {
862
- length: openJPEG.getValue(imageSizePtr, 'i32'),
863
- sx: openJPEG.getValue(imageSizeXPtr, 'i32'),
864
- sy: openJPEG.getValue(imageSizeYPtr, 'i32'),
865
- nbChannels: openJPEG.getValue(imageSizeCompPtr, 'i32'), // hard coded for now
866
- perf_timetodecode: undefined,
867
- pixelData: undefined
868
- };
869
-
870
- // Copy the data from the EMSCRIPTEN heap into the correct type array
871
- const length = image.sx * image.sy * image.nbChannels;
872
- const src32 = new Int32Array(openJPEG.HEAP32.buffer, imagePtr, length);
873
-
874
- if (bytesPerPixel === 1) {
875
- if (Uint8Array.from) {
876
- image.pixelData = Uint8Array.from(src32);
877
- } else {
878
- image.pixelData = new Uint8Array(length);
879
- for (let i = 0; i < length; i++) {
880
- image.pixelData[i] = src32[i];
881
- }
882
- }
883
- } else if (signed) {
884
- if (Int16Array.from) {
885
- image.pixelData = Int16Array.from(src32);
886
- } else {
887
- image.pixelData = new Int16Array(length);
888
- for (let i = 0; i < length; i++) {
889
- image.pixelData[i] = src32[i];
890
- }
891
- }
892
- } else if (Uint16Array.from) {
893
- image.pixelData = Uint16Array.from(src32);
894
- } else {
895
- image.pixelData = new Uint16Array(length);
896
- for (let i = 0; i < length; i++) {
897
- image.pixelData[i] = src32[i];
898
- }
899
- }
900
-
901
- const t1 = new Date().getTime();
902
-
903
- image.perf_timetodecode = t1 - t0;
904
-
905
- // free
906
- openJPEG._free(dataPtr);
907
- openJPEG._free(imagePtrPtr);
908
- openJPEG._free(imagePtr);
909
- openJPEG._free(imageSizePtr);
910
- openJPEG._free(imageSizeXPtr);
911
- openJPEG._free(imageSizeYPtr);
912
- openJPEG._free(imageSizeCompPtr);
913
-
914
- return image;
915
- },
916
- convertRGBColorByPlane: function (pixelData)
917
- {
918
- if (pixelData .length % 3 !== 0)
919
- throw new Error ("DICOM: convertRGBColorByPlane: RGB buffer length must be divisble by 3.");
920
-
921
- var
922
- numPixels = pixelData .length / 3,
923
- rgbIndex = 0,
924
- rIndex = 0,
925
- gIndex = numPixels,
926
- bIndex = numPixels * 2,
927
- out = new (pixelData .constructor) (pixelData .length);
928
-
929
- for (var i = 0; i < numPixels; ++ i)
930
- {
931
- out [rgbIndex ++] = pixelData [rIndex ++]; // red
932
- out [rgbIndex ++] = pixelData [gIndex ++]; // green
933
- out [rgbIndex ++] = pixelData [bIndex ++]; // blue
934
- }
935
-
936
- return out;
937
- },
938
- convertYBRFullByPixel: function (pixelData)
939
- {
940
- if (pixelData .length % 3 !== 0)
941
- throw new Error ("DICOM: convertYBRFullByPixel: YBR buffer length must be divisble by 3.");
942
-
943
- console .log (pixelData);
944
-
945
- var
946
- numPixels = pixelData .length / 3,
947
- ybrIndex = 0,
948
- rgbIndex = 0,
949
- out = new (pixelData .constructor) (pixelData .length);
950
-
951
- for (var i = 0; i < numPixels; ++ i)
952
- {
953
- var
954
- y = pixelData [ybrIndex ++],
955
- cb = pixelData [ybrIndex ++],
956
- cr = pixelData [ybrIndex ++];
957
-
958
- out [rgbIndex ++] = y + 1.40200 * (cr - 128); // red
959
- out [rgbIndex ++] = y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green
960
- out [rgbIndex ++] = y + 1.77200 * (cb - 128); // blue
961
- }
962
-
963
- return out;
964
- },
965
- convertYBRFullByPlane: function (pixelData)
966
- {
967
- if (pixelData .length % 3 !== 0)
968
- throw new Error ("DICOM: convertYBRFullByPlane: YBR buffer length must be divisble by 3.");
969
-
970
- var
971
- numPixels = pixelData .length / 3,
972
- rgbIndex = 0,
973
- yIndex = 0,
974
- cbIndex = numPixels,
975
- crIndex = numPixels * 2,
976
- out = new (pixelData .constructor) (pixelData .length);
977
-
978
- for (var i = 0; i < numPixels; ++ i)
979
- {
980
- var
981
- y = pixelData [yIndex ++],
982
- cb = pixelData [cbIndex ++],
983
- cr = pixelData [crIndex ++];
984
-
985
- out [rgbIndex++] = y + 1.40200 * (cr - 128); // red
986
- out [rgbIndex++] = y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green
987
- out [rgbIndex++] = y + 1.77200 * (cb - 128); // blue
988
- }
989
-
990
- return out;
991
- },
992
- convertPaletteColor: function (pixelData)
993
- {
994
- function convertLUTto8Bit (lut, shift)
995
- {
996
- if (lut .cleaned)
997
- return lut .cleaned;
998
-
999
- const numEntries = lut .length;
1000
- const cleanedLUT = new Uint8ClampedArray (numEntries);
1001
-
1002
- for (let i = 0; i < numEntries; ++i)
1003
- cleanedLUT [i] = lut [i] >> shift;
1004
-
1005
- lut .cleaned = cleanedLUT;
1006
-
1007
- return cleanedLUT;
1008
- }
1009
-
1010
- const LUT = this .getLUT ();
1011
- const numPixels = this .dicom .width * this .dicom .height;
1012
- const rData = LUT .redPaletteColorLookupTableData;
1013
- const gData = LUT .greenPaletteColorLookupTableData;
1014
- const bData = LUT .bluePaletteColorLookupTableData;
1015
- const len = LUT .redPaletteColorLookupTableData .length;
1016
-
1017
- let palIndex = 0;
1018
- let rgbIndex = 0;
1019
-
1020
- const start = LUT .redPaletteColorLookupTableDescriptor [1];
1021
- const shift = LUT .redPaletteColorLookupTableDescriptor [2] === 8 ? 0 : 8;
1022
-
1023
- const rDataCleaned = convertLUTto8Bit (rData, shift);
1024
- const gDataCleaned = convertLUTto8Bit (gData, shift);
1025
- const bDataCleaned = convertLUTto8Bit (bData, shift);
1026
-
1027
- let out = new Uint8Array (pixelData .length * 3);
1028
-
1029
- for (let i = 0; i < numPixels; ++ i)
1030
- {
1031
- let value = pixelData [palIndex++];
1032
-
1033
- if (value < start)
1034
- value = 0;
1035
- else if (value > start + len - 1)
1036
- value = len - 1;
1037
- else
1038
- value -= start;
1039
-
1040
- out [rgbIndex++] = rDataCleaned [value];
1041
- out [rgbIndex++] = gDataCleaned [value];
1042
- out [rgbIndex++] = bDataCleaned [value];
1043
- }
1044
-
1045
- return out;
1046
- },
1047
- getLUT: function ()
1048
- {
1049
- if (this .LUT)
1050
- return this .LUT;
1051
-
1052
- this .LUT = { };
1053
-
1054
- this .populatePaletteColorLut (this .dataSet, this .LUT);
1055
-
1056
- return this .LUT;
1057
- },
1058
- populatePaletteColorLut: function (dataSet, imagePixelModule)
1059
- {
1060
- imagePixelModule .redPaletteColorLookupTableDescriptor = this .getLutDescriptor (dataSet, 'x00281101');
1061
- imagePixelModule .greenPaletteColorLookupTableDescriptor = this .getLutDescriptor (dataSet, 'x00281102');
1062
- imagePixelModule .bluePaletteColorLookupTableDescriptor = this .getLutDescriptor (dataSet, 'x00281103');
1063
-
1064
- // The first Palette Color Lookup Table Descriptor value is the number of entries in the lookup table.
1065
- // When the number of table entries is equal to 2ˆ16 then this value shall be 0.
1066
- // See http://dicom.nema.org/MEDICAL/DICOM/current/output/chtml/part03/sect_C.7.6.3.html#sect_C.7.6.3.1.5
1067
- if (imagePixelModule .redPaletteColorLookupTableDescriptor [0] === 0)
1068
- {
1069
- imagePixelModule .redPaletteColorLookupTableDescriptor [0] = 65536;
1070
- imagePixelModule .greenPaletteColorLookupTableDescriptor [0] = 65536;
1071
- imagePixelModule .bluePaletteColorLookupTableDescriptor [0] = 65536;
1072
- }
1073
-
1074
- // The third Palette Color Lookup Table Descriptor value specifies the number of bits for each entry in the Lookup Table Data.
1075
- // It shall take the value of 8 or 16.
1076
- // The LUT Data shall be stored in a format equivalent to 8 bits allocated when the number of bits for each entry is 8, and 16 bits allocated when the number of bits for each entry is 16, where in both cases the high bit is equal to bits allocated-1.
1077
- // The third value shall be identical for each of the Red, Green and Blue Palette Color Lookup Table Descriptors.
1078
- //
1079
- // Note: Some implementations have encoded 8 bit entries with 16 bits allocated, padding the high bits;
1080
- // this can be detected by comparing the number of entries specified in the LUT Descriptor with the actual value length of the LUT Data entry.
1081
- // The value length in bytes should equal the number of entries if bits allocated is 8, and be twice as long if bits allocated is 16.
1082
- const numLutEntries = imagePixelModule .redPaletteColorLookupTableDescriptor [0];
1083
- const lutData = dataSet .elements .x00281201;
1084
- const lutBitsAllocated = lutData .length === numLutEntries ? 8 : 16;
1085
-
1086
- // If the descriptors do not appear to have the correct values, correct them
1087
- if (imagePixelModule.redPaletteColorLookupTableDescriptor [2] !== lutBitsAllocated)
1088
- {
1089
- imagePixelModule .redPaletteColorLookupTableDescriptor [2] = lutBitsAllocated;
1090
- imagePixelModule .greenPaletteColorLookupTableDescriptor [2] = lutBitsAllocated;
1091
- imagePixelModule .bluePaletteColorLookupTableDescriptor [2] = lutBitsAllocated;
1092
- }
1093
-
1094
- imagePixelModule .redPaletteColorLookupTableData = this .getLutData (dataSet, 'x00281201', imagePixelModule .redPaletteColorLookupTableDescriptor);
1095
- imagePixelModule .greenPaletteColorLookupTableData = this .getLutData (dataSet, 'x00281202', imagePixelModule .greenPaletteColorLookupTableDescriptor);
1096
- imagePixelModule .bluePaletteColorLookupTableData = this .getLutData (dataSet, 'x00281203', imagePixelModule .bluePaletteColorLookupTableDescriptor);
1097
- },
1098
- getLutDescriptor: function (dataSet, tag)
1099
- {
1100
- if (! dataSet .elements [tag] || dataSet .elements [tag] .length !== 6)
1101
- return;
1102
-
1103
- return [dataSet .uint16 (tag, 0), dataSet .uint16 (tag, 1), dataSet .uint16 (tag, 2)];
1104
- },
1105
- getLutData: function (lutDataSet, tag, lutDescriptor)
1106
- {
1107
- const lut = [];
1108
- const lutData = lutDataSet .elements [tag];
1109
-
1110
- for (let i = 0; i < lutDescriptor [0]; ++ i)
1111
- {
1112
- // Output range is always unsigned
1113
- if (lutDescriptor [2] === 16)
1114
- lut [i] = lutDataSet .uint16 (tag, i);
1115
- else
1116
- lut [i] = lutDataSet .byteArray [i + lutData .dataOffset];
1117
- }
1118
-
1119
- return lut;
1120
- },
1121
- };
1122
-
1123
- // ftp://medical.nema.org/medical/dicom/DataSets/WG04/
1124
-
1125
- return DicomParser;
67
+ // Global instances of JPEG libraries.
68
+
69
+ var
70
+ charLS = undefined,
71
+ openJPEG = undefined;
72
+
73
+ // DicomParser
74
+
75
+ function DicomParser ()
76
+ {
77
+ this .dicom = { dicom: false };
78
+ }
79
+
80
+ DicomParser .prototype =
81
+ {
82
+ parse: function (input)
83
+ {
84
+ try
85
+ {
86
+ var inputArray = new Uint8Array (input .length);
87
+
88
+ for (var i = 0, length = input .length; i < length; ++ i)
89
+ inputArray [i] = input .charCodeAt (i);
90
+
91
+ this .dataSet = dicomParser .parseDicom (inputArray);
92
+ this .dicom .dicom = true;
93
+ }
94
+ catch (error)
95
+ {
96
+ console .error (error);
97
+ this .dicom .dicom = false;
98
+ return this .dicom;
99
+ }
100
+
101
+ this .getPhotometricInterpretation ();
102
+ this .getComponents ();
103
+ this .getWidth ();
104
+ this .getHeight ();
105
+ this .getDepth ();
106
+ this .getBitsAllocated ();
107
+ this .getBitsStored ();
108
+ this .getPixelRepresentation ();
109
+ this .getPlanarConfiguration ();
110
+ this .getTansferSyntax ();
111
+ this .getPixelData ();
112
+
113
+ if (DEBUG)
114
+ console .log (this);
115
+
116
+ return this .dicom;
117
+ },
118
+ getPhotometricInterpretation: function ()
119
+ {
120
+ // https://dicom.innolitics.com/ciods/ct-image/image-pixel/00280004
121
+ this .photometricInterpretation = this .dataSet .string ("x00280004");
122
+ },
123
+ getComponents: function ()
124
+ {
125
+ // https://dicom.innolitics.com/ciods/ct-image/image-pixel/00280002
126
+ this .dicom .components = this .dataSet .uint16 ("x00280002");
127
+ },
128
+ getWidth: function ()
129
+ {
130
+ this .dicom .width = this .dataSet .uint16 ("x00280011");
131
+ },
132
+ getHeight: function ()
133
+ {
134
+ this .dicom .height = this .dataSet .uint16 ("x00280010");
135
+ },
136
+ getDepth: function ()
137
+ {
138
+ if (this .dataSet .elements .x00280008)
139
+ {
140
+ this .dicom .depth = this .dataSet .intString ("x00280008");
141
+ }
142
+ else
143
+ this .dicom .depth = 1;
144
+ },
145
+ getBitsAllocated: function ()
146
+ {
147
+ this .bitsAllocated = this .dataSet .uint16 ("x00280100");
148
+ },
149
+ getBitsStored: function ()
150
+ {
151
+ this .bitsStored = this .dataSet .uint16 ("x00280101");
152
+ },
153
+ getPixelRepresentation: function ()
154
+ {
155
+ this .pixelRepresentation = this .dataSet .uint16 ("x00280103") || 0;
156
+ },
157
+ getPlanarConfiguration: function ()
158
+ {
159
+ this .planarConfiguration = this .dataSet .uint16 ("x00280006") || 0;
160
+ },
161
+ getTansferSyntax: function ()
162
+ {
163
+ this .transferSyntax = this .dataSet .string ("x00020010");
164
+ },
165
+ getPixelData: function ()
166
+ {
167
+ var
168
+ dicom = this .dicom,
169
+ pixelElement = this .dataSet .elements .x7fe00010 || this .dataSet .elements .x7fe00008, // pixel or float pixel
170
+ components = this .photometricInterpretation === "PALETTE COLOR" ? 3 : this .dicom .components,
171
+ imageLength = dicom .width * dicom .height * components,
172
+ byteLength = imageLength * dicom .depth,
173
+ bytes = new Uint8Array (byteLength),
174
+ frames = this .getFrames (pixelElement);
175
+
176
+ frames .forEach (function (frame, f)
177
+ {
178
+ // Handle transfer syntax.
179
+
180
+ // https://www.dicomlibrary.com/dicom/transfer-syntax/
181
+
182
+ switch (this .transferSyntax)
183
+ {
184
+ case "1.2.840.10008.1.2": // Implicit VR Little Endian
185
+ case "1.2.840.10008.1.2.1": // Explicit VR Little Endian
186
+ case "1.2.840.10008.1.2.1.99": // Deflated Explicit VR Little Endian
187
+ {
188
+ frame = this .decodeLittleEndian (frame);
189
+ break;
190
+ }
191
+ case "1.2.840.10008.1.2.2": // Explicit VR Big Endian (retired)
192
+ {
193
+ frame = this .decodeBigEndian (frame);
194
+ break;
195
+ }
196
+ case "1.2.840.10008.1.2.5": // RLE Lossless
197
+ {
198
+ frame = this .decodeRLE (frame);
199
+ break;
200
+ }
201
+ case "1.2.840.10008.1.2.4.50": // JPEG Baseline lossy process 1 (8 bit)
202
+ case "1.2.840.10008.1.2.4.51": // JPEG Baseline lossy process 2 & 4 (12 bit)
203
+ {
204
+ frame = this .decodeJPEGBaseline (frame);
205
+ break;
206
+ }
207
+ case "1.2.840.10008.1.2.4.57": // JPEG Lossless, Nonhierarchical (Processes 14)
208
+ case "1.2.840.10008.1.2.4.70": // JPEG Lossless, Nonhierarchical (Processes 14 [Selection 1])
209
+ {
210
+ frame = this .decodeJPEGLossless (frame);
211
+ break;
212
+ }
213
+ case "1.2.840.10008.1.2.4.80": // JPEG-LS Lossless Image Compression
214
+ case "1.2.840.10008.1.2.4.81": // JPEG-LS Lossy (Near-Lossless) Image Compression
215
+ {
216
+ frame = this .decodeJPEGLS (frame);
217
+ break;
218
+ }
219
+ case "1.2.840.10008.1.2.4.90": // JPEG 2000 Lossless
220
+ case "1.2.840.10008.1.2.4.91": // JPEG 2000 Lossy
221
+ {
222
+ frame = this .decodeJPEG2000 (frame);
223
+ break;
224
+ }
225
+ case "1.2.840.10008.1.2.4.52":
226
+ case "1.2.840.10008.1.2.4.53":
227
+ case "1.2.840.10008.1.2.4.54":
228
+ case "1.2.840.10008.1.2.4.55":
229
+ case "1.2.840.10008.1.2.4.56":
230
+ case "1.2.840.10008.1.2.4.58":
231
+ case "1.2.840.10008.1.2.4.59":
232
+ case "1.2.840.10008.1.2.4.60":
233
+ case "1.2.840.10008.1.2.4.61":
234
+ case "1.2.840.10008.1.2.4.62":
235
+ case "1.2.840.10008.1.2.4.63":
236
+ case "1.2.840.10008.1.2.4.64":
237
+ case "1.2.840.10008.1.2.4.65":
238
+ case "1.2.840.10008.1.2.4.66":
239
+ case "1.2.840.10008.1.2.4.92":
240
+ case "1.2.840.10008.1.2.4.93":
241
+ {
242
+ // JPEG
243
+ throw new Error ("DICOM: this JPEG encoding (" + this .transferSyntax + ") is not supported.");
244
+ }
245
+ default:
246
+ {
247
+ throw new Error ("DICOM: unsupported transfer syntax '" + this .transferSyntax + "'.");
248
+ }
249
+ }
250
+
251
+ // Convert to stored type array (int, uint, float, 8/16 bit).
252
+
253
+ frame = this .getTypedArray (frame);
254
+
255
+ // Handle bits stored.
256
+
257
+ if (this .pixelRepresentation === 1 && this .bitsStored !== undefined)
258
+ {
259
+ var shift = 32 - this .bitsStored;
260
+
261
+ for (var i = 0, length = frame .length; i < length; ++ i)
262
+ frame [i] = frame [i] << shift >> shift;
263
+ }
264
+
265
+ // Handle photometric interpretation.
266
+
267
+ switch (this .photometricInterpretation)
268
+ {
269
+ case "MONOCHROME1":
270
+ case "MONOCHROME2":
271
+ {
272
+ break;
273
+ }
274
+ case "RGB":
275
+ case "YBR_RCT":
276
+ case "YBR_ICT":
277
+ case "YBR_FULL_422":
278
+ {
279
+ if (this .planarConfiguration === 1)
280
+ frame = this .convertRGBColorByPlane (frame);
281
+
282
+ break;
283
+ }
284
+ case "YBR_FULL":
285
+ {
286
+ if (this .planarConfiguration === 0)
287
+ frame = this .convertYBRFullByPixel (frame);
288
+ else
289
+ frame = this .convertYBRFullByPlane (frame);
290
+
291
+ break;
292
+ }
293
+ case "PALETTE COLOR":
294
+ {
295
+ frame = this .convertPaletteColor (frame);
296
+ break;
297
+ }
298
+ default:
299
+ {
300
+ throw new Error ("DICOM: unsupported image type '" + this .photometricInterpretation + "'.");
301
+ }
302
+ }
303
+
304
+ // Normalize frame pixel data in the range [0, 255], and assign to image block;
305
+
306
+ frame = this .flipImage (frame, components);
307
+
308
+ var
309
+ normalize = this .getNormalizeOffsetAndFactor (frame),
310
+ b = f * imageLength;
311
+
312
+ for (var i = 0, length = frame .length; i < length; ++ i, ++ b)
313
+ bytes [b] = (frame [i] - normalize .offset) * normalize .factor;
314
+ },
315
+ this);
316
+
317
+ // Invert MONOCHROME1 pixels.
318
+
319
+ if (this .photometricInterpretation === "MONOCHROME1")
320
+ {
321
+ for (var i = 0, length = bytes .length; i < length; ++ i)
322
+ bytes [i] = 255 - bytes [i];
323
+ }
324
+
325
+ // Set Uint8Array.
326
+
327
+ dicom .components = components;
328
+ dicom .data = bytes;
329
+ },
330
+ getFrames: function (pixelElement)
331
+ {
332
+ var frames = [ ];
333
+
334
+ if (pixelElement .encapsulatedPixelData)
335
+ {
336
+ if (pixelElement .basicOffsetTable .length)
337
+ {
338
+ for (var i = 0, length = this .dicom .depth; i < length; ++ i)
339
+ frames .push (dicomParser .readEncapsulatedImageFrame (this .dataSet, pixelElement, i));
340
+ }
341
+ else if (this .dicom .depth !== pixelElement .fragments .length)
342
+ {
343
+ var basicOffsetTable = dicomParser .createJPEGBasicOffsetTable (this .dataSet, pixelElement);
344
+
345
+ for (var i = 0, length = this .dicom .depth; i < length; ++ i)
346
+ frames .push (dicomParser .readEncapsulatedImageFrame (this .dataSet, pixelElement, i, basicOffsetTable));
347
+ }
348
+ else
349
+ {
350
+ for (var i = 0, length = this .dicom .depth; i < length; ++ i)
351
+ frames .push (dicomParser .readEncapsulatedPixelDataFromFragments (this .dataSet, pixelElement, i));
352
+ }
353
+ }
354
+ else
355
+ {
356
+ var pixelsPerFrame = this .dicom .width * this .dicom .height * this .dicom .components;
357
+
358
+ switch (this .bitsAllocated)
359
+ {
360
+ case 1:
361
+ {
362
+ for (var i = 0, length = this .dicom .depth; i < length; ++ i)
363
+ {
364
+ var frameOffset = pixelElement .dataOffset + i * pixelsPerFrame / 8;
365
+
366
+ frames .push (this .unpackBinaryFrame (this .dataSet .byteArray, frameOffset, pixelsPerFrame));
367
+ }
368
+
369
+ this .bitsAllocated = 8;
370
+ break;
371
+ }
372
+ case 8:
373
+ case 16:
374
+ case 32:
375
+ {
376
+ var bytesAllocated = this .bitsAllocated / 8;
377
+
378
+ for (var i = 0, length = this .dicom .depth; i < length; ++ i)
379
+ {
380
+ var frameOffset = pixelElement .dataOffset + i * pixelsPerFrame * bytesAllocated;
381
+
382
+ frames .push (new Uint8Array (this .dataSet .byteArray .buffer, frameOffset, pixelsPerFrame * bytesAllocated));
383
+ }
384
+
385
+ break;
386
+ }
387
+ default:
388
+ throw new Error ("DICOM: unsupported pixel format.");
389
+ }
390
+ }
391
+
392
+ return frames;
393
+ },
394
+ getTypedArray: function (frame)
395
+ {
396
+ switch (this .bitsAllocated)
397
+ {
398
+ case 8:
399
+ return new (this .pixelRepresentation ? Int8Array : Uint8Array) (frame .buffer, frame .byteOffset, frame .length);
400
+ case 16:
401
+ return new (this .pixelRepresentation ? Int16Array : Uint16Array) (frame .buffer, frame .byteOffset, frame .length / 2);
402
+ case 32:
403
+ return new Float32Array (frame .buffer, frame .byteOffset, frame .length / 4);
404
+ default:
405
+ throw new Error ("DICOM: unsupported pixel format.");
406
+ }
407
+ },
408
+ flipImage: function (frame, components)
409
+ {
410
+ var
411
+ width = this .dicom .width,
412
+ height = this .dicom .height,
413
+ out = new (frame .constructor) (frame .length);
414
+
415
+ for (var y = 0; y < height; ++ y)
416
+ {
417
+ var
418
+ inputRow = components * width * (height - 1 - y),
419
+ outputRow = components * width * y;
420
+
421
+ for (var x = 0, w = components * width; x < w; ++ x)
422
+ {
423
+ out [outputRow + x] = frame [inputRow + x];
424
+ }
425
+ }
426
+
427
+ return out;
428
+ },
429
+ getNormalizeOffsetAndFactor: function (data)
430
+ {
431
+ var
432
+ min = Number .POSITIVE_INFINITY,
433
+ max = Number .NEGATIVE_INFINITY;
434
+
435
+ for (var i = 0, length = data .length; i < length; ++ i)
436
+ {
437
+ min = Math .min (min, data [i]);
438
+ max = Math .max (max, data [i]);
439
+ }
440
+
441
+ var diverence = max - min;
442
+
443
+ return { offset: min, factor: diverence ? 1 / diverence * 255 : 0 };
444
+ },
445
+ unpackBinaryFrame: function (byteArray, frameOffset, pixelsPerFrame)
446
+ {
447
+ function isBitSet (byte, bitPos)
448
+ {
449
+ return byte & (1 << bitPos);
450
+ }
451
+
452
+ // Create a new pixel array given the image size
453
+ var pixelData = new Uint8Array (pixelsPerFrame);
454
+
455
+ for (var i = 0; i < pixelsPerFrame; ++ i)
456
+ {
457
+ // Compute byte position
458
+ var bytePos = Math .floor (i / 8);
459
+
460
+ // Get the current byte
461
+ var byte = byteArray [bytePos + frameOffset];
462
+
463
+ // Bit position (0-7) within byte
464
+ var bitPos = (i % 8);
465
+
466
+ // Check whether bit at bitpos is set
467
+ pixelData [i] = isBitSet (byte, bitPos) ? 1 : 0;
468
+ }
469
+
470
+ return pixelData;
471
+ },
472
+ decodeLittleEndian: function (pixelData)
473
+ {
474
+ var
475
+ buffer = pixelData .buffer,
476
+ offset = pixelData .byteOffset,
477
+ length = pixelData .length;
478
+
479
+ if (this .bitsAllocated === 16)
480
+ {
481
+ // if pixel data is not aligned on even boundary, shift it so we can create the 16 bit array
482
+ // buffers on it
483
+
484
+ if (offset % 2)
485
+ {
486
+ buffer = buffer .slice (offset);
487
+ offset = 0;
488
+ }
489
+
490
+ return new Uint8Array (buffer, offset, length);
491
+
492
+ }
493
+ else if (this .bitsAllocated === 32)
494
+ {
495
+ // if pixel data is not aligned on even boundary, shift it
496
+ if (offset % 4)
497
+ {
498
+ buffer = buffer .slice (offset);
499
+ offset = 0;
500
+ }
501
+
502
+ return new Uint8Array (buffer, offset, length);
503
+ }
504
+
505
+ return pixelData;
506
+ },
507
+ decodeBigEndian: function (pixelData)
508
+ {
509
+ function swap16 (value)
510
+ {
511
+ return ((value & 0xFF) << 8) | ((value >> 8) & 0xFF);
512
+ }
513
+
514
+ if (this .bitsAllocated === 16)
515
+ {
516
+ var
517
+ buffer = pixelData .buffer,
518
+ offset = pixelData .byteOffset,
519
+ length = pixelData .length;
520
+
521
+ // if pixel data is not aligned on even boundary, shift it so we can create the 16 bit array
522
+ // buffers on it
523
+
524
+ if (offset % 2)
525
+ {
526
+ buffer = buffer .slice (offset);
527
+ offset = 0;
528
+ }
529
+
530
+ pixelData = new Uint16Array (buffer, offset, length / 2);
531
+
532
+ // Do the byte swap
533
+ for (var i = 0, l = pixelData .length; i < l; ++ i)
534
+ pixelData [i] = swap16 (pixelData [i]);
535
+
536
+ return new Uint8Array (buffer, offset, length);
537
+ }
538
+
539
+ return pixelData;
540
+ },
541
+ decodeRLE: function (pixelData)
542
+ {
543
+ if (this .bitsAllocated === 8)
544
+ {
545
+ if (this .planarConfiguration)
546
+ return this .decodeRLE8Planar (pixelData);
547
+
548
+ return this .decodeRLE8 (pixelData);
549
+ }
550
+
551
+ if (this .bitsAllocated === 16)
552
+ return this .decodeRLE16 (pixelData);
553
+
554
+ throw new Error ("DICOM: unsupported pixel format for RLE.");
555
+ },
556
+ decodeRLE8: function (pixelData)
557
+ {
558
+ const frameData = pixelData;
559
+ const frameSize = this .dicom .width * this .dicom .height;
560
+ const components = this .dicom .components;
561
+ const outFrame = new ArrayBuffer (frameSize * this .dicom .components);
562
+ const header = new DataView (frameData .buffer, frameData .byteOffset);
563
+ const data = new Int8Array(frameData .buffer, frameData .byteOffset);
564
+ const out = new Int8Array (outFrame);
565
+
566
+ let outIndex = 0;
567
+ const numSegments = header .getInt32 (0, true);
568
+
569
+ for (let s = 0; s < numSegments; ++ s)
570
+ {
571
+ outIndex = s;
572
+
573
+ let inIndex = header .getInt32 ((s + 1) * 4, true);
574
+ let maxIndex = header .getInt32 ((s + 2) * 4, true);
575
+
576
+ if (maxIndex === 0)
577
+ maxIndex = frameData.length;
578
+
579
+ const endOfSegment = frameSize * numSegments;
580
+
581
+ while (inIndex < maxIndex)
582
+ {
583
+ const n = data [inIndex ++];
584
+
585
+ if (n >= 0 && n <= 127)
586
+ {
587
+ // copy n bytes
588
+ for (let i = 0; i < n + 1 && outIndex < endOfSegment; ++ i)
589
+ {
590
+ out [outIndex] = data [inIndex ++];
591
+ outIndex += components;
592
+ }
593
+ }
594
+ else if (n <= -1 && n >= -127)
595
+ {
596
+ const value = data [inIndex ++];
597
+
598
+ // run of n bytes
599
+ for (let j = 0; j < -n + 1 && outIndex < endOfSegment; ++ j)
600
+ {
601
+ out [outIndex] = value;
602
+ outIndex += components;
603
+ }
604
+ }
605
+ }
606
+ }
607
+
608
+ return out;
609
+ },
610
+ decodeRLE8Planar: function (pixelData)
611
+ {
612
+ const frameData = pixelData;
613
+ const frameSize = this .dicom .width * this .dicom .height;
614
+ const outFrame = new ArrayBuffer (frameSize * this .dicom .components);
615
+ const header = new DataView (frameData .buffer, frameData .byteOffset);
616
+ const data = new Int8Array (frameData .buffer, frameData .byteOffset);
617
+ const out = new Int8Array (outFrame);
618
+
619
+ let outIndex = 0;
620
+ const numSegments = header .getInt32 (0, true);
621
+
622
+ for (let s = 0; s < numSegments; ++ s)
623
+ {
624
+ outIndex = s * frameSize;
625
+
626
+ let inIndex = header .getInt32 ((s + 1) * 4, true);
627
+ let maxIndex = header .getInt32 ((s + 2) * 4, true);
628
+
629
+ if (maxIndex === 0)
630
+ maxIndex = frameData .length;
631
+
632
+ const endOfSegment = frameSize * numSegments;
633
+
634
+ while (inIndex < maxIndex)
635
+ {
636
+ const n = data [inIndex ++];
637
+
638
+ if (n >= 0 && n <= 127)
639
+ {
640
+ // copy n bytes
641
+ for (let i = 0; i < n + 1 && outIndex < endOfSegment; ++ i)
642
+ {
643
+ out [outIndex] = data [inIndex ++];
644
+ ++ outIndex;
645
+ }
646
+ }
647
+ else if (n <= -1 && n >= -127)
648
+ {
649
+ const value = data[inIndex++];
650
+
651
+ // run of n bytes
652
+ for (let j = 0; j < -n + 1 && outIndex < endOfSegment; ++ j)
653
+ {
654
+ out [outIndex] = value;
655
+ ++ outIndex;
656
+ }
657
+ }
658
+ }
659
+ }
660
+
661
+ return out;
662
+ },
663
+ decodeRLE16: function (pixelData)
664
+ {
665
+ const frameData = pixelData;
666
+ const frameSize = this .dicom .width * this .dicom .height;
667
+ const outFrame = new ArrayBuffer (frameSize * this .dicom .components * 2);
668
+ const header = new DataView (frameData.buffer, frameData.byteOffset);
669
+ const data = new Int8Array (frameData.buffer, frameData.byteOffset);
670
+ const out = new Int8Array (outFrame);
671
+
672
+ const numSegments = header .getInt32 (0, true);
673
+
674
+ for (let s = 0; s < numSegments; ++ s)
675
+ {
676
+ let outIndex = 0;
677
+ const highByte = (s === 0 ? 1 : 0);
678
+
679
+ let inIndex = header .getInt32 ((s + 1) * 4, true);
680
+ let maxIndex = header .getInt32 ((s + 2) * 4, true);
681
+
682
+ if (maxIndex === 0)
683
+ maxIndex = frameData.length;
684
+
685
+ while (inIndex < maxIndex)
686
+ {
687
+ const n = data [inIndex ++];
688
+
689
+ if (n >= 0 && n <= 127)
690
+ {
691
+ for (let i = 0; i < n + 1 && outIndex < frameSize; ++ i)
692
+ {
693
+ out[(outIndex * 2) + highByte] = data[inIndex++];
694
+ ++ outIndex;
695
+ }
696
+ }
697
+ else if (n <= -1 && n >= -127)
698
+ {
699
+ const value = data [inIndex ++];
700
+
701
+ for (let j = 0; j < -n + 1 && outIndex < frameSize; ++ j)
702
+ {
703
+ out [(outIndex * 2) + highByte] = value;
704
+ ++ outIndex;
705
+ }
706
+ }
707
+ }
708
+ }
709
+
710
+ return out;
711
+ },
712
+ decodeJPEGBaseline: function (pixelData)
713
+ {
714
+ var jpeg = new JpegImage ();
715
+
716
+ jpeg .parse (pixelData);
717
+
718
+ jpeg .colorTransform = true; // default is true
719
+
720
+ var data = jpeg .getData (this .dicom .width, this .dicom .height);
721
+
722
+ this .bitsAllocated = 8;
723
+
724
+ return data;
725
+ },
726
+ decodeJPEGLossless: function (pixelData)
727
+ {
728
+ var
729
+ decoder = new jpegLossless .lossless .Decoder (),
730
+ buffer = decoder .decompress (pixelData);
731
+
732
+ return new Uint8Array (buffer);
733
+ },
734
+ decodeJPEGLS: function (pixelData)
735
+ {
736
+ var image = this .jpegLSDecode (pixelData, this .pixelRepresentation === 1);
737
+
738
+ // throw error if not success or too much data
739
+ if (image .result !== 0 && image .result !== 6)
740
+ throw new Error (`DICOM: JPEG-LS decoder failed to decode frame (error code ${image.result}).`);
741
+
742
+ return new Uint8Array (image .pixelData .buffer);
743
+ },
744
+ jpegLSDecode: function (data, isSigned)
745
+ {
746
+ // Init global instance.
747
+ charLS = charLS || CharLS ();
748
+
749
+ // prepare input parameters
750
+ const dataPtr = charLS._malloc(data.length);
751
+
752
+ charLS.writeArrayToMemory(data, dataPtr);
753
+
754
+ // prepare output parameters
755
+ const imagePtrPtr = charLS._malloc(4);
756
+ const imageSizePtr = charLS._malloc(4);
757
+ const widthPtr = charLS._malloc(4);
758
+ const heightPtr = charLS._malloc(4);
759
+ const bitsPerSamplePtr = charLS._malloc(4);
760
+ const stridePtr = charLS._malloc(4);
761
+ const allowedLossyErrorPtr = charLS._malloc(4);
762
+ const componentsPtr = charLS._malloc(4);
763
+ const interleaveModePtr = charLS._malloc(4);
764
+
765
+ // Decode the image
766
+ const result = charLS.ccall(
767
+ 'jpegls_decode',
768
+ 'number',
769
+ ['number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number'],
770
+ [dataPtr, data.length, imagePtrPtr, imageSizePtr, widthPtr, heightPtr, bitsPerSamplePtr, stridePtr, componentsPtr, allowedLossyErrorPtr, interleaveModePtr]
771
+ );
772
+
773
+ // Extract result values into object
774
+ const image = {
775
+ result,
776
+ width: charLS.getValue(widthPtr, 'i32'),
777
+ height: charLS.getValue(heightPtr, 'i32'),
778
+ bitsPerSample: charLS.getValue(bitsPerSamplePtr, 'i32'),
779
+ stride: charLS.getValue(stridePtr, 'i32'),
780
+ components: charLS.getValue(componentsPtr, 'i32'),
781
+ allowedLossyError: charLS.getValue(allowedLossyErrorPtr, 'i32'),
782
+ interleaveMode: charLS.getValue(interleaveModePtr, 'i32'),
783
+ pixelData: undefined
784
+ };
785
+
786
+ // Copy image from emscripten heap into appropriate array buffer type
787
+ const imagePtr = charLS.getValue(imagePtrPtr, '*');
788
+
789
+ if (image.bitsPerSample <= 8) {
790
+ image.pixelData = new Uint8Array(image.width * image.height * image.components);
791
+ image.pixelData.set(new Uint8Array(charLS.HEAP8.buffer, imagePtr, image.pixelData.length));
792
+ } else if (isSigned) {
793
+ image.pixelData = new Int16Array(image.width * image.height * image.components);
794
+ image.pixelData.set(new Int16Array(charLS.HEAP16.buffer, imagePtr, image.pixelData.length));
795
+ } else {
796
+ image.pixelData = new Uint16Array(image.width * image.height * image.components);
797
+ image.pixelData.set(new Uint16Array(charLS.HEAP16.buffer, imagePtr, image.pixelData.length));
798
+ }
799
+
800
+ // free memory and return image object
801
+ charLS._free(dataPtr);
802
+ charLS._free(imagePtr);
803
+ charLS._free(imagePtrPtr);
804
+ charLS._free(imageSizePtr);
805
+ charLS._free(widthPtr);
806
+ charLS._free(heightPtr);
807
+ charLS._free(bitsPerSamplePtr);
808
+ charLS._free(stridePtr);
809
+ charLS._free(componentsPtr);
810
+ charLS._free(interleaveModePtr);
811
+
812
+ return image;
813
+ },
814
+ decodeJPEG2000: function (pixelData)
815
+ {
816
+ var
817
+ bytesPerPixel = this .bitsAllocated <= 8 ? 1 : 2,
818
+ signed = this .pixelRepresentation === 1,
819
+ image = this .decodeOpenJPEG (pixelData, bytesPerPixel, signed);
820
+
821
+ if (image .nbChannels > 1)
822
+ this .photometricInterpretation = "RGB";
823
+
824
+ return new Uint8Array (image .pixelData .buffer);
825
+ },
826
+ decodeOpenJPEG: function (data, bytesPerPixel, signed)
827
+ {
828
+ // Init global instance.
829
+ openJPEG = openJPEG || OpenJPEG ();
830
+
831
+ const dataPtr = openJPEG._malloc(data.length);
832
+
833
+ openJPEG.writeArrayToMemory(data, dataPtr);
834
+
835
+ // create param outpout
836
+ const imagePtrPtr = openJPEG._malloc(4);
837
+ const imageSizePtr = openJPEG._malloc(4);
838
+ const imageSizeXPtr = openJPEG._malloc(4);
839
+ const imageSizeYPtr = openJPEG._malloc(4);
840
+ const imageSizeCompPtr = openJPEG._malloc(4);
841
+
842
+ const t0 = new Date().getTime();
843
+ const ret = openJPEG.ccall('jp2_decode', 'number', ['number', 'number', 'number', 'number', 'number', 'number', 'number'],
844
+ [dataPtr, data.length, imagePtrPtr, imageSizePtr, imageSizeXPtr, imageSizeYPtr, imageSizeCompPtr]);
845
+ // add num vomp..etc
846
+
847
+ if (ret !== 0) {
848
+ console.log('[opj_decode] decoding failed!');
849
+ openJPEG._free(dataPtr);
850
+ openJPEG._free(openJPEG.getValue(imagePtrPtr, '*'));
851
+ openJPEG._free(imageSizeXPtr);
852
+ openJPEG._free(imageSizeYPtr);
853
+ openJPEG._free(imageSizePtr);
854
+ openJPEG._free(imageSizeCompPtr);
855
+
856
+ return;
857
+ }
858
+
859
+ const imagePtr = openJPEG.getValue(imagePtrPtr, '*');
860
+
861
+ const image = {
862
+ length: openJPEG.getValue(imageSizePtr, 'i32'),
863
+ sx: openJPEG.getValue(imageSizeXPtr, 'i32'),
864
+ sy: openJPEG.getValue(imageSizeYPtr, 'i32'),
865
+ nbChannels: openJPEG.getValue(imageSizeCompPtr, 'i32'), // hard coded for now
866
+ perf_timetodecode: undefined,
867
+ pixelData: undefined
868
+ };
869
+
870
+ // Copy the data from the EMSCRIPTEN heap into the correct type array
871
+ const length = image.sx * image.sy * image.nbChannels;
872
+ const src32 = new Int32Array(openJPEG.HEAP32.buffer, imagePtr, length);
873
+
874
+ if (bytesPerPixel === 1) {
875
+ if (Uint8Array.from) {
876
+ image.pixelData = Uint8Array.from(src32);
877
+ } else {
878
+ image.pixelData = new Uint8Array(length);
879
+ for (let i = 0; i < length; i++) {
880
+ image.pixelData[i] = src32[i];
881
+ }
882
+ }
883
+ } else if (signed) {
884
+ if (Int16Array.from) {
885
+ image.pixelData = Int16Array.from(src32);
886
+ } else {
887
+ image.pixelData = new Int16Array(length);
888
+ for (let i = 0; i < length; i++) {
889
+ image.pixelData[i] = src32[i];
890
+ }
891
+ }
892
+ } else if (Uint16Array.from) {
893
+ image.pixelData = Uint16Array.from(src32);
894
+ } else {
895
+ image.pixelData = new Uint16Array(length);
896
+ for (let i = 0; i < length; i++) {
897
+ image.pixelData[i] = src32[i];
898
+ }
899
+ }
900
+
901
+ const t1 = new Date().getTime();
902
+
903
+ image.perf_timetodecode = t1 - t0;
904
+
905
+ // free
906
+ openJPEG._free(dataPtr);
907
+ openJPEG._free(imagePtrPtr);
908
+ openJPEG._free(imagePtr);
909
+ openJPEG._free(imageSizePtr);
910
+ openJPEG._free(imageSizeXPtr);
911
+ openJPEG._free(imageSizeYPtr);
912
+ openJPEG._free(imageSizeCompPtr);
913
+
914
+ return image;
915
+ },
916
+ convertRGBColorByPlane: function (pixelData)
917
+ {
918
+ if (pixelData .length % 3 !== 0)
919
+ throw new Error ("DICOM: convertRGBColorByPlane: RGB buffer length must be divisble by 3.");
920
+
921
+ var
922
+ numPixels = pixelData .length / 3,
923
+ rgbIndex = 0,
924
+ rIndex = 0,
925
+ gIndex = numPixels,
926
+ bIndex = numPixels * 2,
927
+ out = new (pixelData .constructor) (pixelData .length);
928
+
929
+ for (var i = 0; i < numPixels; ++ i)
930
+ {
931
+ out [rgbIndex ++] = pixelData [rIndex ++]; // red
932
+ out [rgbIndex ++] = pixelData [gIndex ++]; // green
933
+ out [rgbIndex ++] = pixelData [bIndex ++]; // blue
934
+ }
935
+
936
+ return out;
937
+ },
938
+ convertYBRFullByPixel: function (pixelData)
939
+ {
940
+ if (pixelData .length % 3 !== 0)
941
+ throw new Error ("DICOM: convertYBRFullByPixel: YBR buffer length must be divisble by 3.");
942
+
943
+ console .log (pixelData);
944
+
945
+ var
946
+ numPixels = pixelData .length / 3,
947
+ ybrIndex = 0,
948
+ rgbIndex = 0,
949
+ out = new (pixelData .constructor) (pixelData .length);
950
+
951
+ for (var i = 0; i < numPixels; ++ i)
952
+ {
953
+ var
954
+ y = pixelData [ybrIndex ++],
955
+ cb = pixelData [ybrIndex ++],
956
+ cr = pixelData [ybrIndex ++];
957
+
958
+ out [rgbIndex ++] = y + 1.40200 * (cr - 128); // red
959
+ out [rgbIndex ++] = y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green
960
+ out [rgbIndex ++] = y + 1.77200 * (cb - 128); // blue
961
+ }
962
+
963
+ return out;
964
+ },
965
+ convertYBRFullByPlane: function (pixelData)
966
+ {
967
+ if (pixelData .length % 3 !== 0)
968
+ throw new Error ("DICOM: convertYBRFullByPlane: YBR buffer length must be divisble by 3.");
969
+
970
+ var
971
+ numPixels = pixelData .length / 3,
972
+ rgbIndex = 0,
973
+ yIndex = 0,
974
+ cbIndex = numPixels,
975
+ crIndex = numPixels * 2,
976
+ out = new (pixelData .constructor) (pixelData .length);
977
+
978
+ for (var i = 0; i < numPixels; ++ i)
979
+ {
980
+ var
981
+ y = pixelData [yIndex ++],
982
+ cb = pixelData [cbIndex ++],
983
+ cr = pixelData [crIndex ++];
984
+
985
+ out [rgbIndex++] = y + 1.40200 * (cr - 128); // red
986
+ out [rgbIndex++] = y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green
987
+ out [rgbIndex++] = y + 1.77200 * (cb - 128); // blue
988
+ }
989
+
990
+ return out;
991
+ },
992
+ convertPaletteColor: function (pixelData)
993
+ {
994
+ function convertLUTto8Bit (lut, shift)
995
+ {
996
+ if (lut .cleaned)
997
+ return lut .cleaned;
998
+
999
+ const numEntries = lut .length;
1000
+ const cleanedLUT = new Uint8ClampedArray (numEntries);
1001
+
1002
+ for (let i = 0; i < numEntries; ++i)
1003
+ cleanedLUT [i] = lut [i] >> shift;
1004
+
1005
+ lut .cleaned = cleanedLUT;
1006
+
1007
+ return cleanedLUT;
1008
+ }
1009
+
1010
+ const LUT = this .getLUT ();
1011
+ const numPixels = this .dicom .width * this .dicom .height;
1012
+ const rData = LUT .redPaletteColorLookupTableData;
1013
+ const gData = LUT .greenPaletteColorLookupTableData;
1014
+ const bData = LUT .bluePaletteColorLookupTableData;
1015
+ const len = LUT .redPaletteColorLookupTableData .length;
1016
+
1017
+ let palIndex = 0;
1018
+ let rgbIndex = 0;
1019
+
1020
+ const start = LUT .redPaletteColorLookupTableDescriptor [1];
1021
+ const shift = LUT .redPaletteColorLookupTableDescriptor [2] === 8 ? 0 : 8;
1022
+
1023
+ const rDataCleaned = convertLUTto8Bit (rData, shift);
1024
+ const gDataCleaned = convertLUTto8Bit (gData, shift);
1025
+ const bDataCleaned = convertLUTto8Bit (bData, shift);
1026
+
1027
+ let out = new Uint8Array (pixelData .length * 3);
1028
+
1029
+ for (let i = 0; i < numPixels; ++ i)
1030
+ {
1031
+ let value = pixelData [palIndex++];
1032
+
1033
+ if (value < start)
1034
+ value = 0;
1035
+ else if (value > start + len - 1)
1036
+ value = len - 1;
1037
+ else
1038
+ value -= start;
1039
+
1040
+ out [rgbIndex++] = rDataCleaned [value];
1041
+ out [rgbIndex++] = gDataCleaned [value];
1042
+ out [rgbIndex++] = bDataCleaned [value];
1043
+ }
1044
+
1045
+ return out;
1046
+ },
1047
+ getLUT: function ()
1048
+ {
1049
+ if (this .LUT)
1050
+ return this .LUT;
1051
+
1052
+ this .LUT = { };
1053
+
1054
+ this .populatePaletteColorLut (this .dataSet, this .LUT);
1055
+
1056
+ return this .LUT;
1057
+ },
1058
+ populatePaletteColorLut: function (dataSet, imagePixelModule)
1059
+ {
1060
+ imagePixelModule .redPaletteColorLookupTableDescriptor = this .getLutDescriptor (dataSet, 'x00281101');
1061
+ imagePixelModule .greenPaletteColorLookupTableDescriptor = this .getLutDescriptor (dataSet, 'x00281102');
1062
+ imagePixelModule .bluePaletteColorLookupTableDescriptor = this .getLutDescriptor (dataSet, 'x00281103');
1063
+
1064
+ // The first Palette Color Lookup Table Descriptor value is the number of entries in the lookup table.
1065
+ // When the number of table entries is equal to 2ˆ16 then this value shall be 0.
1066
+ // See http://dicom.nema.org/MEDICAL/DICOM/current/output/chtml/part03/sect_C.7.6.3.html#sect_C.7.6.3.1.5
1067
+ if (imagePixelModule .redPaletteColorLookupTableDescriptor [0] === 0)
1068
+ {
1069
+ imagePixelModule .redPaletteColorLookupTableDescriptor [0] = 65536;
1070
+ imagePixelModule .greenPaletteColorLookupTableDescriptor [0] = 65536;
1071
+ imagePixelModule .bluePaletteColorLookupTableDescriptor [0] = 65536;
1072
+ }
1073
+
1074
+ // The third Palette Color Lookup Table Descriptor value specifies the number of bits for each entry in the Lookup Table Data.
1075
+ // It shall take the value of 8 or 16.
1076
+ // The LUT Data shall be stored in a format equivalent to 8 bits allocated when the number of bits for each entry is 8, and 16 bits allocated when the number of bits for each entry is 16, where in both cases the high bit is equal to bits allocated-1.
1077
+ // The third value shall be identical for each of the Red, Green and Blue Palette Color Lookup Table Descriptors.
1078
+ //
1079
+ // Note: Some implementations have encoded 8 bit entries with 16 bits allocated, padding the high bits;
1080
+ // this can be detected by comparing the number of entries specified in the LUT Descriptor with the actual value length of the LUT Data entry.
1081
+ // The value length in bytes should equal the number of entries if bits allocated is 8, and be twice as long if bits allocated is 16.
1082
+ const numLutEntries = imagePixelModule .redPaletteColorLookupTableDescriptor [0];
1083
+ const lutData = dataSet .elements .x00281201;
1084
+ const lutBitsAllocated = lutData .length === numLutEntries ? 8 : 16;
1085
+
1086
+ // If the descriptors do not appear to have the correct values, correct them
1087
+ if (imagePixelModule.redPaletteColorLookupTableDescriptor [2] !== lutBitsAllocated)
1088
+ {
1089
+ imagePixelModule .redPaletteColorLookupTableDescriptor [2] = lutBitsAllocated;
1090
+ imagePixelModule .greenPaletteColorLookupTableDescriptor [2] = lutBitsAllocated;
1091
+ imagePixelModule .bluePaletteColorLookupTableDescriptor [2] = lutBitsAllocated;
1092
+ }
1093
+
1094
+ imagePixelModule .redPaletteColorLookupTableData = this .getLutData (dataSet, 'x00281201', imagePixelModule .redPaletteColorLookupTableDescriptor);
1095
+ imagePixelModule .greenPaletteColorLookupTableData = this .getLutData (dataSet, 'x00281202', imagePixelModule .greenPaletteColorLookupTableDescriptor);
1096
+ imagePixelModule .bluePaletteColorLookupTableData = this .getLutData (dataSet, 'x00281203', imagePixelModule .bluePaletteColorLookupTableDescriptor);
1097
+ },
1098
+ getLutDescriptor: function (dataSet, tag)
1099
+ {
1100
+ if (! dataSet .elements [tag] || dataSet .elements [tag] .length !== 6)
1101
+ return;
1102
+
1103
+ return [dataSet .uint16 (tag, 0), dataSet .uint16 (tag, 1), dataSet .uint16 (tag, 2)];
1104
+ },
1105
+ getLutData: function (lutDataSet, tag, lutDescriptor)
1106
+ {
1107
+ const lut = [];
1108
+ const lutData = lutDataSet .elements [tag];
1109
+
1110
+ for (let i = 0; i < lutDescriptor [0]; ++ i)
1111
+ {
1112
+ // Output range is always unsigned
1113
+ if (lutDescriptor [2] === 16)
1114
+ lut [i] = lutDataSet .uint16 (tag, i);
1115
+ else
1116
+ lut [i] = lutDataSet .byteArray [i + lutData .dataOffset];
1117
+ }
1118
+
1119
+ return lut;
1120
+ },
1121
+ };
1122
+
1123
+ // ftp://medical.nema.org/medical/dicom/DataSets/WG04/
1124
+
1125
+ return DicomParser;
1126
1126
  });