ag-psd 16.0.0 → 17.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/dist-es/psd.d.ts CHANGED
@@ -659,86 +659,444 @@ export interface LinkedFile {
659
659
  assetModTime?: number;
660
660
  assetLockedState?: number;
661
661
  }
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: {
662
+ type FilterVariant = {
663
+ type: 'average' | 'blur' | 'blur more';
664
+ } | {
665
+ type: 'box blur';
666
+ filter: {
667
+ radius: UnitsValue;
668
+ };
669
+ } | {
670
+ type: 'gaussian blur';
671
+ filter: {
672
+ radius: UnitsValue;
673
+ };
674
+ } | {
675
+ type: 'motion blur';
676
+ filter: {
677
+ angle: number;
678
+ distance: UnitsValue;
679
+ };
680
+ } | {
681
+ type: 'radial blur';
682
+ filter: {
683
+ amount: number;
684
+ method: 'spin' | 'zoom';
685
+ quality: 'draft' | 'good' | 'best';
686
+ };
687
+ } | {
688
+ type: 'shape blur';
689
+ filter: {
690
+ radius: UnitsValue;
691
+ customShape: {
692
+ name: string;
693
+ id: string;
694
+ };
695
+ };
696
+ } | {
697
+ type: 'smart blur';
698
+ filter: {
699
+ radius: number;
700
+ threshold: number;
701
+ quality: 'low' | 'medium' | 'high';
702
+ mode: 'normal' | 'edge only' | 'overlay edge';
703
+ };
704
+ } | {
705
+ type: 'surface blur';
706
+ filter: {
707
+ radius: UnitsValue;
708
+ threshold: number;
709
+ };
710
+ } | {
711
+ type: 'displace';
712
+ filter: {
713
+ horizontalScale: number;
714
+ verticalScale: number;
715
+ displacementMap: 'stretch to fit' | 'tile';
716
+ undefinedAreas: 'wrap around' | 'repeat edge pixels';
717
+ displacementFile: {
718
+ signature: string;
719
+ path: string;
720
+ };
721
+ };
722
+ } | {
723
+ type: 'pinch';
724
+ filter: {
725
+ amount: number;
726
+ };
727
+ } | {
728
+ type: 'polar coordinates';
729
+ filter: {
730
+ conversion: 'rectangular to polar' | 'polar to rectangular';
731
+ };
732
+ } | {
733
+ type: 'ripple';
734
+ filter: {
735
+ amount: number;
736
+ size: 'small' | 'medium' | 'large';
737
+ };
738
+ } | {
739
+ type: 'shear';
740
+ filter: {
741
+ shearPoints: {
675
742
  x: number;
676
743
  y: number;
677
744
  }[];
678
- indexArray: number[];
679
- pinOffsets: {
745
+ shearStart: number;
746
+ shearEnd: number;
747
+ undefinedAreas: 'wrap around' | 'repeat edge pixels';
748
+ };
749
+ } | {
750
+ type: 'spherize';
751
+ filter: {
752
+ amount: number;
753
+ mode: 'normal' | 'horizontal only' | 'vertical only';
754
+ };
755
+ } | {
756
+ type: 'twirl';
757
+ filter: {
758
+ angle: number;
759
+ };
760
+ } | {
761
+ type: 'wave';
762
+ filter: {
763
+ numberOfGenerators: number;
764
+ type: 'sine' | 'triangle' | 'square';
765
+ wavelength: {
766
+ min: number;
767
+ max: number;
768
+ };
769
+ amplitude: {
770
+ min: number;
771
+ max: number;
772
+ };
773
+ scale: {
680
774
  x: number;
681
775
  y: number;
776
+ };
777
+ randomSeed: number;
778
+ undefinedAreas: 'wrap around' | 'repeat edge pixels';
779
+ };
780
+ } | {
781
+ type: 'zigzag';
782
+ filter: {
783
+ amount: number;
784
+ ridges: number;
785
+ style: 'around center' | 'out from center' | 'pond ripples';
786
+ };
787
+ } | {
788
+ type: 'add noise';
789
+ filter: {
790
+ amount: number;
791
+ distribution: 'uniform' | 'gaussian';
792
+ monochromatic: boolean;
793
+ randomSeed: number;
794
+ };
795
+ } | {
796
+ type: 'despeckle';
797
+ } | {
798
+ type: 'dust and scratches';
799
+ filter: {
800
+ radius: number;
801
+ threshold: number;
802
+ };
803
+ } | {
804
+ type: 'median';
805
+ filter: {
806
+ radius: UnitsValue;
807
+ };
808
+ } | {
809
+ type: 'reduce noise';
810
+ filter: {
811
+ preset: string;
812
+ removeJpegArtifact: boolean;
813
+ reduceColorNoise: number;
814
+ sharpenDetails: number;
815
+ channelDenoise: {
816
+ channels: ('red' | 'green' | 'blue' | 'composite')[];
817
+ amount: number;
818
+ preserveDetails?: number;
682
819
  }[];
683
- posFinalPins: {
820
+ };
821
+ } | {
822
+ type: 'color halftone';
823
+ filter: {
824
+ radius: number;
825
+ angle1: number;
826
+ angle2: number;
827
+ angle3: number;
828
+ angle4: number;
829
+ };
830
+ } | {
831
+ type: 'crystallize';
832
+ filter: {
833
+ cellSize: number;
834
+ randomSeed: number;
835
+ };
836
+ } | {
837
+ type: 'facet' | 'fragment';
838
+ } | {
839
+ type: 'mezzotint';
840
+ filter: {
841
+ type: 'fine dots' | 'medium dots' | 'grainy dots' | 'coarse dots' | 'short lines' | 'medium lines' | 'long lines' | 'short strokes' | 'medium strokes' | 'long strokes';
842
+ randomSeed: number;
843
+ };
844
+ } | {
845
+ type: 'mosaic';
846
+ filter: {
847
+ cellSize: UnitsValue;
848
+ };
849
+ } | {
850
+ type: 'pointillize';
851
+ filter: {
852
+ cellSize: number;
853
+ randomSeed: number;
854
+ };
855
+ } | {
856
+ type: 'clouds';
857
+ filter: {
858
+ randomSeed: number;
859
+ };
860
+ } | {
861
+ type: 'difference clouds';
862
+ filter: {
863
+ randomSeed: number;
864
+ };
865
+ } | {
866
+ type: 'fibers';
867
+ filter: {
868
+ variance: number;
869
+ strength: number;
870
+ randomSeed: number;
871
+ };
872
+ } | {
873
+ type: 'lens flare';
874
+ filter: {
875
+ brightness: number;
876
+ position: {
684
877
  x: number;
685
878
  y: number;
686
- }[];
687
- pinVertexIndices: number[];
688
- selectedPin: number[];
689
- pinPosition: {
879
+ };
880
+ lensType: '50-300mm zoom' | '32mm prime' | '105mm prime' | 'movie prime';
881
+ };
882
+ } | {
883
+ type: 'sharpen' | 'sharpen edges' | 'sharpen more';
884
+ } | {
885
+ type: 'smart sharpen';
886
+ filter: {
887
+ amount: number;
888
+ radius: UnitsValue;
889
+ threshold: number;
890
+ angle: number;
891
+ moreAccurate: boolean;
892
+ blur: 'gaussian blur' | 'lens blur' | 'motion blur';
893
+ preset: string;
894
+ shadow: {
895
+ fadeAmount: number;
896
+ tonalWidth: number;
897
+ radius: number;
898
+ };
899
+ highlight: {
900
+ fadeAmount: number;
901
+ tonalWidth: number;
902
+ radius: number;
903
+ };
904
+ };
905
+ } | {
906
+ type: 'unsharp mask';
907
+ filter: {
908
+ amount: number;
909
+ radius: UnitsValue;
910
+ threshold: number;
911
+ };
912
+ } | {
913
+ type: 'diffuse';
914
+ filter: {
915
+ mode: 'normal' | 'darken only' | 'lighten only' | 'anisotropic';
916
+ randomSeed: number;
917
+ };
918
+ } | {
919
+ type: 'emboss';
920
+ filter: {
921
+ angle: number;
922
+ height: number;
923
+ amount: number;
924
+ };
925
+ } | {
926
+ type: 'extrude';
927
+ filter: {
928
+ type: 'blocks' | 'pyramids';
929
+ size: number;
930
+ depth: number;
931
+ depthMode: 'random' | 'level-based';
932
+ randomSeed: number;
933
+ solidFrontFaces: boolean;
934
+ maskIncompleteBlocks: boolean;
935
+ };
936
+ } | {
937
+ type: 'find edges' | 'solarize';
938
+ } | {
939
+ type: 'tiles';
940
+ filter: {
941
+ numberOfTiles: number;
942
+ maximumOffset: number;
943
+ fillEmptyAreaWith: 'background color' | 'foreground color' | 'inverse image' | 'unaltered image';
944
+ randomSeed: number;
945
+ };
946
+ } | {
947
+ type: 'trace contour';
948
+ filter: {
949
+ level: number;
950
+ edge: 'lower' | 'upper';
951
+ };
952
+ } | {
953
+ type: 'wind';
954
+ filter: {
955
+ method: 'wind' | 'blast' | 'stagger';
956
+ direction: 'left' | 'right';
957
+ };
958
+ } | {
959
+ type: 'de-interlace';
960
+ filter: {
961
+ eliminate: 'odd lines' | 'even lines';
962
+ newFieldsBy: 'duplication' | 'interpolation';
963
+ };
964
+ } | {
965
+ type: 'ntsc colors';
966
+ } | {
967
+ type: 'custom';
968
+ filter: {
969
+ scale: number;
970
+ offset: number;
971
+ matrix: number[];
972
+ };
973
+ } | {
974
+ type: 'high pass' | 'maximum' | 'minimum';
975
+ filter: {
976
+ radius: UnitsValue;
977
+ };
978
+ } | {
979
+ type: 'offset';
980
+ filter: {
981
+ horizontal: number;
982
+ vertical: number;
983
+ undefinedAreas: 'set to transparent' | 'repeat edge pixels' | 'wrap around';
984
+ };
985
+ } | {
986
+ type: 'puppet';
987
+ filter: {
988
+ rigidType: boolean;
989
+ bounds: {
690
990
  x: number;
691
991
  y: number;
692
992
  }[];
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;
993
+ puppetShapeList: {
994
+ rigidType: boolean;
995
+ originalVertexArray: {
996
+ x: number;
997
+ y: number;
998
+ }[];
999
+ deformedVertexArray: {
1000
+ x: number;
1001
+ y: number;
1002
+ }[];
1003
+ indexArray: number[];
1004
+ pinOffsets: {
1005
+ x: number;
1006
+ y: number;
1007
+ }[];
1008
+ posFinalPins: {
1009
+ x: number;
1010
+ y: number;
1011
+ }[];
1012
+ pinVertexIndices: number[];
1013
+ selectedPin: number[];
1014
+ pinPosition: {
1015
+ x: number;
1016
+ y: number;
1017
+ }[];
1018
+ pinRotation: number[];
1019
+ pinOverlay: boolean[];
1020
+ pinDepth: number[];
1021
+ meshQuality: number;
1022
+ meshExpansion: number;
1023
+ meshRigidity: number;
1024
+ imageResolution: number;
1025
+ meshBoundaryPath: {
1026
+ pathComponents: {
1027
+ shapeOperation: string;
1028
+ paths: {
1029
+ closed: boolean;
1030
+ points: {
1031
+ anchor: {
1032
+ x: UnitsValue;
1033
+ y: UnitsValue;
1034
+ };
1035
+ forward: {
1036
+ x: UnitsValue;
1037
+ y: UnitsValue;
1038
+ };
1039
+ backward: {
1040
+ x: UnitsValue;
1041
+ y: UnitsValue;
1042
+ };
1043
+ smooth: boolean;
1044
+ }[];
719
1045
  }[];
720
1046
  }[];
721
- }[];
722
- };
723
- }[];
724
- }
1047
+ };
1048
+ }[];
1049
+ };
1050
+ } | {
1051
+ type: 'oil paint plugin';
1052
+ filter: {
1053
+ name: string;
1054
+ gpu: boolean;
1055
+ lighting: boolean;
1056
+ parameters: {
1057
+ name: string;
1058
+ value: number;
1059
+ }[];
1060
+ };
1061
+ } | {
1062
+ type: 'hsb/hsl';
1063
+ filter: {
1064
+ inputMode: 'rgb' | 'hsb' | 'hsl';
1065
+ rowOrder: 'rgb' | 'hsb' | 'hsl';
1066
+ };
1067
+ } | {
1068
+ type: 'oil paint';
1069
+ filter: {
1070
+ lightingOn: boolean;
1071
+ stylization: number;
1072
+ cleanliness: number;
1073
+ brushScale: number;
1074
+ microBrush: number;
1075
+ lightDirection: number;
1076
+ specularity: number;
1077
+ };
1078
+ } | {
1079
+ type: 'liquify';
1080
+ filter: {
1081
+ liquifyMesh: Uint8Array;
1082
+ };
1083
+ };
1084
+ export type Filter = FilterVariant & {
1085
+ name: string;
1086
+ opacity: number;
1087
+ blendMode: BlendMode;
1088
+ enabled: boolean;
1089
+ hasOptions: boolean;
1090
+ foregroundColor: Color;
1091
+ backgroundColor: Color;
1092
+ };
725
1093
  export interface PlacedLayerFilter {
726
1094
  enabled: boolean;
727
1095
  validAtPosition: boolean;
728
1096
  maskEnabled: boolean;
729
1097
  maskLinked: boolean;
730
1098
  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
- }[];
1099
+ list: Filter[];
742
1100
  }
743
1101
  export type PlacedLayerType = 'unknown' | 'vector' | 'raster' | 'image stack';
744
1102
  export interface PlacedLayer {
@@ -973,7 +1331,22 @@ export interface LayerAdditionalInfo {
973
1331
  unifyLayerVisibility?: boolean;
974
1332
  };
975
1333
  timeline?: Timeline;
976
- filterEffects?: any;
1334
+ filterEffectsMasks?: {
1335
+ id: string;
1336
+ top: number;
1337
+ left: number;
1338
+ bottom: number;
1339
+ right: number;
1340
+ depth: number;
1341
+ channels: ({
1342
+ compressionMode: number;
1343
+ data: Uint8Array;
1344
+ } | undefined)[];
1345
+ extra?: {
1346
+ compressionMode: number;
1347
+ data: Uint8Array;
1348
+ };
1349
+ }[];
977
1350
  engineData?: string;
978
1351
  }
979
1352
  export interface ImageResources {
@@ -1205,6 +1578,7 @@ export interface Layer extends LayerAdditionalInfo {
1205
1578
  blendMode?: BlendMode;
1206
1579
  opacity?: number;
1207
1580
  transparencyProtected?: boolean;
1581
+ effectsOpen?: boolean;
1208
1582
  hidden?: boolean;
1209
1583
  clipping?: boolean;
1210
1584
  canvas?: HTMLCanvasElement;
@@ -1286,3 +1660,4 @@ export interface WriteOptions {
1286
1660
  * with some software. It may also be significantly slower. */
1287
1661
  compress?: boolean;
1288
1662
  }
1663
+ 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');