ag-psd 24.0.0 → 26.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 (53) hide show
  1. package/.v8-cache/v22.13.1-x64-00250a7c/4511bacf +0 -0
  2. package/.v8-cache/v22.13.1-x64-00250a7c/57d3380b +0 -0
  3. package/.v8-cache/v22.13.1-x64-00250a7c/6cbfc0ec +0 -0
  4. package/.v8-cache/v22.13.1-x64-00250a7c/7100ee08 +0 -0
  5. package/.v8-cache/v22.13.1-x64-00250a7c/75e41e43 +0 -0
  6. package/.v8-cache/v22.13.1-x64-00250a7c/8d0bf0b5 +0 -0
  7. package/.v8-cache/v22.13.1-x64-00250a7c/acc36e66 +0 -0
  8. package/.v8-cache/v22.13.1-x64-00250a7c/b3c2fab7 +0 -0
  9. package/.v8-cache/v22.13.1-x64-00250a7c/c314aece +0 -0
  10. package/.v8-cache/v22.13.1-x64-00250a7c/cfc49f4f +0 -0
  11. package/.v8-cache/v22.13.1-x64-00250a7c/e03e2acd +0 -0
  12. package/CHANGELOG.md +7 -0
  13. package/{TODO → TODO.md} +46 -0
  14. package/accept.js +18 -1
  15. package/dist/additionalInfo.js +62 -63
  16. package/dist/additionalInfo.js.map +1 -1
  17. package/dist/bundle.js +246 -186
  18. package/dist/descriptor.d.ts +4 -3
  19. package/dist/descriptor.js +9 -5
  20. package/dist/descriptor.js.map +1 -1
  21. package/dist/helpers.d.ts +1 -0
  22. package/dist/helpers.js.map +1 -1
  23. package/dist/imageResources.js +39 -5
  24. package/dist/imageResources.js.map +1 -1
  25. package/dist/psd.d.ts +12 -1
  26. package/dist/psd.js.map +1 -1
  27. package/dist/psdReader.js +39 -36
  28. package/dist/psdReader.js.map +1 -1
  29. package/dist/psdWriter.js +96 -76
  30. package/dist/psdWriter.js.map +1 -1
  31. package/dist-es/additionalInfo.js +62 -63
  32. package/dist-es/additionalInfo.js.map +1 -1
  33. package/dist-es/descriptor.d.ts +4 -3
  34. package/dist-es/descriptor.js +9 -5
  35. package/dist-es/descriptor.js.map +1 -1
  36. package/dist-es/helpers.d.ts +1 -0
  37. package/dist-es/helpers.js.map +1 -1
  38. package/dist-es/imageResources.js +41 -7
  39. package/dist-es/imageResources.js.map +1 -1
  40. package/dist-es/psd.d.ts +12 -1
  41. package/dist-es/psd.js.map +1 -1
  42. package/dist-es/psdReader.js +39 -36
  43. package/dist-es/psdReader.js.map +1 -1
  44. package/dist-es/psdWriter.js +96 -76
  45. package/dist-es/psdWriter.js.map +1 -1
  46. package/package.json +1 -1
  47. package/src/additionalInfo.ts +66 -66
  48. package/src/descriptor.ts +12 -8
  49. package/src/helpers.ts +1 -0
  50. package/src/imageResources.ts +46 -20
  51. package/src/psd.ts +9 -1
  52. package/src/psdReader.ts +43 -40
  53. package/src/psdWriter.ts +92 -78
package/src/psdWriter.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Psd, Layer, LayerAdditionalInfo, ColorMode, SectionDividerType, WriteOptions, Color, GlobalLayerMaskInfo, PixelData } from './psd';
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
4
  import { resourceHandlers } from './imageResources';
@@ -354,7 +354,7 @@ function writeLayerInfo(writer: PsdWriter, psd: Psd, globalAlpha: boolean, optio
354
354
  let flags = 0x08; // 1 for Photoshop 5.0 and later, tells if bit 4 has useful information
355
355
  if (layer.transparencyProtected) flags |= 0x01;
356
356
  if (layer.hidden) flags |= 0x02;
357
- if (layer.vectorMask || (layer.sectionDivider && layer.sectionDivider.type !== SectionDividerType.Other)) {
357
+ if (layer.vectorMask || (layer.sectionDivider && layer.sectionDivider.type !== SectionDividerType.Other) || layer.adjustment) {
358
358
  flags |= 0x10; // pixel data irrelevant to appearance of document
359
359
  }
360
360
  if (layer.effectsOpen) flags |= 0x20;
@@ -363,7 +363,7 @@ function writeLayerInfo(writer: PsdWriter, psd: Psd, globalAlpha: boolean, optio
363
363
  writeUint8(writer, 0); // filler
364
364
  writeSection(writer, 1, () => {
365
365
  writeLayerMaskData(writer, layer, layerData);
366
- writeLayerBlendingRanges(writer, psd);
366
+ writeLayerBlendingRanges(writer, layer);
367
367
  writePascalString(writer, (layer.name || '').substring(0, 255), 4);
368
368
  writeAdditionalLayerInfo(writer, layer, psd, options);
369
369
  });
@@ -382,57 +382,77 @@ function writeLayerInfo(writer: PsdWriter, psd: Psd, globalAlpha: boolean, optio
382
382
  }, true, options.psb);
383
383
  }
384
384
 
385
- function writeLayerMaskData(writer: PsdWriter, { mask }: Layer, layerData: LayerChannelData) {
385
+ function writeLayerMaskData(writer: PsdWriter, { mask, realMask }: Layer, layerData: LayerChannelData) {
386
386
  writeSection(writer, 1, () => {
387
- if (!mask) return;
387
+ if (!mask && !realMask) return;
388
+
389
+ let params = 0, flags = 0, realFlags = 0;
390
+
391
+ if (mask) {
392
+ if (mask.userMaskDensity !== undefined) params |= MaskParams.UserMaskDensity;
393
+ if (mask.userMaskFeather !== undefined) params |= MaskParams.UserMaskFeather;
394
+ if (mask.vectorMaskDensity !== undefined) params |= MaskParams.VectorMaskDensity;
395
+ if (mask.vectorMaskFeather !== undefined) params |= MaskParams.VectorMaskFeather;
396
+
397
+ if (mask.disabled) flags |= LayerMaskFlags.LayerMaskDisabled;
398
+ if (mask.positionRelativeToLayer) flags |= LayerMaskFlags.PositionRelativeToLayer;
399
+ if (mask.fromVectorData) flags |= LayerMaskFlags.LayerMaskFromRenderingOtherData;
400
+ if (params) flags |= LayerMaskFlags.MaskHasParametersAppliedToIt;
401
+ }
388
402
 
389
403
  const m = layerData.mask || {} as Partial<Bounds>;
390
404
  writeInt32(writer, m.top || 0);
391
405
  writeInt32(writer, m.left || 0);
392
406
  writeInt32(writer, m.bottom || 0);
393
407
  writeInt32(writer, m.right || 0);
394
- writeUint8(writer, mask.defaultColor || 0);
395
-
396
- let params = 0;
397
- if (mask.userMaskDensity !== undefined) params |= MaskParams.UserMaskDensity;
398
- if (mask.userMaskFeather !== undefined) params |= MaskParams.UserMaskFeather;
399
- if (mask.vectorMaskDensity !== undefined) params |= MaskParams.VectorMaskDensity;
400
- if (mask.vectorMaskFeather !== undefined) params |= MaskParams.VectorMaskFeather;
401
-
402
- let flags = 0;
403
- if (mask.disabled) flags |= LayerMaskFlags.LayerMaskDisabled;
404
- if (mask.positionRelativeToLayer) flags |= LayerMaskFlags.PositionRelativeToLayer;
405
- if (mask.fromVectorData) flags |= LayerMaskFlags.LayerMaskFromRenderingOtherData;
406
- if (params) flags |= LayerMaskFlags.MaskHasParametersAppliedToIt;
407
-
408
+ writeUint8(writer, mask && mask.defaultColor || 0);
408
409
  writeUint8(writer, flags);
409
410
 
410
- if (params) {
411
- writeUint8(writer, params);
411
+ if (realMask) {
412
+ if (realMask.disabled) realFlags |= LayerMaskFlags.LayerMaskDisabled;
413
+ if (realMask.positionRelativeToLayer) realFlags |= LayerMaskFlags.PositionRelativeToLayer;
414
+ if (realMask.fromVectorData) realFlags |= LayerMaskFlags.LayerMaskFromRenderingOtherData;
415
+
416
+ const r = layerData.realMask || {} as Partial<Bounds>;
417
+ writeUint8(writer, realFlags);
418
+ writeUint8(writer, realMask.defaultColor || 0);
419
+ writeInt32(writer, r.top || 0);
420
+ writeInt32(writer, r.left || 0);
421
+ writeInt32(writer, r.bottom || 0);
422
+ writeInt32(writer, r.right || 0);
423
+ }
412
424
 
425
+ if (params && mask) {
426
+ writeUint8(writer, params);
413
427
  if (mask.userMaskDensity !== undefined) writeUint8(writer, Math.round(mask.userMaskDensity * 0xff));
414
428
  if (mask.userMaskFeather !== undefined) writeFloat64(writer, mask.userMaskFeather);
415
429
  if (mask.vectorMaskDensity !== undefined) writeUint8(writer, Math.round(mask.vectorMaskDensity * 0xff));
416
430
  if (mask.vectorMaskFeather !== undefined) writeFloat64(writer, mask.vectorMaskFeather);
417
431
  }
418
432
 
419
- // TODO: handle rest of the fields
420
-
421
433
  writeZeros(writer, 2);
422
434
  });
423
435
  }
424
436
 
425
- function writeLayerBlendingRanges(writer: PsdWriter, psd: Psd) {
437
+ function writerBlendingRange(writer: PsdWriter, range: number[]) {
438
+ writeUint8(writer, range[0]);
439
+ writeUint8(writer, range[1]);
440
+ writeUint8(writer, range[2]);
441
+ writeUint8(writer, range[3]);
442
+ }
443
+
444
+ function writeLayerBlendingRanges(writer: PsdWriter, layer: Layer) {
426
445
  writeSection(writer, 1, () => {
427
- writeUint32(writer, 65535);
428
- writeUint32(writer, 65535);
446
+ const ranges = layer.blendingRanges;
429
447
 
430
- let channels = psd.channels || 0; // TODO: use always 4 instead ?
431
- // channels = 4; // TESTING
448
+ if (ranges) {
449
+ writerBlendingRange(writer, ranges.compositeGrayBlendSource);
450
+ writerBlendingRange(writer, ranges.compositeGraphBlendDestinationRange);
432
451
 
433
- for (let i = 0; i < channels; i++) {
434
- writeUint32(writer, 65535);
435
- writeUint32(writer, 65535);
452
+ for (const r of ranges.ranges) {
453
+ writerBlendingRange(writer, r.sourceRange);
454
+ writerBlendingRange(writer, r.destRange);
455
+ }
436
456
  }
437
457
  });
438
458
  }
@@ -477,8 +497,8 @@ function writeAdditionalLayerInfo(writer: PsdWriter, target: LayerAdditionalInfo
477
497
  function addChildren(layers: Layer[], children: Layer[] | undefined) {
478
498
  if (!children) return;
479
499
 
480
- // const layerIds = [];
481
- // const timestamps = []
500
+ // const layerIds: number[] = [2];
501
+ // const timestamps: number[] = [1740120767.0230637];
482
502
 
483
503
  for (const c of children) {
484
504
  if (c.children && c.canvas) throw new Error(`Invalid layer, cannot have both 'canvas' and 'children' properties`);
@@ -490,6 +510,7 @@ function addChildren(layers: Layer[], children: Layer[] | undefined) {
490
510
  sectionDivider: {
491
511
  type: SectionDividerType.BoundingSectionDivider,
492
512
  },
513
+ // blendingRanges: children[0].blendingRanges,
493
514
  // nameSource: 'lset',
494
515
  // id: layerIds.shift(),
495
516
  // protected: {
@@ -497,12 +518,9 @@ function addChildren(layers: Layer[], children: Layer[] | undefined) {
497
518
  // composite: false,
498
519
  // position: false,
499
520
  // },
500
- // layerColor: 'none',
521
+ // layerColor: 'red',
501
522
  // timestamp: timestamps.shift(),
502
- // referencePoint: {
503
- // x: 0,
504
- // y: 0,
505
- // },
523
+ // referencePoint: { x: 0, y: 0 },
506
524
  });
507
525
  addChildren(layers, c.children);
508
526
  layers.push({
@@ -573,54 +591,50 @@ function createThumbnail(psd: Psd) {
573
591
  return canvas;
574
592
  }
575
593
 
576
- function getChannels(
577
- tempBuffer: Uint8Array, layer: Layer, background: boolean, options: WriteOptions
578
- ): LayerChannelData {
579
- const layerData = getLayerChannels(tempBuffer, layer, background, options);
580
- const mask = layer.mask;
581
-
582
- if (mask) {
583
- let top = (mask.top as any) | 0;
584
- let left = (mask.left as any) | 0;
585
- let right = (mask.right as any) | 0;
586
- let bottom = (mask.bottom as any) | 0;
587
- let { width, height } = getLayerDimentions(mask);
588
- let imageData = mask.imageData;
589
-
590
- if (!imageData && mask.canvas && width && height) {
591
- imageData = mask.canvas.getContext('2d')!.getImageData(0, 0, width, height);
592
- }
594
+ function getMaskChannels(tempBuffer: Uint8Array, layerData: LayerChannelData, layer: Layer, mask: LayerMaskData, options: WriteOptions, realMask: boolean) {
595
+ let top = (mask.top as any) | 0;
596
+ let left = (mask.left as any) | 0;
597
+ let right = (mask.right as any) | 0;
598
+ let bottom = (mask.bottom as any) | 0;
599
+ let { width, height } = getLayerDimentions(mask);
600
+ let imageData = mask.imageData;
593
601
 
594
- if (width && height && imageData) {
595
- right = left + width;
596
- bottom = top + height;
602
+ if (!imageData && mask.canvas && width && height) {
603
+ imageData = mask.canvas.getContext('2d')!.getImageData(0, 0, width, height);
604
+ }
597
605
 
598
- if (imageData.width !== width || imageData.height !== height) {
599
- throw new Error('Invalid imageData dimentions');
600
- }
606
+ if (width && height && imageData) {
607
+ right = left + width;
608
+ bottom = top + height;
601
609
 
602
- let buffer: Uint8Array;
603
- let compression: Compression;
604
-
605
- if (RAW_IMAGE_DATA && (layer as any).maskDataRaw) {
606
- // console.log('written raw layer image data');
607
- buffer = (layer as any).maskDataRaw;
608
- compression = (layer as any).maskDataRawCompression;
609
- } else if (options.compress) {
610
- buffer = writeDataZipWithoutPrediction(imageData, [0]);
611
- compression = Compression.ZipWithoutPrediction;
612
- } else {
613
- buffer = writeDataRLE(tempBuffer, imageData, [0], !!options.psb)!;
614
- compression = Compression.RleCompressed;
615
- }
610
+ if (imageData.width !== width || imageData.height !== height) {
611
+ throw new Error('Invalid imageData dimentions');
612
+ }
613
+
614
+ let buffer: Uint8Array;
615
+ let compression: Compression;
616
616
 
617
- layerData.mask = { top, left, right, bottom };
618
- layerData.channels.push({ channelId: ChannelID.UserMask, compression, buffer, length: 2 + buffer.length });
617
+ if (RAW_IMAGE_DATA && (layer as any)[realMask ? 'realMaskDataRaw' : 'maskDataRaw']) {
618
+ buffer = (layer as any)[realMask ? 'realMaskDataRaw' : 'maskDataRaw'];
619
+ compression = (layer as any)[realMask ? 'realMaskDataRawCompression' : 'maskDataRawCompression'];
620
+ } else if (options.compress) {
621
+ buffer = writeDataZipWithoutPrediction(imageData, [0]);
622
+ compression = Compression.ZipWithoutPrediction;
619
623
  } else {
620
- layerData.mask = { top: 0, left: 0, right: 0, bottom: 0 };
624
+ buffer = writeDataRLE(tempBuffer, imageData, [0], !!options.psb)!;
625
+ compression = Compression.RleCompressed;
621
626
  }
627
+
628
+ layerData.channels.push({ channelId: realMask ? ChannelID.RealUserMask : ChannelID.UserMask, compression, buffer, length: 2 + buffer.length });
622
629
  }
623
630
 
631
+ layerData[realMask ? 'realMask' : 'mask'] = { top, left, right, bottom };
632
+ }
633
+
634
+ function getChannels(tempBuffer: Uint8Array, layer: Layer, background: boolean, options: WriteOptions): LayerChannelData {
635
+ const layerData = getLayerChannels(tempBuffer, layer, background, options);
636
+ if (layer.mask) getMaskChannels(tempBuffer, layerData, layer, layer.mask, options, false);
637
+ if (layer.realMask) getMaskChannels(tempBuffer, layerData, layer, layer.realMask, options, true);
624
638
  return layerData;
625
639
  }
626
640