ag-psd 32.0.0 → 34.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.
Files changed (117) hide show
  1. package/.v8-cache/v24.7.0-x64-ef5a0af0/03e19709 +0 -0
  2. package/.v8-cache/v24.7.0-x64-ef5a0af0/05135617 +0 -0
  3. package/.v8-cache/v24.7.0-x64-ef5a0af0/1130885f +0 -0
  4. package/.v8-cache/v24.7.0-x64-ef5a0af0/226e2801 +0 -0
  5. package/.v8-cache/v24.7.0-x64-ef5a0af0/2a19133e +0 -0
  6. package/.v8-cache/v24.7.0-x64-ef5a0af0/4511bacf +0 -0
  7. package/.v8-cache/v24.7.0-x64-ef5a0af0/68416cb2 +0 -0
  8. package/.v8-cache/v24.7.0-x64-ef5a0af0/71df9cb3 +0 -0
  9. package/.v8-cache/v24.7.0-x64-ef5a0af0/7ea06cea +0 -0
  10. package/.v8-cache/v24.7.0-x64-ef5a0af0/87cf2209 +0 -0
  11. package/.v8-cache/v24.7.0-x64-ef5a0af0/932f0770 +0 -0
  12. package/.v8-cache/v24.7.0-x64-ef5a0af0/acc36e66 +0 -0
  13. package/.v8-cache/v24.7.0-x64-ef5a0af0/b3c2fab7 +0 -0
  14. package/.v8-cache/v24.7.0-x64-ef5a0af0/c0b789d2 +0 -0
  15. package/.v8-cache/v24.7.0-x64-ef5a0af0/c314aece +0 -0
  16. package/.v8-cache/v24.7.0-x64-ef5a0af0/cfc49f4f +0 -0
  17. package/.v8-cache/v24.7.0-x64-ef5a0af0/cff9434a +0 -0
  18. package/.v8-cache/v24.7.0-x64-ef5a0af0/d13d7610 +0 -0
  19. package/.v8-cache/v24.7.0-x64-ef5a0af0/dc86f000 +0 -0
  20. package/.v8-cache/v24.7.0-x64-ef5a0af0/e03e2acd +0 -0
  21. package/.v8-cache/v24.7.0-x64-ef5a0af0/e6745c2b +0 -0
  22. package/.v8-cache/v24.7.0-x64-ef5a0af0/e6b99945 +0 -0
  23. package/.v8-cache/v24.7.0-x64-ef5a0af0/eeeebdfe +0 -0
  24. package/.v8-cache/v24.7.0-x64-ef5a0af0/f6fd8125 +0 -0
  25. package/CHANGELOG.md +100 -0
  26. package/LICENSE +5 -0
  27. package/README.md +4 -7
  28. package/README_PSD.md +261 -84
  29. package/TODO.md +13 -84
  30. package/dist/abr.d.ts +11 -4
  31. package/dist/abr.js +362 -230
  32. package/dist/abr.js.map +1 -1
  33. package/dist/additionalInfo.d.ts +56 -2
  34. package/dist/additionalInfo.js +828 -361
  35. package/dist/additionalInfo.js.map +1 -1
  36. package/dist/ase.d.ts +6 -1
  37. package/dist/ase.js +61 -61
  38. package/dist/ase.js.map +1 -1
  39. package/dist/bundle.js +3321 -1364
  40. package/dist/descriptor.d.ts +28 -13
  41. package/dist/descriptor.js +295 -241
  42. package/dist/descriptor.js.map +1 -1
  43. package/dist/helpers.d.ts +7 -1
  44. package/dist/helpers.js +246 -4
  45. package/dist/helpers.js.map +1 -1
  46. package/dist/imageResources.d.ts +15 -3
  47. package/dist/imageResources.js +586 -144
  48. package/dist/imageResources.js.map +1 -1
  49. package/dist/index.d.ts +1 -0
  50. package/dist/index.js +1 -0
  51. package/dist/index.js.map +1 -1
  52. package/dist/jpeg.js +8 -8
  53. package/dist/jpeg.js.map +1 -1
  54. package/dist/psd.d.ts +292 -19
  55. package/dist/psd.js.map +1 -1
  56. package/dist/psdReader.d.ts +10 -0
  57. package/dist/psdReader.js +424 -216
  58. package/dist/psdReader.js.map +1 -1
  59. package/dist/psdWriter.d.ts +2 -0
  60. package/dist/psdWriter.js +373 -113
  61. package/dist/psdWriter.js.map +1 -1
  62. package/dist/text.d.ts +32 -1
  63. package/dist/text.js +75 -6
  64. package/dist/text.js.map +1 -1
  65. package/dist/utf8.js +0 -3
  66. package/dist/utf8.js.map +1 -1
  67. package/dist-es/abr.d.ts +11 -4
  68. package/dist-es/abr.js +362 -230
  69. package/dist-es/abr.js.map +1 -1
  70. package/dist-es/additionalInfo.d.ts +56 -2
  71. package/dist-es/additionalInfo.js +828 -361
  72. package/dist-es/additionalInfo.js.map +1 -1
  73. package/dist-es/ase.d.ts +6 -1
  74. package/dist-es/ase.js +61 -61
  75. package/dist-es/ase.js.map +1 -1
  76. package/dist-es/descriptor.d.ts +28 -13
  77. package/dist-es/descriptor.js +295 -241
  78. package/dist-es/descriptor.js.map +1 -1
  79. package/dist-es/helpers.d.ts +7 -1
  80. package/dist-es/helpers.js +246 -4
  81. package/dist-es/helpers.js.map +1 -1
  82. package/dist-es/imageResources.d.ts +15 -3
  83. package/dist-es/imageResources.js +586 -144
  84. package/dist-es/imageResources.js.map +1 -1
  85. package/dist-es/index.d.ts +1 -0
  86. package/dist-es/index.js +1 -0
  87. package/dist-es/index.js.map +1 -1
  88. package/dist-es/jpeg.js +8 -8
  89. package/dist-es/jpeg.js.map +1 -1
  90. package/dist-es/psd.d.ts +292 -19
  91. package/dist-es/psd.js.map +1 -1
  92. package/dist-es/psdReader.d.ts +10 -0
  93. package/dist-es/psdReader.js +424 -216
  94. package/dist-es/psdReader.js.map +1 -1
  95. package/dist-es/psdWriter.d.ts +2 -0
  96. package/dist-es/psdWriter.js +373 -113
  97. package/dist-es/psdWriter.js.map +1 -1
  98. package/dist-es/text.d.ts +32 -1
  99. package/dist-es/text.js +75 -6
  100. package/dist-es/text.js.map +1 -1
  101. package/dist-es/utf8.js +0 -3
  102. package/dist-es/utf8.js.map +1 -1
  103. package/package.json +2 -2
  104. package/perf.js +312 -9
  105. package/src/abr.ts +382 -235
  106. package/src/additionalInfo.ts +1071 -482
  107. package/src/ase.ts +66 -61
  108. package/src/descriptor.ts +291 -242
  109. package/src/helpers.ts +266 -3
  110. package/src/imageResources.ts +736 -169
  111. package/src/index.ts +1 -0
  112. package/src/jpeg.ts +8 -8
  113. package/src/psd.ts +271 -32
  114. package/src/psdReader.ts +440 -221
  115. package/src/psdWriter.ts +402 -110
  116. package/src/text.ts +93 -7
  117. package/src/utf8.ts +0 -4
package/src/index.ts CHANGED
@@ -5,6 +5,7 @@ import { fromByteArray } from 'base64-js';
5
5
 
6
6
  export * from './abr';
7
7
  export * from './csh';
8
+ export * from './ase';
8
9
  export { initializeCanvas } from './helpers';
9
10
  export * from './psd';
10
11
  export type { PsdReader, PsdWriter };
package/src/jpeg.ts CHANGED
@@ -761,7 +761,7 @@ function parse(data: Uint8Array) {
761
761
  };
762
762
  }
763
763
  }
764
- // TODO APP1 - Exif
764
+ // APP1 - Exif
765
765
  if (fileMarker === 0xFFE1) {
766
766
  if (appData[0] === 0x45 &&
767
767
  appData[1] === 0x78 &&
@@ -952,11 +952,11 @@ function parse(data: Uint8Array) {
952
952
  // set each frame's components quantization table
953
953
  for (let i = 0; i < frames.length; i++) {
954
954
  const cp = frames[i].components;
955
- for (let j in cp) { // TODO: don't use `in`
956
- const table = quantizationTables[cp[j].quantizationIdx!];
957
- if (!table) throw new Error(`Missing quantization table ${cp[j].quantizationIdx}`);
958
- cp[j].quantizationTable = table;
959
- delete cp[j].quantizationIdx; // TODO: why ???
955
+ for (const key of Object.keys(cp)) {
956
+ const component = cp[+key];
957
+ const table = quantizationTables[component.quantizationIdx!];
958
+ if (!table) throw new Error(`Missing quantization table ${component.quantizationIdx}`);
959
+ component.quantizationTable = table;
960
960
  }
961
961
  }
962
962
 
@@ -1021,8 +1021,8 @@ function getData(decoded: Decoded) {
1021
1021
  break;
1022
1022
  }
1023
1023
  case 3: {
1024
- // The default transform for three components is true, the adobe transform marker overrides it
1025
- colorTransform = decoded.adobe ? !!decoded.adobe.transformCode : true;
1024
+ // The default transform for three components is true, JFIF marker implies YCbCr, otherwise the adobe transform marker overrides it
1025
+ colorTransform = decoded.jfif ? true : decoded.adobe ? !!decoded.adobe.transformCode : true;
1026
1026
 
1027
1027
  const component1 = decoded.components[0];
1028
1028
  const component2 = decoded.components[1];
package/src/psd.ts CHANGED
@@ -31,7 +31,15 @@ export type HSB = { h: number; s: number; b: number; }; // values from 0 to 1
31
31
  export type CMYK = { c: number; m: number; y: number; k: number; }; // values from 0 to 255
32
32
  export type LAB = { l: number; a: number; b: number; }; // values `l` from 0 to 1; `a` and `b` from -1 to 1
33
33
  export type Grayscale = { k: number }; // values from 0 to 255
34
- export type Color = RGBA | RGB | FRGB | HSB | CMYK | LAB | Grayscale;
34
+ export interface ColorBookInfo {
35
+ book: string; // name of the color book (e.g. 'PANTONE+® Solid Coated')
36
+ name: string; // name of the color in the book (e.g. 'PANTONE 688 C')
37
+ bookID: number;
38
+ bookKey: string; // unique key of the color in the book
39
+ }
40
+ // `book` is only present for colors picked from color books (Pantone, etc.) in descriptors, color values are the
41
+ // book color converted to document color space
42
+ export type Color = (RGBA | RGB | FRGB | HSB | CMYK | LAB | Grayscale) & { book?: ColorBookInfo; };
35
43
 
36
44
  export interface EffectContour {
37
45
  name: string;
@@ -40,8 +48,7 @@ export interface EffectContour {
40
48
 
41
49
  export interface EffectPattern {
42
50
  name: string;
43
- id: string;
44
- // TODO: add fields
51
+ id: string; // pattern data is stored in `patterns` field of the document
45
52
  }
46
53
 
47
54
  export interface LayerEffectShadow {
@@ -70,12 +77,15 @@ export interface LayerEffectsOuterGlow {
70
77
  blendMode?: BlendMode;
71
78
  opacity?: number;
72
79
  source?: GlowSource;
80
+ technique?: GlowTechnique;
73
81
  antialiased?: boolean;
74
82
  noise?: number;
75
83
  range?: number;
76
84
  choke?: UnitsValue;
77
85
  jitter?: number;
78
86
  contour?: EffectContour;
87
+ gradient?: EffectSolidGradient | EffectNoiseGradient;
88
+ interpolationMethod?: InterpolationMethod;
79
89
  }
80
90
 
81
91
  export interface LayerEffectInnerGlow {
@@ -94,6 +104,8 @@ export interface LayerEffectInnerGlow {
94
104
  choke?: UnitsValue; // spread
95
105
  jitter?: number;
96
106
  contour?: EffectContour;
107
+ gradient?: EffectSolidGradient | EffectNoiseGradient;
108
+ interpolationMethod?: InterpolationMethod;
97
109
  }
98
110
 
99
111
  export interface LayerEffectBevel {
@@ -118,7 +130,10 @@ export interface LayerEffectBevel {
118
130
  useTexture?: boolean;
119
131
  useShape?: boolean;
120
132
  antialiasGloss?: boolean;
121
- contour?: EffectContour;
133
+ contour?: EffectContour; // gloss contour
134
+ shapeContour?: EffectContour; // contour of the bevel shape, used when `useShape` is enabled
135
+ range?: number;
136
+ antialiased?: boolean;
122
137
  }
123
138
 
124
139
  export interface LayerEffectSolidFill {
@@ -142,7 +157,7 @@ export interface LayerEffectStroke {
142
157
  opacity?: number;
143
158
  color?: Color;
144
159
  gradient?: (EffectSolidGradient | EffectNoiseGradient) & ExtraGradientInfo;
145
- pattern?: EffectPattern & {}; // TODO: additional pattern info
160
+ pattern?: EffectPattern & ExtraPatternInfo;
146
161
  }
147
162
 
148
163
  export interface LayerEffectSatin {
@@ -160,7 +175,6 @@ export interface LayerEffectSatin {
160
175
  contour?: EffectContour;
161
176
  }
162
177
 
163
- // not supported yet because of `Patt` section not implemented
164
178
  export interface LayerEffectPatternOverlay {
165
179
  present?: boolean;
166
180
  showInDialog?: boolean;
@@ -168,6 +182,7 @@ export interface LayerEffectPatternOverlay {
168
182
  blendMode?: BlendMode;
169
183
  opacity?: number;
170
184
  scale?: number;
185
+ angle?: number;
171
186
  pattern?: EffectPattern;
172
187
  phase?: { x: number; y: number; };
173
188
  align?: boolean;
@@ -222,7 +237,7 @@ export interface LayerEffectsInfo {
222
237
  satin?: LayerEffectSatin;
223
238
  stroke?: LayerEffectStroke[];
224
239
  gradientOverlay?: LayerEffectGradientOverlay[];
225
- patternOverlay?: LayerEffectPatternOverlay; // not supported yet because of `Patt` section not implemented
240
+ patternOverlay?: LayerEffectPatternOverlay; // pattern is referenced only by name/id
226
241
  }
227
242
 
228
243
  export type PixelArray = Uint8ClampedArray | Uint8Array | Uint16Array | Float32Array;
@@ -250,7 +265,7 @@ export interface LayerMaskData {
250
265
  imageData?: PixelData;
251
266
  }
252
267
 
253
- export type TextGridding = 'none' | 'round'; // TODO: other values (no idea where to set it up in Photoshop)
268
+ export type TextGridding = 'none' | 'round';
254
269
  export type Orientation = 'horizontal' | 'vertical';
255
270
  export type AntiAlias = 'none' | 'sharp' | 'crisp' | 'strong' | 'smooth' | 'platform' | 'platformLCD';
256
271
  export type WarpStyle =
@@ -497,6 +512,8 @@ export interface ExtraGradientInfo {
497
512
  export interface ExtraPatternInfo {
498
513
  linked?: boolean;
499
514
  phase?: { x: number; y: number; };
515
+ scale?: number;
516
+ angle?: number;
500
517
  }
501
518
 
502
519
  export type VectorContent = { type: 'color'; color: Color; } |
@@ -506,7 +523,7 @@ export type VectorContent = { type: 'color'; color: Color; } |
506
523
 
507
524
  export type RenderingIntent = 'perceptual' | 'saturation' | 'relative colorimetric' | 'absolute colorimetric';
508
525
 
509
- export type Units = 'Pixels' | 'Points' | 'Picas' | 'Millimeters' | 'Centimeters' | 'Inches' | 'None' | 'Density';
526
+ export type Units = 'Pixels' | 'Points' | 'Picas' | 'Millimeters' | 'Centimeters' | 'Inches' | 'None' | 'Density' | 'Distance'; // Distance is in points (1/72 inch)
510
527
 
511
528
  export interface UnitsValue {
512
529
  units: Units;
@@ -538,22 +555,21 @@ export interface PresetInfo {
538
555
 
539
556
  export interface LevelsAdjustment extends PresetInfo {
540
557
  type: 'levels';
541
- // TODO: change to generic array of channels (because of other document type CMYK, Lab, etc)
542
- rgb?: LevelsAdjustmentChannel;
543
- red?: LevelsAdjustmentChannel;
544
- green?: LevelsAdjustmentChannel;
545
- blue?: LevelsAdjustmentChannel;
558
+ // levels for each channel, index 0 is composite channel, followed by document color channels (red, green, blue for RGB,
559
+ // cyan, magenta, yellow, black for CMYK, gray for Grayscale), missing channels use default values (no change)
560
+ channels?: LevelsAdjustmentChannel[];
546
561
  }
547
562
 
548
563
  export type CurvesAdjustmentChannel = { input: number; output: number; }[];
549
564
 
550
565
  export interface CurvesAdjustment extends PresetInfo {
551
566
  type: 'curves';
552
- // TODO: change to generic array of channels (because of other document type CMYK, Lab, etc)
553
- rgb?: CurvesAdjustmentChannel;
554
- red?: CurvesAdjustmentChannel;
555
- green?: CurvesAdjustmentChannel;
556
- blue?: CurvesAdjustmentChannel;
567
+ // curve for each channel, index 0 is composite channel, followed by document color channels (red, green, blue for RGB,
568
+ // cyan, magenta, yellow, black for CMYK, gray for Grayscale), missing or empty curve means no change to the channel
569
+ channels?: CurvesAdjustmentChannel[];
570
+ // curves drawn with pencil tool, lookup table of 256 output values (0-255) for each channel (same indexing as
571
+ // `channels`), missing or empty table means no change to the channel, used instead of `channels` when present
572
+ values?: number[][];
557
573
  }
558
574
 
559
575
  export interface ExposureAdjustment extends PresetInfo {
@@ -581,7 +597,17 @@ export interface HueSaturationAdjustmentChannel {
581
597
 
582
598
  export interface HueSaturationAdjustment extends PresetInfo {
583
599
  type: 'hue/saturation';
584
- master?: HueSaturationAdjustmentChannel;
600
+ colorize?: boolean;
601
+ colorization?: {
602
+ hue: number; // 0..360
603
+ saturation: number; // 0..100
604
+ lightness: number; // -100..100
605
+ };
606
+ master?: {
607
+ hue: number;
608
+ saturation: number;
609
+ lightness: number;
610
+ };
585
611
  reds?: HueSaturationAdjustmentChannel;
586
612
  yellows?: HueSaturationAdjustmentChannel;
587
613
  greens?: HueSaturationAdjustmentChannel;
@@ -670,6 +696,7 @@ export interface ColorStop {
670
696
  color: Color;
671
697
  location: number;
672
698
  midpoint: number;
699
+ type?: 'foreground' | 'background'; // stop uses foreground/background color (`color` is the color at the time of saving)
673
700
  }
674
701
 
675
702
  export interface OpacityStop {
@@ -737,6 +764,15 @@ export type LinkedFile = {
737
764
  };
738
765
  }
739
766
 
767
+ export interface LevelsFilterAdjustment {
768
+ channels: ('composite' | 'red' | 'green' | 'blue')[];
769
+ shadowInput?: number; // 0..255
770
+ highlightInput?: number; // 0..255
771
+ shadowOutput?: number; // 0..255
772
+ highlightOutput?: number; // 0..255
773
+ midtoneInput?: number; // gamma, 1 by default
774
+ }
775
+
740
776
  type FilterVariant = {
741
777
  type: 'average' | 'blur' | 'blur more';
742
778
  } | {
@@ -1164,7 +1200,7 @@ type FilterVariant = {
1164
1200
  } | {
1165
1201
  type: 'curves';
1166
1202
  filter: {
1167
- presetKind: 'custom' | 'default';
1203
+ presetKind?: 'custom' | 'default';
1168
1204
  adjustments?: ({
1169
1205
  channels: ('composite' | 'red' | 'green' | 'blue')[];
1170
1206
  curve: { x: number; y: number; curved?: boolean; }[];
@@ -1173,6 +1209,12 @@ type FilterVariant = {
1173
1209
  values: number[];
1174
1210
  })[];
1175
1211
  };
1212
+ } | {
1213
+ type: 'levels';
1214
+ filter: {
1215
+ presetKind?: 'custom' | 'default';
1216
+ adjustments?: LevelsFilterAdjustment[];
1217
+ };
1176
1218
  } | {
1177
1219
  type: 'invert';
1178
1220
  } | {
@@ -1182,8 +1224,75 @@ type FilterVariant = {
1182
1224
  contrast: number;
1183
1225
  useLegacy: boolean;
1184
1226
  };
1227
+ } | {
1228
+ type: 'camera raw';
1229
+ filter: CameraRawFilterSettings;
1185
1230
  };
1186
1231
 
1232
+ export type CameraRawCurvePoint = { input: number; output: number; };
1233
+ export type CameraRawColors = { red?: number; orange?: number; yellow?: number; green?: number; aqua?: number; blue?: number; purple?: number; magenta?: number; };
1234
+ export type CameraRawColorGradingWheel = { hue?: number; saturation?: number; luminance?: number; };
1235
+
1236
+ // Camera Raw Filter settings (missing values use Camera Raw defaults), settings that are not supported are not preserved
1237
+ export interface CameraRawFilterSettings {
1238
+ version?: string; // Camera Raw version (e.g. '18.4')
1239
+ processVersion?: number;
1240
+ processVersionCode?: number;
1241
+ whiteBalance?: string; // raw white balance value (e.g. 'Cst ' for custom)
1242
+ temperature?: number;
1243
+ tint?: number;
1244
+ exposure?: number;
1245
+ contrast?: number;
1246
+ highlights?: number;
1247
+ shadows?: number;
1248
+ whites?: number;
1249
+ blacks?: number;
1250
+ texture?: number;
1251
+ clarity?: number;
1252
+ dehaze?: number;
1253
+ vibrance?: number;
1254
+ saturation?: number;
1255
+ parametricCurve?: {
1256
+ shadows?: number;
1257
+ darks?: number;
1258
+ lights?: number;
1259
+ highlights?: number;
1260
+ shadowSplit?: number;
1261
+ midtoneSplit?: number;
1262
+ highlightSplit?: number;
1263
+ };
1264
+ pointCurve?: {
1265
+ composite?: CameraRawCurvePoint[];
1266
+ red?: CameraRawCurvePoint[];
1267
+ green?: CameraRawCurvePoint[];
1268
+ blue?: CameraRawCurvePoint[];
1269
+ };
1270
+ hsl?: {
1271
+ hue?: CameraRawColors;
1272
+ saturation?: CameraRawColors;
1273
+ luminance?: CameraRawColors;
1274
+ };
1275
+ colorGrading?: {
1276
+ shadows?: CameraRawColorGradingWheel;
1277
+ midtones?: CameraRawColorGradingWheel;
1278
+ highlights?: CameraRawColorGradingWheel;
1279
+ global?: CameraRawColorGradingWheel;
1280
+ blending?: number;
1281
+ balance?: number;
1282
+ };
1283
+ sharpening?: { amount?: number; radius?: number; detail?: number; masking?: number; };
1284
+ noiseReduction?: {
1285
+ luminance?: number;
1286
+ luminanceDetail?: number;
1287
+ luminanceContrast?: number;
1288
+ color?: number;
1289
+ colorDetail?: number;
1290
+ colorSmoothness?: number;
1291
+ };
1292
+ grain?: { amount?: number; size?: number; roughness?: number; };
1293
+ postCropVignette?: { amount?: number; midpoint?: number; feather?: number; roundness?: number; };
1294
+ }
1295
+
1187
1296
  /*
1188
1297
  export interface Position3D {
1189
1298
  x: number;
@@ -1234,6 +1343,7 @@ export interface PlacedLayer {
1234
1343
  id: string; // id of linked image file (psd.linkedFiles), must be in a GUID format (example: 20953ddb-9391-11ec-b4f1-c15674f50bc4)
1235
1344
  placed?: string; // unique id
1236
1345
  type: PlacedLayerType;
1346
+ external?: boolean; // linked smart object (linked file is stored outside of the document)
1237
1347
  pageNumber?: number;
1238
1348
  totalPages?: number;
1239
1349
  frameStep?: { numerator: number; denominator: number; };
@@ -1258,11 +1368,12 @@ export type AdjustmentLayer = BrightnessAdjustment | LevelsAdjustment | CurvesAd
1258
1368
  InvertAdjustment | PosterizeAdjustment | ThresholdAdjustment | GradientMapAdjustment |
1259
1369
  SelectiveColorAdjustment;
1260
1370
 
1261
- export type LayerColor = 'none' | 'red' | 'orange' | 'yellow' | 'green' | 'blue' | 'violet' | 'gray';
1371
+ export type LayerColor = 'none' | 'red' | 'orange' | 'yellow' | 'green' | 'blue' | 'violet' | 'gray' |
1372
+ 'seafoam' | 'indigo' | 'magenta' | 'fuchsia';
1262
1373
 
1263
1374
  export interface KeyDescriptorItem {
1264
1375
  keyShapeInvalidated?: boolean;
1265
- keyOriginType?: number;
1376
+ keyOriginType?: number; // shape type: 1 - rectangle, 2 - rounded rectangle, 4 - line, 5 - ellipse, 8 - polygon
1266
1377
  keyOriginResolution?: number;
1267
1378
  keyOriginRRectRadii?: {
1268
1379
  topRight: UnitsValue;
@@ -1280,10 +1391,7 @@ export interface KeyDescriptorItem {
1280
1391
  transform?: number[]; // 2d transform matrix [xx, xy, yx, yy, tx, ty]
1281
1392
  }
1282
1393
 
1283
- export interface LayerVectorMask {
1284
- invert?: boolean;
1285
- notLink?: boolean;
1286
- disable?: boolean;
1394
+ export interface VectorPathData {
1287
1395
  fillStartsWithAllPixels?: boolean;
1288
1396
  clipboard?: {
1289
1397
  top: number;
@@ -1295,6 +1403,20 @@ export interface LayerVectorMask {
1295
1403
  paths: BezierPath[];
1296
1404
  }
1297
1405
 
1406
+ export interface LayerVectorMask extends VectorPathData {
1407
+ invert?: boolean;
1408
+ notLink?: boolean;
1409
+ disable?: boolean;
1410
+ }
1411
+
1412
+ export interface SavedPath extends VectorPathData {
1413
+ name: string;
1414
+ symmetryMode?: string; // raw enum value, e.g. 'pathSymmetryModeBasicPath'
1415
+ vectorOrigination?: {
1416
+ keyDescriptorList: KeyDescriptorItem[];
1417
+ };
1418
+ }
1419
+
1298
1420
  export interface AnimationFrame {
1299
1421
  frames: number[]; // IDs of frames that this modifiers applies to
1300
1422
  enable?: boolean;
@@ -1371,11 +1493,13 @@ export interface LayerAdditionalInfo {
1371
1493
  blendInteriorElements?: boolean;
1372
1494
  knockout?: boolean;
1373
1495
  layerMaskAsGlobalMask?: boolean;
1496
+ vectorMaskAsGlobalMask?: boolean;
1374
1497
  protected?: {
1375
1498
  transparency?: boolean;
1376
1499
  composite?: boolean;
1377
1500
  position?: boolean;
1378
1501
  artboards?: boolean;
1502
+ all?: boolean;
1379
1503
  };
1380
1504
  layerColor?: LayerColor;
1381
1505
  referencePoint?: {
@@ -1393,7 +1517,7 @@ export interface LayerAdditionalInfo {
1393
1517
  };
1394
1518
  effects?: LayerEffectsInfo;
1395
1519
  text?: LayerTextData;
1396
- patterns?: PatternInfo[]; // not supported yet
1520
+ patterns?: PatternInfo[];
1397
1521
  vectorFill?: VectorContent;
1398
1522
  vectorStroke?: {
1399
1523
  strokeEnabled?: boolean;
@@ -1415,9 +1539,15 @@ export interface LayerAdditionalInfo {
1415
1539
  vectorMask?: LayerVectorMask;
1416
1540
  usingAlignedRendering?: boolean;
1417
1541
  timestamp?: number; // seconds
1418
- pathList?: {
1419
- // TODO: ...
1420
- }[];
1542
+ generatorSettings?: { // Generator (Export As) settings
1543
+ exportAs?: {
1544
+ exportOption?: string; // JSON string
1545
+ scaleSettings?: string; // JSON string
1546
+ };
1547
+ assets?: string; // JSON string, Generator image assets settings (only on document)
1548
+ layerTime?: number; // seconds
1549
+ crema?: string; // JSON string, Export As document settings (only on document)
1550
+ };
1421
1551
  adjustment?: AdjustmentLayer;
1422
1552
  placedLayer?: PlacedLayer;
1423
1553
  vectorOrigination?: {
@@ -1492,6 +1622,26 @@ export interface LayerAdditionalInfo {
1492
1622
  ranges: { sourceRange: number[]; destRange: number[]; }[];
1493
1623
  };
1494
1624
  vowv?: number; // ???
1625
+ foreignEffectId?: number; // foreign effect ID (Photoshop 6.0)
1626
+ framedGroup?: { // frame tool group (frame layer)
1627
+ rect: { top: number; left: number; bottom: number; right: number; };
1628
+ type: number; // 1 - rectangle, 2 - ellipse
1629
+ lockPPI?: boolean;
1630
+ preferredResolution?: number;
1631
+ savedIteratedName?: string;
1632
+ };
1633
+ animationEffects?: Uint8Array; // animation effects (Photoshop CS6, raw descriptor data)
1634
+ patternData?: { // pattern data (Photoshop 6.0)
1635
+ signature: string;
1636
+ key: string;
1637
+ copyOnSheetDuplication: boolean;
1638
+ patterns: {
1639
+ colorHandling: 'convert' | 'avoid conversion' | 'luminance only';
1640
+ name: string;
1641
+ id: string;
1642
+ }[];
1643
+ }[];
1644
+ pixelSourceData?: Uint8Array[]; // pixel source data of video layers (raw data of each entry)
1495
1645
  pixelSource?: {
1496
1646
  type: 'vdPS';
1497
1647
  origin: { x: number; y: number; };
@@ -1525,6 +1675,20 @@ export enum LayerCompCapturedInfo {
1525
1675
  Appearance = 4,
1526
1676
  }
1527
1677
 
1678
+ export interface HalftoneScreen {
1679
+ frequency: number;
1680
+ frequencyUnits: 'lines/inch' | 'lines/cm';
1681
+ angle: number; // degrees
1682
+ shape: 'round' | 'ellipse' | 'line' | 'square' | 'cross' | 'diamond';
1683
+ accurateScreens: boolean;
1684
+ printerDefaultScreens: boolean;
1685
+ }
1686
+
1687
+ export interface PrintTransferFunction {
1688
+ curve: number[]; // 13 points, values 0..1000 (0% - 100%), -1 for missing points (first and last point are always set)
1689
+ override: boolean;
1690
+ }
1691
+
1528
1692
  export interface ImageResources {
1529
1693
  layerState?: number;
1530
1694
  layerSelectionIds?: number[];
@@ -1554,6 +1718,8 @@ export interface ImageResources {
1554
1718
  guides?: {
1555
1719
  location: number;
1556
1720
  direction: 'horizontal' | 'vertical';
1721
+ color?: RGB; // Photoshop default is cyan (74, 255, 255)
1722
+ id?: string; // unique id (GUID)
1557
1723
  }[];
1558
1724
  };
1559
1725
  resolutionInfo?: {
@@ -1578,6 +1744,7 @@ export interface ImageResources {
1578
1744
  printerManagesColors?: boolean;
1579
1745
  printerName?: string;
1580
1746
  printerProfile?: string;
1747
+ printerProfileColorSpace?: 'rgb' | 'grayscale'; // color space of printer profile, missing value means 'rgb'
1581
1748
  printSixteenBit?: boolean;
1582
1749
  renderingIntent?: RenderingIntent;
1583
1750
  hardProof?: boolean;
@@ -1605,7 +1772,76 @@ export interface ImageResources {
1605
1772
  printFlags?: boolean;
1606
1773
  };
1607
1774
  iccUntaggedProfile?: boolean;
1775
+ colorSamplers?: {
1776
+ x: number; // pixels
1777
+ y: number; // pixels
1778
+ colorSpace: number; // -1 - actual color, 0 - RGB, 1 - HSB, 2 - CMYK, 7 - Lab, 8 - grayscale, ...
1779
+ depth?: number; // sample size (Photoshop CS3 format), samplers are written in Photoshop 5 format if missing
1780
+ }[];
1781
+ effectsVisible?: boolean; // global flag to show or hide all layer effects
1782
+ iccProfile?: Uint8Array; // raw ICC profile data
1783
+ exifData?: Uint8Array; // raw EXIF data (TIFF format)
1784
+ iptcData?: Uint8Array; // raw IPTC-NAA record
1785
+ windowsDevMode?: Uint8Array; // raw Windows DEVMODE structure (printer settings)
1786
+ outputSettings?: any; // Save for Web output settings (raw descriptor)
1787
+ colorHalftoneScreens?: HalftoneScreen[]; // cyan, magenta, yellow and black
1788
+ grayscaleHalftoneScreens?: HalftoneScreen[];
1789
+ colorTransferFunctions?: PrintTransferFunction[]; // one for each of 4 printing plates
1790
+ grayscaleTransferFunctions?: PrintTransferFunction[];
1791
+ duotoneHalftoneScreens?: HalftoneScreen[];
1792
+ duotoneTransferFunctions?: PrintTransferFunction[];
1793
+ duotoneImageInformation?: Uint8Array; // raw data
1794
+ alternateDuotoneColors?: {
1795
+ colors: Color[];
1796
+ labColors: Uint8Array; // Lab color table (usually 256 colors), 3 bytes for each color (L, a, b)
1797
+ };
1798
+ quickMaskInfo?: {
1799
+ channelId: number;
1800
+ initiallyEmpty: boolean;
1801
+ };
1802
+ measurementScale?: Uint8Array; // raw descriptor data
1803
+ printStyle?: {
1804
+ caption?: boolean;
1805
+ calibrationBars?: boolean;
1806
+ registrationMarks?: boolean;
1807
+ cornerCropMarks?: boolean;
1808
+ centerCropMarks?: boolean;
1809
+ labels?: boolean;
1810
+ negative?: boolean;
1811
+ emulsionDown?: boolean;
1812
+ interpolate?: boolean;
1813
+ backgroundColor?: Color;
1814
+ border?: UnitsValue;
1815
+ bleed?: UnitsValue;
1816
+ resolution?: UnitsValue;
1817
+ vectorData?: boolean;
1818
+ pagePosition?: string; // 'centered' or raw enum value
1819
+ left?: UnitsValue;
1820
+ top?: UnitsValue;
1821
+ scale?: number; // 0..1
1822
+ cropWhenPrinting?: boolean;
1823
+ cropRect?: { top: number; left: number; bottom: number; right: number; };
1824
+ };
1825
+ printFlagsInfo?: {
1826
+ centerCropMarks: boolean;
1827
+ bleedWidth: number;
1828
+ bleedWidthScale: number;
1829
+ };
1830
+ indexedColorCount?: number; // number of used colors in indexed color palette
1831
+ transparencyIndex?: number; // index of transparent color in indexed color palette
1832
+ alphaChannelDisplayInfo?: {
1833
+ color?: Color;
1834
+ rawColor?: { colorSpace: number; values: number[]; }; // color in color space not supported by this library (instead of `color`)
1835
+ opacity: number; // 0..1
1836
+ kind: 'selected' | 'protected' | 'spot'; // color indicates selected areas, protected (masked) areas or spot color
1837
+ }[];
1608
1838
  pathSelectionState?: string[];
1839
+ savedPaths?: SavedPath[]; // paths from the paths panel
1840
+ workPath?: VectorPathData;
1841
+ clippingPath?: {
1842
+ name: string; // name of the saved path used as clipping path
1843
+ flatness: number; // device pixels, 0 for printer default
1844
+ };
1609
1845
  imageReadyVariables?: string;
1610
1846
  imageReadyDataSets?: string;
1611
1847
  animations?: Animations;
@@ -1794,7 +2030,7 @@ export interface Psd extends LayerAdditionalInfo {
1794
2030
  imageData?: PixelData;
1795
2031
  rawCompositeData?: Uint8Array;
1796
2032
  /** Information needed to decode `rawCompositeData` (see `getCompositeImageData`) */
1797
- rawCompositeDataInfo?: { large: boolean; globalAlpha: boolean; };
2033
+ rawCompositeDataInfo?: { large: boolean; globalAlpha: boolean; layersInGlobalInfo?: boolean; };
1798
2034
  imageResources?: ImageResources;
1799
2035
  linkedFiles?: LinkedFile[]; // used in smart objects
1800
2036
  artboards?: {
@@ -1865,4 +2101,7 @@ export interface WriteOptions {
1865
2101
  /** Uses zip compression when writing PSD file, will result in smaller file size but may be incompatible
1866
2102
  * with some software. It may also be significantly slower. */
1867
2103
  compress?: boolean;
2104
+
2105
+ /** Used only for development. */
2106
+ log?: (...args: any[]) => void;
1868
2107
  }