ag-psd 31.0.3 → 32.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 (138) hide show
  1. package/.v8-cache/v24.7.0-x64-ef5a0af0/00d0e0b4 +0 -0
  2. package/.v8-cache/v24.7.0-x64-ef5a0af0/05135617 +0 -0
  3. package/.v8-cache/v24.7.0-x64-ef5a0af0/0cc76730 +0 -0
  4. package/.v8-cache/v24.7.0-x64-ef5a0af0/1130885f +0 -0
  5. package/.v8-cache/v24.7.0-x64-ef5a0af0/20729831 +0 -0
  6. package/.v8-cache/v24.7.0-x64-ef5a0af0/214a593b +0 -0
  7. package/.v8-cache/v24.7.0-x64-ef5a0af0/226e2801 +0 -0
  8. package/.v8-cache/v24.7.0-x64-ef5a0af0/25f8b84a +0 -0
  9. package/.v8-cache/v24.7.0-x64-ef5a0af0/27518289 +0 -0
  10. package/.v8-cache/v24.7.0-x64-ef5a0af0/330ef2d9 +0 -0
  11. package/.v8-cache/v24.7.0-x64-ef5a0af0/37ff16b8 +0 -0
  12. package/.v8-cache/v24.7.0-x64-ef5a0af0/3f72a97c +0 -0
  13. package/.v8-cache/v24.7.0-x64-ef5a0af0/4511bacf +0 -0
  14. package/.v8-cache/v24.7.0-x64-ef5a0af0/68416cb2 +0 -0
  15. package/.v8-cache/v24.7.0-x64-ef5a0af0/71df9cb3 +0 -0
  16. package/.v8-cache/v24.7.0-x64-ef5a0af0/75efccd4 +0 -0
  17. package/.v8-cache/v24.7.0-x64-ef5a0af0/762f9305 +0 -0
  18. package/.v8-cache/v24.7.0-x64-ef5a0af0/7bcfc50a +0 -0
  19. package/.v8-cache/v24.7.0-x64-ef5a0af0/7ea06cea +0 -0
  20. package/.v8-cache/v24.7.0-x64-ef5a0af0/825e9a05 +0 -0
  21. package/.v8-cache/v24.7.0-x64-ef5a0af0/87372817 +0 -0
  22. package/.v8-cache/v24.7.0-x64-ef5a0af0/87cf2209 +0 -0
  23. package/.v8-cache/v24.7.0-x64-ef5a0af0/891a7c73 +0 -0
  24. package/.v8-cache/v24.7.0-x64-ef5a0af0/8b68a3a2 +0 -0
  25. package/.v8-cache/v24.7.0-x64-ef5a0af0/932f0770 +0 -0
  26. package/.v8-cache/v24.7.0-x64-ef5a0af0/a1d12a93 +0 -0
  27. package/.v8-cache/v24.7.0-x64-ef5a0af0/a7e80865 +0 -0
  28. package/.v8-cache/v24.7.0-x64-ef5a0af0/ac317c9c +0 -0
  29. package/.v8-cache/v24.7.0-x64-ef5a0af0/acc36e66 +0 -0
  30. package/.v8-cache/v24.7.0-x64-ef5a0af0/b3c2fab7 +0 -0
  31. package/.v8-cache/v24.7.0-x64-ef5a0af0/b8569d6b +0 -0
  32. package/.v8-cache/v24.7.0-x64-ef5a0af0/b8b073c4 +0 -0
  33. package/.v8-cache/v24.7.0-x64-ef5a0af0/bb489c89 +0 -0
  34. package/.v8-cache/v24.7.0-x64-ef5a0af0/c0b789d2 +0 -0
  35. package/.v8-cache/v24.7.0-x64-ef5a0af0/c314aece +0 -0
  36. package/.v8-cache/v24.7.0-x64-ef5a0af0/c46725e1 +0 -0
  37. package/.v8-cache/v24.7.0-x64-ef5a0af0/c794cb34 +0 -0
  38. package/.v8-cache/v24.7.0-x64-ef5a0af0/cd4ae980 +0 -0
  39. package/.v8-cache/v24.7.0-x64-ef5a0af0/cfc49f4f +0 -0
  40. package/.v8-cache/v24.7.0-x64-ef5a0af0/cff9434a +0 -0
  41. package/.v8-cache/v24.7.0-x64-ef5a0af0/d02dd6f7 +0 -0
  42. package/.v8-cache/v24.7.0-x64-ef5a0af0/dc86f000 +0 -0
  43. package/.v8-cache/v24.7.0-x64-ef5a0af0/e03e2acd +0 -0
  44. package/.v8-cache/v24.7.0-x64-ef5a0af0/e6735171 +0 -0
  45. package/.v8-cache/v24.7.0-x64-ef5a0af0/f5417276 +0 -0
  46. package/.v8-cache/v24.7.0-x64-ef5a0af0/f6fd8125 +0 -0
  47. package/.v8-cache/v24.7.0-x64-ef5a0af0/f74d3518 +0 -0
  48. package/.v8-cache/v24.7.0-x64-ef5a0af0/f886deac +0 -0
  49. package/.v8-cache/v24.7.0-x64-ef5a0af0/fd0a2987 +0 -0
  50. package/.v8-cache/v24.7.0-x64-ef5a0af0/fe349423 +0 -0
  51. package/CHANGELOG.md +29 -0
  52. package/dist/abr.js +12 -5
  53. package/dist/abr.js.map +1 -1
  54. package/dist/additionalInfo.d.ts +2 -0
  55. package/dist/additionalInfo.js +123 -68
  56. package/dist/additionalInfo.js.map +1 -1
  57. package/dist/bundle.js +1365 -632
  58. package/dist/descriptor.d.ts +15 -2
  59. package/dist/descriptor.js +329 -100
  60. package/dist/descriptor.js.map +1 -1
  61. package/dist/effectsHelpers.js +12 -12
  62. package/dist/effectsHelpers.js.map +1 -1
  63. package/dist/engineData.d.ts +3 -1
  64. package/dist/engineData.js +34 -13
  65. package/dist/engineData.js.map +1 -1
  66. package/dist/engineData2.js +50 -21
  67. package/dist/engineData2.js.map +1 -1
  68. package/dist/helpers.d.ts +5 -2
  69. package/dist/helpers.js +18 -4
  70. package/dist/helpers.js.map +1 -1
  71. package/dist/imageResources.js +45 -21
  72. package/dist/imageResources.js.map +1 -1
  73. package/dist/index.js +1 -0
  74. package/dist/index.js.map +1 -1
  75. package/dist/jpeg.js +27 -7
  76. package/dist/jpeg.js.map +1 -1
  77. package/dist/psd.d.ts +6 -1
  78. package/dist/psdReader.d.ts +2 -2
  79. package/dist/psdReader.js +457 -270
  80. package/dist/psdReader.js.map +1 -1
  81. package/dist/psdWriter.d.ts +2 -0
  82. package/dist/psdWriter.js +98 -76
  83. package/dist/psdWriter.js.map +1 -1
  84. package/dist/text.js +126 -23
  85. package/dist/text.js.map +1 -1
  86. package/dist/utf8.js +36 -15
  87. package/dist/utf8.js.map +1 -1
  88. package/dist-es/abr.js +12 -5
  89. package/dist-es/abr.js.map +1 -1
  90. package/dist-es/additionalInfo.d.ts +2 -0
  91. package/dist-es/additionalInfo.js +123 -68
  92. package/dist-es/additionalInfo.js.map +1 -1
  93. package/dist-es/descriptor.d.ts +15 -2
  94. package/dist-es/descriptor.js +329 -100
  95. package/dist-es/descriptor.js.map +1 -1
  96. package/dist-es/effectsHelpers.js +12 -12
  97. package/dist-es/effectsHelpers.js.map +1 -1
  98. package/dist-es/engineData.d.ts +3 -1
  99. package/dist-es/engineData.js +34 -13
  100. package/dist-es/engineData.js.map +1 -1
  101. package/dist-es/engineData2.js +50 -21
  102. package/dist-es/engineData2.js.map +1 -1
  103. package/dist-es/helpers.d.ts +5 -2
  104. package/dist-es/helpers.js +18 -4
  105. package/dist-es/helpers.js.map +1 -1
  106. package/dist-es/imageResources.js +45 -21
  107. package/dist-es/imageResources.js.map +1 -1
  108. package/dist-es/index.js +1 -0
  109. package/dist-es/index.js.map +1 -1
  110. package/dist-es/jpeg.js +27 -7
  111. package/dist-es/jpeg.js.map +1 -1
  112. package/dist-es/psd.d.ts +6 -1
  113. package/dist-es/psdReader.d.ts +2 -2
  114. package/dist-es/psdReader.js +457 -270
  115. package/dist-es/psdReader.js.map +1 -1
  116. package/dist-es/psdWriter.d.ts +2 -0
  117. package/dist-es/psdWriter.js +98 -76
  118. package/dist-es/psdWriter.js.map +1 -1
  119. package/dist-es/text.js +126 -23
  120. package/dist-es/text.js.map +1 -1
  121. package/dist-es/utf8.js +36 -15
  122. package/dist-es/utf8.js.map +1 -1
  123. package/package.json +1 -1
  124. package/src/abr.ts +14 -6
  125. package/src/additionalInfo.ts +127 -66
  126. package/src/descriptor.ts +347 -107
  127. package/src/effectsHelpers.ts +9 -9
  128. package/src/engineData.ts +36 -13
  129. package/src/engineData2.ts +468 -432
  130. package/src/helpers.ts +19 -4
  131. package/src/imageResources.ts +49 -22
  132. package/src/index.ts +1 -0
  133. package/src/jpeg.ts +24 -9
  134. package/src/psd.ts +3 -1
  135. package/src/psdReader.ts +477 -260
  136. package/src/psdWriter.ts +100 -83
  137. package/src/text.ts +122 -12
  138. package/src/utf8.ts +35 -17
@@ -46,10 +46,10 @@ export function readEffects(reader: PsdReader) {
46
46
  case 'cmnS': { // common state (see See Effects layer, common state info)
47
47
  const size = readUint32(reader);
48
48
  const version = readUint32(reader);
49
- const visible = !!readUint8(reader);
49
+ readUint8(reader); // visible (not reliable, Photoshop writes 1 even if effects are disabled)
50
50
  skipBytes(reader, 2);
51
51
 
52
- if (size !== 7 || version !== 0 || !visible) throw new Error(`Invalid effects common state`);
52
+ if (size !== 7 || version !== 0) throw new Error(`Invalid effects common state`);
53
53
  break;
54
54
  }
55
55
  case 'dsdw': // drop shadow (see See Effects layer, drop shadow and inner shadow info)
@@ -224,7 +224,7 @@ export function writeEffects(writer: PsdWriter, effects: LayerEffectsInfo) {
224
224
  writeSignature(writer, 'cmnS');
225
225
  writeUint32(writer, 7); // size
226
226
  writeUint32(writer, 0); // version
227
- writeUint8(writer, 1); // visible
227
+ writeUint8(writer, 1); // visible (Photoshop writes 1 here even if effects are disabled)
228
228
  writeZeros(writer, 2);
229
229
 
230
230
  if (dropShadow) {
@@ -249,7 +249,7 @@ export function writeEffects(writer: PsdWriter, effects: LayerEffectsInfo) {
249
249
  writeColor(writer, outerGlow.color);
250
250
  writeBlendMode(writer, outerGlow.blendMode);
251
251
  writeUint8(writer, outerGlow.enabled ? 1 : 0);
252
- writeFixedPoint8(writer, outerGlow.opacity || 0);
252
+ writeFixedPoint8(writer, outerGlow.opacity ?? 1);
253
253
  writeColor(writer, outerGlow.color);
254
254
  }
255
255
 
@@ -263,7 +263,7 @@ export function writeEffects(writer: PsdWriter, effects: LayerEffectsInfo) {
263
263
  writeColor(writer, innerGlow.color);
264
264
  writeBlendMode(writer, innerGlow.blendMode);
265
265
  writeUint8(writer, innerGlow.enabled ? 1 : 0);
266
- writeFixedPoint8(writer, innerGlow.opacity || 0);
266
+ writeFixedPoint8(writer, innerGlow.opacity ?? 1);
267
267
  writeUint8(writer, 0); // inverted
268
268
  writeColor(writer, innerGlow.color);
269
269
  }
@@ -281,9 +281,9 @@ export function writeEffects(writer: PsdWriter, effects: LayerEffectsInfo) {
281
281
  writeColor(writer, bevel.highlightColor);
282
282
  writeColor(writer, bevel.shadowColor);
283
283
  const style = bevelStyles.indexOf(bevel.style!);
284
- writeUint8(writer, style <= 0 ? 1 : style);
285
- writeFixedPoint8(writer, bevel.highlightOpacity || 0);
286
- writeFixedPoint8(writer, bevel.shadowOpacity || 0);
284
+ writeUint8(writer, style <= 0 ? bevelStyles.indexOf('inner bevel') : style); // reader defaults to inner bevel
285
+ writeFixedPoint8(writer, bevel.highlightOpacity ?? 1);
286
+ writeFixedPoint8(writer, bevel.shadowOpacity ?? 1);
287
287
  writeUint8(writer, bevel.enabled ? 1 : 0);
288
288
  writeUint8(writer, bevel.useGlobalLight ? 1 : 0);
289
289
  writeUint8(writer, bevel.direction === 'down' ? 1 : 0);
@@ -298,7 +298,7 @@ export function writeEffects(writer: PsdWriter, effects: LayerEffectsInfo) {
298
298
  writeUint32(writer, 2);
299
299
  writeBlendMode(writer, solidFill.blendMode);
300
300
  writeColor(writer, solidFill.color);
301
- writeFixedPoint8(writer, solidFill.opacity || 0);
301
+ writeFixedPoint8(writer, solidFill.opacity ?? 1);
302
302
  writeUint8(writer, solidFill.enabled ? 1 : 0);
303
303
  writeColor(writer, solidFill.color);
304
304
  }
package/src/engineData.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { PsdReader } from "./psdReader";
2
+
1
3
  function isWhitespace(char: number) {
2
4
  // ' ', '\n', '\r', '\t'
3
5
  return char === 32 || char === 10 || char === 13 || char === 9;
@@ -8,7 +10,15 @@ function isNumber(char: number) {
8
10
  return (char >= 48 && char <= 57) || char === 46 || char === 45;
9
11
  }
10
12
 
11
- export function parseEngineData(data: number[] | Uint8Array) {
13
+ export function setProperty(target: any, key: string, value: any) {
14
+ if (key === '__proto__') { // avoid changing prototype of the object
15
+ Object.defineProperty(target, key, { value, enumerable: true, configurable: true, writable: true });
16
+ } else {
17
+ target[key] = value;
18
+ }
19
+ }
20
+
21
+ export function parseEngineData(data: number[] | Uint8Array, reader: Pick<PsdReader, 'log'>) {
12
22
  let index = 0;
13
23
 
14
24
  function skipWhitespace() {
@@ -81,7 +91,10 @@ export function parseEngineData(data: number[] | Uint8Array) {
81
91
  const top = stack[stack.length - 1];
82
92
 
83
93
  if (typeof top === 'string') {
84
- stack[stack.length - 2][top] = value;
94
+ const target = stack[stack.length - 2];
95
+
96
+ setProperty(target, top, value);
97
+
85
98
  pop();
86
99
  } else if (Array.isArray(top)) {
87
100
  top.push(value);
@@ -95,7 +108,8 @@ export function parseEngineData(data: number[] | Uint8Array) {
95
108
 
96
109
  const top = stack[stack.length - 1];
97
110
 
98
- if (top && typeof top === 'string') {
111
+ if (typeof top === 'string' || Array.isArray(top)) {
112
+ // name used as a value (either property value or array item)
99
113
  if (name === 'nil') {
100
114
  pushValue(null);
101
115
  } else {
@@ -116,6 +130,8 @@ export function parseEngineData(data: number[] | Uint8Array) {
116
130
  skipWhitespace();
117
131
 
118
132
  let dataLength = data.length;
133
+ let invalidTokens = 0;
134
+ let firstInvalidToken = '';
119
135
 
120
136
  while (dataLength > 0 && data[dataLength - 1] === 0) dataLength--; // trim 0 bytes from end
121
137
 
@@ -173,16 +189,18 @@ export function parseEngineData(data: number[] | Uint8Array) {
173
189
  pushValue(parseFloat(value));
174
190
  } else {
175
191
  index += 1;
176
- console.log(`Invalid token '${String.fromCharCode(char)}' (${char}) at ${index}`
177
- // + ` near '${String.fromCharCode.apply(null, data.slice(index - 10, index + 20) as any)}'`
178
- // + ` data [${Array.from(data.slice(index - 10, index + 20)).join(', ')}]`
179
- );
192
+ if (!invalidTokens) firstInvalidToken = `'${String.fromCharCode(char)}' (${char}) at ${index}`;
193
+ invalidTokens++;
180
194
  // throw new Error(`Invalid token ${String.fromCharCode(char)} at ${index}`);
181
195
  }
182
196
 
183
197
  skipWhitespace();
184
198
  }
185
199
 
200
+ if (invalidTokens) {
201
+ reader.log(`Invalid tokens in engine data (${invalidTokens} in total, first: ${firstInvalidToken})`);
202
+ }
203
+
186
204
  return root;
187
205
  }
188
206
 
@@ -195,7 +213,6 @@ const floatKeys = [
195
213
 
196
214
  const intArrays = ['RunLengthArray'];
197
215
 
198
- // TODO: handle /nil
199
216
  export function serializeEngineData(data: any, condensed = false) {
200
217
  let buffer = new Uint8Array(1024);
201
218
  let offset = 0;
@@ -235,18 +252,24 @@ export function serializeEngineData(data: any, condensed = false) {
235
252
  if (!condensed) writeString('\n');
236
253
  }
237
254
 
255
+ // NaN and Infinity can't be represented in engine data, write them as 0
256
+ function finite(value: number) {
257
+ return Number.isFinite(value) ? value : 0;
258
+ }
259
+
238
260
  function serializeInt(value: number) {
239
- return value.toString();
261
+ return finite(value).toString();
240
262
  }
241
263
 
242
264
  function serializeFloat(value: number) {
243
- return value.toFixed(5)
265
+ return finite(value).toFixed(5)
244
266
  .replace(/(\d)0+$/g, '$1')
245
267
  .replace(/^0+\.([1-9])/g, '.$1')
246
268
  .replace(/^-0+\.0(\d)/g, '-.0$1');
247
269
  }
248
270
 
249
271
  function serializeNumber(value: number, key?: string) {
272
+ value = finite(value);
250
273
  const isFloat = (key && floatKeys.indexOf(key) !== -1) || (value | 0) !== value;
251
274
  return isFloat ? serializeFloat(value) : serializeInt(value);
252
275
  }
@@ -280,7 +303,7 @@ export function serializeEngineData(data: any, condensed = false) {
280
303
  }
281
304
  }
282
305
 
283
- if (value === null) {
306
+ if (value === null || value === undefined) { // undefined is only written for array items, properties are skipped
284
307
  writePrefix();
285
308
  writeString(condensed ? '/nil' : 'null');
286
309
  } else if (typeof value === 'number') {
@@ -344,7 +367,7 @@ export function serializeEngineData(data: any, condensed = false) {
344
367
  indent++;
345
368
 
346
369
  for (const key of getKeys(value)) {
347
- writeProperty(key, value[key]);
370
+ if (value[key] !== undefined) writeProperty(key, value[key]);
348
371
  }
349
372
 
350
373
  indent--;
@@ -358,7 +381,7 @@ export function serializeEngineData(data: any, condensed = false) {
358
381
  if (condensed) {
359
382
  if (typeof data === 'object') {
360
383
  for (const key of getKeys(data)) {
361
- writeProperty(key, data[key]);
384
+ if (data[key] !== undefined) writeProperty(key, data[key]);
362
385
  }
363
386
  }
364
387
  } else {