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/CHANGELOG.md +9 -0
- package/README.md +1 -0
- package/dist/additionalInfo.js +933 -247
- package/dist/additionalInfo.js.map +1 -1
- package/dist/bundle.js +1299 -325
- package/dist/descriptor.d.ts +140 -1
- package/dist/descriptor.js +297 -37
- package/dist/descriptor.js.map +1 -1
- package/dist/imageResources.js +13 -21
- package/dist/imageResources.js.map +1 -1
- package/dist/psd.d.ts +445 -62
- package/dist/psdReader.d.ts +2 -0
- package/dist/psdReader.js +30 -13
- package/dist/psdReader.js.map +1 -1
- package/dist/psdWriter.d.ts +4 -0
- package/dist/psdWriter.js +26 -7
- package/dist/psdWriter.js.map +1 -1
- package/dist-es/additionalInfo.js +934 -248
- package/dist-es/additionalInfo.js.map +1 -1
- package/dist-es/descriptor.d.ts +140 -1
- package/dist-es/descriptor.js +293 -38
- package/dist-es/descriptor.js.map +1 -1
- package/dist-es/imageResources.js +14 -22
- package/dist-es/imageResources.js.map +1 -1
- package/dist-es/psd.d.ts +445 -62
- package/dist-es/psdReader.d.ts +2 -0
- package/dist-es/psdReader.js +27 -12
- package/dist-es/psdReader.js.map +1 -1
- package/dist-es/psdWriter.d.ts +4 -0
- package/dist-es/psdWriter.js +22 -7
- package/dist-es/psdWriter.js.map +1 -1
- package/package.json +1 -1
- package/src/additionalInfo.ts +2014 -289
- package/src/descriptor.ts +329 -39
- package/src/imageResources.ts +18 -23
- package/src/psd.ts +477 -46
- package/src/psdReader.ts +26 -7
- package/src/psdWriter.ts +25 -8
package/src/imageResources.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
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.
|
|
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
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
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
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
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
|
-
|
|
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;
|