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.
Files changed (40) hide show
  1. package/.v8-cache/v22.13.1-x64-00250a7c/a7e80865 +0 -0
  2. package/.v8-cache/v22.13.1-x64-00250a7c/b3c2fab7 +0 -0
  3. package/.v8-cache/v22.13.1-x64-00250a7c/c314aece +0 -0
  4. package/.v8-cache/v22.13.1-x64-00250a7c/cfc49f4f +0 -0
  5. package/CHANGELOG.md +3 -0
  6. package/README_PSD.md +3 -0
  7. package/dist/additionalInfo.d.ts +2 -1
  8. package/dist/additionalInfo.js +4 -4
  9. package/dist/additionalInfo.js.map +1 -1
  10. package/dist/bundle.js +45 -24
  11. package/dist/engineData.js +1 -0
  12. package/dist/engineData.js.map +1 -1
  13. package/dist/imageResources.d.ts +7 -3
  14. package/dist/imageResources.js.map +1 -1
  15. package/dist/psd.d.ts +2 -2
  16. package/dist/psdReader.d.ts +3 -2
  17. package/dist/psdReader.js +30 -12
  18. package/dist/psdReader.js.map +1 -1
  19. package/dist/psdWriter.js +10 -8
  20. package/dist/psdWriter.js.map +1 -1
  21. package/dist-es/additionalInfo.d.ts +2 -1
  22. package/dist-es/additionalInfo.js +4 -4
  23. package/dist-es/additionalInfo.js.map +1 -1
  24. package/dist-es/engineData.js +1 -0
  25. package/dist-es/engineData.js.map +1 -1
  26. package/dist-es/imageResources.d.ts +7 -3
  27. package/dist-es/imageResources.js.map +1 -1
  28. package/dist-es/psd.d.ts +2 -2
  29. package/dist-es/psdReader.d.ts +3 -2
  30. package/dist-es/psdReader.js +30 -12
  31. package/dist-es/psdReader.js.map +1 -1
  32. package/dist-es/psdWriter.js +10 -8
  33. package/dist-es/psdWriter.js.map +1 -1
  34. package/package.json +1 -1
  35. package/src/additionalInfo.ts +6 -5
  36. package/src/engineData.ts +1 -0
  37. package/src/imageResources.ts +11 -6
  38. package/src/psd.ts +2 -2
  39. package/src/psdReader.ts +23 -14
  40. 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, psd.imageResources, left);
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
- let imageResources = psd.imageResources || {};
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 = { ...imageResources, thumbnail: createThumbnail(psd) };
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