ag-psd 27.0.0 → 28.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/v22.13.1-x64-00250a7c/a7e80865 +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/b3c2fab7 +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/c314aece +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/cfc49f4f +0 -0
- package/CHANGELOG.md +3 -0
- package/README_PSD.md +3 -0
- package/dist/additionalInfo.d.ts +2 -1
- package/dist/additionalInfo.js +4 -4
- package/dist/additionalInfo.js.map +1 -1
- package/dist/bundle.js +45 -24
- package/dist/engineData.js +1 -0
- package/dist/engineData.js.map +1 -1
- package/dist/imageResources.d.ts +7 -3
- package/dist/imageResources.js.map +1 -1
- package/dist/psd.d.ts +2 -2
- package/dist/psdReader.d.ts +3 -2
- package/dist/psdReader.js +30 -12
- package/dist/psdReader.js.map +1 -1
- package/dist/psdWriter.js +10 -8
- package/dist/psdWriter.js.map +1 -1
- package/dist-es/additionalInfo.d.ts +2 -1
- package/dist-es/additionalInfo.js +4 -4
- package/dist-es/additionalInfo.js.map +1 -1
- package/dist-es/engineData.js +1 -0
- package/dist-es/engineData.js.map +1 -1
- package/dist-es/imageResources.d.ts +7 -3
- package/dist-es/imageResources.js.map +1 -1
- package/dist-es/psd.d.ts +2 -2
- package/dist-es/psdReader.d.ts +3 -2
- package/dist-es/psdReader.js +30 -12
- package/dist-es/psdReader.js.map +1 -1
- package/dist-es/psdWriter.js +10 -8
- package/dist-es/psdWriter.js.map +1 -1
- package/package.json +1 -1
- package/src/additionalInfo.ts +6 -5
- package/src/engineData.ts +1 -0
- package/src/imageResources.ts +11 -6
- package/src/psd.ts +2 -2
- package/src/psdReader.ts +23 -14
- package/src/psdWriter.ts +14 -12
package/src/psdReader.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { inflate as inflateSync } from 'pako';
|
|
|
2
2
|
import { Psd, Layer, ColorMode, SectionDividerType, LayerAdditionalInfo, ReadOptions, LayerMaskData, Color, PatternInfo, GlobalLayerMaskInfo, RGB, PixelData, PixelArray } from './psd';
|
|
3
3
|
import { resetImageData, offsetForChannel, decodeBitmap, createImageData, toBlendMode, ChannelID, Compression, LayerMaskFlags, MaskParams, ColorSpace, RAW_IMAGE_DATA, largeAdditionalInfoKeys, imageDataToCanvas } from './helpers';
|
|
4
4
|
import { infoHandlersMap } from './additionalInfo';
|
|
5
|
-
import { resourceHandlersMap } from './imageResources';
|
|
5
|
+
import { InternalImageResources, resourceHandlersMap } from './imageResources';
|
|
6
6
|
|
|
7
7
|
interface ChannelInfo {
|
|
8
8
|
id: ChannelID;
|
|
@@ -257,6 +257,9 @@ export function readPsd(reader: PsdReader, readOptions: ReadOptions = {}) {
|
|
|
257
257
|
});
|
|
258
258
|
|
|
259
259
|
// image resources
|
|
260
|
+
|
|
261
|
+
const imageResources: InternalImageResources = {};
|
|
262
|
+
|
|
260
263
|
readSection(reader, 1, left => {
|
|
261
264
|
while (left() > 0) {
|
|
262
265
|
const sigOffset = reader.offset;
|
|
@@ -282,13 +285,9 @@ export function readPsd(reader: PsdReader, readOptions: ReadOptions = {}) {
|
|
|
282
285
|
const handler = resourceHandlersMap[id];
|
|
283
286
|
const skip = id === 1036 && !!reader.skipThumbnail;
|
|
284
287
|
|
|
285
|
-
if (!psd.imageResources) {
|
|
286
|
-
psd.imageResources = {};
|
|
287
|
-
}
|
|
288
|
-
|
|
289
288
|
if (handler && !skip) {
|
|
290
289
|
try {
|
|
291
|
-
handler.read(reader,
|
|
290
|
+
handler.read(reader, imageResources, left);
|
|
292
291
|
} catch (e) {
|
|
293
292
|
if (reader.throwForMissingFeatures) throw e;
|
|
294
293
|
skipBytes(reader, left());
|
|
@@ -301,10 +300,16 @@ export function readPsd(reader: PsdReader, readOptions: ReadOptions = {}) {
|
|
|
301
300
|
}
|
|
302
301
|
});
|
|
303
302
|
|
|
303
|
+
const { layersGroup, layerGroupsEnabledId, ...rest } = imageResources;
|
|
304
|
+
|
|
305
|
+
if (Object.keys(rest)) {
|
|
306
|
+
psd.imageResources = rest;
|
|
307
|
+
}
|
|
308
|
+
|
|
304
309
|
// layer and mask info
|
|
305
310
|
readSection(reader, 1, left => {
|
|
306
311
|
readSection(reader, 2, left => {
|
|
307
|
-
readLayerInfo(reader, psd);
|
|
312
|
+
readLayerInfo(reader, psd, imageResources);
|
|
308
313
|
skipBytes(reader, left());
|
|
309
314
|
}, undefined, reader.large);
|
|
310
315
|
|
|
@@ -326,7 +331,7 @@ export function readPsd(reader: PsdReader, readOptions: ReadOptions = {}) {
|
|
|
326
331
|
}
|
|
327
332
|
|
|
328
333
|
if (left() >= 12) {
|
|
329
|
-
readAdditionalLayerInfo(reader, psd, psd);
|
|
334
|
+
readAdditionalLayerInfo(reader, psd, psd, imageResources);
|
|
330
335
|
} else {
|
|
331
336
|
// opt.logMissingFeatures && console.log('skipping leftover bytes', left());
|
|
332
337
|
skipBytes(reader, left());
|
|
@@ -348,7 +353,9 @@ export function readPsd(reader: PsdReader, readOptions: ReadOptions = {}) {
|
|
|
348
353
|
return psd;
|
|
349
354
|
}
|
|
350
355
|
|
|
351
|
-
export function readLayerInfo(reader: PsdReader, psd: Psd) {
|
|
356
|
+
export function readLayerInfo(reader: PsdReader, psd: Psd, imageResources: InternalImageResources) {
|
|
357
|
+
const { layersGroup = [], layerGroupsEnabledId = [] } = imageResources;
|
|
358
|
+
|
|
352
359
|
let layerCount = readInt16(reader);
|
|
353
360
|
|
|
354
361
|
if (layerCount < 0) {
|
|
@@ -360,7 +367,9 @@ export function readLayerInfo(reader: PsdReader, psd: Psd) {
|
|
|
360
367
|
const layerChannels: ChannelInfo[][] = [];
|
|
361
368
|
|
|
362
369
|
for (let i = 0; i < layerCount; i++) {
|
|
363
|
-
const { layer, channels } = readLayerRecord(reader, psd);
|
|
370
|
+
const { layer, channels } = readLayerRecord(reader, psd, imageResources);
|
|
371
|
+
if (layersGroup[i] !== undefined) layer.linkGroup = layersGroup[i];
|
|
372
|
+
if (layerGroupsEnabledId[i] !== undefined) layer.linkGroupEnabled = !!layerGroupsEnabledId[i];
|
|
364
373
|
layers.push(layer);
|
|
365
374
|
layerChannels.push(channels);
|
|
366
375
|
}
|
|
@@ -401,7 +410,7 @@ export function readLayerInfo(reader: PsdReader, psd: Psd) {
|
|
|
401
410
|
}
|
|
402
411
|
}
|
|
403
412
|
|
|
404
|
-
function readLayerRecord(reader: PsdReader, psd: Psd) {
|
|
413
|
+
function readLayerRecord(reader: PsdReader, psd: Psd, imageResources: InternalImageResources) {
|
|
405
414
|
const layer: Layer = {};
|
|
406
415
|
layer.top = readInt32(reader);
|
|
407
416
|
layer.left = readInt32(reader);
|
|
@@ -452,7 +461,7 @@ function readLayerRecord(reader: PsdReader, psd: Psd) {
|
|
|
452
461
|
// HACK: fix for sometimes layer.name string not being padded correctly, just skip until we get valid signature
|
|
453
462
|
while (left() > 4 && !validSignatureAt(reader, reader.offset)) reader.offset++;
|
|
454
463
|
|
|
455
|
-
while (left() >= 12) readAdditionalLayerInfo(reader, layer, psd);
|
|
464
|
+
while (left() >= 12) readAdditionalLayerInfo(reader, layer, psd, imageResources);
|
|
456
465
|
|
|
457
466
|
skipBytes(reader, left());
|
|
458
467
|
});
|
|
@@ -676,7 +685,7 @@ export function readGlobalLayerMaskInfo(reader: PsdReader) {
|
|
|
676
685
|
});
|
|
677
686
|
}
|
|
678
687
|
|
|
679
|
-
export function readAdditionalLayerInfo(reader: PsdReader, target: LayerAdditionalInfo, psd: Psd) {
|
|
688
|
+
export function readAdditionalLayerInfo(reader: PsdReader, target: LayerAdditionalInfo, psd: Psd, imageResources: InternalImageResources) {
|
|
680
689
|
const sig = readSignature(reader);
|
|
681
690
|
if (sig !== '8BIM' && sig !== '8B64') throw new Error(`Invalid signature: '${sig}' at 0x${(reader.offset - 4).toString(16)}`);
|
|
682
691
|
const key = readSignature(reader);
|
|
@@ -689,7 +698,7 @@ export function readAdditionalLayerInfo(reader: PsdReader, target: LayerAddition
|
|
|
689
698
|
|
|
690
699
|
if (handler) {
|
|
691
700
|
try {
|
|
692
|
-
handler.read(reader, target, left, psd);
|
|
701
|
+
handler.read(reader, target, left, psd, imageResources);
|
|
693
702
|
} catch (e) {
|
|
694
703
|
if (reader.throwForMissingFeatures) throw e;
|
|
695
704
|
}
|
package/src/psdWriter.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Psd, Layer, LayerAdditionalInfo, ColorMode, SectionDividerType, WriteOptions, Color, GlobalLayerMaskInfo, PixelData, LayerMaskData } from './psd';
|
|
2
2
|
import { hasAlpha, createCanvas, writeDataRLE, LayerChannelData, ChannelData, offsetForChannel, createImageData, fromBlendMode, ChannelID, Compression, clamp, LayerMaskFlags, MaskParams, ColorSpace, Bounds, largeAdditionalInfoKeys, RAW_IMAGE_DATA, writeDataZipWithoutPrediction, imageDataToCanvas } from './helpers';
|
|
3
3
|
import { ExtendedWriteOptions, infoHandlers } from './additionalInfo';
|
|
4
|
-
import { resourceHandlers } from './imageResources';
|
|
4
|
+
import { InternalImageResources, resourceHandlers } from './imageResources';
|
|
5
5
|
|
|
6
6
|
export interface PsdWriter {
|
|
7
7
|
offset: number;
|
|
@@ -221,12 +221,11 @@ export function writePsd(writer: PsdWriter, psd: Psd, options: WriteOptions = {}
|
|
|
221
221
|
|
|
222
222
|
verifyBitCount(psd);
|
|
223
223
|
|
|
224
|
-
|
|
225
|
-
|
|
224
|
+
const imageResources: InternalImageResources = { ...psd.imageResources };
|
|
226
225
|
const opt: ExtendedWriteOptions = { ...options, layerIds: new Set(), layerToId: new Map() };
|
|
227
226
|
|
|
228
227
|
if (opt.generateThumbnail) {
|
|
229
|
-
imageResources =
|
|
228
|
+
imageResources.thumbnail = createThumbnail(psd);
|
|
230
229
|
}
|
|
231
230
|
|
|
232
231
|
let imageData = psd.imageData;
|
|
@@ -263,7 +262,15 @@ export function writePsd(writer: PsdWriter, psd: Psd, options: WriteOptions = {}
|
|
|
263
262
|
// TODO: other data?
|
|
264
263
|
});
|
|
265
264
|
|
|
265
|
+
const layers: Layer[] = [];
|
|
266
|
+
addChildren(layers, psd.children);
|
|
267
|
+
if (!layers.length) layers.push({});
|
|
268
|
+
|
|
266
269
|
// image resources
|
|
270
|
+
|
|
271
|
+
imageResources.layersGroup = layers.map(l => l.linkGroup || 0);
|
|
272
|
+
imageResources.layerGroupsEnabledId = layers.map(l => l.linkGroupEnabled == false ? 0 : 1);
|
|
273
|
+
|
|
267
274
|
writeSection(writer, 1, () => {
|
|
268
275
|
for (const handler of resourceHandlers) {
|
|
269
276
|
const has = handler.has(imageResources);
|
|
@@ -279,7 +286,7 @@ export function writePsd(writer: PsdWriter, psd: Psd, options: WriteOptions = {}
|
|
|
279
286
|
|
|
280
287
|
// layer and mask info
|
|
281
288
|
writeSection(writer, 2, () => {
|
|
282
|
-
writeLayerInfo(writer, psd, globalAlpha, opt);
|
|
289
|
+
writeLayerInfo(writer, layers, psd, globalAlpha, opt);
|
|
283
290
|
writeGlobalLayerMaskInfo(writer, psd.globalLayerMaskInfo);
|
|
284
291
|
writeAdditionalLayerInfo(writer, psd, psd, opt);
|
|
285
292
|
}, undefined, !!opt.psb);
|
|
@@ -318,14 +325,8 @@ export function writePsd(writer: PsdWriter, psd: Psd, options: WriteOptions = {}
|
|
|
318
325
|
}
|
|
319
326
|
}
|
|
320
327
|
|
|
321
|
-
function writeLayerInfo(writer: PsdWriter, psd: Psd, globalAlpha: boolean, options: ExtendedWriteOptions) {
|
|
328
|
+
function writeLayerInfo(writer: PsdWriter, layers: Layer[], psd: Psd, globalAlpha: boolean, options: ExtendedWriteOptions) {
|
|
322
329
|
writeSection(writer, 4, () => {
|
|
323
|
-
const layers: Layer[] = [];
|
|
324
|
-
|
|
325
|
-
addChildren(layers, psd.children);
|
|
326
|
-
|
|
327
|
-
if (!layers.length) layers.push({});
|
|
328
|
-
|
|
329
330
|
writeInt16(writer, globalAlpha ? -layers.length : layers.length);
|
|
330
331
|
|
|
331
332
|
const layersData = layers.map((l, i) => getChannels(writer.tempBuffer!, l, i === 0, options));
|
|
@@ -494,6 +495,7 @@ function writeAdditionalLayerInfo(writer: PsdWriter, target: LayerAdditionalInfo
|
|
|
494
495
|
}
|
|
495
496
|
}
|
|
496
497
|
}
|
|
498
|
+
|
|
497
499
|
function addChildren(layers: Layer[], children: Layer[] | undefined) {
|
|
498
500
|
if (!children) return;
|
|
499
501
|
|