ag-psd 30.2.0 → 31.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 (252) hide show
  1. package/.v8-cache/v24.13.1-x64-cf738c9d/01e5e61b +0 -0
  2. package/.v8-cache/v24.13.1-x64-cf738c9d/05135617 +0 -0
  3. package/.v8-cache/v24.13.1-x64-cf738c9d/06423db9 +0 -0
  4. package/.v8-cache/v24.13.1-x64-cf738c9d/06e765df +0 -0
  5. package/.v8-cache/v24.13.1-x64-cf738c9d/0930679d +0 -0
  6. package/.v8-cache/v24.13.1-x64-cf738c9d/09519a62 +0 -0
  7. package/.v8-cache/v24.13.1-x64-cf738c9d/0a6607b0 +0 -0
  8. package/.v8-cache/v24.13.1-x64-cf738c9d/0ad8fa6e +0 -0
  9. package/.v8-cache/v24.13.1-x64-cf738c9d/0d390e10 +0 -0
  10. package/.v8-cache/v24.13.1-x64-cf738c9d/0dfa7b16 +0 -0
  11. package/.v8-cache/v24.13.1-x64-cf738c9d/0e9e09db +0 -0
  12. package/.v8-cache/v24.13.1-x64-cf738c9d/1130885f +0 -0
  13. package/.v8-cache/v24.13.1-x64-cf738c9d/1222cb8c +0 -0
  14. package/.v8-cache/v24.13.1-x64-cf738c9d/15e2c039 +0 -0
  15. package/.v8-cache/v24.13.1-x64-cf738c9d/1a2d469d +0 -0
  16. package/.v8-cache/v24.13.1-x64-cf738c9d/1b300c82 +0 -0
  17. package/.v8-cache/v24.13.1-x64-cf738c9d/1bc3d370 +0 -0
  18. package/.v8-cache/v24.13.1-x64-cf738c9d/1e44e5af +0 -0
  19. package/.v8-cache/v24.13.1-x64-cf738c9d/1efa10a1 +0 -0
  20. package/.v8-cache/v24.13.1-x64-cf738c9d/1f6c8743 +0 -0
  21. package/.v8-cache/v24.13.1-x64-cf738c9d/20b27e40 +0 -0
  22. package/.v8-cache/v24.13.1-x64-cf738c9d/257c62ba +0 -0
  23. package/.v8-cache/v24.13.1-x64-cf738c9d/25d60154 +0 -0
  24. package/.v8-cache/v24.13.1-x64-cf738c9d/26f822f3 +0 -0
  25. package/.v8-cache/v24.13.1-x64-cf738c9d/2a1e2a8d +0 -0
  26. package/.v8-cache/v24.13.1-x64-cf738c9d/2b02fded +0 -0
  27. package/.v8-cache/v24.13.1-x64-cf738c9d/2c76dc0d +0 -0
  28. package/.v8-cache/v24.13.1-x64-cf738c9d/2deb286a +0 -0
  29. package/.v8-cache/v24.13.1-x64-cf738c9d/32018e44 +0 -0
  30. package/.v8-cache/v24.13.1-x64-cf738c9d/341402c3 +0 -0
  31. package/.v8-cache/v24.13.1-x64-cf738c9d/34e0fa2e +0 -0
  32. package/.v8-cache/v24.13.1-x64-cf738c9d/3bbf643e +0 -0
  33. package/.v8-cache/v24.13.1-x64-cf738c9d/3ceff89e +0 -0
  34. package/.v8-cache/v24.13.1-x64-cf738c9d/404f5cdc +0 -0
  35. package/.v8-cache/v24.13.1-x64-cf738c9d/4087aa2b +0 -0
  36. package/.v8-cache/v24.13.1-x64-cf738c9d/4376c1f9 +0 -0
  37. package/.v8-cache/v24.13.1-x64-cf738c9d/44903df4 +0 -0
  38. package/.v8-cache/v24.13.1-x64-cf738c9d/44d58dc8 +0 -0
  39. package/.v8-cache/v24.13.1-x64-cf738c9d/4511bacf +0 -0
  40. package/.v8-cache/v24.13.1-x64-cf738c9d/47da0ce8 +0 -0
  41. package/.v8-cache/v24.13.1-x64-cf738c9d/48cd54a9 +0 -0
  42. package/.v8-cache/v24.13.1-x64-cf738c9d/4d938476 +0 -0
  43. package/.v8-cache/v24.13.1-x64-cf738c9d/4ec6d390 +0 -0
  44. package/.v8-cache/v24.13.1-x64-cf738c9d/4f5702bd +0 -0
  45. package/.v8-cache/v24.13.1-x64-cf738c9d/514cc428 +0 -0
  46. package/.v8-cache/v24.13.1-x64-cf738c9d/557d3b42 +0 -0
  47. package/.v8-cache/v24.13.1-x64-cf738c9d/56abbff7 +0 -0
  48. package/.v8-cache/v24.13.1-x64-cf738c9d/57b540ee +0 -0
  49. package/.v8-cache/v24.13.1-x64-cf738c9d/5e20c081 +0 -0
  50. package/.v8-cache/v24.13.1-x64-cf738c9d/651c4ada +0 -0
  51. package/.v8-cache/v24.13.1-x64-cf738c9d/652a0d59 +0 -0
  52. package/.v8-cache/v24.13.1-x64-cf738c9d/6a0e89ee +0 -0
  53. package/.v8-cache/v24.13.1-x64-cf738c9d/6af33b91 +0 -0
  54. package/.v8-cache/v24.13.1-x64-cf738c9d/6c2562d2 +0 -0
  55. package/.v8-cache/v24.13.1-x64-cf738c9d/6dae0cfa +0 -0
  56. package/.v8-cache/v24.13.1-x64-cf738c9d/6e2529ce +0 -0
  57. package/.v8-cache/v24.13.1-x64-cf738c9d/71df9cb3 +0 -0
  58. package/.v8-cache/v24.13.1-x64-cf738c9d/72e1d543 +0 -0
  59. package/.v8-cache/v24.13.1-x64-cf738c9d/75519c80 +0 -0
  60. package/.v8-cache/v24.13.1-x64-cf738c9d/79bf115c +0 -0
  61. package/.v8-cache/v24.13.1-x64-cf738c9d/7a39347c +0 -0
  62. package/.v8-cache/v24.13.1-x64-cf738c9d/7b83e3d3 +0 -0
  63. package/.v8-cache/v24.13.1-x64-cf738c9d/7cd71bc5 +0 -0
  64. package/.v8-cache/v24.13.1-x64-cf738c9d/7da78512 +0 -0
  65. package/.v8-cache/v24.13.1-x64-cf738c9d/7ea06cea +0 -0
  66. package/.v8-cache/v24.13.1-x64-cf738c9d/82c3b573 +0 -0
  67. package/.v8-cache/v24.13.1-x64-cf738c9d/84c186e4 +0 -0
  68. package/.v8-cache/v24.13.1-x64-cf738c9d/8607bd36 +0 -0
  69. package/.v8-cache/v24.13.1-x64-cf738c9d/87372817 +0 -0
  70. package/.v8-cache/v24.13.1-x64-cf738c9d/87cf2209 +0 -0
  71. package/.v8-cache/v24.13.1-x64-cf738c9d/882aaa05 +0 -0
  72. package/.v8-cache/v24.13.1-x64-cf738c9d/8a4d3de8 +0 -0
  73. package/.v8-cache/v24.13.1-x64-cf738c9d/8e223473 +0 -0
  74. package/.v8-cache/v24.13.1-x64-cf738c9d/92b7aefd +0 -0
  75. package/.v8-cache/v24.13.1-x64-cf738c9d/932f0770 +0 -0
  76. package/.v8-cache/v24.13.1-x64-cf738c9d/937c03a1 +0 -0
  77. package/.v8-cache/v24.13.1-x64-cf738c9d/991e4758 +0 -0
  78. package/.v8-cache/v24.13.1-x64-cf738c9d/9af658fb +0 -0
  79. package/.v8-cache/v24.13.1-x64-cf738c9d/9ed80ba5 +0 -0
  80. package/.v8-cache/v24.13.1-x64-cf738c9d/9f0dc993 +0 -0
  81. package/.v8-cache/v24.13.1-x64-cf738c9d/a19c0c4f +0 -0
  82. package/.v8-cache/v24.13.1-x64-cf738c9d/a6409d95 +0 -0
  83. package/.v8-cache/v24.13.1-x64-cf738c9d/a7e80865 +0 -0
  84. package/.v8-cache/v24.13.1-x64-cf738c9d/ac9802c6 +0 -0
  85. package/.v8-cache/v24.13.1-x64-cf738c9d/acc36e66 +0 -0
  86. package/.v8-cache/v24.13.1-x64-cf738c9d/ad11e2dc +0 -0
  87. package/.v8-cache/v24.13.1-x64-cf738c9d/b0c8fcd8 +0 -0
  88. package/.v8-cache/v24.13.1-x64-cf738c9d/b1762958 +0 -0
  89. package/.v8-cache/v24.13.1-x64-cf738c9d/b3c2fab7 +0 -0
  90. package/.v8-cache/v24.13.1-x64-cf738c9d/b5b3329b +0 -0
  91. package/.v8-cache/v24.13.1-x64-cf738c9d/b806679e +0 -0
  92. package/.v8-cache/v24.13.1-x64-cf738c9d/bc1cdd48 +0 -0
  93. package/.v8-cache/v24.13.1-x64-cf738c9d/bc7ebd1d +0 -0
  94. package/.v8-cache/v24.13.1-x64-cf738c9d/c0b789d2 +0 -0
  95. package/.v8-cache/v24.13.1-x64-cf738c9d/c314aece +0 -0
  96. package/.v8-cache/v24.13.1-x64-cf738c9d/c399a5dc +0 -0
  97. package/.v8-cache/v24.13.1-x64-cf738c9d/c681cbc8 +0 -0
  98. package/.v8-cache/v24.13.1-x64-cf738c9d/c6834ffc +0 -0
  99. package/.v8-cache/v24.13.1-x64-cf738c9d/c6f12ed5 +0 -0
  100. package/.v8-cache/v24.13.1-x64-cf738c9d/cb0f0a3d +0 -0
  101. package/.v8-cache/v24.13.1-x64-cf738c9d/cbcb7c95 +0 -0
  102. package/.v8-cache/v24.13.1-x64-cf738c9d/cdd9107c +0 -0
  103. package/.v8-cache/v24.13.1-x64-cf738c9d/cdf2c4a3 +0 -0
  104. package/.v8-cache/v24.13.1-x64-cf738c9d/cfc49f4f +0 -0
  105. package/.v8-cache/v24.13.1-x64-cf738c9d/cff9434a +0 -0
  106. package/.v8-cache/v24.13.1-x64-cf738c9d/d02dd6f7 +0 -0
  107. package/.v8-cache/v24.13.1-x64-cf738c9d/d0507bf3 +0 -0
  108. package/.v8-cache/v24.13.1-x64-cf738c9d/d60fce19 +0 -0
  109. package/.v8-cache/v24.13.1-x64-cf738c9d/d733d619 +0 -0
  110. package/.v8-cache/v24.13.1-x64-cf738c9d/d75b7803 +0 -0
  111. package/.v8-cache/v24.13.1-x64-cf738c9d/dc86f000 +0 -0
  112. package/.v8-cache/v24.13.1-x64-cf738c9d/defa4f7f +0 -0
  113. package/.v8-cache/v24.13.1-x64-cf738c9d/e03e2acd +0 -0
  114. package/.v8-cache/v24.13.1-x64-cf738c9d/e0e3f52c +0 -0
  115. package/.v8-cache/v24.13.1-x64-cf738c9d/e158d332 +0 -0
  116. package/.v8-cache/v24.13.1-x64-cf738c9d/e6735171 +0 -0
  117. package/.v8-cache/v24.13.1-x64-cf738c9d/e6745c2b +0 -0
  118. package/.v8-cache/v24.13.1-x64-cf738c9d/e6b99945 +0 -0
  119. package/.v8-cache/v24.13.1-x64-cf738c9d/e6d8ceb8 +0 -0
  120. package/.v8-cache/v24.13.1-x64-cf738c9d/e7ffec37 +0 -0
  121. package/.v8-cache/v24.13.1-x64-cf738c9d/ea33b6de +0 -0
  122. package/.v8-cache/v24.13.1-x64-cf738c9d/eaafa3c4 +0 -0
  123. package/.v8-cache/v24.13.1-x64-cf738c9d/ebb50fca +0 -0
  124. package/.v8-cache/v24.13.1-x64-cf738c9d/ec805f2e +0 -0
  125. package/.v8-cache/v24.13.1-x64-cf738c9d/edaef8f1 +0 -0
  126. package/.v8-cache/v24.13.1-x64-cf738c9d/ee4401c8 +0 -0
  127. package/.v8-cache/v24.13.1-x64-cf738c9d/eeeebdfe +0 -0
  128. package/.v8-cache/v24.13.1-x64-cf738c9d/f3d51676 +0 -0
  129. package/.v8-cache/v24.13.1-x64-cf738c9d/f7b50a75 +0 -0
  130. package/.v8-cache/v24.13.1-x64-cf738c9d/fa58ca72 +0 -0
  131. package/.v8-cache/v24.13.1-x64-cf738c9d/fc97d72d +0 -0
  132. package/.v8-cache/v24.13.1-x64-cf738c9d/fd0a2987 +0 -0
  133. package/CHANGELOG.md +6 -0
  134. package/README.md +64 -0
  135. package/TODO.md +2 -0
  136. package/dist/abr.d.ts +196 -196
  137. package/dist/abr.js +364 -365
  138. package/dist/abr.js.map +1 -1
  139. package/dist/additionalInfo.d.ts +26 -26
  140. package/dist/additionalInfo.js +3478 -3478
  141. package/dist/additionalInfo.js.map +1 -1
  142. package/dist/ase.d.ts +32 -32
  143. package/dist/ase.js +81 -82
  144. package/dist/ase.js.map +1 -1
  145. package/dist/bundle.js +12380 -12259
  146. package/dist/csh.d.ts +10 -10
  147. package/dist/csh.js +35 -36
  148. package/dist/csh.js.map +1 -1
  149. package/dist/descriptor.d.ts +601 -601
  150. package/dist/descriptor.js +2003 -2003
  151. package/dist/descriptor.js.map +1 -1
  152. package/dist/effectsHelpers.d.ts +5 -5
  153. package/dist/effectsHelpers.js +286 -287
  154. package/dist/effectsHelpers.js.map +1 -1
  155. package/dist/engineData.d.ts +2 -2
  156. package/dist/engineData.js +334 -335
  157. package/dist/engineData.js.map +1 -1
  158. package/dist/engineData2.d.ts +2 -2
  159. package/dist/engineData2.js +409 -410
  160. package/dist/engineData2.js.map +1 -1
  161. package/dist/helpers.d.ts +74 -74
  162. package/dist/helpers.js +353 -342
  163. package/dist/helpers.js.map +1 -1
  164. package/dist/imageResources.d.ts +17 -17
  165. package/dist/imageResources.js +1040 -1040
  166. package/dist/imageResources.js.map +1 -1
  167. package/dist/index.d.ts +20 -22
  168. package/dist/index.js +61 -56
  169. package/dist/index.js.map +1 -1
  170. package/dist/initializeCanvas.d.ts +1 -1
  171. package/dist/initializeCanvas.js +9 -10
  172. package/dist/initializeCanvas.js.map +1 -1
  173. package/dist/jpeg.d.ts +1 -1
  174. package/dist/jpeg.js +1020 -1021
  175. package/dist/jpeg.js.map +1 -1
  176. package/dist/psd.d.ts +1877 -1873
  177. package/dist/psd.js +45 -45
  178. package/dist/psd.js.map +1 -1
  179. package/dist/psdReader.d.ts +52 -45
  180. package/dist/psdReader.js +1385 -1282
  181. package/dist/psdReader.js.map +1 -1
  182. package/dist/psdWriter.d.ts +34 -34
  183. package/dist/psdWriter.js +834 -824
  184. package/dist/psdWriter.js.map +1 -1
  185. package/dist/text.d.ts +179 -179
  186. package/dist/text.js +552 -553
  187. package/dist/text.js.map +1 -1
  188. package/dist/utf8.d.ts +4 -6
  189. package/dist/utf8.js +156 -157
  190. package/dist/utf8.js.map +1 -1
  191. package/dist-es/abr.d.ts +196 -196
  192. package/dist-es/abr.js +364 -361
  193. package/dist-es/abr.js.map +1 -1
  194. package/dist-es/additionalInfo.d.ts +26 -26
  195. package/dist-es/additionalInfo.js +3478 -3472
  196. package/dist-es/additionalInfo.js.map +1 -1
  197. package/dist-es/ase.d.ts +32 -32
  198. package/dist-es/ase.js +81 -78
  199. package/dist-es/ase.js.map +1 -1
  200. package/dist-es/csh.d.ts +10 -10
  201. package/dist-es/csh.js +35 -32
  202. package/dist-es/csh.js.map +1 -1
  203. package/dist-es/descriptor.d.ts +601 -601
  204. package/dist-es/descriptor.js +2003 -1970
  205. package/dist-es/descriptor.js.map +1 -1
  206. package/dist-es/effectsHelpers.d.ts +5 -5
  207. package/dist-es/effectsHelpers.js +286 -282
  208. package/dist-es/effectsHelpers.js.map +1 -1
  209. package/dist-es/engineData.d.ts +2 -2
  210. package/dist-es/engineData.js +334 -330
  211. package/dist-es/engineData.js.map +1 -1
  212. package/dist-es/engineData2.d.ts +2 -2
  213. package/dist-es/engineData2.js +409 -406
  214. package/dist-es/engineData2.js.map +1 -1
  215. package/dist-es/helpers.d.ts +74 -74
  216. package/dist-es/helpers.js +353 -324
  217. package/dist-es/helpers.js.map +1 -1
  218. package/dist-es/imageResources.d.ts +17 -17
  219. package/dist-es/imageResources.js +1040 -1037
  220. package/dist-es/imageResources.js.map +1 -1
  221. package/dist-es/index.d.ts +20 -22
  222. package/dist-es/index.js +61 -33
  223. package/dist-es/index.js.map +1 -1
  224. package/dist-es/initializeCanvas.d.ts +1 -1
  225. package/dist-es/initializeCanvas.js +9 -6
  226. package/dist-es/initializeCanvas.js.map +1 -1
  227. package/dist-es/jpeg.d.ts +1 -1
  228. package/dist-es/jpeg.js +1020 -1017
  229. package/dist-es/jpeg.js.map +1 -1
  230. package/dist-es/psd.d.ts +1877 -1873
  231. package/dist-es/psd.js +45 -42
  232. package/dist-es/psd.js.map +1 -1
  233. package/dist-es/psdReader.d.ts +52 -45
  234. package/dist-es/psdReader.js +1385 -1244
  235. package/dist-es/psdReader.js.map +1 -1
  236. package/dist-es/psdWriter.d.ts +34 -34
  237. package/dist-es/psdWriter.js +834 -794
  238. package/dist-es/psdWriter.js.map +1 -1
  239. package/dist-es/text.d.ts +179 -179
  240. package/dist-es/text.js +552 -548
  241. package/dist-es/text.js.map +1 -1
  242. package/dist-es/utf8.d.ts +4 -6
  243. package/dist-es/utf8.js +156 -150
  244. package/dist-es/utf8.js.map +1 -1
  245. package/package.json +4 -3
  246. package/src/helpers.ts +13 -3
  247. package/src/index.ts +4 -6
  248. package/src/psd.ts +4 -0
  249. package/src/psdReader.ts +136 -43
  250. package/src/psdWriter.ts +42 -23
  251. package/tsconfig-es6.json +2 -1
  252. package/tsconfig.json +1 -0
@@ -1,1038 +1,1041 @@
1
- import { toByteArray } from 'base64-js';
2
- import { readUnicodeString, readUint32, readUint16, readUint8, readFloat64, readBytes, skipBytes, readFloat32, readInt16, readFixedPoint32, readSignature, checkSignature, readSection, readColor, readInt32, readAsciiString } from './psdReader';
3
- import { writeUnicodeString, writeUint32, writeUint8, writeFloat64, writeUint16, writeBytes, writeInt16, writeFloat32, writeFixedPoint32, writeUnicodeStringWithPadding, writeColor, writeSignature, writeSection, writeInt32, writeAsciiString, } from './psdWriter';
4
- import { createCanvasFromData, createEnum, MOCK_HANDLERS } from './helpers';
5
- import { decodeString, encodeString } from './utf8';
6
- import { ESliceBGColorType, ESliceHorzAlign, ESliceOrigin, ESliceType, ESliceVertAlign, frac, parseTrackList, readVersionAndDescriptor, serializeTrackList, writeVersionAndDescriptor } from './descriptor';
7
- export const resourceHandlers = [];
8
- export const resourceHandlersMap = {};
9
- function addHandler(key, has, read, write) {
10
- const handler = { key, has, read, write };
11
- resourceHandlers.push(handler);
12
- resourceHandlersMap[handler.key] = handler;
13
- }
14
- const LOG_MOCK_HANDLERS = false;
15
- const RESOLUTION_UNITS = [undefined, 'PPI', 'PPCM'];
16
- const MEASUREMENT_UNITS = [undefined, 'Inches', 'Centimeters', 'Points', 'Picas', 'Columns'];
17
- const hex = '0123456789abcdef';
18
- function charToNibble(code) {
19
- return code <= 57 ? code - 48 : code - 87;
20
- }
21
- function byteAt(value, index) {
22
- return (charToNibble(value.charCodeAt(index)) << 4) | charToNibble(value.charCodeAt(index + 1));
23
- }
24
- function readUtf8String(reader, length) {
25
- const buffer = readBytes(reader, length);
26
- return decodeString(buffer);
27
- }
28
- function writeUtf8String(writer, value) {
29
- const buffer = encodeString(value);
30
- writeBytes(writer, buffer);
31
- }
32
- function readEncodedString(reader) {
33
- const length = readUint8(reader);
34
- const buffer = readBytes(reader, length);
35
- let notAscii = false;
36
- for (let i = 0; i < buffer.byteLength; i++) {
37
- if (buffer[i] & 0x80) {
38
- notAscii = true;
39
- break;
40
- }
41
- }
42
- if (notAscii) {
43
- const decoder = new TextDecoder('gbk');
44
- return decoder.decode(buffer);
45
- }
46
- else {
47
- return decodeString(buffer);
48
- }
49
- }
50
- function writeEncodedString(writer, value) {
51
- let ascii = '';
52
- for (let i = 0, code = value.codePointAt(i++); code !== undefined; code = value.codePointAt(i++)) {
53
- ascii += code > 0x7f ? '?' : String.fromCodePoint(code);
54
- }
55
- const buffer = encodeString(ascii);
56
- writeUint8(writer, buffer.byteLength);
57
- writeBytes(writer, buffer);
58
- }
59
- MOCK_HANDLERS && addHandler(1028, // IPTC-NAA record
60
- // IPTC-NAA record
61
- target => target._ir1028 !== undefined, (reader, target, left) => {
62
- LOG_MOCK_HANDLERS && console.log('image resource 1028', left());
63
- target._ir1028 = readBytes(reader, left());
64
- }, (writer, target) => {
65
- writeBytes(writer, target._ir1028);
66
- });
67
- addHandler(1061, target => target.captionDigest !== undefined, (reader, target) => {
68
- let captionDigest = '';
69
- for (let i = 0; i < 16; i++) {
70
- const byte = readUint8(reader);
71
- captionDigest += hex[byte >> 4];
72
- captionDigest += hex[byte & 0xf];
73
- }
74
- target.captionDigest = captionDigest;
75
- }, (writer, target) => {
76
- for (let i = 0; i < 16; i++) {
77
- writeUint8(writer, byteAt(target.captionDigest, i * 2));
78
- }
79
- });
80
- addHandler(1060, target => target.xmpMetadata !== undefined, (reader, target, left) => {
81
- target.xmpMetadata = readUtf8String(reader, left());
82
- }, (writer, target) => {
83
- writeUtf8String(writer, target.xmpMetadata);
84
- });
85
- const Inte = createEnum('Inte', 'perceptual', {
86
- 'perceptual': 'Img ',
87
- 'saturation': 'Grp ',
88
- 'relative colorimetric': 'Clrm',
89
- 'absolute colorimetric': 'AClr',
90
- });
91
- MOCK_HANDLERS && addHandler(1085, // Windows DEVMODE. Variable OS specific info for Windows.
92
- // Windows DEVMODE. Variable OS specific info for Windows.
93
- target => target._ir1085 !== undefined, (reader, target, left) => {
94
- target._ir1085 = readBytes(reader, left());
95
- }, (writer, target) => {
96
- writeBytes(writer, target._ir1085);
97
- });
98
- addHandler(1082, target => target.printInformation !== undefined, (reader, target) => {
99
- var _a, _b;
100
- const desc = readVersionAndDescriptor(reader);
101
- target.printInformation = {
102
- printerName: desc.printerName || '',
103
- renderingIntent: Inte.decode((_a = desc.Inte) !== null && _a !== void 0 ? _a : 'Inte.Img '),
104
- };
105
- const info = target.printInformation;
106
- if (desc.PstS !== undefined)
107
- info.printerManagesColors = desc.PstS;
108
- if (desc['Nm '] !== undefined)
109
- info.printerProfile = desc['Nm '];
110
- if (desc.MpBl !== undefined)
111
- info.blackPointCompensation = desc.MpBl;
112
- if (desc.printSixteenBit !== undefined)
113
- info.printSixteenBit = desc.printSixteenBit;
114
- if (desc.hardProof !== undefined)
115
- info.hardProof = desc.hardProof;
116
- if (desc.printProofSetup) {
117
- if ('Bltn' in desc.printProofSetup) {
118
- info.proofSetup = { builtin: desc.printProofSetup.Bltn.split('.')[1] };
119
- }
120
- else {
121
- info.proofSetup = {
122
- profile: desc.printProofSetup.profile,
123
- renderingIntent: Inte.decode((_b = desc.printProofSetup.Inte) !== null && _b !== void 0 ? _b : 'Inte.Img '),
124
- blackPointCompensation: !!desc.printProofSetup.MpBl,
125
- paperWhite: !!desc.printProofSetup.paperWhite,
126
- };
127
- }
128
- }
129
- }, (writer, target) => {
130
- var _a, _b;
131
- const info = target.printInformation;
132
- const desc = {};
133
- if (info.printerManagesColors) {
134
- desc.PstS = true;
135
- }
136
- else {
137
- if (info.hardProof !== undefined)
138
- desc.hardProof = !!info.hardProof;
139
- desc.ClrS = 'ClrS.RGBC'; // TODO: ???
140
- desc['Nm '] = (_a = info.printerProfile) !== null && _a !== void 0 ? _a : 'CIE RGB';
141
- }
142
- desc.Inte = Inte.encode(info.renderingIntent);
143
- if (!info.printerManagesColors)
144
- desc.MpBl = !!info.blackPointCompensation;
145
- desc.printSixteenBit = !!info.printSixteenBit;
146
- desc.printerName = info.printerName || '';
147
- if (info.proofSetup && 'profile' in info.proofSetup) {
148
- desc.printProofSetup = {
149
- profile: info.proofSetup.profile || '',
150
- Inte: Inte.encode(info.proofSetup.renderingIntent),
151
- MpBl: !!info.proofSetup.blackPointCompensation,
152
- paperWhite: !!info.proofSetup.paperWhite,
153
- };
154
- }
155
- else {
156
- desc.printProofSetup = {
157
- Bltn: ((_b = info.proofSetup) === null || _b === void 0 ? void 0 : _b.builtin) ? `builtinProof.${info.proofSetup.builtin}` : 'builtinProof.proofCMYK',
158
- };
159
- }
160
- writeVersionAndDescriptor(writer, '', 'printOutput', desc);
161
- });
162
- MOCK_HANDLERS && addHandler(1083, // Print style
163
- // Print style
164
- target => target._ir1083 !== undefined, (reader, target, left) => {
165
- LOG_MOCK_HANDLERS && console.log('image resource 1083', left());
166
- target._ir1083 = readBytes(reader, left());
167
- // TODO:
168
- // const desc = readVersionAndDescriptor(reader);
169
- // console.log('1083', require('util').inspect(desc, false, 99, true));
170
- }, (writer, target) => {
171
- writeBytes(writer, target._ir1083);
172
- });
173
- addHandler(1005, target => target.resolutionInfo !== undefined, (reader, target) => {
174
- const horizontalResolution = readFixedPoint32(reader);
175
- const horizontalResolutionUnit = readUint16(reader);
176
- const widthUnit = readUint16(reader);
177
- const verticalResolution = readFixedPoint32(reader);
178
- const verticalResolutionUnit = readUint16(reader);
179
- const heightUnit = readUint16(reader);
180
- target.resolutionInfo = {
181
- horizontalResolution,
182
- horizontalResolutionUnit: RESOLUTION_UNITS[horizontalResolutionUnit] || 'PPI',
183
- widthUnit: MEASUREMENT_UNITS[widthUnit] || 'Inches',
184
- verticalResolution,
185
- verticalResolutionUnit: RESOLUTION_UNITS[verticalResolutionUnit] || 'PPI',
186
- heightUnit: MEASUREMENT_UNITS[heightUnit] || 'Inches',
187
- };
188
- }, (writer, target) => {
189
- const info = target.resolutionInfo;
190
- writeFixedPoint32(writer, info.horizontalResolution || 0);
191
- writeUint16(writer, Math.max(1, RESOLUTION_UNITS.indexOf(info.horizontalResolutionUnit)));
192
- writeUint16(writer, Math.max(1, MEASUREMENT_UNITS.indexOf(info.widthUnit)));
193
- writeFixedPoint32(writer, info.verticalResolution || 0);
194
- writeUint16(writer, Math.max(1, RESOLUTION_UNITS.indexOf(info.verticalResolutionUnit)));
195
- writeUint16(writer, Math.max(1, MEASUREMENT_UNITS.indexOf(info.heightUnit)));
196
- });
197
- const printScaleStyles = ['centered', 'size to fit', 'user defined'];
198
- addHandler(1062, target => target.printScale !== undefined, (reader, target) => {
199
- target.printScale = {
200
- style: printScaleStyles[readInt16(reader)],
201
- x: readFloat32(reader),
202
- y: readFloat32(reader),
203
- scale: readFloat32(reader),
204
- };
205
- }, (writer, target) => {
206
- const { style, x, y, scale } = target.printScale;
207
- writeInt16(writer, Math.max(0, printScaleStyles.indexOf(style)));
208
- writeFloat32(writer, x || 0);
209
- writeFloat32(writer, y || 0);
210
- writeFloat32(writer, scale || 0);
211
- });
212
- addHandler(1006, target => target.alphaChannelNames !== undefined, (reader, target, left) => {
213
- if (!target.alphaChannelNames) { // skip if the unicode versions are already read
214
- target.alphaChannelNames = [];
215
- while (left() > 0) {
216
- const value = readEncodedString(reader);
217
- // const value = readPascalString(reader, 1);
218
- target.alphaChannelNames.push(value);
219
- }
220
- }
221
- else {
222
- skipBytes(reader, left());
223
- }
224
- }, (writer, target) => {
225
- for (const name of target.alphaChannelNames) {
226
- writeEncodedString(writer, name);
227
- // writePascalString(writer, name, 1);
228
- }
229
- });
230
- addHandler(1045, target => target.alphaChannelNames !== undefined, (reader, target, left) => {
231
- target.alphaChannelNames = [];
232
- while (left() > 0) {
233
- target.alphaChannelNames.push(readUnicodeString(reader));
234
- }
235
- }, (writer, target) => {
236
- for (const name of target.alphaChannelNames) {
237
- writeUnicodeStringWithPadding(writer, name);
238
- }
239
- });
240
- MOCK_HANDLERS && addHandler(1077, target => target._ir1077 !== undefined, (reader, target, left) => {
241
- LOG_MOCK_HANDLERS && console.log('image resource 1077', left());
242
- target._ir1077 = readBytes(reader, left());
243
- }, (writer, target) => {
244
- writeBytes(writer, target._ir1077);
245
- });
246
- addHandler(1053, target => target.alphaIdentifiers !== undefined, (reader, target, left) => {
247
- target.alphaIdentifiers = [];
248
- while (left() >= 4) {
249
- target.alphaIdentifiers.push(readUint32(reader));
250
- }
251
- }, (writer, target) => {
252
- for (const id of target.alphaIdentifiers) {
253
- writeUint32(writer, id);
254
- }
255
- });
256
- addHandler(1010, target => target.backgroundColor !== undefined, (reader, target) => target.backgroundColor = readColor(reader), (writer, target) => writeColor(writer, target.backgroundColor));
257
- addHandler(1037, target => target.globalAngle !== undefined, (reader, target) => target.globalAngle = readInt32(reader), (writer, target) => writeInt32(writer, target.globalAngle));
258
- addHandler(1049, target => target.globalAltitude !== undefined, (reader, target) => target.globalAltitude = readUint32(reader), (writer, target) => writeUint32(writer, target.globalAltitude));
259
- addHandler(1011, target => target.printFlags !== undefined, (reader, target) => {
260
- target.printFlags = {
261
- labels: !!readUint8(reader),
262
- cropMarks: !!readUint8(reader),
263
- colorBars: !!readUint8(reader),
264
- registrationMarks: !!readUint8(reader),
265
- negative: !!readUint8(reader),
266
- flip: !!readUint8(reader),
267
- interpolate: !!readUint8(reader),
268
- caption: !!readUint8(reader),
269
- printFlags: !!readUint8(reader),
270
- };
271
- }, (writer, target) => {
272
- const flags = target.printFlags;
273
- writeUint8(writer, flags.labels ? 1 : 0);
274
- writeUint8(writer, flags.cropMarks ? 1 : 0);
275
- writeUint8(writer, flags.colorBars ? 1 : 0);
276
- writeUint8(writer, flags.registrationMarks ? 1 : 0);
277
- writeUint8(writer, flags.negative ? 1 : 0);
278
- writeUint8(writer, flags.flip ? 1 : 0);
279
- writeUint8(writer, flags.interpolate ? 1 : 0);
280
- writeUint8(writer, flags.caption ? 1 : 0);
281
- writeUint8(writer, flags.printFlags ? 1 : 0);
282
- });
283
- addHandler(1034, // Copyright flag
284
- // Copyright flag
285
- target => target.copyrighted !== undefined, (reader, target) => {
286
- target.copyrighted = !!readUint8(reader);
287
- }, (writer, target) => {
288
- writeUint8(writer, target.copyrighted ? 1 : 0);
289
- });
290
- addHandler(1035, // URL
291
- // URL
292
- target => target.url !== undefined, (reader, target, left) => {
293
- target.url = readAsciiString(reader, left());
294
- }, (writer, target) => {
295
- writeAsciiString(writer, target.url);
296
- });
297
- MOCK_HANDLERS && addHandler(10000, // Print flags
298
- // Print flags
299
- target => target._ir10000 !== undefined, (reader, target, left) => {
300
- LOG_MOCK_HANDLERS && console.log('image resource 10000', left());
301
- target._ir10000 = readBytes(reader, left());
302
- }, (writer, target) => {
303
- writeBytes(writer, target._ir10000);
304
- });
305
- MOCK_HANDLERS && addHandler(1013, // Color halftoning
306
- // Color halftoning
307
- target => target._ir1013 !== undefined, (reader, target, left) => {
308
- LOG_MOCK_HANDLERS && console.log('image resource 1013', left());
309
- target._ir1013 = readBytes(reader, left());
310
- }, (writer, target) => {
311
- writeBytes(writer, target._ir1013);
312
- });
313
- MOCK_HANDLERS && addHandler(1016, // Color transfer functions
314
- // Color transfer functions
315
- target => target._ir1016 !== undefined, (reader, target, left) => {
316
- LOG_MOCK_HANDLERS && console.log('image resource 1016', left());
317
- target._ir1016 = readBytes(reader, left());
318
- }, (writer, target) => {
319
- writeBytes(writer, target._ir1016);
320
- });
321
- addHandler(1080, // Count Information
322
- // Count Information
323
- target => target.countInformation !== undefined, (reader, target) => {
324
- const desc = readVersionAndDescriptor(reader);
325
- target.countInformation = desc.countGroupList.map(g => ({
326
- color: { r: g['Rd '], g: g['Grn '], b: g['Bl '] },
327
- name: g['Nm '],
328
- size: g['Rds '],
329
- fontSize: g.fontSize,
330
- visible: g.Vsbl,
331
- points: g.countObjectList.map(p => ({ x: p['X '], y: p['Y '] })),
332
- }));
333
- }, (writer, target) => {
334
- const desc = {
335
- Vrsn: 1,
336
- countGroupList: target.countInformation.map(g => ({
337
- 'Rd ': g.color.r,
338
- 'Grn ': g.color.g,
339
- 'Bl ': g.color.b,
340
- 'Nm ': g.name,
341
- 'Rds ': g.size,
342
- fontSize: g.fontSize,
343
- Vsbl: g.visible,
344
- countObjectList: g.points.map(p => ({ 'X ': p.x, 'Y ': p.y })),
345
- })),
346
- };
347
- writeVersionAndDescriptor(writer, '', 'Cnt ', desc);
348
- });
349
- addHandler(1024, target => target.layerState !== undefined, (reader, target) => target.layerState = readUint16(reader), (writer, target) => writeUint16(writer, target.layerState));
350
- addHandler(1026, target => target.layersGroup !== undefined, (reader, target, left) => {
351
- target.layersGroup = [];
352
- while (left() > 0) {
353
- target.layersGroup.push(readUint16(reader));
354
- }
355
- }, (writer, target) => {
356
- for (const g of target.layersGroup) {
357
- writeUint16(writer, g);
358
- }
359
- });
360
- addHandler(1072, target => target.layerGroupsEnabledId !== undefined, (reader, target, left) => {
361
- target.layerGroupsEnabledId = [];
362
- while (left() > 0) {
363
- target.layerGroupsEnabledId.push(readUint8(reader));
364
- }
365
- }, (writer, target) => {
366
- for (const id of target.layerGroupsEnabledId) {
367
- writeUint8(writer, id);
368
- }
369
- });
370
- addHandler(1069, target => target.layerSelectionIds !== undefined, (reader, target) => {
371
- let count = readUint16(reader);
372
- target.layerSelectionIds = [];
373
- while (count--) {
374
- target.layerSelectionIds.push(readUint32(reader));
375
- }
376
- }, (writer, target) => {
377
- writeUint16(writer, target.layerSelectionIds.length);
378
- for (const id of target.layerSelectionIds) {
379
- writeUint32(writer, id);
380
- }
381
- });
382
- addHandler(1032, target => target.gridAndGuidesInformation !== undefined, (reader, target) => {
383
- const version = readUint32(reader);
384
- const horizontal = readUint32(reader);
385
- const vertical = readUint32(reader);
386
- const count = readUint32(reader);
387
- if (version !== 1)
388
- throw new Error(`Invalid 1032 resource version: ${version}`);
389
- target.gridAndGuidesInformation = {
390
- grid: { horizontal, vertical },
391
- guides: [],
392
- };
393
- for (let i = 0; i < count; i++) {
394
- target.gridAndGuidesInformation.guides.push({
395
- location: readUint32(reader) / 32,
396
- direction: readUint8(reader) ? 'horizontal' : 'vertical'
397
- });
398
- }
399
- }, (writer, target) => {
400
- const info = target.gridAndGuidesInformation;
401
- const grid = info.grid || { horizontal: 18 * 32, vertical: 18 * 32 };
402
- const guides = info.guides || [];
403
- writeUint32(writer, 1);
404
- writeUint32(writer, grid.horizontal);
405
- writeUint32(writer, grid.vertical);
406
- writeUint32(writer, guides.length);
407
- for (const g of guides) {
408
- writeUint32(writer, g.location * 32);
409
- writeUint8(writer, g.direction === 'horizontal' ? 1 : 0);
410
- }
411
- });
412
- addHandler(1065, // Layer Comps
413
- // Layer Comps
414
- target => target.layerComps !== undefined, (reader, target) => {
415
- const desc = readVersionAndDescriptor(reader, true);
416
- // console.log('CompList', require('util').inspect(desc, false, 99, true));
417
- target.layerComps = { list: [] };
418
- for (const item of desc.list) {
419
- target.layerComps.list.push({
420
- id: item.compID,
421
- name: item['Nm '],
422
- capturedInfo: item.capturedInfo,
423
- });
424
- if ('comment' in item)
425
- target.layerComps.list[target.layerComps.list.length - 1].comment = item.comment;
426
- }
427
- if ('lastAppliedComp' in desc)
428
- target.layerComps.lastApplied = desc.lastAppliedComp;
429
- }, (writer, target) => {
430
- const layerComps = target.layerComps;
431
- const desc = { list: [] };
432
- for (const item of layerComps.list) {
433
- const t = {};
434
- t._classID = 'Comp';
435
- t['Nm '] = item.name;
436
- if ('comment' in item)
437
- t.comment = item.comment;
438
- t.compID = item.id;
439
- t.capturedInfo = item.capturedInfo;
440
- desc.list.push(t);
441
- }
442
- if ('lastApplied' in layerComps)
443
- desc.lastAppliedComp = layerComps.lastApplied;
444
- // console.log('CompList', require('util').inspect(desc, false, 99, true));
445
- writeVersionAndDescriptor(writer, '', 'CompList', desc);
446
- });
447
- MOCK_HANDLERS && addHandler(1092, // ???
448
- // ???
449
- target => target._ir1092 !== undefined, (reader, target, left) => {
450
- LOG_MOCK_HANDLERS && console.log('image resource 1092', left());
451
- // 16 bytes, seems to be 4 integers
452
- target._ir1092 = readBytes(reader, left());
453
- }, (writer, target) => {
454
- writeBytes(writer, target._ir1092);
455
- });
456
- // 0 - normal, 7 - multiply, 8 - screen, 23 - difference
457
- const onionSkinsBlendModes = [
458
- 'normal', undefined, undefined, undefined, undefined, undefined, undefined, 'multiply',
459
- 'screen', undefined, undefined, undefined, undefined, undefined, undefined, undefined,
460
- undefined, undefined, undefined, undefined, undefined, undefined, undefined, 'difference',
461
- ];
462
- addHandler(1078, // Onion Skins
463
- // Onion Skins
464
- target => target.onionSkins !== undefined, (reader, target) => {
465
- const desc = readVersionAndDescriptor(reader);
466
- // console.log('1078', require('util').inspect(desc, false, 99, true));
467
- target.onionSkins = {
468
- enabled: desc.enab,
469
- framesBefore: desc.numBefore,
470
- framesAfter: desc.numAfter,
471
- frameSpacing: desc.Spcn,
472
- minOpacity: desc.minOpacity / 100,
473
- maxOpacity: desc.maxOpacity / 100,
474
- blendMode: onionSkinsBlendModes[desc.BlnM] || 'normal',
475
- };
476
- }, (writer, target) => {
477
- const onionSkins = target.onionSkins;
478
- const desc = {
479
- Vrsn: 1,
480
- enab: onionSkins.enabled,
481
- numBefore: onionSkins.framesBefore,
482
- numAfter: onionSkins.framesAfter,
483
- Spcn: onionSkins.frameSpacing,
484
- minOpacity: (onionSkins.minOpacity * 100) | 0,
485
- maxOpacity: (onionSkins.maxOpacity * 100) | 0,
486
- BlnM: Math.max(0, onionSkinsBlendModes.indexOf(onionSkins.blendMode)),
487
- };
488
- writeVersionAndDescriptor(writer, '', 'null', desc);
489
- });
490
- addHandler(1075, // Timeline Information
491
- // Timeline Information
492
- target => target.timelineInformation !== undefined, (reader, target) => {
493
- var _a, _b;
494
- const desc = readVersionAndDescriptor(reader);
495
- target.timelineInformation = {
496
- enabled: desc.enab,
497
- frameStep: frac(desc.frameStep),
498
- frameRate: desc.frameRate,
499
- time: frac(desc.time),
500
- duration: frac(desc.duration),
501
- workInTime: frac(desc.workInTime),
502
- workOutTime: frac(desc.workOutTime),
503
- repeats: desc.LCnt,
504
- hasMotion: desc.hasMotion,
505
- globalTracks: parseTrackList(desc.globalTrackList, !!reader.logMissingFeatures),
506
- };
507
- if ((_b = (_a = desc.audioClipGroupList) === null || _a === void 0 ? void 0 : _a.audioClipGroupList) === null || _b === void 0 ? void 0 : _b.length) {
508
- target.timelineInformation.audioClipGroups = desc.audioClipGroupList.audioClipGroupList.map(g => ({
509
- id: g.groupID,
510
- muted: g.muted,
511
- audioClips: g.audioClipList.map(({ clipID, timeScope, muted, audioLevel, frameReader }) => ({
512
- id: clipID,
513
- start: frac(timeScope.Strt),
514
- duration: frac(timeScope.duration),
515
- inTime: frac(timeScope.inTime),
516
- outTime: frac(timeScope.outTime),
517
- muted: muted,
518
- audioLevel: audioLevel,
519
- frameReader: {
520
- type: frameReader.frameReaderType,
521
- mediaDescriptor: frameReader.mediaDescriptor,
522
- link: {
523
- name: frameReader['Lnk ']['Nm '],
524
- fullPath: frameReader['Lnk '].fullPath,
525
- relativePath: frameReader['Lnk '].relPath,
526
- },
527
- },
528
- })),
529
- }));
530
- }
531
- }, (writer, target) => {
532
- var _a;
533
- const timeline = target.timelineInformation;
534
- const desc = {
535
- Vrsn: 1,
536
- enab: timeline.enabled,
537
- frameStep: timeline.frameStep,
538
- frameRate: timeline.frameRate,
539
- time: timeline.time,
540
- duration: timeline.duration,
541
- workInTime: timeline.workInTime,
542
- workOutTime: timeline.workOutTime,
543
- LCnt: timeline.repeats,
544
- globalTrackList: serializeTrackList(timeline.globalTracks),
545
- audioClipGroupList: {
546
- audioClipGroupList: (_a = timeline.audioClipGroups) === null || _a === void 0 ? void 0 : _a.map(a => ({
547
- groupID: a.id,
548
- muted: a.muted,
549
- audioClipList: a.audioClips.map(c => ({
550
- clipID: c.id,
551
- timeScope: {
552
- Vrsn: 1,
553
- Strt: c.start,
554
- duration: c.duration,
555
- inTime: c.inTime,
556
- outTime: c.outTime,
557
- },
558
- frameReader: {
559
- frameReaderType: c.frameReader.type,
560
- descVersion: 1,
561
- 'Lnk ': {
562
- descVersion: 1,
563
- 'Nm ': c.frameReader.link.name,
564
- fullPath: c.frameReader.link.fullPath,
565
- relPath: c.frameReader.link.relativePath,
566
- },
567
- mediaDescriptor: c.frameReader.mediaDescriptor,
568
- },
569
- muted: c.muted,
570
- audioLevel: c.audioLevel,
571
- })),
572
- })),
573
- },
574
- hasMotion: timeline.hasMotion,
575
- };
576
- writeVersionAndDescriptor(writer, '', 'null', desc, 'anim');
577
- });
578
- addHandler(1076, // Sheet Disclosure
579
- // Sheet Disclosure
580
- target => target.sheetDisclosure !== undefined, (reader, target) => {
581
- const desc = readVersionAndDescriptor(reader);
582
- target.sheetDisclosure = {};
583
- if (desc.sheetTimelineOptions) {
584
- target.sheetDisclosure.sheetTimelineOptions = desc.sheetTimelineOptions.map(o => ({
585
- sheetID: o.sheetID,
586
- sheetDisclosed: o.sheetDisclosed,
587
- lightsDisclosed: o.lightsDisclosed,
588
- meshesDisclosed: o.meshesDisclosed,
589
- materialsDisclosed: o.materialsDisclosed,
590
- }));
591
- }
592
- }, (writer, target) => {
593
- const disclosure = target.sheetDisclosure;
594
- const desc = { Vrsn: 1 };
595
- if (disclosure.sheetTimelineOptions) {
596
- desc.sheetTimelineOptions = disclosure.sheetTimelineOptions.map(d => ({
597
- Vrsn: 2,
598
- sheetID: d.sheetID,
599
- sheetDisclosed: d.sheetDisclosed,
600
- lightsDisclosed: d.lightsDisclosed,
601
- meshesDisclosed: d.meshesDisclosed,
602
- materialsDisclosed: d.materialsDisclosed,
603
- }));
604
- }
605
- writeVersionAndDescriptor(writer, '', 'null', desc);
606
- });
607
- addHandler(1054, // URL List
608
- // URL List
609
- target => target.urlsList !== undefined, (reader, target) => {
610
- const count = readUint32(reader);
611
- target.urlsList = [];
612
- for (let i = 0; i < count; i++) {
613
- const long = readSignature(reader);
614
- if (long !== 'slic' && reader.throwForMissingFeatures)
615
- throw new Error('Unknown long');
616
- const id = readUint32(reader);
617
- const url = readUnicodeString(reader);
618
- target.urlsList.push({ id, url, ref: 'slice' });
619
- }
620
- }, (writer, target) => {
621
- const list = target.urlsList;
622
- writeUint32(writer, list.length);
623
- for (let i = 0; i < list.length; i++) {
624
- writeSignature(writer, 'slic');
625
- writeUint32(writer, list[i].id);
626
- writeUnicodeString(writer, list[i].url);
627
- }
628
- });
629
- function boundsToBounds(bounds) {
630
- return { 'Top ': bounds.top, Left: bounds.left, Btom: bounds.bottom, Rght: bounds.right };
631
- }
632
- function boundsFromBounds(bounds) {
633
- return { top: bounds['Top '], left: bounds.Left, bottom: bounds.Btom, right: bounds.Rght };
634
- }
635
- function clamped(array, index) {
636
- return array[Math.max(0, Math.min(array.length - 1, index))];
637
- }
638
- const sliceOrigins = ['autoGenerated', 'layer', 'userGenerated'];
639
- const sliceTypes = ['noImage', 'image'];
640
- const sliceAlignments = ['default'];
641
- addHandler(1050, // Slices
642
- // Slices
643
- target => target.slices ? target.slices.length : 0, (reader, target) => {
644
- const version = readUint32(reader);
645
- if (version === 6) {
646
- if (!target.slices)
647
- target.slices = [];
648
- const top = readInt32(reader);
649
- const left = readInt32(reader);
650
- const bottom = readInt32(reader);
651
- const right = readInt32(reader);
652
- const groupName = readUnicodeString(reader);
653
- const count = readUint32(reader);
654
- target.slices.push({ bounds: { top, left, bottom, right }, groupName, slices: [] });
655
- const slices = target.slices[target.slices.length - 1].slices;
656
- for (let i = 0; i < count; i++) {
657
- const id = readUint32(reader);
658
- const groupId = readUint32(reader);
659
- const origin = clamped(sliceOrigins, readUint32(reader));
660
- const associatedLayerId = origin == 'layer' ? readUint32(reader) : 0;
661
- const name = readUnicodeString(reader);
662
- const type = clamped(sliceTypes, readUint32(reader));
663
- const left = readInt32(reader);
664
- const top = readInt32(reader);
665
- const right = readInt32(reader);
666
- const bottom = readInt32(reader);
667
- const url = readUnicodeString(reader);
668
- const target = readUnicodeString(reader);
669
- const message = readUnicodeString(reader);
670
- const altTag = readUnicodeString(reader);
671
- const cellTextIsHTML = !!readUint8(reader);
672
- const cellText = readUnicodeString(reader);
673
- const horizontalAlignment = clamped(sliceAlignments, readUint32(reader));
674
- const verticalAlignment = clamped(sliceAlignments, readUint32(reader));
675
- const a = readUint8(reader);
676
- const r = readUint8(reader);
677
- const g = readUint8(reader);
678
- const b = readUint8(reader);
679
- const backgroundColorType = ((a + r + g + b) === 0) ? 'none' : (a === 0 ? 'matte' : 'color');
680
- slices.push({
681
- id, groupId, origin, associatedLayerId, name, target, message, altTag, cellTextIsHTML, cellText,
682
- horizontalAlignment, verticalAlignment, type, url,
683
- bounds: { top, left, bottom, right },
684
- backgroundColorType, backgroundColor: { r, g, b, a },
685
- });
686
- }
687
- const desc = readVersionAndDescriptor(reader);
688
- desc.slices.forEach(d => {
689
- const slice = slices.find(s => d.sliceID == s.id);
690
- if (slice) {
691
- slice.topOutset = d.topOutset;
692
- slice.leftOutset = d.leftOutset;
693
- slice.bottomOutset = d.bottomOutset;
694
- slice.rightOutset = d.rightOutset;
695
- }
696
- });
697
- }
698
- else if (version === 7 || version === 8) {
699
- const desc = readVersionAndDescriptor(reader);
700
- if (!target.slices)
701
- target.slices = [];
702
- target.slices.push({
703
- groupName: desc.baseName,
704
- bounds: boundsFromBounds(desc.bounds),
705
- slices: desc.slices.map(s => (Object.assign(Object.assign({}, (s['Nm '] ? { name: s['Nm '] } : {})), { id: s.sliceID, groupId: s.groupID, associatedLayerId: 0, origin: ESliceOrigin.decode(s.origin), type: ESliceType.decode(s.Type), bounds: boundsFromBounds(s.bounds), url: s.url, target: s.null, message: s.Msge, altTag: s.altTag, cellTextIsHTML: s.cellTextIsHTML, cellText: s.cellText, horizontalAlignment: ESliceHorzAlign.decode(s.horzAlign), verticalAlignment: ESliceVertAlign.decode(s.vertAlign), backgroundColorType: ESliceBGColorType.decode(s.bgColorType), backgroundColor: s.bgColor ? { r: s.bgColor['Rd '], g: s.bgColor['Grn '], b: s.bgColor['Bl '], a: s.bgColor.alpha } : { r: 0, g: 0, b: 0, a: 0 }, topOutset: s.topOutset || 0, leftOutset: s.leftOutset || 0, bottomOutset: s.bottomOutset || 0, rightOutset: s.rightOutset || 0 }))),
706
- });
707
- }
708
- else {
709
- throw new Error(`Invalid slices version (${version})`);
710
- }
711
- }, (writer, target, index) => {
712
- const { bounds, groupName, slices } = target.slices[index];
713
- writeUint32(writer, 6); // version
714
- writeInt32(writer, bounds.top);
715
- writeInt32(writer, bounds.left);
716
- writeInt32(writer, bounds.bottom);
717
- writeInt32(writer, bounds.right);
718
- writeUnicodeString(writer, groupName);
719
- writeUint32(writer, slices.length);
720
- for (let i = 0; i < slices.length; i++) {
721
- const slice = slices[i];
722
- let { a, r, g, b } = slice.backgroundColor;
723
- if (slice.backgroundColorType === 'none') {
724
- a = r = g = b = 0;
725
- }
726
- else if (slice.backgroundColorType === 'matte') {
727
- a = 0;
728
- r = g = b = 255;
729
- }
730
- writeUint32(writer, slice.id);
731
- writeUint32(writer, slice.groupId);
732
- writeUint32(writer, sliceOrigins.indexOf(slice.origin));
733
- if (slice.origin === 'layer')
734
- writeUint32(writer, slice.associatedLayerId);
735
- writeUnicodeString(writer, slice.name || '');
736
- writeUint32(writer, sliceTypes.indexOf(slice.type));
737
- writeInt32(writer, slice.bounds.left);
738
- writeInt32(writer, slice.bounds.top);
739
- writeInt32(writer, slice.bounds.right);
740
- writeInt32(writer, slice.bounds.bottom);
741
- writeUnicodeString(writer, slice.url);
742
- writeUnicodeString(writer, slice.target);
743
- writeUnicodeString(writer, slice.message);
744
- writeUnicodeString(writer, slice.altTag);
745
- writeUint8(writer, slice.cellTextIsHTML ? 1 : 0);
746
- writeUnicodeString(writer, slice.cellText);
747
- writeUint32(writer, sliceAlignments.indexOf(slice.horizontalAlignment));
748
- writeUint32(writer, sliceAlignments.indexOf(slice.verticalAlignment));
749
- writeUint8(writer, a);
750
- writeUint8(writer, r);
751
- writeUint8(writer, g);
752
- writeUint8(writer, b);
753
- }
754
- const desc = {
755
- bounds: boundsToBounds(bounds),
756
- slices: [],
757
- };
758
- slices.forEach(s => {
759
- const slice = Object.assign(Object.assign({ sliceID: s.id, groupID: s.groupId, origin: ESliceOrigin.encode(s.origin), Type: ESliceType.encode(s.type), bounds: boundsToBounds(s.bounds) }, (s.name ? { 'Nm ': s.name } : {})), { url: s.url, null: s.target, Msge: s.message, altTag: s.altTag, cellTextIsHTML: s.cellTextIsHTML, cellText: s.cellText, horzAlign: ESliceHorzAlign.encode(s.horizontalAlignment), vertAlign: ESliceVertAlign.encode(s.verticalAlignment), bgColorType: ESliceBGColorType.encode(s.backgroundColorType) });
760
- if (s.backgroundColorType === 'color') {
761
- const { r, g, b, a } = s.backgroundColor;
762
- slice.bgColor = { 'Rd ': r, 'Grn ': g, 'Bl ': b, alpha: a };
763
- }
764
- slice.topOutset = s.topOutset || 0;
765
- slice.leftOutset = s.leftOutset || 0;
766
- slice.bottomOutset = s.bottomOutset || 0;
767
- slice.rightOutset = s.rightOutset || 0;
768
- desc.slices.push(slice);
769
- });
770
- writeVersionAndDescriptor(writer, '', 'null', desc, 'slices');
771
- });
772
- addHandler(1064, target => target.pixelAspectRatio !== undefined, (reader, target) => {
773
- if (readUint32(reader) > 2)
774
- throw new Error('Invalid pixelAspectRatio version');
775
- target.pixelAspectRatio = { aspect: readFloat64(reader) };
776
- }, (writer, target) => {
777
- writeUint32(writer, 2); // version
778
- writeFloat64(writer, target.pixelAspectRatio.aspect);
779
- });
780
- addHandler(1041, target => target.iccUntaggedProfile !== undefined, (reader, target) => {
781
- target.iccUntaggedProfile = !!readUint8(reader);
782
- }, (writer, target) => {
783
- writeUint8(writer, target.iccUntaggedProfile ? 1 : 0);
784
- });
785
- MOCK_HANDLERS && addHandler(1039, // ICC Profile
786
- // ICC Profile
787
- target => target._ir1039 !== undefined, (reader, target, left) => {
788
- // TODO: this is raw bytes, just return as a byte array
789
- LOG_MOCK_HANDLERS && console.log('image resource 1039', left());
790
- target._ir1039 = readBytes(reader, left());
791
- }, (writer, target) => {
792
- writeBytes(writer, target._ir1039);
793
- });
794
- addHandler(1044, target => target.idsSeedNumber !== undefined, (reader, target) => target.idsSeedNumber = readUint32(reader), (writer, target) => writeUint32(writer, target.idsSeedNumber));
795
- addHandler(1036, target => target.thumbnail !== undefined || target.thumbnailRaw !== undefined, (reader, target, left) => {
796
- const format = readUint32(reader); // 1 = kJpegRGB, 0 = kRawRGB
797
- const width = readUint32(reader);
798
- const height = readUint32(reader);
799
- readUint32(reader); // widthBytes = (width * bits_per_pixel + 31) / 32 * 4.
800
- readUint32(reader); // totalSize = widthBytes * height * planes
801
- readUint32(reader); // sizeAfterCompression
802
- const bitsPerPixel = readUint16(reader); // 24
803
- const planes = readUint16(reader); // 1
804
- if (format !== 1 || bitsPerPixel !== 24 || planes !== 1) {
805
- reader.logMissingFeatures && reader.log(`Invalid thumbnail data (format: ${format}, bitsPerPixel: ${bitsPerPixel}, planes: ${planes})`);
806
- skipBytes(reader, left());
807
- return;
808
- }
809
- const size = left();
810
- const data = readBytes(reader, size);
811
- if (reader.useRawThumbnail) {
812
- target.thumbnailRaw = { width, height, data };
813
- }
814
- else if (data.byteLength) {
815
- target.thumbnail = createCanvasFromData(data);
816
- }
817
- }, (writer, target) => {
818
- var _a;
819
- let width = 0;
820
- let height = 0;
821
- let data = new Uint8Array(0);
822
- if (target.thumbnailRaw) {
823
- width = target.thumbnailRaw.width;
824
- height = target.thumbnailRaw.height;
825
- data = target.thumbnailRaw.data;
826
- }
827
- else {
828
- try {
829
- const dataUrl = (_a = target.thumbnail.toDataURL('image/jpeg', 1)) === null || _a === void 0 ? void 0 : _a.substring('data:image/jpeg;base64,'.length);
830
- if (dataUrl) {
831
- data = toByteArray(dataUrl); // this sometimes fails for some reason, maybe some browser bugs
832
- width = target.thumbnail.width;
833
- height = target.thumbnail.height;
834
- }
835
- }
836
- catch (_b) { }
837
- }
838
- const bitsPerPixel = 24;
839
- const widthBytes = Math.floor((width * bitsPerPixel + 31) / 32) * 4;
840
- const planes = 1;
841
- const totalSize = widthBytes * height * planes;
842
- const sizeAfterCompression = data.length;
843
- writeUint32(writer, 1); // 1 = kJpegRGB
844
- writeUint32(writer, width);
845
- writeUint32(writer, height);
846
- writeUint32(writer, widthBytes);
847
- writeUint32(writer, totalSize);
848
- writeUint32(writer, sizeAfterCompression);
849
- writeUint16(writer, bitsPerPixel);
850
- writeUint16(writer, planes);
851
- writeBytes(writer, data);
852
- });
853
- addHandler(1057, target => target.versionInfo !== undefined, (reader, target, left) => {
854
- const version = readUint32(reader);
855
- if (version !== 1)
856
- throw new Error('Invalid versionInfo version');
857
- target.versionInfo = {
858
- hasRealMergedData: !!readUint8(reader),
859
- writerName: readUnicodeString(reader),
860
- readerName: readUnicodeString(reader),
861
- fileVersion: readUint32(reader),
862
- };
863
- skipBytes(reader, left());
864
- }, (writer, target) => {
865
- const versionInfo = target.versionInfo;
866
- writeUint32(writer, 1); // version
867
- writeUint8(writer, versionInfo.hasRealMergedData ? 1 : 0);
868
- writeUnicodeString(writer, versionInfo.writerName);
869
- writeUnicodeString(writer, versionInfo.readerName);
870
- writeUint32(writer, versionInfo.fileVersion);
871
- });
872
- MOCK_HANDLERS && addHandler(1058, // EXIF data 1.
873
- // EXIF data 1.
874
- target => target._ir1058 !== undefined, (reader, target, left) => {
875
- LOG_MOCK_HANDLERS && console.log('image resource 1058', left());
876
- target._ir1058 = readBytes(reader, left());
877
- }, (writer, target) => {
878
- writeBytes(writer, target._ir1058);
879
- });
880
- addHandler(7000, target => target.imageReadyVariables !== undefined, (reader, target, left) => {
881
- target.imageReadyVariables = readUtf8String(reader, left());
882
- }, (writer, target) => {
883
- writeUtf8String(writer, target.imageReadyVariables);
884
- });
885
- addHandler(7001, target => target.imageReadyDataSets !== undefined, (reader, target, left) => {
886
- target.imageReadyDataSets = readUtf8String(reader, left());
887
- }, (writer, target) => {
888
- writeUtf8String(writer, target.imageReadyDataSets);
889
- });
890
- addHandler(1088, target => target.pathSelectionState !== undefined, (reader, target, _left) => {
891
- const desc = readVersionAndDescriptor(reader);
892
- target.pathSelectionState = desc['null'];
893
- }, (writer, target) => {
894
- const desc = { 'null': target.pathSelectionState };
895
- writeVersionAndDescriptor(writer, '', 'null', desc);
896
- });
897
- MOCK_HANDLERS && addHandler(1025, target => target._ir1025 !== undefined, (reader, target, left) => {
898
- LOG_MOCK_HANDLERS && console.log('image resource 1025', left());
899
- target._ir1025 = readBytes(reader, left());
900
- }, (writer, target) => {
901
- writeBytes(writer, target._ir1025);
902
- });
903
- const FrmD = createEnum('FrmD', '', {
904
- auto: 'Auto',
905
- none: 'None',
906
- dispose: 'Disp',
907
- });
908
- addHandler(4000, // Plug-In resource(s)
909
- // Plug-In resource(s)
910
- target => target.animations !== undefined, (reader, target, left) => {
911
- const key = readSignature(reader);
912
- if (key === 'mani') {
913
- checkSignature(reader, 'IRFR');
914
- readSection(reader, 1, left => {
915
- while (left() > 0) {
916
- checkSignature(reader, '8BIM');
917
- const key = readSignature(reader);
918
- readSection(reader, 1, left => {
919
- if (key === 'AnDs') {
920
- const desc = readVersionAndDescriptor(reader);
921
- target.animations = {
922
- // desc.AFSt ???
923
- frames: desc.FrIn.map(x => ({
924
- id: x.FrID,
925
- delay: (x.FrDl || 0) / 100,
926
- dispose: x.FrDs ? FrmD.decode(x.FrDs) : 'auto', // missing == auto
927
- // x.FrGA ???
928
- })),
929
- animations: desc.FSts.map(x => ({
930
- id: x.FsID,
931
- frames: x.FsFr,
932
- repeats: x.LCnt,
933
- activeFrame: x.AFrm || 0,
934
- })),
935
- };
936
- // console.log('#4000 AnDs', require('util').inspect(desc, false, 99, true));
937
- // console.log('#4000 AnDs:result', require('util').inspect(target.animations, false, 99, true));
938
- }
939
- else if (key === 'Roll') {
940
- const bytes = readBytes(reader, left());
941
- reader.logDevFeatures && reader.log('#4000 Roll', bytes);
942
- }
943
- else {
944
- reader.logMissingFeatures && reader.log('Unhandled subsection in #4000', key);
945
- }
946
- });
947
- }
948
- });
949
- }
950
- else if (key === 'mopt') {
951
- const bytes = readBytes(reader, left());
952
- reader.logDevFeatures && reader.log('#4000 mopt', bytes);
953
- }
954
- else {
955
- reader.logMissingFeatures && reader.log('Unhandled key in #4000:', key);
956
- }
957
- }, (writer, target) => {
958
- if (target.animations) {
959
- writeSignature(writer, 'mani');
960
- writeSignature(writer, 'IRFR');
961
- writeSection(writer, 1, () => {
962
- writeSignature(writer, '8BIM');
963
- writeSignature(writer, 'AnDs');
964
- writeSection(writer, 1, () => {
965
- const desc = {
966
- // AFSt: 0, // ???
967
- FrIn: [],
968
- FSts: [],
969
- };
970
- for (let i = 0; i < target.animations.frames.length; i++) {
971
- const f = target.animations.frames[i];
972
- const frame = {
973
- FrID: f.id,
974
- };
975
- if (f.delay)
976
- frame.FrDl = (f.delay * 100) | 0;
977
- frame.FrDs = FrmD.encode(f.dispose);
978
- // if (i === 0) frame.FrGA = 30; // ???
979
- desc.FrIn.push(frame);
980
- }
981
- for (let i = 0; i < target.animations.animations.length; i++) {
982
- const a = target.animations.animations[i];
983
- const anim = {
984
- FsID: a.id,
985
- AFrm: a.activeFrame | 0,
986
- FsFr: a.frames,
987
- LCnt: a.repeats | 0,
988
- };
989
- desc.FSts.push(anim);
990
- }
991
- writeVersionAndDescriptor(writer, '', 'null', desc);
992
- });
993
- // writeSignature(writer, '8BIM');
994
- // writeSignature(writer, 'Roll');
995
- // writeSection(writer, 1, () => {
996
- // writeZeros(writer, 8);
997
- // });
998
- });
999
- }
1000
- });
1001
- // TODO: Unfinished
1002
- MOCK_HANDLERS && addHandler(4001, // Plug-In resource(s)
1003
- // Plug-In resource(s)
1004
- target => target._ir4001 !== undefined, (reader, target, left) => {
1005
- if (MOCK_HANDLERS) {
1006
- LOG_MOCK_HANDLERS && console.log('image resource 4001', left());
1007
- target._ir4001 = readBytes(reader, left());
1008
- return;
1009
- }
1010
- const key = readSignature(reader);
1011
- if (key === 'mfri') {
1012
- const version = readUint32(reader);
1013
- if (version !== 2)
1014
- throw new Error('Invalid mfri version');
1015
- const length = readUint32(reader);
1016
- const bytes = readBytes(reader, length);
1017
- reader.logDevFeatures && reader.log('mfri', bytes);
1018
- }
1019
- else if (key === 'mset') {
1020
- const desc = readVersionAndDescriptor(reader);
1021
- reader.logDevFeatures && reader.log('mset', desc);
1022
- }
1023
- else {
1024
- reader.logMissingFeatures && reader.log('Unhandled key in #4001', key);
1025
- }
1026
- }, (writer, target) => {
1027
- writeBytes(writer, target._ir4001);
1028
- });
1029
- // TODO: Unfinished
1030
- MOCK_HANDLERS && addHandler(4002, // Plug-In resource(s)
1031
- // Plug-In resource(s)
1032
- target => target._ir4002 !== undefined, (reader, target, left) => {
1033
- LOG_MOCK_HANDLERS && console.log('image resource 4002', left());
1034
- target._ir4002 = readBytes(reader, left());
1035
- }, (writer, target) => {
1036
- writeBytes(writer, target._ir4002);
1037
- });
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resourceHandlersMap = exports.resourceHandlers = void 0;
4
+ const base64_js_1 = require("base64-js");
5
+ const psdReader_1 = require("./psdReader");
6
+ const psdWriter_1 = require("./psdWriter");
7
+ const helpers_1 = require("./helpers");
8
+ const utf8_1 = require("./utf8");
9
+ const descriptor_1 = require("./descriptor");
10
+ exports.resourceHandlers = [];
11
+ exports.resourceHandlersMap = {};
12
+ function addHandler(key, has, read, write) {
13
+ const handler = { key, has, read, write };
14
+ exports.resourceHandlers.push(handler);
15
+ exports.resourceHandlersMap[handler.key] = handler;
16
+ }
17
+ const LOG_MOCK_HANDLERS = false;
18
+ const RESOLUTION_UNITS = [undefined, 'PPI', 'PPCM'];
19
+ const MEASUREMENT_UNITS = [undefined, 'Inches', 'Centimeters', 'Points', 'Picas', 'Columns'];
20
+ const hex = '0123456789abcdef';
21
+ function charToNibble(code) {
22
+ return code <= 57 ? code - 48 : code - 87;
23
+ }
24
+ function byteAt(value, index) {
25
+ return (charToNibble(value.charCodeAt(index)) << 4) | charToNibble(value.charCodeAt(index + 1));
26
+ }
27
+ function readUtf8String(reader, length) {
28
+ const buffer = (0, psdReader_1.readBytes)(reader, length);
29
+ return (0, utf8_1.decodeString)(buffer);
30
+ }
31
+ function writeUtf8String(writer, value) {
32
+ const buffer = (0, utf8_1.encodeString)(value);
33
+ (0, psdWriter_1.writeBytes)(writer, buffer);
34
+ }
35
+ function readEncodedString(reader) {
36
+ const length = (0, psdReader_1.readUint8)(reader);
37
+ const buffer = (0, psdReader_1.readBytes)(reader, length);
38
+ let notAscii = false;
39
+ for (let i = 0; i < buffer.byteLength; i++) {
40
+ if (buffer[i] & 0x80) {
41
+ notAscii = true;
42
+ break;
43
+ }
44
+ }
45
+ if (notAscii) {
46
+ const decoder = new TextDecoder('gbk');
47
+ return decoder.decode(buffer);
48
+ }
49
+ else {
50
+ return (0, utf8_1.decodeString)(buffer);
51
+ }
52
+ }
53
+ function writeEncodedString(writer, value) {
54
+ let ascii = '';
55
+ for (let i = 0, code = value.codePointAt(i++); code !== undefined; code = value.codePointAt(i++)) {
56
+ ascii += code > 0x7f ? '?' : String.fromCodePoint(code);
57
+ }
58
+ const buffer = (0, utf8_1.encodeString)(ascii);
59
+ (0, psdWriter_1.writeUint8)(writer, buffer.byteLength);
60
+ (0, psdWriter_1.writeBytes)(writer, buffer);
61
+ }
62
+ helpers_1.MOCK_HANDLERS && addHandler(1028, // IPTC-NAA record
63
+ // IPTC-NAA record
64
+ target => target._ir1028 !== undefined, (reader, target, left) => {
65
+ LOG_MOCK_HANDLERS && console.log('image resource 1028', left());
66
+ target._ir1028 = (0, psdReader_1.readBytes)(reader, left());
67
+ }, (writer, target) => {
68
+ (0, psdWriter_1.writeBytes)(writer, target._ir1028);
69
+ });
70
+ addHandler(1061, target => target.captionDigest !== undefined, (reader, target) => {
71
+ let captionDigest = '';
72
+ for (let i = 0; i < 16; i++) {
73
+ const byte = (0, psdReader_1.readUint8)(reader);
74
+ captionDigest += hex[byte >> 4];
75
+ captionDigest += hex[byte & 0xf];
76
+ }
77
+ target.captionDigest = captionDigest;
78
+ }, (writer, target) => {
79
+ for (let i = 0; i < 16; i++) {
80
+ (0, psdWriter_1.writeUint8)(writer, byteAt(target.captionDigest, i * 2));
81
+ }
82
+ });
83
+ addHandler(1060, target => target.xmpMetadata !== undefined, (reader, target, left) => {
84
+ target.xmpMetadata = readUtf8String(reader, left());
85
+ }, (writer, target) => {
86
+ writeUtf8String(writer, target.xmpMetadata);
87
+ });
88
+ const Inte = (0, helpers_1.createEnum)('Inte', 'perceptual', {
89
+ 'perceptual': 'Img ',
90
+ 'saturation': 'Grp ',
91
+ 'relative colorimetric': 'Clrm',
92
+ 'absolute colorimetric': 'AClr',
93
+ });
94
+ helpers_1.MOCK_HANDLERS && addHandler(1085, // Windows DEVMODE. Variable OS specific info for Windows.
95
+ // Windows DEVMODE. Variable OS specific info for Windows.
96
+ target => target._ir1085 !== undefined, (reader, target, left) => {
97
+ target._ir1085 = (0, psdReader_1.readBytes)(reader, left());
98
+ }, (writer, target) => {
99
+ (0, psdWriter_1.writeBytes)(writer, target._ir1085);
100
+ });
101
+ addHandler(1082, target => target.printInformation !== undefined, (reader, target) => {
102
+ var _a, _b;
103
+ const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
104
+ target.printInformation = {
105
+ printerName: desc.printerName || '',
106
+ renderingIntent: Inte.decode((_a = desc.Inte) !== null && _a !== void 0 ? _a : 'Inte.Img '),
107
+ };
108
+ const info = target.printInformation;
109
+ if (desc.PstS !== undefined)
110
+ info.printerManagesColors = desc.PstS;
111
+ if (desc['Nm '] !== undefined)
112
+ info.printerProfile = desc['Nm '];
113
+ if (desc.MpBl !== undefined)
114
+ info.blackPointCompensation = desc.MpBl;
115
+ if (desc.printSixteenBit !== undefined)
116
+ info.printSixteenBit = desc.printSixteenBit;
117
+ if (desc.hardProof !== undefined)
118
+ info.hardProof = desc.hardProof;
119
+ if (desc.printProofSetup) {
120
+ if ('Bltn' in desc.printProofSetup) {
121
+ info.proofSetup = { builtin: desc.printProofSetup.Bltn.split('.')[1] };
122
+ }
123
+ else {
124
+ info.proofSetup = {
125
+ profile: desc.printProofSetup.profile,
126
+ renderingIntent: Inte.decode((_b = desc.printProofSetup.Inte) !== null && _b !== void 0 ? _b : 'Inte.Img '),
127
+ blackPointCompensation: !!desc.printProofSetup.MpBl,
128
+ paperWhite: !!desc.printProofSetup.paperWhite,
129
+ };
130
+ }
131
+ }
132
+ }, (writer, target) => {
133
+ var _a, _b;
134
+ const info = target.printInformation;
135
+ const desc = {};
136
+ if (info.printerManagesColors) {
137
+ desc.PstS = true;
138
+ }
139
+ else {
140
+ if (info.hardProof !== undefined)
141
+ desc.hardProof = !!info.hardProof;
142
+ desc.ClrS = 'ClrS.RGBC'; // TODO: ???
143
+ desc['Nm '] = (_a = info.printerProfile) !== null && _a !== void 0 ? _a : 'CIE RGB';
144
+ }
145
+ desc.Inte = Inte.encode(info.renderingIntent);
146
+ if (!info.printerManagesColors)
147
+ desc.MpBl = !!info.blackPointCompensation;
148
+ desc.printSixteenBit = !!info.printSixteenBit;
149
+ desc.printerName = info.printerName || '';
150
+ if (info.proofSetup && 'profile' in info.proofSetup) {
151
+ desc.printProofSetup = {
152
+ profile: info.proofSetup.profile || '',
153
+ Inte: Inte.encode(info.proofSetup.renderingIntent),
154
+ MpBl: !!info.proofSetup.blackPointCompensation,
155
+ paperWhite: !!info.proofSetup.paperWhite,
156
+ };
157
+ }
158
+ else {
159
+ desc.printProofSetup = {
160
+ Bltn: ((_b = info.proofSetup) === null || _b === void 0 ? void 0 : _b.builtin) ? `builtinProof.${info.proofSetup.builtin}` : 'builtinProof.proofCMYK',
161
+ };
162
+ }
163
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'printOutput', desc);
164
+ });
165
+ helpers_1.MOCK_HANDLERS && addHandler(1083, // Print style
166
+ // Print style
167
+ target => target._ir1083 !== undefined, (reader, target, left) => {
168
+ LOG_MOCK_HANDLERS && console.log('image resource 1083', left());
169
+ target._ir1083 = (0, psdReader_1.readBytes)(reader, left());
170
+ // TODO:
171
+ // const desc = readVersionAndDescriptor(reader);
172
+ // console.log('1083', require('util').inspect(desc, false, 99, true));
173
+ }, (writer, target) => {
174
+ (0, psdWriter_1.writeBytes)(writer, target._ir1083);
175
+ });
176
+ addHandler(1005, target => target.resolutionInfo !== undefined, (reader, target) => {
177
+ const horizontalResolution = (0, psdReader_1.readFixedPoint32)(reader);
178
+ const horizontalResolutionUnit = (0, psdReader_1.readUint16)(reader);
179
+ const widthUnit = (0, psdReader_1.readUint16)(reader);
180
+ const verticalResolution = (0, psdReader_1.readFixedPoint32)(reader);
181
+ const verticalResolutionUnit = (0, psdReader_1.readUint16)(reader);
182
+ const heightUnit = (0, psdReader_1.readUint16)(reader);
183
+ target.resolutionInfo = {
184
+ horizontalResolution,
185
+ horizontalResolutionUnit: RESOLUTION_UNITS[horizontalResolutionUnit] || 'PPI',
186
+ widthUnit: MEASUREMENT_UNITS[widthUnit] || 'Inches',
187
+ verticalResolution,
188
+ verticalResolutionUnit: RESOLUTION_UNITS[verticalResolutionUnit] || 'PPI',
189
+ heightUnit: MEASUREMENT_UNITS[heightUnit] || 'Inches',
190
+ };
191
+ }, (writer, target) => {
192
+ const info = target.resolutionInfo;
193
+ (0, psdWriter_1.writeFixedPoint32)(writer, info.horizontalResolution || 0);
194
+ (0, psdWriter_1.writeUint16)(writer, Math.max(1, RESOLUTION_UNITS.indexOf(info.horizontalResolutionUnit)));
195
+ (0, psdWriter_1.writeUint16)(writer, Math.max(1, MEASUREMENT_UNITS.indexOf(info.widthUnit)));
196
+ (0, psdWriter_1.writeFixedPoint32)(writer, info.verticalResolution || 0);
197
+ (0, psdWriter_1.writeUint16)(writer, Math.max(1, RESOLUTION_UNITS.indexOf(info.verticalResolutionUnit)));
198
+ (0, psdWriter_1.writeUint16)(writer, Math.max(1, MEASUREMENT_UNITS.indexOf(info.heightUnit)));
199
+ });
200
+ const printScaleStyles = ['centered', 'size to fit', 'user defined'];
201
+ addHandler(1062, target => target.printScale !== undefined, (reader, target) => {
202
+ target.printScale = {
203
+ style: printScaleStyles[(0, psdReader_1.readInt16)(reader)],
204
+ x: (0, psdReader_1.readFloat32)(reader),
205
+ y: (0, psdReader_1.readFloat32)(reader),
206
+ scale: (0, psdReader_1.readFloat32)(reader),
207
+ };
208
+ }, (writer, target) => {
209
+ const { style, x, y, scale } = target.printScale;
210
+ (0, psdWriter_1.writeInt16)(writer, Math.max(0, printScaleStyles.indexOf(style)));
211
+ (0, psdWriter_1.writeFloat32)(writer, x || 0);
212
+ (0, psdWriter_1.writeFloat32)(writer, y || 0);
213
+ (0, psdWriter_1.writeFloat32)(writer, scale || 0);
214
+ });
215
+ addHandler(1006, target => target.alphaChannelNames !== undefined, (reader, target, left) => {
216
+ if (!target.alphaChannelNames) { // skip if the unicode versions are already read
217
+ target.alphaChannelNames = [];
218
+ while (left() > 0) {
219
+ const value = readEncodedString(reader);
220
+ // const value = readPascalString(reader, 1);
221
+ target.alphaChannelNames.push(value);
222
+ }
223
+ }
224
+ else {
225
+ (0, psdReader_1.skipBytes)(reader, left());
226
+ }
227
+ }, (writer, target) => {
228
+ for (const name of target.alphaChannelNames) {
229
+ writeEncodedString(writer, name);
230
+ // writePascalString(writer, name, 1);
231
+ }
232
+ });
233
+ addHandler(1045, target => target.alphaChannelNames !== undefined, (reader, target, left) => {
234
+ target.alphaChannelNames = [];
235
+ while (left() > 0) {
236
+ target.alphaChannelNames.push((0, psdReader_1.readUnicodeString)(reader));
237
+ }
238
+ }, (writer, target) => {
239
+ for (const name of target.alphaChannelNames) {
240
+ (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, name);
241
+ }
242
+ });
243
+ helpers_1.MOCK_HANDLERS && addHandler(1077, target => target._ir1077 !== undefined, (reader, target, left) => {
244
+ LOG_MOCK_HANDLERS && console.log('image resource 1077', left());
245
+ target._ir1077 = (0, psdReader_1.readBytes)(reader, left());
246
+ }, (writer, target) => {
247
+ (0, psdWriter_1.writeBytes)(writer, target._ir1077);
248
+ });
249
+ addHandler(1053, target => target.alphaIdentifiers !== undefined, (reader, target, left) => {
250
+ target.alphaIdentifiers = [];
251
+ while (left() >= 4) {
252
+ target.alphaIdentifiers.push((0, psdReader_1.readUint32)(reader));
253
+ }
254
+ }, (writer, target) => {
255
+ for (const id of target.alphaIdentifiers) {
256
+ (0, psdWriter_1.writeUint32)(writer, id);
257
+ }
258
+ });
259
+ addHandler(1010, target => target.backgroundColor !== undefined, (reader, target) => target.backgroundColor = (0, psdReader_1.readColor)(reader), (writer, target) => (0, psdWriter_1.writeColor)(writer, target.backgroundColor));
260
+ addHandler(1037, target => target.globalAngle !== undefined, (reader, target) => target.globalAngle = (0, psdReader_1.readInt32)(reader), (writer, target) => (0, psdWriter_1.writeInt32)(writer, target.globalAngle));
261
+ addHandler(1049, target => target.globalAltitude !== undefined, (reader, target) => target.globalAltitude = (0, psdReader_1.readUint32)(reader), (writer, target) => (0, psdWriter_1.writeUint32)(writer, target.globalAltitude));
262
+ addHandler(1011, target => target.printFlags !== undefined, (reader, target) => {
263
+ target.printFlags = {
264
+ labels: !!(0, psdReader_1.readUint8)(reader),
265
+ cropMarks: !!(0, psdReader_1.readUint8)(reader),
266
+ colorBars: !!(0, psdReader_1.readUint8)(reader),
267
+ registrationMarks: !!(0, psdReader_1.readUint8)(reader),
268
+ negative: !!(0, psdReader_1.readUint8)(reader),
269
+ flip: !!(0, psdReader_1.readUint8)(reader),
270
+ interpolate: !!(0, psdReader_1.readUint8)(reader),
271
+ caption: !!(0, psdReader_1.readUint8)(reader),
272
+ printFlags: !!(0, psdReader_1.readUint8)(reader),
273
+ };
274
+ }, (writer, target) => {
275
+ const flags = target.printFlags;
276
+ (0, psdWriter_1.writeUint8)(writer, flags.labels ? 1 : 0);
277
+ (0, psdWriter_1.writeUint8)(writer, flags.cropMarks ? 1 : 0);
278
+ (0, psdWriter_1.writeUint8)(writer, flags.colorBars ? 1 : 0);
279
+ (0, psdWriter_1.writeUint8)(writer, flags.registrationMarks ? 1 : 0);
280
+ (0, psdWriter_1.writeUint8)(writer, flags.negative ? 1 : 0);
281
+ (0, psdWriter_1.writeUint8)(writer, flags.flip ? 1 : 0);
282
+ (0, psdWriter_1.writeUint8)(writer, flags.interpolate ? 1 : 0);
283
+ (0, psdWriter_1.writeUint8)(writer, flags.caption ? 1 : 0);
284
+ (0, psdWriter_1.writeUint8)(writer, flags.printFlags ? 1 : 0);
285
+ });
286
+ addHandler(1034, // Copyright flag
287
+ // Copyright flag
288
+ target => target.copyrighted !== undefined, (reader, target) => {
289
+ target.copyrighted = !!(0, psdReader_1.readUint8)(reader);
290
+ }, (writer, target) => {
291
+ (0, psdWriter_1.writeUint8)(writer, target.copyrighted ? 1 : 0);
292
+ });
293
+ addHandler(1035, // URL
294
+ // URL
295
+ target => target.url !== undefined, (reader, target, left) => {
296
+ target.url = (0, psdReader_1.readAsciiString)(reader, left());
297
+ }, (writer, target) => {
298
+ (0, psdWriter_1.writeAsciiString)(writer, target.url);
299
+ });
300
+ helpers_1.MOCK_HANDLERS && addHandler(10000, // Print flags
301
+ // Print flags
302
+ target => target._ir10000 !== undefined, (reader, target, left) => {
303
+ LOG_MOCK_HANDLERS && console.log('image resource 10000', left());
304
+ target._ir10000 = (0, psdReader_1.readBytes)(reader, left());
305
+ }, (writer, target) => {
306
+ (0, psdWriter_1.writeBytes)(writer, target._ir10000);
307
+ });
308
+ helpers_1.MOCK_HANDLERS && addHandler(1013, // Color halftoning
309
+ // Color halftoning
310
+ target => target._ir1013 !== undefined, (reader, target, left) => {
311
+ LOG_MOCK_HANDLERS && console.log('image resource 1013', left());
312
+ target._ir1013 = (0, psdReader_1.readBytes)(reader, left());
313
+ }, (writer, target) => {
314
+ (0, psdWriter_1.writeBytes)(writer, target._ir1013);
315
+ });
316
+ helpers_1.MOCK_HANDLERS && addHandler(1016, // Color transfer functions
317
+ // Color transfer functions
318
+ target => target._ir1016 !== undefined, (reader, target, left) => {
319
+ LOG_MOCK_HANDLERS && console.log('image resource 1016', left());
320
+ target._ir1016 = (0, psdReader_1.readBytes)(reader, left());
321
+ }, (writer, target) => {
322
+ (0, psdWriter_1.writeBytes)(writer, target._ir1016);
323
+ });
324
+ addHandler(1080, // Count Information
325
+ // Count Information
326
+ target => target.countInformation !== undefined, (reader, target) => {
327
+ const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
328
+ target.countInformation = desc.countGroupList.map(g => ({
329
+ color: { r: g['Rd '], g: g['Grn '], b: g['Bl '] },
330
+ name: g['Nm '],
331
+ size: g['Rds '],
332
+ fontSize: g.fontSize,
333
+ visible: g.Vsbl,
334
+ points: g.countObjectList.map(p => ({ x: p['X '], y: p['Y '] })),
335
+ }));
336
+ }, (writer, target) => {
337
+ const desc = {
338
+ Vrsn: 1,
339
+ countGroupList: target.countInformation.map(g => ({
340
+ 'Rd ': g.color.r,
341
+ 'Grn ': g.color.g,
342
+ 'Bl ': g.color.b,
343
+ 'Nm ': g.name,
344
+ 'Rds ': g.size,
345
+ fontSize: g.fontSize,
346
+ Vsbl: g.visible,
347
+ countObjectList: g.points.map(p => ({ 'X ': p.x, 'Y ': p.y })),
348
+ })),
349
+ };
350
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'Cnt ', desc);
351
+ });
352
+ addHandler(1024, target => target.layerState !== undefined, (reader, target) => target.layerState = (0, psdReader_1.readUint16)(reader), (writer, target) => (0, psdWriter_1.writeUint16)(writer, target.layerState));
353
+ addHandler(1026, target => target.layersGroup !== undefined, (reader, target, left) => {
354
+ target.layersGroup = [];
355
+ while (left() > 0) {
356
+ target.layersGroup.push((0, psdReader_1.readUint16)(reader));
357
+ }
358
+ }, (writer, target) => {
359
+ for (const g of target.layersGroup) {
360
+ (0, psdWriter_1.writeUint16)(writer, g);
361
+ }
362
+ });
363
+ addHandler(1072, target => target.layerGroupsEnabledId !== undefined, (reader, target, left) => {
364
+ target.layerGroupsEnabledId = [];
365
+ while (left() > 0) {
366
+ target.layerGroupsEnabledId.push((0, psdReader_1.readUint8)(reader));
367
+ }
368
+ }, (writer, target) => {
369
+ for (const id of target.layerGroupsEnabledId) {
370
+ (0, psdWriter_1.writeUint8)(writer, id);
371
+ }
372
+ });
373
+ addHandler(1069, target => target.layerSelectionIds !== undefined, (reader, target) => {
374
+ let count = (0, psdReader_1.readUint16)(reader);
375
+ target.layerSelectionIds = [];
376
+ while (count--) {
377
+ target.layerSelectionIds.push((0, psdReader_1.readUint32)(reader));
378
+ }
379
+ }, (writer, target) => {
380
+ (0, psdWriter_1.writeUint16)(writer, target.layerSelectionIds.length);
381
+ for (const id of target.layerSelectionIds) {
382
+ (0, psdWriter_1.writeUint32)(writer, id);
383
+ }
384
+ });
385
+ addHandler(1032, target => target.gridAndGuidesInformation !== undefined, (reader, target) => {
386
+ const version = (0, psdReader_1.readUint32)(reader);
387
+ const horizontal = (0, psdReader_1.readUint32)(reader);
388
+ const vertical = (0, psdReader_1.readUint32)(reader);
389
+ const count = (0, psdReader_1.readUint32)(reader);
390
+ if (version !== 1)
391
+ throw new Error(`Invalid 1032 resource version: ${version}`);
392
+ target.gridAndGuidesInformation = {
393
+ grid: { horizontal, vertical },
394
+ guides: [],
395
+ };
396
+ for (let i = 0; i < count; i++) {
397
+ target.gridAndGuidesInformation.guides.push({
398
+ location: (0, psdReader_1.readUint32)(reader) / 32,
399
+ direction: (0, psdReader_1.readUint8)(reader) ? 'horizontal' : 'vertical'
400
+ });
401
+ }
402
+ }, (writer, target) => {
403
+ const info = target.gridAndGuidesInformation;
404
+ const grid = info.grid || { horizontal: 18 * 32, vertical: 18 * 32 };
405
+ const guides = info.guides || [];
406
+ (0, psdWriter_1.writeUint32)(writer, 1);
407
+ (0, psdWriter_1.writeUint32)(writer, grid.horizontal);
408
+ (0, psdWriter_1.writeUint32)(writer, grid.vertical);
409
+ (0, psdWriter_1.writeUint32)(writer, guides.length);
410
+ for (const g of guides) {
411
+ (0, psdWriter_1.writeUint32)(writer, g.location * 32);
412
+ (0, psdWriter_1.writeUint8)(writer, g.direction === 'horizontal' ? 1 : 0);
413
+ }
414
+ });
415
+ addHandler(1065, // Layer Comps
416
+ // Layer Comps
417
+ target => target.layerComps !== undefined, (reader, target) => {
418
+ const desc = (0, descriptor_1.readVersionAndDescriptor)(reader, true);
419
+ // console.log('CompList', require('util').inspect(desc, false, 99, true));
420
+ target.layerComps = { list: [] };
421
+ for (const item of desc.list) {
422
+ target.layerComps.list.push({
423
+ id: item.compID,
424
+ name: item['Nm '],
425
+ capturedInfo: item.capturedInfo,
426
+ });
427
+ if ('comment' in item)
428
+ target.layerComps.list[target.layerComps.list.length - 1].comment = item.comment;
429
+ }
430
+ if ('lastAppliedComp' in desc)
431
+ target.layerComps.lastApplied = desc.lastAppliedComp;
432
+ }, (writer, target) => {
433
+ const layerComps = target.layerComps;
434
+ const desc = { list: [] };
435
+ for (const item of layerComps.list) {
436
+ const t = {};
437
+ t._classID = 'Comp';
438
+ t['Nm '] = item.name;
439
+ if ('comment' in item)
440
+ t.comment = item.comment;
441
+ t.compID = item.id;
442
+ t.capturedInfo = item.capturedInfo;
443
+ desc.list.push(t);
444
+ }
445
+ if ('lastApplied' in layerComps)
446
+ desc.lastAppliedComp = layerComps.lastApplied;
447
+ // console.log('CompList', require('util').inspect(desc, false, 99, true));
448
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'CompList', desc);
449
+ });
450
+ helpers_1.MOCK_HANDLERS && addHandler(1092, // ???
451
+ // ???
452
+ target => target._ir1092 !== undefined, (reader, target, left) => {
453
+ LOG_MOCK_HANDLERS && console.log('image resource 1092', left());
454
+ // 16 bytes, seems to be 4 integers
455
+ target._ir1092 = (0, psdReader_1.readBytes)(reader, left());
456
+ }, (writer, target) => {
457
+ (0, psdWriter_1.writeBytes)(writer, target._ir1092);
458
+ });
459
+ // 0 - normal, 7 - multiply, 8 - screen, 23 - difference
460
+ const onionSkinsBlendModes = [
461
+ 'normal', undefined, undefined, undefined, undefined, undefined, undefined, 'multiply',
462
+ 'screen', undefined, undefined, undefined, undefined, undefined, undefined, undefined,
463
+ undefined, undefined, undefined, undefined, undefined, undefined, undefined, 'difference',
464
+ ];
465
+ addHandler(1078, // Onion Skins
466
+ // Onion Skins
467
+ target => target.onionSkins !== undefined, (reader, target) => {
468
+ const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
469
+ // console.log('1078', require('util').inspect(desc, false, 99, true));
470
+ target.onionSkins = {
471
+ enabled: desc.enab,
472
+ framesBefore: desc.numBefore,
473
+ framesAfter: desc.numAfter,
474
+ frameSpacing: desc.Spcn,
475
+ minOpacity: desc.minOpacity / 100,
476
+ maxOpacity: desc.maxOpacity / 100,
477
+ blendMode: onionSkinsBlendModes[desc.BlnM] || 'normal',
478
+ };
479
+ }, (writer, target) => {
480
+ const onionSkins = target.onionSkins;
481
+ const desc = {
482
+ Vrsn: 1,
483
+ enab: onionSkins.enabled,
484
+ numBefore: onionSkins.framesBefore,
485
+ numAfter: onionSkins.framesAfter,
486
+ Spcn: onionSkins.frameSpacing,
487
+ minOpacity: (onionSkins.minOpacity * 100) | 0,
488
+ maxOpacity: (onionSkins.maxOpacity * 100) | 0,
489
+ BlnM: Math.max(0, onionSkinsBlendModes.indexOf(onionSkins.blendMode)),
490
+ };
491
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
492
+ });
493
+ addHandler(1075, // Timeline Information
494
+ // Timeline Information
495
+ target => target.timelineInformation !== undefined, (reader, target) => {
496
+ var _a, _b;
497
+ const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
498
+ target.timelineInformation = {
499
+ enabled: desc.enab,
500
+ frameStep: (0, descriptor_1.frac)(desc.frameStep),
501
+ frameRate: desc.frameRate,
502
+ time: (0, descriptor_1.frac)(desc.time),
503
+ duration: (0, descriptor_1.frac)(desc.duration),
504
+ workInTime: (0, descriptor_1.frac)(desc.workInTime),
505
+ workOutTime: (0, descriptor_1.frac)(desc.workOutTime),
506
+ repeats: desc.LCnt,
507
+ hasMotion: desc.hasMotion,
508
+ globalTracks: (0, descriptor_1.parseTrackList)(desc.globalTrackList, !!reader.logMissingFeatures),
509
+ };
510
+ if ((_b = (_a = desc.audioClipGroupList) === null || _a === void 0 ? void 0 : _a.audioClipGroupList) === null || _b === void 0 ? void 0 : _b.length) {
511
+ target.timelineInformation.audioClipGroups = desc.audioClipGroupList.audioClipGroupList.map(g => ({
512
+ id: g.groupID,
513
+ muted: g.muted,
514
+ audioClips: g.audioClipList.map(({ clipID, timeScope, muted, audioLevel, frameReader }) => ({
515
+ id: clipID,
516
+ start: (0, descriptor_1.frac)(timeScope.Strt),
517
+ duration: (0, descriptor_1.frac)(timeScope.duration),
518
+ inTime: (0, descriptor_1.frac)(timeScope.inTime),
519
+ outTime: (0, descriptor_1.frac)(timeScope.outTime),
520
+ muted: muted,
521
+ audioLevel: audioLevel,
522
+ frameReader: {
523
+ type: frameReader.frameReaderType,
524
+ mediaDescriptor: frameReader.mediaDescriptor,
525
+ link: {
526
+ name: frameReader['Lnk ']['Nm '],
527
+ fullPath: frameReader['Lnk '].fullPath,
528
+ relativePath: frameReader['Lnk '].relPath,
529
+ },
530
+ },
531
+ })),
532
+ }));
533
+ }
534
+ }, (writer, target) => {
535
+ var _a;
536
+ const timeline = target.timelineInformation;
537
+ const desc = {
538
+ Vrsn: 1,
539
+ enab: timeline.enabled,
540
+ frameStep: timeline.frameStep,
541
+ frameRate: timeline.frameRate,
542
+ time: timeline.time,
543
+ duration: timeline.duration,
544
+ workInTime: timeline.workInTime,
545
+ workOutTime: timeline.workOutTime,
546
+ LCnt: timeline.repeats,
547
+ globalTrackList: (0, descriptor_1.serializeTrackList)(timeline.globalTracks),
548
+ audioClipGroupList: {
549
+ audioClipGroupList: (_a = timeline.audioClipGroups) === null || _a === void 0 ? void 0 : _a.map(a => ({
550
+ groupID: a.id,
551
+ muted: a.muted,
552
+ audioClipList: a.audioClips.map(c => ({
553
+ clipID: c.id,
554
+ timeScope: {
555
+ Vrsn: 1,
556
+ Strt: c.start,
557
+ duration: c.duration,
558
+ inTime: c.inTime,
559
+ outTime: c.outTime,
560
+ },
561
+ frameReader: {
562
+ frameReaderType: c.frameReader.type,
563
+ descVersion: 1,
564
+ 'Lnk ': {
565
+ descVersion: 1,
566
+ 'Nm ': c.frameReader.link.name,
567
+ fullPath: c.frameReader.link.fullPath,
568
+ relPath: c.frameReader.link.relativePath,
569
+ },
570
+ mediaDescriptor: c.frameReader.mediaDescriptor,
571
+ },
572
+ muted: c.muted,
573
+ audioLevel: c.audioLevel,
574
+ })),
575
+ })),
576
+ },
577
+ hasMotion: timeline.hasMotion,
578
+ };
579
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc, 'anim');
580
+ });
581
+ addHandler(1076, // Sheet Disclosure
582
+ // Sheet Disclosure
583
+ target => target.sheetDisclosure !== undefined, (reader, target) => {
584
+ const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
585
+ target.sheetDisclosure = {};
586
+ if (desc.sheetTimelineOptions) {
587
+ target.sheetDisclosure.sheetTimelineOptions = desc.sheetTimelineOptions.map(o => ({
588
+ sheetID: o.sheetID,
589
+ sheetDisclosed: o.sheetDisclosed,
590
+ lightsDisclosed: o.lightsDisclosed,
591
+ meshesDisclosed: o.meshesDisclosed,
592
+ materialsDisclosed: o.materialsDisclosed,
593
+ }));
594
+ }
595
+ }, (writer, target) => {
596
+ const disclosure = target.sheetDisclosure;
597
+ const desc = { Vrsn: 1 };
598
+ if (disclosure.sheetTimelineOptions) {
599
+ desc.sheetTimelineOptions = disclosure.sheetTimelineOptions.map(d => ({
600
+ Vrsn: 2,
601
+ sheetID: d.sheetID,
602
+ sheetDisclosed: d.sheetDisclosed,
603
+ lightsDisclosed: d.lightsDisclosed,
604
+ meshesDisclosed: d.meshesDisclosed,
605
+ materialsDisclosed: d.materialsDisclosed,
606
+ }));
607
+ }
608
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
609
+ });
610
+ addHandler(1054, // URL List
611
+ // URL List
612
+ target => target.urlsList !== undefined, (reader, target) => {
613
+ const count = (0, psdReader_1.readUint32)(reader);
614
+ target.urlsList = [];
615
+ for (let i = 0; i < count; i++) {
616
+ const long = (0, psdReader_1.readSignature)(reader);
617
+ if (long !== 'slic' && reader.throwForMissingFeatures)
618
+ throw new Error('Unknown long');
619
+ const id = (0, psdReader_1.readUint32)(reader);
620
+ const url = (0, psdReader_1.readUnicodeString)(reader);
621
+ target.urlsList.push({ id, url, ref: 'slice' });
622
+ }
623
+ }, (writer, target) => {
624
+ const list = target.urlsList;
625
+ (0, psdWriter_1.writeUint32)(writer, list.length);
626
+ for (let i = 0; i < list.length; i++) {
627
+ (0, psdWriter_1.writeSignature)(writer, 'slic');
628
+ (0, psdWriter_1.writeUint32)(writer, list[i].id);
629
+ (0, psdWriter_1.writeUnicodeString)(writer, list[i].url);
630
+ }
631
+ });
632
+ function boundsToBounds(bounds) {
633
+ return { 'Top ': bounds.top, Left: bounds.left, Btom: bounds.bottom, Rght: bounds.right };
634
+ }
635
+ function boundsFromBounds(bounds) {
636
+ return { top: bounds['Top '], left: bounds.Left, bottom: bounds.Btom, right: bounds.Rght };
637
+ }
638
+ function clamped(array, index) {
639
+ return array[Math.max(0, Math.min(array.length - 1, index))];
640
+ }
641
+ const sliceOrigins = ['autoGenerated', 'layer', 'userGenerated'];
642
+ const sliceTypes = ['noImage', 'image'];
643
+ const sliceAlignments = ['default'];
644
+ addHandler(1050, // Slices
645
+ // Slices
646
+ target => target.slices ? target.slices.length : 0, (reader, target) => {
647
+ const version = (0, psdReader_1.readUint32)(reader);
648
+ if (version === 6) {
649
+ if (!target.slices)
650
+ target.slices = [];
651
+ const top = (0, psdReader_1.readInt32)(reader);
652
+ const left = (0, psdReader_1.readInt32)(reader);
653
+ const bottom = (0, psdReader_1.readInt32)(reader);
654
+ const right = (0, psdReader_1.readInt32)(reader);
655
+ const groupName = (0, psdReader_1.readUnicodeString)(reader);
656
+ const count = (0, psdReader_1.readUint32)(reader);
657
+ target.slices.push({ bounds: { top, left, bottom, right }, groupName, slices: [] });
658
+ const slices = target.slices[target.slices.length - 1].slices;
659
+ for (let i = 0; i < count; i++) {
660
+ const id = (0, psdReader_1.readUint32)(reader);
661
+ const groupId = (0, psdReader_1.readUint32)(reader);
662
+ const origin = clamped(sliceOrigins, (0, psdReader_1.readUint32)(reader));
663
+ const associatedLayerId = origin == 'layer' ? (0, psdReader_1.readUint32)(reader) : 0;
664
+ const name = (0, psdReader_1.readUnicodeString)(reader);
665
+ const type = clamped(sliceTypes, (0, psdReader_1.readUint32)(reader));
666
+ const left = (0, psdReader_1.readInt32)(reader);
667
+ const top = (0, psdReader_1.readInt32)(reader);
668
+ const right = (0, psdReader_1.readInt32)(reader);
669
+ const bottom = (0, psdReader_1.readInt32)(reader);
670
+ const url = (0, psdReader_1.readUnicodeString)(reader);
671
+ const target = (0, psdReader_1.readUnicodeString)(reader);
672
+ const message = (0, psdReader_1.readUnicodeString)(reader);
673
+ const altTag = (0, psdReader_1.readUnicodeString)(reader);
674
+ const cellTextIsHTML = !!(0, psdReader_1.readUint8)(reader);
675
+ const cellText = (0, psdReader_1.readUnicodeString)(reader);
676
+ const horizontalAlignment = clamped(sliceAlignments, (0, psdReader_1.readUint32)(reader));
677
+ const verticalAlignment = clamped(sliceAlignments, (0, psdReader_1.readUint32)(reader));
678
+ const a = (0, psdReader_1.readUint8)(reader);
679
+ const r = (0, psdReader_1.readUint8)(reader);
680
+ const g = (0, psdReader_1.readUint8)(reader);
681
+ const b = (0, psdReader_1.readUint8)(reader);
682
+ const backgroundColorType = ((a + r + g + b) === 0) ? 'none' : (a === 0 ? 'matte' : 'color');
683
+ slices.push({
684
+ id, groupId, origin, associatedLayerId, name, target, message, altTag, cellTextIsHTML, cellText,
685
+ horizontalAlignment, verticalAlignment, type, url,
686
+ bounds: { top, left, bottom, right },
687
+ backgroundColorType, backgroundColor: { r, g, b, a },
688
+ });
689
+ }
690
+ const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
691
+ desc.slices.forEach(d => {
692
+ const slice = slices.find(s => d.sliceID == s.id);
693
+ if (slice) {
694
+ slice.topOutset = d.topOutset;
695
+ slice.leftOutset = d.leftOutset;
696
+ slice.bottomOutset = d.bottomOutset;
697
+ slice.rightOutset = d.rightOutset;
698
+ }
699
+ });
700
+ }
701
+ else if (version === 7 || version === 8) {
702
+ const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
703
+ if (!target.slices)
704
+ target.slices = [];
705
+ target.slices.push({
706
+ groupName: desc.baseName,
707
+ bounds: boundsFromBounds(desc.bounds),
708
+ slices: desc.slices.map(s => (Object.assign(Object.assign({}, (s['Nm '] ? { name: s['Nm '] } : {})), { id: s.sliceID, groupId: s.groupID, associatedLayerId: 0, origin: descriptor_1.ESliceOrigin.decode(s.origin), type: descriptor_1.ESliceType.decode(s.Type), bounds: boundsFromBounds(s.bounds), url: s.url, target: s.null, message: s.Msge, altTag: s.altTag, cellTextIsHTML: s.cellTextIsHTML, cellText: s.cellText, horizontalAlignment: descriptor_1.ESliceHorzAlign.decode(s.horzAlign), verticalAlignment: descriptor_1.ESliceVertAlign.decode(s.vertAlign), backgroundColorType: descriptor_1.ESliceBGColorType.decode(s.bgColorType), backgroundColor: s.bgColor ? { r: s.bgColor['Rd '], g: s.bgColor['Grn '], b: s.bgColor['Bl '], a: s.bgColor.alpha } : { r: 0, g: 0, b: 0, a: 0 }, topOutset: s.topOutset || 0, leftOutset: s.leftOutset || 0, bottomOutset: s.bottomOutset || 0, rightOutset: s.rightOutset || 0 }))),
709
+ });
710
+ }
711
+ else {
712
+ throw new Error(`Invalid slices version (${version})`);
713
+ }
714
+ }, (writer, target, index) => {
715
+ const { bounds, groupName, slices } = target.slices[index];
716
+ (0, psdWriter_1.writeUint32)(writer, 6); // version
717
+ (0, psdWriter_1.writeInt32)(writer, bounds.top);
718
+ (0, psdWriter_1.writeInt32)(writer, bounds.left);
719
+ (0, psdWriter_1.writeInt32)(writer, bounds.bottom);
720
+ (0, psdWriter_1.writeInt32)(writer, bounds.right);
721
+ (0, psdWriter_1.writeUnicodeString)(writer, groupName);
722
+ (0, psdWriter_1.writeUint32)(writer, slices.length);
723
+ for (let i = 0; i < slices.length; i++) {
724
+ const slice = slices[i];
725
+ let { a, r, g, b } = slice.backgroundColor;
726
+ if (slice.backgroundColorType === 'none') {
727
+ a = r = g = b = 0;
728
+ }
729
+ else if (slice.backgroundColorType === 'matte') {
730
+ a = 0;
731
+ r = g = b = 255;
732
+ }
733
+ (0, psdWriter_1.writeUint32)(writer, slice.id);
734
+ (0, psdWriter_1.writeUint32)(writer, slice.groupId);
735
+ (0, psdWriter_1.writeUint32)(writer, sliceOrigins.indexOf(slice.origin));
736
+ if (slice.origin === 'layer')
737
+ (0, psdWriter_1.writeUint32)(writer, slice.associatedLayerId);
738
+ (0, psdWriter_1.writeUnicodeString)(writer, slice.name || '');
739
+ (0, psdWriter_1.writeUint32)(writer, sliceTypes.indexOf(slice.type));
740
+ (0, psdWriter_1.writeInt32)(writer, slice.bounds.left);
741
+ (0, psdWriter_1.writeInt32)(writer, slice.bounds.top);
742
+ (0, psdWriter_1.writeInt32)(writer, slice.bounds.right);
743
+ (0, psdWriter_1.writeInt32)(writer, slice.bounds.bottom);
744
+ (0, psdWriter_1.writeUnicodeString)(writer, slice.url);
745
+ (0, psdWriter_1.writeUnicodeString)(writer, slice.target);
746
+ (0, psdWriter_1.writeUnicodeString)(writer, slice.message);
747
+ (0, psdWriter_1.writeUnicodeString)(writer, slice.altTag);
748
+ (0, psdWriter_1.writeUint8)(writer, slice.cellTextIsHTML ? 1 : 0);
749
+ (0, psdWriter_1.writeUnicodeString)(writer, slice.cellText);
750
+ (0, psdWriter_1.writeUint32)(writer, sliceAlignments.indexOf(slice.horizontalAlignment));
751
+ (0, psdWriter_1.writeUint32)(writer, sliceAlignments.indexOf(slice.verticalAlignment));
752
+ (0, psdWriter_1.writeUint8)(writer, a);
753
+ (0, psdWriter_1.writeUint8)(writer, r);
754
+ (0, psdWriter_1.writeUint8)(writer, g);
755
+ (0, psdWriter_1.writeUint8)(writer, b);
756
+ }
757
+ const desc = {
758
+ bounds: boundsToBounds(bounds),
759
+ slices: [],
760
+ };
761
+ slices.forEach(s => {
762
+ const slice = Object.assign(Object.assign({ sliceID: s.id, groupID: s.groupId, origin: descriptor_1.ESliceOrigin.encode(s.origin), Type: descriptor_1.ESliceType.encode(s.type), bounds: boundsToBounds(s.bounds) }, (s.name ? { 'Nm ': s.name } : {})), { url: s.url, null: s.target, Msge: s.message, altTag: s.altTag, cellTextIsHTML: s.cellTextIsHTML, cellText: s.cellText, horzAlign: descriptor_1.ESliceHorzAlign.encode(s.horizontalAlignment), vertAlign: descriptor_1.ESliceVertAlign.encode(s.verticalAlignment), bgColorType: descriptor_1.ESliceBGColorType.encode(s.backgroundColorType) });
763
+ if (s.backgroundColorType === 'color') {
764
+ const { r, g, b, a } = s.backgroundColor;
765
+ slice.bgColor = { 'Rd ': r, 'Grn ': g, 'Bl ': b, alpha: a };
766
+ }
767
+ slice.topOutset = s.topOutset || 0;
768
+ slice.leftOutset = s.leftOutset || 0;
769
+ slice.bottomOutset = s.bottomOutset || 0;
770
+ slice.rightOutset = s.rightOutset || 0;
771
+ desc.slices.push(slice);
772
+ });
773
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc, 'slices');
774
+ });
775
+ addHandler(1064, target => target.pixelAspectRatio !== undefined, (reader, target) => {
776
+ if ((0, psdReader_1.readUint32)(reader) > 2)
777
+ throw new Error('Invalid pixelAspectRatio version');
778
+ target.pixelAspectRatio = { aspect: (0, psdReader_1.readFloat64)(reader) };
779
+ }, (writer, target) => {
780
+ (0, psdWriter_1.writeUint32)(writer, 2); // version
781
+ (0, psdWriter_1.writeFloat64)(writer, target.pixelAspectRatio.aspect);
782
+ });
783
+ addHandler(1041, target => target.iccUntaggedProfile !== undefined, (reader, target) => {
784
+ target.iccUntaggedProfile = !!(0, psdReader_1.readUint8)(reader);
785
+ }, (writer, target) => {
786
+ (0, psdWriter_1.writeUint8)(writer, target.iccUntaggedProfile ? 1 : 0);
787
+ });
788
+ helpers_1.MOCK_HANDLERS && addHandler(1039, // ICC Profile
789
+ // ICC Profile
790
+ target => target._ir1039 !== undefined, (reader, target, left) => {
791
+ // TODO: this is raw bytes, just return as a byte array
792
+ LOG_MOCK_HANDLERS && console.log('image resource 1039', left());
793
+ target._ir1039 = (0, psdReader_1.readBytes)(reader, left());
794
+ }, (writer, target) => {
795
+ (0, psdWriter_1.writeBytes)(writer, target._ir1039);
796
+ });
797
+ addHandler(1044, target => target.idsSeedNumber !== undefined, (reader, target) => target.idsSeedNumber = (0, psdReader_1.readUint32)(reader), (writer, target) => (0, psdWriter_1.writeUint32)(writer, target.idsSeedNumber));
798
+ addHandler(1036, target => target.thumbnail !== undefined || target.thumbnailRaw !== undefined, (reader, target, left) => {
799
+ const format = (0, psdReader_1.readUint32)(reader); // 1 = kJpegRGB, 0 = kRawRGB
800
+ const width = (0, psdReader_1.readUint32)(reader);
801
+ const height = (0, psdReader_1.readUint32)(reader);
802
+ (0, psdReader_1.readUint32)(reader); // widthBytes = (width * bits_per_pixel + 31) / 32 * 4.
803
+ (0, psdReader_1.readUint32)(reader); // totalSize = widthBytes * height * planes
804
+ (0, psdReader_1.readUint32)(reader); // sizeAfterCompression
805
+ const bitsPerPixel = (0, psdReader_1.readUint16)(reader); // 24
806
+ const planes = (0, psdReader_1.readUint16)(reader); // 1
807
+ if (format !== 1 || bitsPerPixel !== 24 || planes !== 1) {
808
+ reader.logMissingFeatures && reader.log(`Invalid thumbnail data (format: ${format}, bitsPerPixel: ${bitsPerPixel}, planes: ${planes})`);
809
+ (0, psdReader_1.skipBytes)(reader, left());
810
+ return;
811
+ }
812
+ const size = left();
813
+ const data = (0, psdReader_1.readBytes)(reader, size);
814
+ if (reader.useRawThumbnail) {
815
+ target.thumbnailRaw = { width, height, data };
816
+ }
817
+ else if (data.byteLength) {
818
+ target.thumbnail = (0, helpers_1.createCanvasFromData)(data);
819
+ }
820
+ }, (writer, target) => {
821
+ var _a;
822
+ let width = 0;
823
+ let height = 0;
824
+ let data = new Uint8Array(0);
825
+ if (target.thumbnailRaw) {
826
+ width = target.thumbnailRaw.width;
827
+ height = target.thumbnailRaw.height;
828
+ data = target.thumbnailRaw.data;
829
+ }
830
+ else {
831
+ try {
832
+ const dataUrl = (_a = target.thumbnail.toDataURL('image/jpeg', 1)) === null || _a === void 0 ? void 0 : _a.substring('data:image/jpeg;base64,'.length);
833
+ if (dataUrl) {
834
+ data = (0, base64_js_1.toByteArray)(dataUrl); // this sometimes fails for some reason, maybe some browser bugs
835
+ width = target.thumbnail.width;
836
+ height = target.thumbnail.height;
837
+ }
838
+ }
839
+ catch (_b) { }
840
+ }
841
+ const bitsPerPixel = 24;
842
+ const widthBytes = Math.floor((width * bitsPerPixel + 31) / 32) * 4;
843
+ const planes = 1;
844
+ const totalSize = widthBytes * height * planes;
845
+ const sizeAfterCompression = data.length;
846
+ (0, psdWriter_1.writeUint32)(writer, 1); // 1 = kJpegRGB
847
+ (0, psdWriter_1.writeUint32)(writer, width);
848
+ (0, psdWriter_1.writeUint32)(writer, height);
849
+ (0, psdWriter_1.writeUint32)(writer, widthBytes);
850
+ (0, psdWriter_1.writeUint32)(writer, totalSize);
851
+ (0, psdWriter_1.writeUint32)(writer, sizeAfterCompression);
852
+ (0, psdWriter_1.writeUint16)(writer, bitsPerPixel);
853
+ (0, psdWriter_1.writeUint16)(writer, planes);
854
+ (0, psdWriter_1.writeBytes)(writer, data);
855
+ });
856
+ addHandler(1057, target => target.versionInfo !== undefined, (reader, target, left) => {
857
+ const version = (0, psdReader_1.readUint32)(reader);
858
+ if (version !== 1)
859
+ throw new Error('Invalid versionInfo version');
860
+ target.versionInfo = {
861
+ hasRealMergedData: !!(0, psdReader_1.readUint8)(reader),
862
+ writerName: (0, psdReader_1.readUnicodeString)(reader),
863
+ readerName: (0, psdReader_1.readUnicodeString)(reader),
864
+ fileVersion: (0, psdReader_1.readUint32)(reader),
865
+ };
866
+ (0, psdReader_1.skipBytes)(reader, left());
867
+ }, (writer, target) => {
868
+ const versionInfo = target.versionInfo;
869
+ (0, psdWriter_1.writeUint32)(writer, 1); // version
870
+ (0, psdWriter_1.writeUint8)(writer, versionInfo.hasRealMergedData ? 1 : 0);
871
+ (0, psdWriter_1.writeUnicodeString)(writer, versionInfo.writerName);
872
+ (0, psdWriter_1.writeUnicodeString)(writer, versionInfo.readerName);
873
+ (0, psdWriter_1.writeUint32)(writer, versionInfo.fileVersion);
874
+ });
875
+ helpers_1.MOCK_HANDLERS && addHandler(1058, // EXIF data 1.
876
+ // EXIF data 1.
877
+ target => target._ir1058 !== undefined, (reader, target, left) => {
878
+ LOG_MOCK_HANDLERS && console.log('image resource 1058', left());
879
+ target._ir1058 = (0, psdReader_1.readBytes)(reader, left());
880
+ }, (writer, target) => {
881
+ (0, psdWriter_1.writeBytes)(writer, target._ir1058);
882
+ });
883
+ addHandler(7000, target => target.imageReadyVariables !== undefined, (reader, target, left) => {
884
+ target.imageReadyVariables = readUtf8String(reader, left());
885
+ }, (writer, target) => {
886
+ writeUtf8String(writer, target.imageReadyVariables);
887
+ });
888
+ addHandler(7001, target => target.imageReadyDataSets !== undefined, (reader, target, left) => {
889
+ target.imageReadyDataSets = readUtf8String(reader, left());
890
+ }, (writer, target) => {
891
+ writeUtf8String(writer, target.imageReadyDataSets);
892
+ });
893
+ addHandler(1088, target => target.pathSelectionState !== undefined, (reader, target, _left) => {
894
+ const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
895
+ target.pathSelectionState = desc['null'];
896
+ }, (writer, target) => {
897
+ const desc = { 'null': target.pathSelectionState };
898
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
899
+ });
900
+ helpers_1.MOCK_HANDLERS && addHandler(1025, target => target._ir1025 !== undefined, (reader, target, left) => {
901
+ LOG_MOCK_HANDLERS && console.log('image resource 1025', left());
902
+ target._ir1025 = (0, psdReader_1.readBytes)(reader, left());
903
+ }, (writer, target) => {
904
+ (0, psdWriter_1.writeBytes)(writer, target._ir1025);
905
+ });
906
+ const FrmD = (0, helpers_1.createEnum)('FrmD', '', {
907
+ auto: 'Auto',
908
+ none: 'None',
909
+ dispose: 'Disp',
910
+ });
911
+ addHandler(4000, // Plug-In resource(s)
912
+ // Plug-In resource(s)
913
+ target => target.animations !== undefined, (reader, target, left) => {
914
+ const key = (0, psdReader_1.readSignature)(reader);
915
+ if (key === 'mani') {
916
+ (0, psdReader_1.checkSignature)(reader, 'IRFR');
917
+ (0, psdReader_1.readSection)(reader, 1, left => {
918
+ while (left() > 0) {
919
+ (0, psdReader_1.checkSignature)(reader, '8BIM');
920
+ const key = (0, psdReader_1.readSignature)(reader);
921
+ (0, psdReader_1.readSection)(reader, 1, left => {
922
+ if (key === 'AnDs') {
923
+ const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
924
+ target.animations = {
925
+ // desc.AFSt ???
926
+ frames: desc.FrIn.map(x => ({
927
+ id: x.FrID,
928
+ delay: (x.FrDl || 0) / 100,
929
+ dispose: x.FrDs ? FrmD.decode(x.FrDs) : 'auto', // missing == auto
930
+ // x.FrGA ???
931
+ })),
932
+ animations: desc.FSts.map(x => ({
933
+ id: x.FsID,
934
+ frames: x.FsFr,
935
+ repeats: x.LCnt,
936
+ activeFrame: x.AFrm || 0,
937
+ })),
938
+ };
939
+ // console.log('#4000 AnDs', require('util').inspect(desc, false, 99, true));
940
+ // console.log('#4000 AnDs:result', require('util').inspect(target.animations, false, 99, true));
941
+ }
942
+ else if (key === 'Roll') {
943
+ const bytes = (0, psdReader_1.readBytes)(reader, left());
944
+ reader.logDevFeatures && reader.log('#4000 Roll', bytes);
945
+ }
946
+ else {
947
+ reader.logMissingFeatures && reader.log('Unhandled subsection in #4000', key);
948
+ }
949
+ });
950
+ }
951
+ });
952
+ }
953
+ else if (key === 'mopt') {
954
+ const bytes = (0, psdReader_1.readBytes)(reader, left());
955
+ reader.logDevFeatures && reader.log('#4000 mopt', bytes);
956
+ }
957
+ else {
958
+ reader.logMissingFeatures && reader.log('Unhandled key in #4000:', key);
959
+ }
960
+ }, (writer, target) => {
961
+ if (target.animations) {
962
+ (0, psdWriter_1.writeSignature)(writer, 'mani');
963
+ (0, psdWriter_1.writeSignature)(writer, 'IRFR');
964
+ (0, psdWriter_1.writeSection)(writer, 1, () => {
965
+ (0, psdWriter_1.writeSignature)(writer, '8BIM');
966
+ (0, psdWriter_1.writeSignature)(writer, 'AnDs');
967
+ (0, psdWriter_1.writeSection)(writer, 1, () => {
968
+ const desc = {
969
+ // AFSt: 0, // ???
970
+ FrIn: [],
971
+ FSts: [],
972
+ };
973
+ for (let i = 0; i < target.animations.frames.length; i++) {
974
+ const f = target.animations.frames[i];
975
+ const frame = {
976
+ FrID: f.id,
977
+ };
978
+ if (f.delay)
979
+ frame.FrDl = (f.delay * 100) | 0;
980
+ frame.FrDs = FrmD.encode(f.dispose);
981
+ // if (i === 0) frame.FrGA = 30; // ???
982
+ desc.FrIn.push(frame);
983
+ }
984
+ for (let i = 0; i < target.animations.animations.length; i++) {
985
+ const a = target.animations.animations[i];
986
+ const anim = {
987
+ FsID: a.id,
988
+ AFrm: a.activeFrame | 0,
989
+ FsFr: a.frames,
990
+ LCnt: a.repeats | 0,
991
+ };
992
+ desc.FSts.push(anim);
993
+ }
994
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
995
+ });
996
+ // writeSignature(writer, '8BIM');
997
+ // writeSignature(writer, 'Roll');
998
+ // writeSection(writer, 1, () => {
999
+ // writeZeros(writer, 8);
1000
+ // });
1001
+ });
1002
+ }
1003
+ });
1004
+ // TODO: Unfinished
1005
+ helpers_1.MOCK_HANDLERS && addHandler(4001, // Plug-In resource(s)
1006
+ // Plug-In resource(s)
1007
+ target => target._ir4001 !== undefined, (reader, target, left) => {
1008
+ if (helpers_1.MOCK_HANDLERS) {
1009
+ LOG_MOCK_HANDLERS && console.log('image resource 4001', left());
1010
+ target._ir4001 = (0, psdReader_1.readBytes)(reader, left());
1011
+ return;
1012
+ }
1013
+ const key = (0, psdReader_1.readSignature)(reader);
1014
+ if (key === 'mfri') {
1015
+ const version = (0, psdReader_1.readUint32)(reader);
1016
+ if (version !== 2)
1017
+ throw new Error('Invalid mfri version');
1018
+ const length = (0, psdReader_1.readUint32)(reader);
1019
+ const bytes = (0, psdReader_1.readBytes)(reader, length);
1020
+ reader.logDevFeatures && reader.log('mfri', bytes);
1021
+ }
1022
+ else if (key === 'mset') {
1023
+ const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
1024
+ reader.logDevFeatures && reader.log('mset', desc);
1025
+ }
1026
+ else {
1027
+ reader.logMissingFeatures && reader.log('Unhandled key in #4001', key);
1028
+ }
1029
+ }, (writer, target) => {
1030
+ (0, psdWriter_1.writeBytes)(writer, target._ir4001);
1031
+ });
1032
+ // TODO: Unfinished
1033
+ helpers_1.MOCK_HANDLERS && addHandler(4002, // Plug-In resource(s)
1034
+ // Plug-In resource(s)
1035
+ target => target._ir4002 !== undefined, (reader, target, left) => {
1036
+ LOG_MOCK_HANDLERS && console.log('image resource 4002', left());
1037
+ target._ir4002 = (0, psdReader_1.readBytes)(reader, left());
1038
+ }, (writer, target) => {
1039
+ (0, psdWriter_1.writeBytes)(writer, target._ir4002);
1040
+ });
1038
1041
  //# sourceMappingURL=imageResources.js.map