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.
@@ -12,7 +12,11 @@ import {
12
12
  } from './psdWriter';
13
13
  import { createCanvasFromData, createEnum, MOCK_HANDLERS } from './helpers';
14
14
  import { decodeString, encodeString } from './utf8';
15
- import { ESliceBGColorType, ESliceHorzAlign, ESliceOrigin, ESliceType, ESliceVertAlign, FractionDescriptor, parseTrackList, readVersionAndDescriptor, serializeTrackList, TimelineTrackDescriptor, TimeScopeDescriptor, writeVersionAndDescriptor } from './descriptor';
15
+ import {
16
+ ESliceBGColorType, ESliceHorzAlign, ESliceOrigin, ESliceType, ESliceVertAlign, frac,
17
+ FractionDescriptor, parseTrackList, readVersionAndDescriptor, serializeTrackList, TimelineTrackDescriptor,
18
+ TimeScopeDescriptor, writeVersionAndDescriptor
19
+ } from './descriptor';
16
20
 
17
21
  export interface ResourceHandler {
18
22
  key: number;
@@ -660,16 +664,15 @@ addHandler(
660
664
  target => target.timelineInformation !== undefined,
661
665
  (reader, target, _, options) => {
662
666
  const desc = readVersionAndDescriptor(reader) as TimelineInformationDescriptor;
663
- // console.log('1075', require('util').inspect(desc, false, 99, true));
664
667
 
665
668
  target.timelineInformation = {
666
669
  enabled: desc.enab,
667
- frameStep: desc.frameStep,
670
+ frameStep: frac(desc.frameStep),
668
671
  frameRate: desc.frameRate,
669
- time: desc.time,
670
- duration: desc.duration,
671
- workInTime: desc.workInTime,
672
- workOutTime: desc.workOutTime,
672
+ time: frac(desc.time),
673
+ duration: frac(desc.duration),
674
+ workInTime: frac(desc.workInTime),
675
+ workOutTime: frac(desc.workOutTime),
673
676
  repeats: desc.LCnt,
674
677
  hasMotion: desc.hasMotion,
675
678
  globalTracks: parseTrackList(desc.globalTrackList, !!options.logMissingFeatures),
@@ -681,10 +684,10 @@ addHandler(
681
684
  muted: g.muted,
682
685
  audioClips: g.audioClipList.map(({ clipID, timeScope, muted, audioLevel, frameReader }) => ({
683
686
  id: clipID,
684
- start: timeScope.Strt,
685
- duration: timeScope.duration,
686
- inTime: timeScope.inTime,
687
- outTime: timeScope.outTime,
687
+ start: frac(timeScope.Strt),
688
+ duration: frac(timeScope.duration),
689
+ inTime: frac(timeScope.inTime),
690
+ outTime: frac(timeScope.outTime),
688
691
  muted: muted,
689
692
  audioLevel: audioLevel,
690
693
  frameReader: {
@@ -745,7 +748,6 @@ addHandler(
745
748
  hasMotion: timeline.hasMotion,
746
749
  };
747
750
 
748
- // console.log('WRITE:1075', require('util').inspect(desc, false, 99, true));
749
751
  writeVersionAndDescriptor(writer, '', 'null', desc, 'anim');
750
752
  },
751
753
  );
@@ -767,7 +769,6 @@ addHandler(
767
769
  target => target.sheetDisclosure !== undefined,
768
770
  (reader, target) => {
769
771
  const desc = readVersionAndDescriptor(reader) as SheetDisclosureDescriptor;
770
- // console.log('1076', require('util').inspect(desc, false, 99, true));
771
772
 
772
773
  target.sheetDisclosure = {};
773
774
 
@@ -907,10 +908,10 @@ addHandler(
907
908
  const associatedLayerId = origin == 'layer' ? readUint32(reader) : 0;
908
909
  const name = readUnicodeString(reader);
909
910
  const type = clamped(sliceTypes, readUint32(reader));
910
- const top = readInt32(reader);
911
911
  const left = readInt32(reader);
912
- const bottom = readInt32(reader);
912
+ const top = readInt32(reader);
913
913
  const right = readInt32(reader);
914
+ const bottom = readInt32(reader);
914
915
  const url = readUnicodeString(reader);
915
916
  const target = readUnicodeString(reader);
916
917
  const message = readUnicodeString(reader);
@@ -930,7 +931,6 @@ addHandler(
930
931
  bounds: { top, left, bottom, right },
931
932
  backgroundColorType, backgroundColor: { r, g, b, a },
932
933
  });
933
- // console.log(require('util').inspect(slices[slices.length - 1], false, 99, true));
934
934
  }
935
935
  const desc = readVersionAndDescriptor(reader) as SlicesDesc;
936
936
  desc.slices.forEach(d => {
@@ -942,12 +942,8 @@ addHandler(
942
942
  slice.rightOutset = d.rightOutset;
943
943
  }
944
944
  });
945
-
946
- // console.log(require('util').inspect(desc, false, 99, true));
947
- // console.log(require('util').inspect(target.slices, false, 99, true));
948
945
  } else if (version == 7 || version == 8) {
949
946
  const desc = readVersionAndDescriptor(reader) as SlicesDesc7;
950
- // console.log(require('util').inspect(desc, false, 99, true));
951
947
 
952
948
  if (!target.slices) target.slices = [];
953
949
  target.slices.push({
@@ -1009,10 +1005,10 @@ addHandler(
1009
1005
  if (slice.origin === 'layer') writeUint32(writer, slice.associatedLayerId);
1010
1006
  writeUnicodeString(writer, slice.name);
1011
1007
  writeUint32(writer, sliceTypes.indexOf(slice.type));
1012
- writeInt32(writer, slice.bounds.top);
1013
1008
  writeInt32(writer, slice.bounds.left);
1014
- writeInt32(writer, slice.bounds.bottom);
1009
+ writeInt32(writer, slice.bounds.top);
1015
1010
  writeInt32(writer, slice.bounds.right);
1011
+ writeInt32(writer, slice.bounds.bottom);
1016
1012
  writeUnicodeString(writer, slice.url);
1017
1013
  writeUnicodeString(writer, slice.target);
1018
1014
  writeUnicodeString(writer, slice.message);
@@ -1247,7 +1243,6 @@ addHandler(
1247
1243
  target => target.pathSelectionState !== undefined,
1248
1244
  (reader, target, _left) => {
1249
1245
  const desc: Descriptor1088 = readVersionAndDescriptor(reader);
1250
- // console.log(require('util').inspect(desc, false, 99, true));
1251
1246
  target.pathSelectionState = desc['null'];
1252
1247
  },
1253
1248
  (writer, target) => {
package/src/psd.ts CHANGED
@@ -380,6 +380,13 @@ export interface TextGridInfo {
380
380
  alignLineHeightToGridFlags?: boolean;
381
381
  }
382
382
 
383
+ export interface UnitsBounds {
384
+ top: UnitsValue;
385
+ left: UnitsValue;
386
+ right: UnitsValue;
387
+ bottom: UnitsValue;
388
+ }
389
+
383
390
  export interface LayerTextData {
384
391
  text: string;
385
392
  transform?: number[]; // 2d transform matrix [xx, xy, yx, yy, tx, ty]
@@ -409,6 +416,9 @@ export interface LayerTextData {
409
416
  shapeType?: 'point' | 'box';
410
417
  pointBase?: number[];
411
418
  boxBounds?: number[];
419
+
420
+ bounds?: UnitsBounds;
421
+ boundingBox?: UnitsBounds;
412
422
  }
413
423
 
414
424
  export interface PatternInfo {
@@ -674,43 +684,458 @@ export interface LinkedFile {
674
684
  assetLockedState?: number;
675
685
  }
676
686
 
677
- export interface PlacedLayerPuppetFilter {
678
- rigidType: boolean;
679
- bounds: { x: number; y: number; }[];
680
- puppetShapeList: {
687
+ type FilterVariant = {
688
+ type: 'average' | 'blur' | 'blur more';
689
+ } | {
690
+ type: 'box blur';
691
+ filter: {
692
+ radius: UnitsValue;
693
+ };
694
+ } | {
695
+ type: 'gaussian blur';
696
+ filter: {
697
+ radius: UnitsValue;
698
+ };
699
+ } | {
700
+ type: 'motion blur';
701
+ filter: {
702
+ angle: number; // in degrees
703
+ distance: UnitsValue;
704
+ };
705
+ } | {
706
+ type: 'radial blur';
707
+ filter: {
708
+ amount: number;
709
+ method: 'spin' | 'zoom';
710
+ quality: 'draft' | 'good' | 'best';
711
+ };
712
+ } | {
713
+ type: 'shape blur';
714
+ filter: {
715
+ radius: UnitsValue;
716
+ customShape: { name: string; id: string };
717
+ };
718
+ } | {
719
+ type: 'smart blur';
720
+ filter: {
721
+ radius: number;
722
+ threshold: number;
723
+ quality: 'low' | 'medium' | 'high';
724
+ mode: 'normal' | 'edge only' | 'overlay edge';
725
+ };
726
+ } | {
727
+ type: 'surface blur';
728
+ filter: {
729
+ radius: UnitsValue;
730
+ threshold: number;
731
+ };
732
+ } | {
733
+ type: 'displace';
734
+ filter: {
735
+ horizontalScale: number;
736
+ verticalScale: number;
737
+ displacementMap: 'stretch to fit' | 'tile';
738
+ undefinedAreas: 'wrap around' | 'repeat edge pixels';
739
+ displacementFile: {
740
+ signature: string;
741
+ path: string;
742
+ };
743
+ };
744
+ } | {
745
+ type: 'pinch';
746
+ filter: {
747
+ amount: number;
748
+ };
749
+ } | {
750
+ type: 'polar coordinates';
751
+ filter: {
752
+ conversion: 'rectangular to polar' | 'polar to rectangular';
753
+ };
754
+ } | {
755
+ type: 'ripple';
756
+ filter: {
757
+ amount: number;
758
+ size: 'small' | 'medium' | 'large';
759
+ };
760
+ } | {
761
+ type: 'shear';
762
+ filter: {
763
+ shearPoints: { x: number; y: number }[];
764
+ shearStart: number;
765
+ shearEnd: number;
766
+ undefinedAreas: 'wrap around' | 'repeat edge pixels';
767
+ };
768
+ } | {
769
+ type: 'spherize';
770
+ filter: {
771
+ amount: number;
772
+ mode: 'normal' | 'horizontal only' | 'vertical only';
773
+ };
774
+ } | {
775
+ type: 'twirl';
776
+ filter: {
777
+ angle: number; // degrees
778
+ };
779
+ } | {
780
+ type: 'wave';
781
+ filter: {
782
+ numberOfGenerators: number;
783
+ type: 'sine' | 'triangle' | 'square';
784
+ wavelength: { min: number; max: number };
785
+ amplitude: { min: number; max: number };
786
+ scale: { x: number; y: number };
787
+ randomSeed: number;
788
+ undefinedAreas: 'wrap around' | 'repeat edge pixels';
789
+ };
790
+ } | {
791
+ type: 'zigzag';
792
+ filter: {
793
+ amount: number;
794
+ ridges: number;
795
+ style: 'around center' | 'out from center' | 'pond ripples';
796
+ };
797
+ } | {
798
+ type: 'add noise';
799
+ filter: {
800
+ amount: number; // 0..1
801
+ distribution: 'uniform' | 'gaussian';
802
+ monochromatic: boolean;
803
+ randomSeed: number;
804
+ };
805
+ } | {
806
+ type: 'despeckle';
807
+ } | {
808
+ type: 'dust and scratches';
809
+ filter: {
810
+ radius: number; // pixels
811
+ threshold: number; // levels
812
+ };
813
+ } | {
814
+ type: 'median';
815
+ filter: {
816
+ radius: UnitsValue;
817
+ };
818
+ } | {
819
+ type: 'reduce noise';
820
+ filter: {
821
+ preset: string;
822
+ removeJpegArtifact: boolean;
823
+ reduceColorNoise: number; // 0..1
824
+ sharpenDetails: number; // 0..1
825
+ channelDenoise: {
826
+ channels: ('red' | 'green' | 'blue' | 'composite')[];
827
+ amount: number;
828
+ preserveDetails?: number; // percent
829
+ }[];
830
+ };
831
+ } | {
832
+ type: 'color halftone';
833
+ filter: {
834
+ radius: number; // pixels
835
+ angle1: number; // degrees
836
+ angle2: number; // degrees
837
+ angle3: number; // degrees
838
+ angle4: number; // degrees
839
+ };
840
+ } | {
841
+ type: 'crystallize';
842
+ filter: {
843
+ cellSize: number;
844
+ randomSeed: number;
845
+ };
846
+ } | {
847
+ type: 'facet' | 'fragment';
848
+ } | {
849
+ type: 'mezzotint';
850
+ filter: {
851
+ type: 'fine dots' | 'medium dots' | 'grainy dots' | 'coarse dots' | 'short lines' | 'medium lines' | 'long lines' | 'short strokes' | 'medium strokes' | 'long strokes';
852
+ randomSeed: number;
853
+ };
854
+ } | {
855
+ type: 'mosaic';
856
+ filter: {
857
+ cellSize: UnitsValue;
858
+ };
859
+ } | {
860
+ type: 'pointillize';
861
+ filter: {
862
+ cellSize: number;
863
+ randomSeed: number;
864
+ };
865
+ } | {
866
+ type: 'clouds';
867
+ filter: {
868
+ randomSeed: number;
869
+ };
870
+ } | {
871
+ type: 'difference clouds';
872
+ filter: {
873
+ randomSeed: number;
874
+ };
875
+ } | {
876
+ type: 'fibers';
877
+ filter: {
878
+ variance: number;
879
+ strength: number;
880
+ randomSeed: number;
881
+ };
882
+ } | {
883
+ type: 'lens flare';
884
+ filter: {
885
+ brightness: number; // percent
886
+ position: { x: number; y: number; };
887
+ lensType: '50-300mm zoom' | '32mm prime' | '105mm prime' | 'movie prime';
888
+ };
889
+ } /*| {
890
+ type: 'lighting effects';
891
+ filter: {
892
+ lights: Light3D;
893
+ cameraPosition: Position3D;
894
+ gloss: number;
895
+ metallic: number;
896
+ exposure: number;
897
+ ambience: number;
898
+ ambientColor: Color;
899
+ // TODO: BmpA, BmpC / Hotspot / color ?
900
+ width: number;
901
+ height: number;
902
+ };
903
+ }*/ | {
904
+ type: 'sharpen' | 'sharpen edges' | 'sharpen more';
905
+ } | {
906
+ type: 'smart sharpen';
907
+ filter: {
908
+ amount: number; // 0..1
909
+ radius: UnitsValue;
910
+ threshold: number;
911
+ angle: number; // degrees
912
+ moreAccurate: boolean;
913
+ blur: 'gaussian blur' | 'lens blur' | 'motion blur';
914
+ preset: string;
915
+ shadow: {
916
+ fadeAmount: number; // 0..1
917
+ tonalWidth: number; // 0..1
918
+ radius: number; // px
919
+ };
920
+ highlight: {
921
+ fadeAmount: number; // 0..1
922
+ tonalWidth: number; // 0..1
923
+ radius: number; // px
924
+ };
925
+ };
926
+ } | {
927
+ type: 'unsharp mask';
928
+ filter: {
929
+ amount: number; // 0..1
930
+ radius: UnitsValue;
931
+ threshold: number; // levels
932
+ };
933
+ } | {
934
+ type: 'diffuse';
935
+ filter: {
936
+ mode: 'normal' | 'darken only' | 'lighten only' | 'anisotropic';
937
+ randomSeed: number;
938
+ };
939
+ } | {
940
+ type: 'emboss';
941
+ filter: {
942
+ angle: number; // degrees
943
+ height: number; // pixels
944
+ amount: number; // percent
945
+ };
946
+ } | {
947
+ type: 'extrude';
948
+ filter: {
949
+ type: 'blocks' | 'pyramids';
950
+ size: number; // pixels
951
+ depth: number;
952
+ depthMode: 'random' | 'level-based';
953
+ randomSeed: number;
954
+ solidFrontFaces: boolean;
955
+ maskIncompleteBlocks: boolean;
956
+ };
957
+ } | {
958
+ type: 'find edges' | 'solarize';
959
+ } | {
960
+ type: 'tiles';
961
+ filter: {
962
+ numberOfTiles: number;
963
+ maximumOffset: number; // percent
964
+ fillEmptyAreaWith: 'background color' | 'foreground color' | 'inverse image' | 'unaltered image';
965
+ randomSeed: number;
966
+ };
967
+ } | {
968
+ type: 'trace contour';
969
+ filter: {
970
+ level: number;
971
+ edge: 'lower' | 'upper';
972
+ };
973
+ } | {
974
+ type: 'wind';
975
+ filter: {
976
+ method: 'wind' | 'blast' | 'stagger';
977
+ direction: 'left' | 'right';
978
+ };
979
+ } | {
980
+ type: 'de-interlace';
981
+ filter: {
982
+ eliminate: 'odd lines' | 'even lines';
983
+ newFieldsBy: 'duplication' | 'interpolation';
984
+ };
985
+ } | {
986
+ type: 'ntsc colors';
987
+ } | {
988
+ type: 'custom';
989
+ filter: {
990
+ scale: number;
991
+ offset: number;
992
+ matrix: number[];
993
+ };
994
+ } | {
995
+ type: 'high pass' | 'maximum' | 'minimum';
996
+ filter: {
997
+ radius: UnitsValue;
998
+ };
999
+ } | {
1000
+ type: 'offset';
1001
+ filter: {
1002
+ horizontal: number; // pixels
1003
+ vertical: number; // pixels
1004
+ undefinedAreas: 'set to transparent' | 'repeat edge pixels' | 'wrap around';
1005
+ };
1006
+ } | {
1007
+ type: 'puppet';
1008
+ filter: {
681
1009
  rigidType: boolean;
682
- // VrsM: number;
683
- // VrsN: number;
684
- originalVertexArray: { x: number; y: number; }[];
685
- deformedVertexArray: { x: number; y: number; }[];
686
- indexArray: number[];
687
- pinOffsets: { x: number; y: number; }[];
688
- posFinalPins: { x: number; y: number; }[];
689
- pinVertexIndices: number[];
690
- selectedPin: number[];
691
- pinPosition: { x: number; y: number; }[];
692
- pinRotation: number[]; // in degrees
693
- pinOverlay: boolean[];
694
- pinDepth: number[];
695
- meshQuality: number;
696
- meshExpansion: number;
697
- meshRigidity: number;
698
- imageResolution: number;
699
- meshBoundaryPath: {
700
- pathComponents: {
701
- shapeOperation: string;
702
- paths: {
703
- closed: boolean;
704
- points: {
705
- anchor: { x: UnitsValue; y: UnitsValue; };
706
- forward: { x: UnitsValue; y: UnitsValue; };
707
- backward: { x: UnitsValue; y: UnitsValue; };
708
- smooth: boolean;
1010
+ bounds: { x: number; y: number; }[];
1011
+ puppetShapeList: {
1012
+ rigidType: boolean;
1013
+ // VrsM: number;
1014
+ // VrsN: number;
1015
+ originalVertexArray: { x: number; y: number; }[];
1016
+ deformedVertexArray: { x: number; y: number; }[];
1017
+ indexArray: number[];
1018
+ pinOffsets: { x: number; y: number; }[];
1019
+ posFinalPins: { x: number; y: number; }[];
1020
+ pinVertexIndices: number[];
1021
+ selectedPin: number[];
1022
+ pinPosition: { x: number; y: number; }[];
1023
+ pinRotation: number[]; // in degrees
1024
+ pinOverlay: boolean[];
1025
+ pinDepth: number[];
1026
+ meshQuality: number;
1027
+ meshExpansion: number;
1028
+ meshRigidity: number;
1029
+ imageResolution: number;
1030
+ meshBoundaryPath: {
1031
+ pathComponents: {
1032
+ shapeOperation: string;
1033
+ paths: {
1034
+ closed: boolean;
1035
+ points: {
1036
+ anchor: { x: UnitsValue; y: UnitsValue; };
1037
+ forward: { x: UnitsValue; y: UnitsValue; };
1038
+ backward: { x: UnitsValue; y: UnitsValue; };
1039
+ smooth: boolean;
1040
+ }[];
709
1041
  }[];
710
1042
  }[];
711
- }[];
712
- };
713
- }[];
1043
+ };
1044
+ }[];
1045
+ };
1046
+ } | {
1047
+ type: 'oil paint plugin';
1048
+ filter: {
1049
+ name: string;
1050
+ gpu: boolean;
1051
+ lighting: boolean;
1052
+ // FPth ???
1053
+ parameters: {
1054
+ name: string;
1055
+ value: number;
1056
+ }[];
1057
+ };
1058
+ } /*| {
1059
+ type: 'lens correction';
1060
+ filter: {
1061
+ profile: string;
1062
+
1063
+ };
1064
+ }*//* | {
1065
+ type: 'adaptive wide angle';
1066
+ filter: {
1067
+ correction: 'fisheye' | 'perspective' | 'auto' | 'full spherical';
1068
+ focalLength: number;
1069
+ cropFactor: number;
1070
+ imageScale: number;
1071
+ imageX: number;
1072
+ imageY: number;
1073
+ };
1074
+ }*//* | {
1075
+ type: 'filter gallery';
1076
+ filter: {
1077
+ filter: 'colored pencil';
1078
+ pencilWidth: number;
1079
+ strokePressure: number;
1080
+ paperBrightness: number;
1081
+ } | ...;
1082
+ }*/ | {
1083
+ type: 'hsb/hsl';
1084
+ filter: {
1085
+ inputMode: 'rgb' | 'hsb' | 'hsl';
1086
+ rowOrder: 'rgb' | 'hsb' | 'hsl';
1087
+ };
1088
+ } | {
1089
+ type: 'oil paint';
1090
+ filter: {
1091
+ lightingOn: boolean;
1092
+ stylization: number;
1093
+ cleanliness: number;
1094
+ brushScale: number;
1095
+ microBrush: number;
1096
+ lightDirection: number; // degrees
1097
+ specularity: number;
1098
+ };
1099
+ } | {
1100
+ type: 'liquify';
1101
+ filter: {
1102
+ liquifyMesh: Uint8Array;
1103
+ };
1104
+ };
1105
+
1106
+ /*
1107
+ export interface Position3D {
1108
+ x: number;
1109
+ y: number;
1110
+ z: number;
1111
+ angleX: number;
1112
+ angleY: number;
1113
+ angleZ: number;
1114
+ }
1115
+
1116
+ export interface Light3D {
1117
+ name: string;
1118
+ type: 'point' | 'spot' | 'infinite';
1119
+ red: number; // 0..1
1120
+ green: number; // 0..1
1121
+ blue: number; // 0..1
1122
+ // TODO: hots
1123
+ falloff: number;
1124
+ shadow: number;
1125
+ // TODO: attn
1126
+ // TODO: attt atta, attb, attc, orad, irad, mult, Type
1127
+ // ...
1128
+ }
1129
+ */
1130
+
1131
+ export type Filter = FilterVariant & {
1132
+ name: string;
1133
+ opacity: number;
1134
+ blendMode: BlendMode;
1135
+ enabled: boolean;
1136
+ hasOptions: boolean;
1137
+ foregroundColor: Color;
1138
+ backgroundColor: Color;
714
1139
  }
715
1140
 
716
1141
  export interface PlacedLayerFilter {
@@ -719,17 +1144,7 @@ export interface PlacedLayerFilter {
719
1144
  maskEnabled: boolean;
720
1145
  maskLinked: boolean;
721
1146
  maskExtendWithWhite: boolean;
722
- list: {
723
- id: number;
724
- name: string;
725
- opacity: number;
726
- blendMode: BlendMode;
727
- enabled: boolean;
728
- hasOptions: boolean;
729
- foregroundColor: Color;
730
- backgroundColor: Color;
731
- filter: PlacedLayerPuppetFilter | {};
732
- }[];
1147
+ list: Filter[];
733
1148
  }
734
1149
 
735
1150
  export type PlacedLayerType = 'unknown' | 'vector' | 'raster' | 'image stack';
@@ -953,7 +1368,22 @@ export interface LayerAdditionalInfo {
953
1368
  unifyLayerVisibility?: boolean;
954
1369
  };
955
1370
  timeline?: Timeline;
956
- filterEffects?: any;
1371
+ filterEffectsMasks?: {
1372
+ id: string;
1373
+ top: number;
1374
+ left: number;
1375
+ bottom: number;
1376
+ right: number;
1377
+ depth: number;
1378
+ channels: ({
1379
+ compressionMode: number;
1380
+ data: Uint8Array;
1381
+ } | undefined)[];
1382
+ extra?: {
1383
+ compressionMode: number;
1384
+ data: Uint8Array;
1385
+ };
1386
+ }[];
957
1387
 
958
1388
  // Base64 encoded raw EngineData, currently just kept in original state to support
959
1389
  // loading and modifying PSD file without breaking text layers.
@@ -1165,6 +1595,7 @@ export interface Layer extends LayerAdditionalInfo {
1165
1595
  blendMode?: BlendMode;
1166
1596
  opacity?: number;
1167
1597
  transparencyProtected?: boolean;
1598
+ effectsOpen?: boolean; // effects/filters panel is expanded
1168
1599
  hidden?: boolean;
1169
1600
  clipping?: boolean;
1170
1601
  canvas?: HTMLCanvasElement;