ag-psd 15.0.4 → 15.0.5

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/src/psd.ts ADDED
@@ -0,0 +1,1184 @@
1
+ export type BlendMode = 'pass through' | 'normal' | 'dissolve' | 'darken' | 'multiply' |
2
+ 'color burn' | 'linear burn' | 'darker color' | 'lighten' | 'screen' | 'color dodge' |
3
+ 'linear dodge' | 'lighter color' | 'overlay' | 'soft light' | 'hard light' |
4
+ 'vivid light' | 'linear light' | 'pin light' | 'hard mix' | 'difference' | 'exclusion' |
5
+ 'subtract' | 'divide' | 'hue' | 'saturation' | 'color' | 'luminosity';
6
+
7
+ export const enum ColorMode {
8
+ Bitmap = 0,
9
+ Grayscale = 1,
10
+ Indexed = 2,
11
+ RGB = 3,
12
+ CMYK = 4,
13
+ Multichannel = 7,
14
+ Duotone = 8,
15
+ Lab = 9,
16
+ }
17
+
18
+ export const enum SectionDividerType {
19
+ Other = 0,
20
+ OpenFolder = 1,
21
+ ClosedFolder = 2,
22
+ BoundingSectionDivider = 3,
23
+ }
24
+
25
+ export type RGBA = { r: number; g: number; b: number; a: number; }; // values from 0 to 255
26
+ export type RGB = { r: number; g: number; b: number; }; // values from 0 to 255
27
+ export type HSB = { h: number; s: number; b: number; }; // values from 0 to 1
28
+ export type CMYK = { c: number; m: number; y: number; k: number; }; // values from 0 to 255
29
+ export type LAB = { l: number; a: number; b: number; }; // values `l` from 0 to 1; `a` and `b` from -1 to 1
30
+ export type Grayscale = { k: number }; // values from 0 to 255
31
+ export type Color = RGBA | RGB | HSB | CMYK | LAB | Grayscale;
32
+
33
+ export interface EffectContour {
34
+ name: string;
35
+ curve: { x: number; y: number; }[];
36
+ }
37
+
38
+ export interface EffectPattern {
39
+ name: string;
40
+ id: string;
41
+ // TODO: add fields
42
+ }
43
+
44
+ export interface LayerEffectShadow {
45
+ present?: boolean;
46
+ showInDialog?: boolean;
47
+ enabled?: boolean;
48
+ size?: UnitsValue;
49
+ angle?: number;
50
+ distance?: UnitsValue;
51
+ color?: Color;
52
+ blendMode?: BlendMode;
53
+ opacity?: number;
54
+ useGlobalLight?: boolean;
55
+ antialiased?: boolean;
56
+ contour?: EffectContour;
57
+ choke?: UnitsValue; // spread
58
+ layerConceals?: boolean; // only drop shadow
59
+ }
60
+
61
+ export interface LayerEffectsOuterGlow {
62
+ present?: boolean;
63
+ showInDialog?: boolean;
64
+ enabled?: boolean;
65
+ size?: UnitsValue;
66
+ color?: Color;
67
+ blendMode?: BlendMode;
68
+ opacity?: number;
69
+ source?: GlowSource;
70
+ antialiased?: boolean;
71
+ noise?: number;
72
+ range?: number;
73
+ choke?: UnitsValue;
74
+ jitter?: number;
75
+ contour?: EffectContour;
76
+ }
77
+
78
+ export interface LayerEffectInnerGlow {
79
+ present?: boolean;
80
+ showInDialog?: boolean;
81
+ enabled?: boolean;
82
+ size?: UnitsValue;
83
+ color?: Color;
84
+ blendMode?: BlendMode;
85
+ opacity?: number;
86
+ source?: GlowSource;
87
+ technique?: GlowTechnique;
88
+ antialiased?: boolean;
89
+ noise?: number;
90
+ range?: number;
91
+ choke?: UnitsValue; // spread
92
+ jitter?: number;
93
+ contour?: EffectContour;
94
+ }
95
+
96
+ export interface LayerEffectBevel {
97
+ present?: boolean;
98
+ showInDialog?: boolean;
99
+ enabled?: boolean;
100
+ size?: UnitsValue;
101
+ angle?: number;
102
+ strength?: number; // depth
103
+ highlightBlendMode?: BlendMode;
104
+ shadowBlendMode?: BlendMode;
105
+ highlightColor?: Color;
106
+ shadowColor?: Color;
107
+ style?: BevelStyle;
108
+ highlightOpacity?: number;
109
+ shadowOpacity?: number;
110
+ soften?: UnitsValue;
111
+ useGlobalLight?: boolean;
112
+ altitude?: number;
113
+ technique?: BevelTechnique;
114
+ direction?: BevelDirection;
115
+ useTexture?: boolean;
116
+ useShape?: boolean;
117
+ antialiasGloss?: boolean;
118
+ contour?: EffectContour;
119
+ }
120
+
121
+ export interface LayerEffectSolidFill {
122
+ present?: boolean;
123
+ showInDialog?: boolean;
124
+ enabled?: boolean;
125
+ blendMode?: BlendMode;
126
+ color?: Color;
127
+ opacity?: number;
128
+ }
129
+
130
+ export interface LayerEffectStroke {
131
+ present?: boolean;
132
+ showInDialog?: boolean;
133
+ enabled?: boolean;
134
+ overprint?: boolean;
135
+ size?: UnitsValue;
136
+ position?: 'inside' | 'center' | 'outside';
137
+ fillType?: 'color' | 'gradient' | 'pattern';
138
+ blendMode?: BlendMode;
139
+ opacity?: number;
140
+ color?: Color;
141
+ gradient?: (EffectSolidGradient | EffectNoiseGradient) & ExtraGradientInfo;
142
+ pattern?: EffectPattern & {}; // TODO: additional pattern info
143
+ }
144
+
145
+ export interface LayerEffectSatin {
146
+ present?: boolean;
147
+ showInDialog?: boolean;
148
+ enabled?: boolean;
149
+ size?: UnitsValue;
150
+ blendMode?: BlendMode;
151
+ color?: Color;
152
+ antialiased?: boolean;
153
+ opacity?: number;
154
+ distance?: UnitsValue;
155
+ invert?: boolean;
156
+ angle?: number;
157
+ contour?: EffectContour;
158
+ }
159
+
160
+ // not supported yet because of `Patt` section not implemented
161
+ export interface LayerEffectPatternOverlay {
162
+ present?: boolean;
163
+ showInDialog?: boolean;
164
+ enabled?: boolean;
165
+ blendMode?: BlendMode;
166
+ opacity?: number;
167
+ scale?: number;
168
+ pattern?: EffectPattern;
169
+ phase?: { x: number; y: number; };
170
+ align?: boolean;
171
+ }
172
+
173
+ export interface EffectSolidGradient {
174
+ name: string;
175
+ type: 'solid';
176
+ smoothness?: number;
177
+ colorStops: ColorStop[];
178
+ opacityStops: OpacityStop[];
179
+ }
180
+
181
+ export interface EffectNoiseGradient {
182
+ name: string;
183
+ type: 'noise';
184
+ roughness?: number;
185
+ colorModel?: 'rgb' | 'hsb' | 'lab';
186
+ randomSeed?: number;
187
+ restrictColors?: boolean;
188
+ addTransparency?: boolean;
189
+ min: number[];
190
+ max: number[];
191
+ }
192
+
193
+ export interface LayerEffectGradientOverlay {
194
+ present?: boolean;
195
+ showInDialog?: boolean;
196
+ enabled?: boolean;
197
+ blendMode?: string;
198
+ opacity?: number;
199
+ align?: boolean;
200
+ scale?: number;
201
+ dither?: boolean;
202
+ reverse?: boolean;
203
+ type?: GradientStyle;
204
+ offset?: { x: number; y: number; };
205
+ gradient?: EffectSolidGradient | EffectNoiseGradient;
206
+ interpolationMethod?: InterpolationMethod;
207
+ }
208
+
209
+ export interface LayerEffectsInfo {
210
+ disabled?: boolean;
211
+ scale?: number;
212
+ dropShadow?: LayerEffectShadow[];
213
+ innerShadow?: LayerEffectShadow[];
214
+ outerGlow?: LayerEffectsOuterGlow;
215
+ innerGlow?: LayerEffectInnerGlow;
216
+ bevel?: LayerEffectBevel;
217
+ solidFill?: LayerEffectSolidFill[];
218
+ satin?: LayerEffectSatin;
219
+ stroke?: LayerEffectStroke[];
220
+ gradientOverlay?: LayerEffectGradientOverlay[];
221
+ patternOverlay?: LayerEffectPatternOverlay; // not supported yet because of `Patt` section not implemented
222
+ }
223
+
224
+ export interface LayerMaskData {
225
+ top?: number;
226
+ left?: number;
227
+ bottom?: number;
228
+ right?: number;
229
+ defaultColor?: number;
230
+ disabled?: boolean;
231
+ positionRelativeToLayer?: boolean;
232
+ fromVectorData?: boolean; // set to true if the mask is generated from vector data, false if it's a bitmap provided by user
233
+ userMaskDensity?: number;
234
+ userMaskFeather?: number; // px
235
+ vectorMaskDensity?: number;
236
+ vectorMaskFeather?: number;
237
+ canvas?: HTMLCanvasElement;
238
+ imageData?: ImageData;
239
+ }
240
+
241
+ export type TextGridding = 'none' | 'round'; // TODO: other values (no idea where to set it up in Photoshop)
242
+ export type Orientation = 'horizontal' | 'vertical';
243
+ export type AntiAlias = 'none' | 'sharp' | 'crisp' | 'strong' | 'smooth' | 'platform' | 'platformLCD';
244
+ export type WarpStyle =
245
+ 'none' | 'arc' | 'arcLower' | 'arcUpper' | 'arch' | 'bulge' | 'shellLower' | 'shellUpper' | 'flag' |
246
+ 'wave' | 'fish' | 'rise' | 'fisheye' | 'inflate' | 'squeeze' | 'twist' | 'custom' | 'cylinder';
247
+ export type BevelStyle = 'outer bevel' | 'inner bevel' | 'emboss' | 'pillow emboss' | 'stroke emboss';
248
+ export type BevelTechnique = 'smooth' | 'chisel hard' | 'chisel soft';
249
+ export type BevelDirection = 'up' | 'down';
250
+ export type GlowTechnique = 'softer' | 'precise';
251
+ export type GlowSource = 'edge' | 'center';
252
+ export type GradientStyle = 'linear' | 'radial' | 'angle' | 'reflected' | 'diamond';
253
+ export type Justification = 'left' | 'right' | 'center';
254
+ export type LineCapType = 'butt' | 'round' | 'square';
255
+ export type LineJoinType = 'miter' | 'round' | 'bevel';
256
+ export type LineAlignment = 'inside' | 'center' | 'outside';
257
+ export type InterpolationMethod = 'classic' | 'perceptual' | 'linear';
258
+
259
+ export interface Warp {
260
+ style?: WarpStyle;
261
+ value?: number;
262
+ values?: number[];
263
+ perspective?: number;
264
+ perspectiveOther?: number;
265
+ rotate?: Orientation;
266
+ // for custom warps
267
+ bounds?: { top: UnitsValue; left: UnitsValue; bottom: UnitsValue; right: UnitsValue; };
268
+ uOrder?: number;
269
+ vOrder?: number;
270
+ deformNumRows?: number;
271
+ deformNumCols?: number;
272
+ customEnvelopeWarp?: {
273
+ quiltSliceX?: number[];
274
+ quiltSliceY?: number[];
275
+ // 16 points from top left to bottom right, rows first, all points are relative to the first point
276
+ meshPoints: { x: number; y: number; }[];
277
+ };
278
+ }
279
+
280
+ export interface Animations {
281
+ frames: {
282
+ id: number;
283
+ delay: number;
284
+ dispose?: 'auto' | 'none' | 'dispose';
285
+ }[];
286
+ animations: {
287
+ id: number;
288
+ frames: number[];
289
+ repeats?: number;
290
+ activeFrame?: number;
291
+ }[];
292
+ }
293
+
294
+ export interface Font {
295
+ name: string;
296
+ script?: number;
297
+ type?: number;
298
+ synthetic?: number;
299
+ }
300
+
301
+ export interface ParagraphStyle {
302
+ justification?: Justification;
303
+ firstLineIndent?: number;
304
+ startIndent?: number;
305
+ endIndent?: number;
306
+ spaceBefore?: number;
307
+ spaceAfter?: number;
308
+ autoHyphenate?: boolean;
309
+ hyphenatedWordSize?: number;
310
+ preHyphen?: number;
311
+ postHyphen?: number;
312
+ consecutiveHyphens?: number;
313
+ zone?: number;
314
+ wordSpacing?: number[];
315
+ letterSpacing?: number[];
316
+ glyphSpacing?: number[];
317
+ autoLeading?: number;
318
+ leadingType?: number;
319
+ hanging?: boolean;
320
+ burasagari?: boolean;
321
+ kinsokuOrder?: number;
322
+ everyLineComposer?: boolean;
323
+ }
324
+
325
+ export interface ParagraphStyleRun {
326
+ length: number;
327
+ style: ParagraphStyle;
328
+ }
329
+
330
+ export interface TextStyle {
331
+ font?: Font;
332
+ fontSize?: number;
333
+ fauxBold?: boolean;
334
+ fauxItalic?: boolean;
335
+ autoLeading?: boolean;
336
+ leading?: number;
337
+ horizontalScale?: number;
338
+ verticalScale?: number;
339
+ tracking?: number;
340
+ autoKerning?: boolean;
341
+ kerning?: number;
342
+ baselineShift?: number;
343
+ fontCaps?: number; // 0 - none, 1 - small caps, 2 - all caps
344
+ fontBaseline?: number; // 0 - normal, 1 - superscript, 2 - subscript
345
+ underline?: boolean;
346
+ strikethrough?: boolean;
347
+ ligatures?: boolean;
348
+ dLigatures?: boolean;
349
+ baselineDirection?: number;
350
+ tsume?: number;
351
+ styleRunAlignment?: number;
352
+ language?: number;
353
+ noBreak?: boolean;
354
+ fillColor?: Color;
355
+ strokeColor?: Color;
356
+ fillFlag?: boolean;
357
+ strokeFlag?: boolean;
358
+ fillFirst?: boolean;
359
+ yUnderline?: number;
360
+ outlineWidth?: number;
361
+ characterDirection?: number;
362
+ hindiNumbers?: boolean;
363
+ kashida?: number;
364
+ diacriticPos?: number;
365
+ }
366
+
367
+ export interface TextStyleRun {
368
+ length: number;
369
+ style: TextStyle;
370
+ }
371
+
372
+ export interface TextGridInfo {
373
+ isOn?: boolean;
374
+ show?: boolean;
375
+ size?: number;
376
+ leading?: number;
377
+ color?: Color;
378
+ leadingFillColor?: Color;
379
+ alignLineHeightToGridFlags?: boolean;
380
+ }
381
+
382
+ export interface LayerTextData {
383
+ text: string;
384
+ transform?: number[]; // 2d transform matrix [xx, xy, yx, yy, tx, ty]
385
+ antiAlias?: AntiAlias;
386
+ gridding?: TextGridding;
387
+ orientation?: Orientation;
388
+ index?: number;
389
+ warp?: Warp;
390
+ top?: number;
391
+ left?: number;
392
+ bottom?: number;
393
+ right?: number;
394
+
395
+ gridInfo?: TextGridInfo;
396
+ useFractionalGlyphWidths?: boolean;
397
+ style?: TextStyle; // base style
398
+ styleRuns?: TextStyleRun[]; // spans of different style
399
+ paragraphStyle?: ParagraphStyle; // base paragraph style
400
+ paragraphStyleRuns?: ParagraphStyleRun[]; // style for each line
401
+
402
+ superscriptSize?: number;
403
+ superscriptPosition?: number;
404
+ subscriptSize?: number;
405
+ subscriptPosition?: number;
406
+ smallCapSize?: number;
407
+
408
+ shapeType?: 'point' | 'box';
409
+ pointBase?: number[];
410
+ boxBounds?: number[];
411
+ }
412
+
413
+ export interface PatternInfo {
414
+ name: string;
415
+ id: string;
416
+ x: number;
417
+ y: number;
418
+ bounds: { x: number; y: number; w: number, h: number; };
419
+ data: Uint8Array;
420
+ }
421
+
422
+ export interface BezierKnot {
423
+ linked: boolean;
424
+ points: number[]; // x0, y0, x1, y1, x2, y2
425
+ }
426
+
427
+ export type BooleanOperation = 'exclude' | 'combine' | 'subtract' | 'intersect';
428
+
429
+ export interface BezierPath {
430
+ open: boolean;
431
+ operation: BooleanOperation;
432
+ knots: BezierKnot[];
433
+ }
434
+
435
+ export interface ExtraGradientInfo {
436
+ style?: GradientStyle;
437
+ scale?: number;
438
+ angle?: number;
439
+ dither?: boolean;
440
+ reverse?: boolean;
441
+ align?: boolean;
442
+ offset?: { x: number; y: number; };
443
+ }
444
+
445
+ export interface ExtraPatternInfo {
446
+ linked?: boolean;
447
+ phase?: { x: number; y: number; };
448
+ }
449
+
450
+ export type VectorContent = { type: 'color'; color: Color; } |
451
+ (EffectSolidGradient & ExtraGradientInfo) |
452
+ (EffectNoiseGradient & ExtraGradientInfo) |
453
+ (EffectPattern & { type: 'pattern'; } & ExtraPatternInfo);
454
+
455
+ export type RenderingIntent = 'perceptual' | 'saturation' | 'relative colorimetric' | 'absolute colorimetric';
456
+
457
+ export type Units = 'Pixels' | 'Points' | 'Picas' | 'Millimeters' | 'Centimeters' | 'Inches' | 'None' | 'Density';
458
+
459
+ export interface UnitsValue {
460
+ units: Units;
461
+ value: number;
462
+ }
463
+
464
+ export interface BrightnessAdjustment {
465
+ type: 'brightness/contrast';
466
+ brightness?: number;
467
+ contrast?: number;
468
+ meanValue?: number;
469
+ useLegacy?: boolean;
470
+ labColorOnly?: boolean;
471
+ auto?: boolean;
472
+ }
473
+
474
+ export interface LevelsAdjustmentChannel {
475
+ shadowInput: number;
476
+ highlightInput: number;
477
+ shadowOutput: number;
478
+ highlightOutput: number;
479
+ midtoneInput: number;
480
+ }
481
+
482
+ export interface PresetInfo {
483
+ presetKind?: number;
484
+ presetFileName?: string;
485
+ }
486
+
487
+ export interface LevelsAdjustment extends PresetInfo {
488
+ type: 'levels';
489
+ rgb?: LevelsAdjustmentChannel;
490
+ red?: LevelsAdjustmentChannel;
491
+ green?: LevelsAdjustmentChannel;
492
+ blue?: LevelsAdjustmentChannel;
493
+ }
494
+
495
+ export type CurvesAdjustmentChannel = { input: number; output: number; }[];
496
+
497
+ export interface CurvesAdjustment extends PresetInfo {
498
+ type: 'curves';
499
+ rgb?: CurvesAdjustmentChannel;
500
+ red?: CurvesAdjustmentChannel;
501
+ green?: CurvesAdjustmentChannel;
502
+ blue?: CurvesAdjustmentChannel;
503
+ }
504
+
505
+ export interface ExposureAdjustment extends PresetInfo {
506
+ type: 'exposure';
507
+ exposure?: number;
508
+ offset?: number;
509
+ gamma?: number;
510
+ }
511
+
512
+ export interface VibranceAdjustment {
513
+ type: 'vibrance';
514
+ vibrance?: number;
515
+ saturation?: number;
516
+ }
517
+
518
+ export interface HueSaturationAdjustmentChannel {
519
+ a: number;
520
+ b: number;
521
+ c: number;
522
+ d: number;
523
+ hue: number;
524
+ saturation: number;
525
+ lightness: number;
526
+ }
527
+
528
+ export interface HueSaturationAdjustment extends PresetInfo {
529
+ type: 'hue/saturation';
530
+ master?: HueSaturationAdjustmentChannel;
531
+ reds?: HueSaturationAdjustmentChannel;
532
+ yellows?: HueSaturationAdjustmentChannel;
533
+ greens?: HueSaturationAdjustmentChannel;
534
+ cyans?: HueSaturationAdjustmentChannel;
535
+ blues?: HueSaturationAdjustmentChannel;
536
+ magentas?: HueSaturationAdjustmentChannel;
537
+ }
538
+
539
+ export interface ColorBalanceValues {
540
+ cyanRed: number;
541
+ magentaGreen: number;
542
+ yellowBlue: number;
543
+ }
544
+
545
+ export interface ColorBalanceAdjustment {
546
+ type: 'color balance';
547
+ shadows?: ColorBalanceValues;
548
+ midtones?: ColorBalanceValues;
549
+ highlights?: ColorBalanceValues;
550
+ preserveLuminosity?: boolean;
551
+ }
552
+
553
+ export interface BlackAndWhiteAdjustment extends PresetInfo {
554
+ type: 'black & white';
555
+ reds?: number;
556
+ yellows?: number;
557
+ greens?: number;
558
+ cyans?: number;
559
+ blues?: number;
560
+ magentas?: number;
561
+ useTint?: boolean;
562
+ tintColor?: Color;
563
+ }
564
+
565
+ export interface PhotoFilterAdjustment {
566
+ type: 'photo filter';
567
+ color?: Color;
568
+ density?: number;
569
+ preserveLuminosity?: boolean;
570
+ }
571
+
572
+ export interface ChannelMixerChannel {
573
+ red: number;
574
+ green: number;
575
+ blue: number;
576
+ constant: number;
577
+ }
578
+
579
+ export interface ChannelMixerAdjustment extends PresetInfo {
580
+ type: 'channel mixer';
581
+ monochrome?: boolean;
582
+ red?: ChannelMixerChannel;
583
+ green?: ChannelMixerChannel;
584
+ blue?: ChannelMixerChannel;
585
+ gray?: ChannelMixerChannel;
586
+ }
587
+
588
+ export interface ColorLookupAdjustment {
589
+ type: 'color lookup';
590
+ lookupType?: '3dlut' | 'abstractProfile' | 'deviceLinkProfile';
591
+ name?: string;
592
+ dither?: boolean;
593
+ profile?: Uint8Array;
594
+ lutFormat?: 'look' | 'cube' | '3dl';
595
+ dataOrder?: 'rgb' | 'bgr';
596
+ tableOrder?: 'rgb' | 'bgr';
597
+ lut3DFileData?: Uint8Array;
598
+ lut3DFileName?: string;
599
+ }
600
+
601
+ export interface InvertAdjustment {
602
+ type: 'invert';
603
+ }
604
+
605
+ export interface PosterizeAdjustment {
606
+ type: 'posterize';
607
+ levels?: number;
608
+ }
609
+
610
+ export interface ThresholdAdjustment {
611
+ type: 'threshold';
612
+ level?: number;
613
+ }
614
+
615
+ export interface ColorStop {
616
+ color: Color;
617
+ location: number;
618
+ midpoint: number;
619
+ }
620
+
621
+ export interface OpacityStop {
622
+ opacity: number;
623
+ location: number;
624
+ midpoint: number;
625
+ }
626
+
627
+ export interface GradientMapAdjustment {
628
+ type: 'gradient map';
629
+ name?: string;
630
+ gradientType: 'solid' | 'noise';
631
+ dither?: boolean;
632
+ reverse?: boolean;
633
+ // solid
634
+ smoothness?: number;
635
+ colorStops?: ColorStop[];
636
+ opacityStops?: OpacityStop[];
637
+ // noise
638
+ roughness?: number;
639
+ colorModel?: 'rgb' | 'hsb' | 'lab';
640
+ randomSeed?: number;
641
+ restrictColors?: boolean;
642
+ addTransparency?: boolean;
643
+ min?: number[];
644
+ max?: number[];
645
+ }
646
+
647
+ export interface SelectiveColorAdjustment {
648
+ type: 'selective color';
649
+ mode?: 'relative' | 'absolute';
650
+ reds?: CMYK;
651
+ yellows?: CMYK;
652
+ greens?: CMYK;
653
+ cyans?: CMYK;
654
+ blues?: CMYK;
655
+ magentas?: CMYK;
656
+ whites?: CMYK;
657
+ neutrals?: CMYK;
658
+ blacks?: CMYK;
659
+ }
660
+
661
+ export interface LinkedFile {
662
+ id: string;
663
+ name: string;
664
+ type?: string;
665
+ creator?: string;
666
+ data?: Uint8Array;
667
+ time?: Date; // for external files
668
+ descriptor?: {
669
+ compInfo: { compID: number; originalCompID: number; };
670
+ };
671
+ childDocumentID?: string;
672
+ assetModTime?: number;
673
+ assetLockedState?: number;
674
+ }
675
+
676
+ export type PlacedLayerType = 'unknown' | 'vector' | 'raster' | 'image stack';
677
+
678
+ export interface PlacedLayer {
679
+ id: string; // id of linked image file (psd.linkedFiles)
680
+ placed?: string; // unique id
681
+ type: PlacedLayerType;
682
+ pageNumber?: number;
683
+ totalPages?: number;
684
+ frameStep?: { numerator: number; denominator: number; };
685
+ duration?: { numerator: number; denominator: number; };
686
+ frameCount?: number;
687
+ transform: number[]; // x, y of 4 corners of the transform
688
+ nonAffineTransform?: number[]; // x, y of 4 corners of the transform
689
+ width?: number;
690
+ height?: number;
691
+ resolution?: UnitsValue;
692
+ // antialias ?
693
+ warp?: Warp;
694
+ crop?: number;
695
+ comp?: number;
696
+ compInfo?: { compID: number; originalCompID: number; };
697
+ }
698
+
699
+ export type AdjustmentLayer = BrightnessAdjustment | LevelsAdjustment | CurvesAdjustment |
700
+ ExposureAdjustment | VibranceAdjustment | HueSaturationAdjustment | ColorBalanceAdjustment |
701
+ BlackAndWhiteAdjustment | PhotoFilterAdjustment | ChannelMixerAdjustment | ColorLookupAdjustment |
702
+ InvertAdjustment | PosterizeAdjustment | ThresholdAdjustment | GradientMapAdjustment |
703
+ SelectiveColorAdjustment;
704
+
705
+ export type LayerColor = 'none' | 'red' | 'orange' | 'yellow' | 'green' | 'blue' | 'violet' | 'gray';
706
+
707
+ export interface KeyDescriptorItem {
708
+ keyShapeInvalidated?: boolean;
709
+ keyOriginType?: number;
710
+ keyOriginResolution?: number;
711
+ keyOriginRRectRadii?: {
712
+ topRight: UnitsValue;
713
+ topLeft: UnitsValue;
714
+ bottomLeft: UnitsValue;
715
+ bottomRight: UnitsValue;
716
+ };
717
+ keyOriginShapeBoundingBox?: {
718
+ top: UnitsValue;
719
+ left: UnitsValue;
720
+ bottom: UnitsValue;
721
+ right: UnitsValue;
722
+ };
723
+ keyOriginBoxCorners?: { x: number; y: number; }[];
724
+ transform?: number[]; // 2d transform matrix [xx, xy, yx, yy, tx, ty]
725
+ }
726
+
727
+ export interface LayerVectorMask {
728
+ invert?: boolean;
729
+ notLink?: boolean;
730
+ disable?: boolean;
731
+ fillStartsWithAllPixels?: boolean;
732
+ clipboard?: {
733
+ top: number;
734
+ left: number;
735
+ bottom: number;
736
+ right: number;
737
+ resolution: number;
738
+ };
739
+ paths: BezierPath[];
740
+ }
741
+
742
+ export interface AnimationFrame {
743
+ frames: number[]; // IDs of frames that this modifiers applies to
744
+ enable?: boolean;
745
+ offset?: { x: number; y: number; };
746
+ referencePoint?: { x: number; y: number; };
747
+ opacity?: number;
748
+ effects?: LayerEffectsInfo;
749
+ }
750
+
751
+ export interface Fraction {
752
+ numerator: number;
753
+ denominator: number;
754
+ }
755
+
756
+ export type TimelineKeyInterpolation = 'linear' | 'hold';
757
+
758
+ export type TimelineKey = {
759
+ interpolation: TimelineKeyInterpolation;
760
+ time: Fraction;
761
+ selected?: boolean;
762
+ } & ({
763
+ type: 'opacity';
764
+ value: number;
765
+ } | {
766
+ type: 'position';
767
+ x: number;
768
+ y: number;
769
+ } | {
770
+ type: 'transform';
771
+ scale: { x: number; y: number; };
772
+ skew: { x: number; y: number; };
773
+ rotation: number;
774
+ translation: { x: number; y: number; };
775
+ } | {
776
+ type: 'style';
777
+ style?: LayerEffectsInfo;
778
+ } | {
779
+ type: 'globalLighting';
780
+ globalAngle: number;
781
+ globalAltitude: number;
782
+ });
783
+
784
+ export type TimelineTrackType = 'opacity' | 'style' | 'sheetTransform' | 'sheetPosition' | 'globalLighting';
785
+
786
+ export interface TimelineTrack {
787
+ type: TimelineTrackType;
788
+ enabled?: boolean;
789
+ effectParams?: {
790
+ keys: TimelineKey[];
791
+ fillCanvas: boolean;
792
+ zoomOrigin: number;
793
+ };
794
+ keys: TimelineKey[];
795
+ }
796
+
797
+ export interface Timeline {
798
+ start: Fraction;
799
+ duration: Fraction;
800
+ inTime: Fraction;
801
+ outTime: Fraction;
802
+ autoScope: boolean;
803
+ audioLevel: number;
804
+ tracks?: TimelineTrack[];
805
+ }
806
+
807
+ export interface LayerAdditionalInfo {
808
+ name?: string; // layer name
809
+ nameSource?: string; // layer name source
810
+ id?: number; // layer id
811
+ version?: number; // layer version
812
+ mask?: LayerMaskData;
813
+ blendClippendElements?: boolean; // has to be set to `true` when using `color burn` blend mode (otherwise `transparencyShapesLayer` is set incorrectly)
814
+ blendInteriorElements?: boolean;
815
+ knockout?: boolean;
816
+ layerMaskAsGlobalMask?: boolean;
817
+ protected?: {
818
+ transparency?: boolean;
819
+ composite?: boolean;
820
+ position?: boolean;
821
+ artboards?: boolean;
822
+ };
823
+ layerColor?: LayerColor;
824
+ referencePoint?: {
825
+ x: number;
826
+ y: number;
827
+ };
828
+ sectionDivider?: {
829
+ type: SectionDividerType;
830
+ key?: string;
831
+ subType?: number; // 0 = normal, 1 = scene group, affects the animation timeline.
832
+ };
833
+ filterMask?: {
834
+ colorSpace: Color;
835
+ opacity: number;
836
+ };
837
+ effects?: LayerEffectsInfo;
838
+ text?: LayerTextData;
839
+ patterns?: PatternInfo[]; // not supported yet
840
+ vectorFill?: VectorContent;
841
+ vectorStroke?: {
842
+ strokeEnabled?: boolean;
843
+ fillEnabled?: boolean;
844
+ lineWidth?: UnitsValue;
845
+ lineDashOffset?: UnitsValue;
846
+ miterLimit?: number;
847
+ lineCapType?: LineCapType;
848
+ lineJoinType?: LineJoinType;
849
+ lineAlignment?: LineAlignment;
850
+ scaleLock?: boolean;
851
+ strokeAdjust?: boolean;
852
+ lineDashSet?: UnitsValue[];
853
+ blendMode?: BlendMode;
854
+ opacity?: number;
855
+ content?: VectorContent;
856
+ resolution?: number;
857
+ };
858
+ vectorMask?: LayerVectorMask;
859
+ usingAlignedRendering?: boolean;
860
+ timestamp?: number; // seconds
861
+ pathList?: {
862
+ // TODO: ...
863
+ }[];
864
+ adjustment?: AdjustmentLayer;
865
+ placedLayer?: PlacedLayer;
866
+ vectorOrigination?: {
867
+ keyDescriptorList: KeyDescriptorItem[];
868
+ };
869
+ compositorUsed?: {
870
+ description: string;
871
+ reason: string;
872
+ engine: string;
873
+ enableCompCore: string;
874
+ enableCompCoreGPU: string;
875
+ compCoreSupport: string;
876
+ compCoreGPUSupport: string;
877
+ };
878
+ artboard?: {
879
+ rect: { top: number; left: number; bottom: number; right: number; };
880
+ guideIndices?: any[];
881
+ presetName?: string;
882
+ color?: Color;
883
+ backgroundType?: number;
884
+ };
885
+ fillOpacity?: number;
886
+ transparencyShapesLayer?: boolean;
887
+ channelBlendingRestrictions?: number[];
888
+ animationFrames?: AnimationFrame[];
889
+ animationFrameFlags?: {
890
+ propagateFrameOne?: boolean;
891
+ unifyLayerPosition?: boolean;
892
+ unifyLayerStyle?: boolean;
893
+ unifyLayerVisibility?: boolean;
894
+ };
895
+ timeline?: Timeline;
896
+
897
+ // Base64 encoded raw EngineData, currently just kept in original state to support
898
+ // loading and modifying PSD file without breaking text layers.
899
+ engineData?: string;
900
+ }
901
+
902
+ export interface ImageResources {
903
+ layerState?: number;
904
+ layersGroup?: number[];
905
+ layerSelectionIds?: number[];
906
+ layerGroupsEnabledId?: number[];
907
+ versionInfo?: {
908
+ hasRealMergedData: boolean;
909
+ writerName: string;
910
+ readerName: string;
911
+ fileVersion: number;
912
+ };
913
+ alphaIdentifiers?: number[];
914
+ alphaChannelNames?: string[];
915
+ globalAngle?: number;
916
+ globalAltitude?: number;
917
+ pixelAspectRatio?: {
918
+ aspect: number;
919
+ };
920
+ urlsList?: {
921
+ id: number;
922
+ ref: 'slice';
923
+ url: string;
924
+ }[];
925
+ gridAndGuidesInformation?: {
926
+ grid?: {
927
+ horizontal: number;
928
+ vertical: number;
929
+ },
930
+ guides?: {
931
+ location: number;
932
+ direction: 'horizontal' | 'vertical';
933
+ }[];
934
+ };
935
+ resolutionInfo?: {
936
+ horizontalResolution: number;
937
+ horizontalResolutionUnit: 'PPI' | 'PPCM';
938
+ widthUnit: 'Inches' | 'Centimeters' | 'Points' | 'Picas' | 'Columns';
939
+ verticalResolution: number;
940
+ verticalResolutionUnit: 'PPI' | 'PPCM';
941
+ heightUnit: 'Inches' | 'Centimeters' | 'Points' | 'Picas' | 'Columns';
942
+ };
943
+ thumbnail?: HTMLCanvasElement;
944
+ thumbnailRaw?: { width: number; height: number; data: Uint8Array; };
945
+ captionDigest?: string;
946
+ xmpMetadata?: string;
947
+ printScale?: {
948
+ style?: 'centered' | 'size to fit' | 'user defined';
949
+ x?: number;
950
+ y?: number;
951
+ scale?: number;
952
+ };
953
+ printInformation?: {
954
+ printerManagesColors?: boolean;
955
+ printerName?: string;
956
+ printerProfile?: string;
957
+ printSixteenBit?: boolean;
958
+ renderingIntent?: RenderingIntent;
959
+ hardProof?: boolean;
960
+ blackPointCompensation?: boolean;
961
+ proofSetup?: {
962
+ builtin: string;
963
+ } | {
964
+ profile: string;
965
+ renderingIntent?: RenderingIntent;
966
+ blackPointCompensation?: boolean;
967
+ paperWhite?: boolean;
968
+ };
969
+ };
970
+ backgroundColor?: Color;
971
+ idsSeedNumber?: number;
972
+ printFlags?: {
973
+ labels?: boolean;
974
+ cropMarks?: boolean;
975
+ colorBars?: boolean;
976
+ registrationMarks?: boolean;
977
+ negative?: boolean;
978
+ flip?: boolean;
979
+ interpolate?: boolean;
980
+ caption?: boolean;
981
+ printFlags?: boolean;
982
+ };
983
+ iccUntaggedProfile?: boolean;
984
+ pathSelectionState?: string[];
985
+ imageReadyVariables?: string;
986
+ imageReadyDataSets?: string;
987
+ animations?: Animations;
988
+ onionSkins?: {
989
+ enabled: boolean;
990
+ framesBefore: number;
991
+ framesAfter: number;
992
+ frameSpacing: number;
993
+ minOpacity: number;
994
+ maxOpacity: number;
995
+ blendMode: BlendMode;
996
+ };
997
+ timelineInformation?: {
998
+ enabled: boolean;
999
+ frameStep: Fraction;
1000
+ frameRate: number;
1001
+ time: Fraction;
1002
+ duration: Fraction;
1003
+ workInTime: Fraction;
1004
+ workOutTime: Fraction;
1005
+ repeats: number;
1006
+ hasMotion: boolean;
1007
+ globalTracks: TimelineTrack[];
1008
+ audioClipGroups?: {
1009
+ id: string;
1010
+ muted: boolean;
1011
+ audioClips: {
1012
+ id: string;
1013
+ start: Fraction;
1014
+ duration: Fraction;
1015
+ inTime: Fraction;
1016
+ outTime: Fraction;
1017
+ muted: boolean;
1018
+ audioLevel: number;
1019
+ frameReader: {
1020
+ type: number;
1021
+ mediaDescriptor: string;
1022
+ link: {
1023
+ name: string;
1024
+ fullPath: string;
1025
+ relativePath: string;
1026
+ };
1027
+ };
1028
+ }[];
1029
+ }[];
1030
+ };
1031
+ sheetDisclosure?: {
1032
+ sheetTimelineOptions?: {
1033
+ sheetID: number;
1034
+ sheetDisclosed: boolean;
1035
+ lightsDisclosed: boolean;
1036
+ meshesDisclosed: boolean;
1037
+ materialsDisclosed: boolean;
1038
+ }[];
1039
+ };
1040
+ countInformation?: {
1041
+ color: RGB;
1042
+ name: string;
1043
+ size: number;
1044
+ fontSize: number;
1045
+ visible: boolean;
1046
+ points: { x: number; y: number }[];
1047
+ }[];
1048
+ slices?: {
1049
+ bounds: { left: number; top: number; right: number; bottom: number };
1050
+ groupName: string;
1051
+ slices: {
1052
+ id: number;
1053
+ groupId: number;
1054
+ origin: 'userGenerated' | 'autoGenerated' | 'layer';
1055
+ associatedLayerId: number;
1056
+ name: string;
1057
+ type: 'image' | 'noImage';
1058
+ bounds: { left: number; top: number; right: number; bottom: number };
1059
+ url: string;
1060
+ target: string;
1061
+ message: string;
1062
+ altTag: string;
1063
+ cellTextIsHTML: boolean;
1064
+ cellText: string;
1065
+ horizontalAlignment: 'default';
1066
+ verticalAlignment: 'default';
1067
+ backgroundColorType: 'none' | 'matte' | 'color';
1068
+ backgroundColor: RGBA;
1069
+ topOutset?: number;
1070
+ leftOutset?: number;
1071
+ bottomOutset?: number;
1072
+ rightOutset?: number;
1073
+ }[];
1074
+ }[];
1075
+ }
1076
+
1077
+ export interface GlobalLayerMaskInfo {
1078
+ overlayColorSpace: number;
1079
+ colorSpace1: number;
1080
+ colorSpace2: number;
1081
+ colorSpace3: number;
1082
+ colorSpace4: number;
1083
+ opacity: number;
1084
+ kind: number;
1085
+ }
1086
+
1087
+ export interface Annotation {
1088
+ type: 'text' | 'sound';
1089
+ open: boolean;
1090
+ iconLocation: { left: number; top: number; right: number; bottom: number };
1091
+ popupLocation: { left: number; top: number; right: number; bottom: number };
1092
+ color: Color;
1093
+ author: string;
1094
+ name: string;
1095
+ date: string;
1096
+ data: string | Uint8Array;
1097
+ }
1098
+
1099
+ export interface Layer extends LayerAdditionalInfo {
1100
+ top?: number;
1101
+ left?: number;
1102
+ bottom?: number;
1103
+ right?: number;
1104
+ blendMode?: BlendMode;
1105
+ opacity?: number;
1106
+ transparencyProtected?: boolean;
1107
+ hidden?: boolean;
1108
+ clipping?: boolean;
1109
+ canvas?: HTMLCanvasElement;
1110
+ imageData?: ImageData;
1111
+ children?: Layer[];
1112
+ /** Applies only for layer groups. */
1113
+ opened?: boolean;
1114
+ }
1115
+
1116
+ export interface Psd extends LayerAdditionalInfo {
1117
+ width: number;
1118
+ height: number;
1119
+ channels?: number;
1120
+ bitsPerChannel?: number;
1121
+ colorMode?: ColorMode;
1122
+ children?: Layer[];
1123
+ canvas?: HTMLCanvasElement;
1124
+ imageData?: ImageData;
1125
+ imageResources?: ImageResources;
1126
+ linkedFiles?: LinkedFile[]; // used in smart objects
1127
+ artboards?: {
1128
+ count: number; // number of artboards in the document
1129
+ autoExpandOffset?: { horizontal: number; vertical: number; };
1130
+ origin?: { horizontal: number; vertical: number; };
1131
+ autoExpandEnabled?: boolean;
1132
+ autoNestEnabled?: boolean;
1133
+ autoPositionEnabled?: boolean;
1134
+ shrinkwrapOnSaveEnabled?: boolean;
1135
+ docDefaultNewArtboardBackgroundColor?: Color;
1136
+ docDefaultNewArtboardBackgroundType?: number;
1137
+ };
1138
+ globalLayerMaskInfo?: GlobalLayerMaskInfo;
1139
+ annotations?: Annotation[];
1140
+ }
1141
+
1142
+ export interface ReadOptions {
1143
+ /** Does not load layer image data. */
1144
+ skipLayerImageData?: boolean;
1145
+ /** Does not load composite image data. */
1146
+ skipCompositeImageData?: boolean;
1147
+ /** Does not load thumbnail. */
1148
+ skipThumbnail?: boolean;
1149
+ /** Does not load linked files (used in smart-objects). */
1150
+ skipLinkedFilesData?: boolean;
1151
+ /** Throws exception if features are missing. */
1152
+ throwForMissingFeatures?: boolean;
1153
+ /** Logs if features are missing. */
1154
+ logMissingFeatures?: boolean;
1155
+ /** Keep image data as byte array instead of canvas.
1156
+ * (image data will appear in `imageData` fields instead of `canvas` fields)
1157
+ * This avoids issues with canvas premultiplied alpha corrupting image data. */
1158
+ useImageData?: boolean;
1159
+ /** Loads thumbnail raw data instead of decoding it's content into canvas.
1160
+ * `thumnailRaw` field is used instead. */
1161
+ useRawThumbnail?: boolean;
1162
+ /** Usend only for development. */
1163
+ logDevFeatures?: boolean;
1164
+ }
1165
+
1166
+ export interface WriteOptions {
1167
+ /** Automatically generates thumbnail from composite image. */
1168
+ generateThumbnail?: boolean;
1169
+ /** Trims transparent pixels from layer image data. */
1170
+ trimImageData?: boolean;
1171
+ /** Invalidates text layer data, forcing Photoshop to redraw them on load.
1172
+ * Use this option if you're updating loaded text layer properties. */
1173
+ invalidateTextLayers?: boolean;
1174
+ /** Logs if features are missing. */
1175
+ logMissingFeatures?: boolean;
1176
+ /** Forces bottom layer to be treated as layer and not background even when it's missing any transparency
1177
+ * (by default Photoshop treats bottom layer as background it it doesn't have any transparent pixels). */
1178
+ noBackground?: boolean;
1179
+ /** Saves document as PSB (Large Document Format) file. */
1180
+ psb?: boolean;
1181
+ /** Uses zip compression when writing PSD file, will result in smaller file size but may be incompatible
1182
+ * with some software. It may also be significantly slower. */
1183
+ compress?: boolean;
1184
+ }