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.
- package/.v8-cache/v24.7.0-x64-ef5a0af0/00d0e0b4 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/05135617 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/0cc76730 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/1130885f +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/20729831 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/214a593b +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/226e2801 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/25f8b84a +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/27518289 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/330ef2d9 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/37ff16b8 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/3f72a97c +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/4511bacf +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/68416cb2 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/71df9cb3 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/75efccd4 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/762f9305 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/7bcfc50a +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/7ea06cea +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/825e9a05 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/87372817 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/87cf2209 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/891a7c73 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/8b68a3a2 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/932f0770 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/a1d12a93 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/a7e80865 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/ac317c9c +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/acc36e66 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/b3c2fab7 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/b8569d6b +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/b8b073c4 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/bb489c89 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/c0b789d2 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/c314aece +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/c46725e1 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/c794cb34 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/cd4ae980 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/cfc49f4f +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/cff9434a +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/d02dd6f7 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/dc86f000 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/e03e2acd +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/e6735171 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/f5417276 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/f6fd8125 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/f74d3518 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/f886deac +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/fd0a2987 +0 -0
- package/.v8-cache/v24.7.0-x64-ef5a0af0/fe349423 +0 -0
- package/CHANGELOG.md +29 -0
- package/dist/abr.js +12 -5
- package/dist/abr.js.map +1 -1
- package/dist/additionalInfo.d.ts +2 -0
- package/dist/additionalInfo.js +123 -68
- package/dist/additionalInfo.js.map +1 -1
- package/dist/bundle.js +1365 -632
- package/dist/descriptor.d.ts +15 -2
- package/dist/descriptor.js +329 -100
- package/dist/descriptor.js.map +1 -1
- package/dist/effectsHelpers.js +12 -12
- package/dist/effectsHelpers.js.map +1 -1
- package/dist/engineData.d.ts +3 -1
- package/dist/engineData.js +34 -13
- package/dist/engineData.js.map +1 -1
- package/dist/engineData2.js +50 -21
- package/dist/engineData2.js.map +1 -1
- package/dist/helpers.d.ts +5 -2
- package/dist/helpers.js +18 -4
- package/dist/helpers.js.map +1 -1
- package/dist/imageResources.js +45 -21
- package/dist/imageResources.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/jpeg.js +27 -7
- package/dist/jpeg.js.map +1 -1
- package/dist/psd.d.ts +6 -1
- package/dist/psdReader.d.ts +2 -2
- package/dist/psdReader.js +457 -270
- package/dist/psdReader.js.map +1 -1
- package/dist/psdWriter.d.ts +2 -0
- package/dist/psdWriter.js +98 -76
- package/dist/psdWriter.js.map +1 -1
- package/dist/text.js +126 -23
- package/dist/text.js.map +1 -1
- package/dist/utf8.js +36 -15
- package/dist/utf8.js.map +1 -1
- package/dist-es/abr.js +12 -5
- package/dist-es/abr.js.map +1 -1
- package/dist-es/additionalInfo.d.ts +2 -0
- package/dist-es/additionalInfo.js +123 -68
- package/dist-es/additionalInfo.js.map +1 -1
- package/dist-es/descriptor.d.ts +15 -2
- package/dist-es/descriptor.js +329 -100
- package/dist-es/descriptor.js.map +1 -1
- package/dist-es/effectsHelpers.js +12 -12
- package/dist-es/effectsHelpers.js.map +1 -1
- package/dist-es/engineData.d.ts +3 -1
- package/dist-es/engineData.js +34 -13
- package/dist-es/engineData.js.map +1 -1
- package/dist-es/engineData2.js +50 -21
- package/dist-es/engineData2.js.map +1 -1
- package/dist-es/helpers.d.ts +5 -2
- package/dist-es/helpers.js +18 -4
- package/dist-es/helpers.js.map +1 -1
- package/dist-es/imageResources.js +45 -21
- package/dist-es/imageResources.js.map +1 -1
- package/dist-es/index.js +1 -0
- package/dist-es/index.js.map +1 -1
- package/dist-es/jpeg.js +27 -7
- package/dist-es/jpeg.js.map +1 -1
- package/dist-es/psd.d.ts +6 -1
- package/dist-es/psdReader.d.ts +2 -2
- package/dist-es/psdReader.js +457 -270
- package/dist-es/psdReader.js.map +1 -1
- package/dist-es/psdWriter.d.ts +2 -0
- package/dist-es/psdWriter.js +98 -76
- package/dist-es/psdWriter.js.map +1 -1
- package/dist-es/text.js +126 -23
- package/dist-es/text.js.map +1 -1
- package/dist-es/utf8.js +36 -15
- package/dist-es/utf8.js.map +1 -1
- package/package.json +1 -1
- package/src/abr.ts +14 -6
- package/src/additionalInfo.ts +127 -66
- package/src/descriptor.ts +347 -107
- package/src/effectsHelpers.ts +9 -9
- package/src/engineData.ts +36 -13
- package/src/engineData2.ts +468 -432
- package/src/helpers.ts +19 -4
- package/src/imageResources.ts +49 -22
- package/src/index.ts +1 -0
- package/src/jpeg.ts +24 -9
- package/src/psd.ts +3 -1
- package/src/psdReader.ts +477 -260
- package/src/psdWriter.ts +100 -83
- package/src/text.ts +122 -12
- package/src/utf8.ts +35 -17
package/src/effectsHelpers.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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
|
|
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 ?
|
|
285
|
-
writeFixedPoint8(writer, bevel.highlightOpacity
|
|
286
|
-
writeFixedPoint8(writer, bevel.shadowOpacity
|
|
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
|
|
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
|
|
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]
|
|
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 (
|
|
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
|
-
|
|
177
|
-
|
|
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 {
|