ag-psd 16.0.0 → 17.0.1

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/dist-es/psd.d.ts CHANGED
@@ -387,6 +387,12 @@ export interface TextGridInfo {
387
387
  leadingFillColor?: Color;
388
388
  alignLineHeightToGridFlags?: boolean;
389
389
  }
390
+ export interface UnitsBounds {
391
+ top: UnitsValue;
392
+ left: UnitsValue;
393
+ right: UnitsValue;
394
+ bottom: UnitsValue;
395
+ }
390
396
  export interface LayerTextData {
391
397
  text: string;
392
398
  transform?: number[];
@@ -413,6 +419,8 @@ export interface LayerTextData {
413
419
  shapeType?: 'point' | 'box';
414
420
  pointBase?: number[];
415
421
  boxBounds?: number[];
422
+ bounds?: UnitsBounds;
423
+ boundingBox?: UnitsBounds;
416
424
  }
417
425
  export interface PatternInfo {
418
426
  name: string;
@@ -659,86 +667,444 @@ export interface LinkedFile {
659
667
  assetModTime?: number;
660
668
  assetLockedState?: number;
661
669
  }
662
- export interface PlacedLayerPuppetFilter {
663
- rigidType: boolean;
664
- bounds: {
665
- x: number;
666
- y: number;
667
- }[];
668
- puppetShapeList: {
669
- rigidType: boolean;
670
- originalVertexArray: {
671
- x: number;
672
- y: number;
673
- }[];
674
- deformedVertexArray: {
670
+ type FilterVariant = {
671
+ type: 'average' | 'blur' | 'blur more';
672
+ } | {
673
+ type: 'box blur';
674
+ filter: {
675
+ radius: UnitsValue;
676
+ };
677
+ } | {
678
+ type: 'gaussian blur';
679
+ filter: {
680
+ radius: UnitsValue;
681
+ };
682
+ } | {
683
+ type: 'motion blur';
684
+ filter: {
685
+ angle: number;
686
+ distance: UnitsValue;
687
+ };
688
+ } | {
689
+ type: 'radial blur';
690
+ filter: {
691
+ amount: number;
692
+ method: 'spin' | 'zoom';
693
+ quality: 'draft' | 'good' | 'best';
694
+ };
695
+ } | {
696
+ type: 'shape blur';
697
+ filter: {
698
+ radius: UnitsValue;
699
+ customShape: {
700
+ name: string;
701
+ id: string;
702
+ };
703
+ };
704
+ } | {
705
+ type: 'smart blur';
706
+ filter: {
707
+ radius: number;
708
+ threshold: number;
709
+ quality: 'low' | 'medium' | 'high';
710
+ mode: 'normal' | 'edge only' | 'overlay edge';
711
+ };
712
+ } | {
713
+ type: 'surface blur';
714
+ filter: {
715
+ radius: UnitsValue;
716
+ threshold: number;
717
+ };
718
+ } | {
719
+ type: 'displace';
720
+ filter: {
721
+ horizontalScale: number;
722
+ verticalScale: number;
723
+ displacementMap: 'stretch to fit' | 'tile';
724
+ undefinedAreas: 'wrap around' | 'repeat edge pixels';
725
+ displacementFile: {
726
+ signature: string;
727
+ path: string;
728
+ };
729
+ };
730
+ } | {
731
+ type: 'pinch';
732
+ filter: {
733
+ amount: number;
734
+ };
735
+ } | {
736
+ type: 'polar coordinates';
737
+ filter: {
738
+ conversion: 'rectangular to polar' | 'polar to rectangular';
739
+ };
740
+ } | {
741
+ type: 'ripple';
742
+ filter: {
743
+ amount: number;
744
+ size: 'small' | 'medium' | 'large';
745
+ };
746
+ } | {
747
+ type: 'shear';
748
+ filter: {
749
+ shearPoints: {
675
750
  x: number;
676
751
  y: number;
677
752
  }[];
678
- indexArray: number[];
679
- pinOffsets: {
753
+ shearStart: number;
754
+ shearEnd: number;
755
+ undefinedAreas: 'wrap around' | 'repeat edge pixels';
756
+ };
757
+ } | {
758
+ type: 'spherize';
759
+ filter: {
760
+ amount: number;
761
+ mode: 'normal' | 'horizontal only' | 'vertical only';
762
+ };
763
+ } | {
764
+ type: 'twirl';
765
+ filter: {
766
+ angle: number;
767
+ };
768
+ } | {
769
+ type: 'wave';
770
+ filter: {
771
+ numberOfGenerators: number;
772
+ type: 'sine' | 'triangle' | 'square';
773
+ wavelength: {
774
+ min: number;
775
+ max: number;
776
+ };
777
+ amplitude: {
778
+ min: number;
779
+ max: number;
780
+ };
781
+ scale: {
680
782
  x: number;
681
783
  y: number;
784
+ };
785
+ randomSeed: number;
786
+ undefinedAreas: 'wrap around' | 'repeat edge pixels';
787
+ };
788
+ } | {
789
+ type: 'zigzag';
790
+ filter: {
791
+ amount: number;
792
+ ridges: number;
793
+ style: 'around center' | 'out from center' | 'pond ripples';
794
+ };
795
+ } | {
796
+ type: 'add noise';
797
+ filter: {
798
+ amount: number;
799
+ distribution: 'uniform' | 'gaussian';
800
+ monochromatic: boolean;
801
+ randomSeed: number;
802
+ };
803
+ } | {
804
+ type: 'despeckle';
805
+ } | {
806
+ type: 'dust and scratches';
807
+ filter: {
808
+ radius: number;
809
+ threshold: number;
810
+ };
811
+ } | {
812
+ type: 'median';
813
+ filter: {
814
+ radius: UnitsValue;
815
+ };
816
+ } | {
817
+ type: 'reduce noise';
818
+ filter: {
819
+ preset: string;
820
+ removeJpegArtifact: boolean;
821
+ reduceColorNoise: number;
822
+ sharpenDetails: number;
823
+ channelDenoise: {
824
+ channels: ('red' | 'green' | 'blue' | 'composite')[];
825
+ amount: number;
826
+ preserveDetails?: number;
682
827
  }[];
683
- posFinalPins: {
828
+ };
829
+ } | {
830
+ type: 'color halftone';
831
+ filter: {
832
+ radius: number;
833
+ angle1: number;
834
+ angle2: number;
835
+ angle3: number;
836
+ angle4: number;
837
+ };
838
+ } | {
839
+ type: 'crystallize';
840
+ filter: {
841
+ cellSize: number;
842
+ randomSeed: number;
843
+ };
844
+ } | {
845
+ type: 'facet' | 'fragment';
846
+ } | {
847
+ type: 'mezzotint';
848
+ filter: {
849
+ type: 'fine dots' | 'medium dots' | 'grainy dots' | 'coarse dots' | 'short lines' | 'medium lines' | 'long lines' | 'short strokes' | 'medium strokes' | 'long strokes';
850
+ randomSeed: number;
851
+ };
852
+ } | {
853
+ type: 'mosaic';
854
+ filter: {
855
+ cellSize: UnitsValue;
856
+ };
857
+ } | {
858
+ type: 'pointillize';
859
+ filter: {
860
+ cellSize: number;
861
+ randomSeed: number;
862
+ };
863
+ } | {
864
+ type: 'clouds';
865
+ filter: {
866
+ randomSeed: number;
867
+ };
868
+ } | {
869
+ type: 'difference clouds';
870
+ filter: {
871
+ randomSeed: number;
872
+ };
873
+ } | {
874
+ type: 'fibers';
875
+ filter: {
876
+ variance: number;
877
+ strength: number;
878
+ randomSeed: number;
879
+ };
880
+ } | {
881
+ type: 'lens flare';
882
+ filter: {
883
+ brightness: number;
884
+ position: {
684
885
  x: number;
685
886
  y: number;
686
- }[];
687
- pinVertexIndices: number[];
688
- selectedPin: number[];
689
- pinPosition: {
887
+ };
888
+ lensType: '50-300mm zoom' | '32mm prime' | '105mm prime' | 'movie prime';
889
+ };
890
+ } | {
891
+ type: 'sharpen' | 'sharpen edges' | 'sharpen more';
892
+ } | {
893
+ type: 'smart sharpen';
894
+ filter: {
895
+ amount: number;
896
+ radius: UnitsValue;
897
+ threshold: number;
898
+ angle: number;
899
+ moreAccurate: boolean;
900
+ blur: 'gaussian blur' | 'lens blur' | 'motion blur';
901
+ preset: string;
902
+ shadow: {
903
+ fadeAmount: number;
904
+ tonalWidth: number;
905
+ radius: number;
906
+ };
907
+ highlight: {
908
+ fadeAmount: number;
909
+ tonalWidth: number;
910
+ radius: number;
911
+ };
912
+ };
913
+ } | {
914
+ type: 'unsharp mask';
915
+ filter: {
916
+ amount: number;
917
+ radius: UnitsValue;
918
+ threshold: number;
919
+ };
920
+ } | {
921
+ type: 'diffuse';
922
+ filter: {
923
+ mode: 'normal' | 'darken only' | 'lighten only' | 'anisotropic';
924
+ randomSeed: number;
925
+ };
926
+ } | {
927
+ type: 'emboss';
928
+ filter: {
929
+ angle: number;
930
+ height: number;
931
+ amount: number;
932
+ };
933
+ } | {
934
+ type: 'extrude';
935
+ filter: {
936
+ type: 'blocks' | 'pyramids';
937
+ size: number;
938
+ depth: number;
939
+ depthMode: 'random' | 'level-based';
940
+ randomSeed: number;
941
+ solidFrontFaces: boolean;
942
+ maskIncompleteBlocks: boolean;
943
+ };
944
+ } | {
945
+ type: 'find edges' | 'solarize';
946
+ } | {
947
+ type: 'tiles';
948
+ filter: {
949
+ numberOfTiles: number;
950
+ maximumOffset: number;
951
+ fillEmptyAreaWith: 'background color' | 'foreground color' | 'inverse image' | 'unaltered image';
952
+ randomSeed: number;
953
+ };
954
+ } | {
955
+ type: 'trace contour';
956
+ filter: {
957
+ level: number;
958
+ edge: 'lower' | 'upper';
959
+ };
960
+ } | {
961
+ type: 'wind';
962
+ filter: {
963
+ method: 'wind' | 'blast' | 'stagger';
964
+ direction: 'left' | 'right';
965
+ };
966
+ } | {
967
+ type: 'de-interlace';
968
+ filter: {
969
+ eliminate: 'odd lines' | 'even lines';
970
+ newFieldsBy: 'duplication' | 'interpolation';
971
+ };
972
+ } | {
973
+ type: 'ntsc colors';
974
+ } | {
975
+ type: 'custom';
976
+ filter: {
977
+ scale: number;
978
+ offset: number;
979
+ matrix: number[];
980
+ };
981
+ } | {
982
+ type: 'high pass' | 'maximum' | 'minimum';
983
+ filter: {
984
+ radius: UnitsValue;
985
+ };
986
+ } | {
987
+ type: 'offset';
988
+ filter: {
989
+ horizontal: number;
990
+ vertical: number;
991
+ undefinedAreas: 'set to transparent' | 'repeat edge pixels' | 'wrap around';
992
+ };
993
+ } | {
994
+ type: 'puppet';
995
+ filter: {
996
+ rigidType: boolean;
997
+ bounds: {
690
998
  x: number;
691
999
  y: number;
692
1000
  }[];
693
- pinRotation: number[];
694
- pinOverlay: boolean[];
695
- pinDepth: number[];
696
- meshQuality: number;
697
- meshExpansion: number;
698
- meshRigidity: number;
699
- imageResolution: number;
700
- meshBoundaryPath: {
701
- pathComponents: {
702
- shapeOperation: string;
703
- paths: {
704
- closed: boolean;
705
- points: {
706
- anchor: {
707
- x: UnitsValue;
708
- y: UnitsValue;
709
- };
710
- forward: {
711
- x: UnitsValue;
712
- y: UnitsValue;
713
- };
714
- backward: {
715
- x: UnitsValue;
716
- y: UnitsValue;
717
- };
718
- smooth: boolean;
1001
+ puppetShapeList: {
1002
+ rigidType: boolean;
1003
+ originalVertexArray: {
1004
+ x: number;
1005
+ y: number;
1006
+ }[];
1007
+ deformedVertexArray: {
1008
+ x: number;
1009
+ y: number;
1010
+ }[];
1011
+ indexArray: number[];
1012
+ pinOffsets: {
1013
+ x: number;
1014
+ y: number;
1015
+ }[];
1016
+ posFinalPins: {
1017
+ x: number;
1018
+ y: number;
1019
+ }[];
1020
+ pinVertexIndices: number[];
1021
+ selectedPin: number[];
1022
+ pinPosition: {
1023
+ x: number;
1024
+ y: number;
1025
+ }[];
1026
+ pinRotation: number[];
1027
+ pinOverlay: boolean[];
1028
+ pinDepth: number[];
1029
+ meshQuality: number;
1030
+ meshExpansion: number;
1031
+ meshRigidity: number;
1032
+ imageResolution: number;
1033
+ meshBoundaryPath: {
1034
+ pathComponents: {
1035
+ shapeOperation: string;
1036
+ paths: {
1037
+ closed: boolean;
1038
+ points: {
1039
+ anchor: {
1040
+ x: UnitsValue;
1041
+ y: UnitsValue;
1042
+ };
1043
+ forward: {
1044
+ x: UnitsValue;
1045
+ y: UnitsValue;
1046
+ };
1047
+ backward: {
1048
+ x: UnitsValue;
1049
+ y: UnitsValue;
1050
+ };
1051
+ smooth: boolean;
1052
+ }[];
719
1053
  }[];
720
1054
  }[];
721
- }[];
722
- };
723
- }[];
724
- }
1055
+ };
1056
+ }[];
1057
+ };
1058
+ } | {
1059
+ type: 'oil paint plugin';
1060
+ filter: {
1061
+ name: string;
1062
+ gpu: boolean;
1063
+ lighting: boolean;
1064
+ parameters: {
1065
+ name: string;
1066
+ value: number;
1067
+ }[];
1068
+ };
1069
+ } | {
1070
+ type: 'hsb/hsl';
1071
+ filter: {
1072
+ inputMode: 'rgb' | 'hsb' | 'hsl';
1073
+ rowOrder: 'rgb' | 'hsb' | 'hsl';
1074
+ };
1075
+ } | {
1076
+ type: 'oil paint';
1077
+ filter: {
1078
+ lightingOn: boolean;
1079
+ stylization: number;
1080
+ cleanliness: number;
1081
+ brushScale: number;
1082
+ microBrush: number;
1083
+ lightDirection: number;
1084
+ specularity: number;
1085
+ };
1086
+ } | {
1087
+ type: 'liquify';
1088
+ filter: {
1089
+ liquifyMesh: Uint8Array;
1090
+ };
1091
+ };
1092
+ export type Filter = FilterVariant & {
1093
+ name: string;
1094
+ opacity: number;
1095
+ blendMode: BlendMode;
1096
+ enabled: boolean;
1097
+ hasOptions: boolean;
1098
+ foregroundColor: Color;
1099
+ backgroundColor: Color;
1100
+ };
725
1101
  export interface PlacedLayerFilter {
726
1102
  enabled: boolean;
727
1103
  validAtPosition: boolean;
728
1104
  maskEnabled: boolean;
729
1105
  maskLinked: boolean;
730
1106
  maskExtendWithWhite: boolean;
731
- list: {
732
- id: number;
733
- name: string;
734
- opacity: number;
735
- blendMode: BlendMode;
736
- enabled: boolean;
737
- hasOptions: boolean;
738
- foregroundColor: Color;
739
- backgroundColor: Color;
740
- filter: PlacedLayerPuppetFilter | {};
741
- }[];
1107
+ list: Filter[];
742
1108
  }
743
1109
  export type PlacedLayerType = 'unknown' | 'vector' | 'raster' | 'image stack';
744
1110
  export interface PlacedLayer {
@@ -973,7 +1339,22 @@ export interface LayerAdditionalInfo {
973
1339
  unifyLayerVisibility?: boolean;
974
1340
  };
975
1341
  timeline?: Timeline;
976
- filterEffects?: any;
1342
+ filterEffectsMasks?: {
1343
+ id: string;
1344
+ top: number;
1345
+ left: number;
1346
+ bottom: number;
1347
+ right: number;
1348
+ depth: number;
1349
+ channels: ({
1350
+ compressionMode: number;
1351
+ data: Uint8Array;
1352
+ } | undefined)[];
1353
+ extra?: {
1354
+ compressionMode: number;
1355
+ data: Uint8Array;
1356
+ };
1357
+ }[];
977
1358
  engineData?: string;
978
1359
  }
979
1360
  export interface ImageResources {
@@ -1205,6 +1586,7 @@ export interface Layer extends LayerAdditionalInfo {
1205
1586
  blendMode?: BlendMode;
1206
1587
  opacity?: number;
1207
1588
  transparencyProtected?: boolean;
1589
+ effectsOpen?: boolean;
1208
1590
  hidden?: boolean;
1209
1591
  clipping?: boolean;
1210
1592
  canvas?: HTMLCanvasElement;
@@ -1286,3 +1668,4 @@ export interface WriteOptions {
1286
1668
  * with some software. It may also be significantly slower. */
1287
1669
  compress?: boolean;
1288
1670
  }
1671
+ export {};
@@ -13,6 +13,7 @@ export declare function readUint8(reader: PsdReader): number;
13
13
  export declare function peekUint8(reader: PsdReader): number;
14
14
  export declare function readInt16(reader: PsdReader): number;
15
15
  export declare function readUint16(reader: PsdReader): number;
16
+ export declare function readUint16LE(reader: PsdReader): number;
16
17
  export declare function readInt32(reader: PsdReader): number;
17
18
  export declare function readInt32LE(reader: PsdReader): number;
18
19
  export declare function readUint32(reader: PsdReader): number;
@@ -25,6 +26,7 @@ export declare function readSignature(reader: PsdReader): string;
25
26
  export declare function readPascalString(reader: PsdReader, padTo: number): string;
26
27
  export declare function readUnicodeString(reader: PsdReader): string;
27
28
  export declare function readUnicodeStringWithLength(reader: PsdReader, length: number): string;
29
+ export declare function readUnicodeStringWithLengthLE(reader: PsdReader, length: number): string;
28
30
  export declare function readAsciiString(reader: PsdReader, length: number): string;
29
31
  export declare function skipBytes(reader: PsdReader, count: number): void;
30
32
  export declare function checkSignature(reader: PsdReader, a: string, b?: string): void;
@@ -47,6 +47,10 @@ export function readUint16(reader) {
47
47
  reader.offset += 2;
48
48
  return reader.view.getUint16(reader.offset - 2, false);
49
49
  }
50
+ export function readUint16LE(reader) {
51
+ reader.offset += 2;
52
+ return reader.view.getUint16(reader.offset - 2, true);
53
+ }
50
54
  export function readInt32(reader) {
51
55
  reader.offset += 4;
52
56
  return reader.view.getInt32(reader.offset - 4, false);
@@ -118,6 +122,16 @@ export function readUnicodeStringWithLength(reader, length) {
118
122
  }
119
123
  return text;
120
124
  }
125
+ export function readUnicodeStringWithLengthLE(reader, length) {
126
+ var text = '';
127
+ while (length--) {
128
+ var value = readUint16LE(reader);
129
+ if (value || length > 0) { // remove trailing \0
130
+ text += String.fromCharCode(value);
131
+ }
132
+ }
133
+ return text;
134
+ }
121
135
  export function readAsciiString(reader, length) {
122
136
  var text = '';
123
137
  while (length--) {
@@ -321,14 +335,14 @@ function readLayerRecord(reader, psd, options) {
321
335
  var channelCount = readUint16(reader);
322
336
  var channels = [];
323
337
  for (var i = 0; i < channelCount; i++) {
324
- var channelID = readInt16(reader);
325
- var channelLength = readUint32(reader);
338
+ var id = readInt16(reader);
339
+ var length_1 = readUint32(reader);
326
340
  if (options.large) {
327
- if (channelLength !== 0)
341
+ if (length_1 !== 0)
328
342
  throw new Error('Sizes larger than 4GB are not supported');
329
- channelLength = readUint32(reader);
343
+ length_1 = readUint32(reader);
330
344
  }
331
- channels.push({ id: channelID, length: channelLength });
345
+ channels.push({ id: id, length: length_1 });
332
346
  }
333
347
  checkSignature(reader, '8BIM');
334
348
  var blendMode = readSignature(reader);
@@ -340,11 +354,12 @@ function readLayerRecord(reader, psd, options) {
340
354
  var flags = readUint8(reader);
341
355
  layer.transparencyProtected = (flags & 0x01) !== 0;
342
356
  layer.hidden = (flags & 0x02) !== 0;
357
+ if (flags & 0x20)
358
+ layer.effectsOpen = true;
343
359
  // 0x04 - obsolete
344
360
  // 0x08 - 1 for Photoshop 5.0 and later, tells if bit 4 has useful information
345
361
  // 0x10 - pixel data irrelevant to appearance of document
346
- // 0x20 - ???
347
- // if (flags & 0x20) (layer as any)._2 = true; // TEMP !!!!
362
+ // 0x20 - effects/filters panel is expanded
348
363
  skipBytes(reader, 1);
349
364
  readSection(reader, 1, function (left) {
350
365
  var mask = readLayerMaskData(reader, options);
@@ -747,9 +762,9 @@ export function readDataRLE(reader, pixelData, _width, height, step, offsets, la
747
762
  }
748
763
  else {
749
764
  for (var y = 0, p = offset | 0; y < height; y++, li++) {
750
- var length_1 = lengths[li];
751
- var buffer = readBytes(reader, length_1);
752
- for (var i = 0; i < length_1; i++) {
765
+ var length_2 = lengths[li];
766
+ var buffer = readBytes(reader, length_2);
767
+ for (var i = 0; i < length_2; i++) {
753
768
  var header = buffer[i];
754
769
  if (header > 128) {
755
770
  var value = buffer[++i];
@@ -890,7 +905,7 @@ export function readPattern(reader) {
890
905
  var has = readUint32(reader);
891
906
  if (!has)
892
907
  continue;
893
- var length_2 = readUint32(reader);
908
+ var length_3 = readUint32(reader);
894
909
  var pixelDepth = readUint32(reader);
895
910
  var ctop = readUint32(reader);
896
911
  var cleft = readUint32(reader);
@@ -898,7 +913,7 @@ export function readPattern(reader) {
898
913
  var cright = readUint32(reader);
899
914
  var pixelDepth2 = readUint16(reader);
900
915
  var compressionMode = readUint8(reader); // 0 - raw, 1 - zip
901
- var dataLength = length_2 - (4 + 16 + 2 + 1);
916
+ var dataLength = length_3 - (4 + 16 + 2 + 1);
902
917
  var cdata = readBytes(reader, dataLength);
903
918
  if (pixelDepth !== 8 || pixelDepth2 !== 8) {
904
919
  throw new Error('16bit pixel depth not supported for patterns');