ag-psd 19.0.1 → 20.1.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 (65) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README_PSD.md +20 -2
  3. package/TODO +7 -0
  4. package/dist/abr.js +4 -4
  5. package/dist/abr.js.map +1 -1
  6. package/dist/additionalInfo.d.ts +3 -3
  7. package/dist/additionalInfo.js +107 -12
  8. package/dist/additionalInfo.js.map +1 -1
  9. package/dist/bundle.js +15305 -7643
  10. package/dist/descriptor.js +21 -16
  11. package/dist/descriptor.js.map +1 -1
  12. package/dist/engineData2.d.ts +1 -0
  13. package/dist/engineData2.js +349 -0
  14. package/dist/engineData2.js.map +1 -0
  15. package/dist/helpers.d.ts +2 -7
  16. package/dist/helpers.js +45 -12
  17. package/dist/helpers.js.map +1 -1
  18. package/dist/imageResources.js +42 -1
  19. package/dist/imageResources.js.map +1 -1
  20. package/dist/psd.d.ts +46 -3
  21. package/dist/psd.js +8 -1
  22. package/dist/psd.js.map +1 -1
  23. package/dist/psdReader.d.ts +11 -5
  24. package/dist/psdReader.js +213 -100
  25. package/dist/psdReader.js.map +1 -1
  26. package/dist/psdWriter.js +24 -4
  27. package/dist/psdWriter.js.map +1 -1
  28. package/dist/utf8.js +10 -4
  29. package/dist/utf8.js.map +1 -1
  30. package/dist-es/abr.js +4 -4
  31. package/dist-es/abr.js.map +1 -1
  32. package/dist-es/additionalInfo.d.ts +3 -3
  33. package/dist-es/additionalInfo.js +110 -15
  34. package/dist-es/additionalInfo.js.map +1 -1
  35. package/dist-es/descriptor.js +21 -16
  36. package/dist-es/descriptor.js.map +1 -1
  37. package/dist-es/engineData2.d.ts +1 -0
  38. package/dist-es/engineData2.js +345 -0
  39. package/dist-es/engineData2.js.map +1 -0
  40. package/dist-es/helpers.d.ts +2 -7
  41. package/dist-es/helpers.js +43 -11
  42. package/dist-es/helpers.js.map +1 -1
  43. package/dist-es/imageResources.js +42 -1
  44. package/dist-es/imageResources.js.map +1 -1
  45. package/dist-es/psd.d.ts +46 -3
  46. package/dist-es/psd.js +7 -0
  47. package/dist-es/psd.js.map +1 -1
  48. package/dist-es/psdReader.d.ts +11 -5
  49. package/dist-es/psdReader.js +212 -102
  50. package/dist-es/psdReader.js.map +1 -1
  51. package/dist-es/psdWriter.js +25 -5
  52. package/dist-es/psdWriter.js.map +1 -1
  53. package/dist-es/utf8.js +10 -4
  54. package/dist-es/utf8.js.map +1 -1
  55. package/package.json +6 -7
  56. package/src/abr.ts +4 -4
  57. package/src/additionalInfo.ts +156 -51
  58. package/src/descriptor.ts +14 -9
  59. package/src/engineData2.ts +367 -0
  60. package/src/helpers.ts +47 -20
  61. package/src/imageResources.ts +59 -2
  62. package/src/psd.ts +41 -5
  63. package/src/psdReader.ts +210 -128
  64. package/src/psdWriter.ts +33 -14
  65. package/src/utf8.ts +12 -4
@@ -1,37 +1,10 @@
1
1
  import { fromByteArray, toByteArray } from 'base64-js';
2
2
  import { readEffects, writeEffects } from './effectsHelpers';
3
3
  import { clamp, createEnum, layerColors, MOCK_HANDLERS } from './helpers';
4
- import {
5
- LayerAdditionalInfo, BezierPath, Psd, ReadOptions, BrightnessAdjustment, ExposureAdjustment, VibranceAdjustment,
6
- ColorBalanceAdjustment, BlackAndWhiteAdjustment, PhotoFilterAdjustment, ChannelMixerChannel,
7
- ChannelMixerAdjustment, PosterizeAdjustment, ThresholdAdjustment, GradientMapAdjustment, CMYK,
8
- SelectiveColorAdjustment, ColorLookupAdjustment, LevelsAdjustmentChannel, LevelsAdjustment,
9
- CurvesAdjustment, CurvesAdjustmentChannel, HueSaturationAdjustment, HueSaturationAdjustmentChannel,
10
- PresetInfo, Color, ColorBalanceValues, WriteOptions, LinkedFile, PlacedLayerType, Warp, KeyDescriptorItem,
11
- BooleanOperation, LayerEffectsInfo, Annotation, LayerVectorMask, AnimationFrame, Timeline, PlacedLayerFilter,
12
- UnitsValue, Filter, PlacedLayer,
13
- } from './psd';
14
- import {
15
- PsdReader, readSignature, readUnicodeString, skipBytes, readUint32, readUint8, readFloat64, readUint16,
16
- readBytes, readInt16, checkSignature, readFloat32, readFixedPointPath32, readSection, readColor, readInt32,
17
- readPascalString, readUnicodeStringWithLength, readAsciiString, readPattern,
18
- } from './psdReader';
19
- import {
20
- PsdWriter, writeZeros, writeSignature, writeBytes, writeUint32, writeUint16, writeFloat64, writeUint8,
21
- writeInt16, writeFloat32, writeFixedPointPath32, writeUnicodeString, writeSection, writeUnicodeStringWithPadding,
22
- writeColor, writePascalString, writeInt32,
23
- } from './psdWriter';
24
- import {
25
- Annt, BlnM, DescriptorColor, DescriptorUnitsValue, parsePercent, parseUnits, parseUnitsOrNumber, QuiltWarpDescriptor,
26
- strokeStyleLineAlignment, strokeStyleLineCapType, strokeStyleLineJoinType, TextDescriptor, textGridding,
27
- unitsPercent, unitsValue, WarpDescriptor, warpStyle, writeVersionAndDescriptor,
28
- readVersionAndDescriptor, StrokeDescriptor, Ornt, horzVrtcToXY, LmfxDescriptor, Lfx2Descriptor,
29
- FrameListDescriptor, TimelineDescriptor, FrameDescriptor, xyToHorzVrtc, serializeEffects,
30
- parseEffects, parseColor, serializeColor, serializeVectorContent, parseVectorContent, parseTrackList,
31
- serializeTrackList, FractionDescriptor, BlrM, BlrQ, SmBQ, SmBM, DspM, UndA, Cnvr, RplS, SphM, Wvtp, ZZTy,
32
- Dstr, Chnl, MztT, Lns, blurType, DfsM, ExtT, ExtR, FlCl, CntE, WndM, Drct, IntE, IntC, FlMd,
33
- unitsPercentF, frac, ClrS, descBoundsToBounds, boundsToDescBounds,
34
- } from './descriptor';
4
+ import { LayerAdditionalInfo, BezierPath, Psd, BrightnessAdjustment, ExposureAdjustment, VibranceAdjustment, ColorBalanceAdjustment, BlackAndWhiteAdjustment, PhotoFilterAdjustment, ChannelMixerChannel, ChannelMixerAdjustment, PosterizeAdjustment, ThresholdAdjustment, GradientMapAdjustment, CMYK, SelectiveColorAdjustment, ColorLookupAdjustment, LevelsAdjustmentChannel, LevelsAdjustment, CurvesAdjustment, CurvesAdjustmentChannel, HueSaturationAdjustment, HueSaturationAdjustmentChannel, PresetInfo, Color, ColorBalanceValues, WriteOptions, LinkedFile, PlacedLayerType, Warp, KeyDescriptorItem, BooleanOperation, LayerEffectsInfo, Annotation, LayerVectorMask, AnimationFrame, Timeline, PlacedLayerFilter, UnitsValue, Filter, PlacedLayer } from './psd';
5
+ import { PsdReader, readSignature, readUnicodeString, skipBytes, readUint32, readUint8, readFloat64, readUint16, readBytes, readInt16, checkSignature, readFloat32, readFixedPointPath32, readSection, readColor, readInt32, readPascalString, readUnicodeStringWithLength, readAsciiString, readPattern, readLayerInfo, ReadOptionsExt } from './psdReader';
6
+ import { PsdWriter, writeZeros, writeSignature, writeBytes, writeUint32, writeUint16, writeFloat64, writeUint8, writeInt16, writeFloat32, writeFixedPointPath32, writeUnicodeString, writeSection, writeUnicodeStringWithPadding, writeColor, writePascalString, writeInt32 } from './psdWriter';
7
+ import { Annt, BlnM, DescriptorColor, DescriptorUnitsValue, parsePercent, parseUnits, parseUnitsOrNumber, QuiltWarpDescriptor, strokeStyleLineAlignment, strokeStyleLineCapType, strokeStyleLineJoinType, TextDescriptor, textGridding, unitsPercent, unitsValue, WarpDescriptor, warpStyle, writeVersionAndDescriptor, readVersionAndDescriptor, StrokeDescriptor, Ornt, horzVrtcToXY, LmfxDescriptor, Lfx2Descriptor, FrameListDescriptor, TimelineDescriptor, FrameDescriptor, xyToHorzVrtc, serializeEffects, parseEffects, parseColor, serializeColor, serializeVectorContent, parseVectorContent, parseTrackList, serializeTrackList, FractionDescriptor, BlrM, BlrQ, SmBQ, SmBM, DspM, UndA, Cnvr, RplS, SphM, Wvtp, ZZTy, Dstr, Chnl, MztT, Lns, blurType, DfsM, ExtT, ExtR, FlCl, CntE, WndM, Drct, IntE, IntC, FlMd, unitsPercentF, frac, ClrS, descBoundsToBounds, boundsToDescBounds } from './descriptor';
35
8
  import { serializeEngineData, parseEngineData } from './engineData';
36
9
  import { encodeEngineData, decodeEngineData } from './text';
37
10
 
@@ -41,7 +14,7 @@ export interface ExtendedWriteOptions extends WriteOptions {
41
14
  }
42
15
 
43
16
  type HasMethod = (target: LayerAdditionalInfo) => boolean;
44
- type ReadMethod = (reader: PsdReader, target: LayerAdditionalInfo, left: () => number, psd: Psd, options: ReadOptions) => void;
17
+ type ReadMethod = (reader: PsdReader, target: LayerAdditionalInfo, left: () => number, psd: Psd, options: ReadOptionsExt) => void;
45
18
  type WriteMethod = (writer: PsdWriter, target: LayerAdditionalInfo, psd: Psd, options: ExtendedWriteOptions) => void;
46
19
 
47
20
  export interface InfoHandler {
@@ -90,9 +63,11 @@ addHandler(
90
63
 
91
64
  if (readInt16(reader) !== 50) throw new Error(`Invalid TySh text version`);
92
65
  const text: TextDescriptor = readVersionAndDescriptor(reader);
66
+ // console.log(require('util').inspect(text, false, 99, false), 'utf8');
93
67
 
94
68
  if (readInt16(reader) !== 1) throw new Error(`Invalid TySh warp version`);
95
69
  const warp: WarpDescriptor = readVersionAndDescriptor(reader);
70
+ // console.log(require('util').inspect(warp, false, 99, false), 'utf8');
96
71
 
97
72
  target.text = {
98
73
  transform,
@@ -120,6 +95,7 @@ addHandler(
120
95
  if (text.EngineData) {
121
96
  const engineData = parseEngineData(text.EngineData);
122
97
  const textData = decodeEngineData(engineData);
98
+ // console.log(require('util').inspect(engineData, false, 99, false), 'utf8');
123
99
 
124
100
  // require('fs').writeFileSync(`layer-${target.name}.txt`, require('util').inspect(engineData, false, 99, false), 'utf8');
125
101
  // const before = parseEngineData(text.EngineData);
@@ -732,10 +708,21 @@ interface CustomDescriptor {
732
708
  layerTime?: number;
733
709
  }
734
710
 
711
+ interface CmlsDescriptor {
712
+ origFXRefPoint?: { Hrzn: number; Vrtc: number; };
713
+ LyrI: number;
714
+ layerSettings: {
715
+ enab?: boolean;
716
+ Ofst?: { Hrzn: number; Vrtc: number; };
717
+ FXRefPoint?: { Hrzn: number; Vrtc: number; };
718
+ compList: number[];
719
+ }[];
720
+ }
721
+
735
722
  addHandler(
736
723
  'shmd',
737
724
  target => target.timestamp !== undefined || target.animationFrames !== undefined ||
738
- target.animationFrameFlags !== undefined || target.timeline !== undefined,
725
+ target.animationFrameFlags !== undefined || target.timeline !== undefined || target.comps !== undefined,
739
726
  (reader, target, left, _, options) => {
740
727
  const count = readUint32(reader);
741
728
 
@@ -798,8 +785,25 @@ addHandler(
798
785
 
799
786
  target.timeline = timeline;
800
787
  // console.log('tmln:result', target.name, target.id, require('util').inspect(timeline, false, 99, true));
788
+ } else if (key === 'cmls') {
789
+ const desc = readVersionAndDescriptor(reader) as CmlsDescriptor;
790
+ // console.log('cmls', require('util').inspect(desc, false, 99, true));
791
+
792
+ target.comps = {
793
+ settings: [],
794
+ };
795
+
796
+ if (desc.origFXRefPoint) target.comps.originalEffectsReferencePoint = { x: desc.origFXRefPoint.Hrzn, y: desc.origFXRefPoint.Vrtc };
797
+
798
+ for (const item of desc.layerSettings) {
799
+ target.comps.settings.push({ compList: item.compList });
800
+ const t = target.comps.settings[target.comps.settings.length - 1];
801
+ if ('enab' in item) t.enabled = item.enab;
802
+ if (item.Ofst) t.offset = { x: item.Ofst.Hrzn, y: item.Ofst.Vrtc };
803
+ if (item.FXRefPoint) t.effectsReferencePoint = { x: item.FXRefPoint.Hrzn, y: item.FXRefPoint.Vrtc };
804
+ }
801
805
  } else {
802
- options.logDevFeatures && console.log('Unhandled "shmd" section key', key);
806
+ options.logMissingFeatures && console.log('Unhandled "shmd" section key', key);
803
807
  }
804
808
 
805
809
  skipBytes(reader, left());
@@ -809,13 +813,14 @@ addHandler(
809
813
  skipBytes(reader, left());
810
814
  },
811
815
  (writer, target, _, options) => {
812
- const { animationFrames, animationFrameFlags, timestamp, timeline } = target;
816
+ const { animationFrames, animationFrameFlags, timestamp, timeline, comps } = target;
813
817
 
814
818
  let count = 0;
815
819
  if (animationFrames) count++;
816
820
  if (animationFrameFlags) count++;
817
821
  if (timeline) count++;
818
822
  if (timestamp !== undefined) count++;
823
+ if (comps) count++;
819
824
  writeUint32(writer, count);
820
825
 
821
826
  if (animationFrames) {
@@ -883,7 +888,7 @@ addHandler(
883
888
  desc.trackList = serializeTrackList(timeline.tracks);
884
889
  }
885
890
 
886
- const id = options.layerToId.get(target) || target.id || 0;
891
+ const id = options.layerToId.get(target) || target.id;
887
892
  if (!id) throw new Error('You need to provide layer.id value whan writing document with animations');
888
893
  desc.LyrI = id;
889
894
 
@@ -904,6 +909,38 @@ addHandler(
904
909
  writeVersionAndDescriptor(writer, '', 'metadata', desc);
905
910
  }, true);
906
911
  }
912
+
913
+ if (comps) {
914
+ writeSignature(writer, '8BIM');
915
+ writeSignature(writer, 'cmls');
916
+ writeUint8(writer, 0); // copy (always false)
917
+ writeZeros(writer, 3);
918
+ writeSection(writer, 2, () => {
919
+ const id = options.layerToId.get(target) || target.id;
920
+ if (!id) throw new Error('You need to provide layer.id value whan writing document with layer comps');
921
+
922
+ const desc: CmlsDescriptor = {} as any;
923
+
924
+ if (comps.originalEffectsReferencePoint) {
925
+ desc.origFXRefPoint = { Hrzn: comps.originalEffectsReferencePoint.x, Vrtc: comps.originalEffectsReferencePoint.y };
926
+ }
927
+
928
+ desc.LyrI = id;
929
+ desc.layerSettings = [];
930
+
931
+ for (const item of comps.settings) {
932
+ const t: CmlsDescriptor['layerSettings'][0] = {} as any;
933
+ if (item.enabled !== undefined) t.enab = item.enabled;
934
+ if (item.offset) t.Ofst = { Hrzn: item.offset.x, Vrtc: item.offset.y };
935
+ if (item.effectsReferencePoint) t.FXRefPoint = { Hrzn: item.effectsReferencePoint.x, Vrtc: item.effectsReferencePoint.y };
936
+ t.compList = item.compList;
937
+ desc.layerSettings.push(t);
938
+ }
939
+
940
+ // console.log('cmls', require('util').inspect(desc, false, 99, true));
941
+ writeVersionAndDescriptor(writer, '', 'null', desc);
942
+ }, true);
943
+ }
907
944
  },
908
945
  );
909
946
 
@@ -3304,6 +3341,62 @@ addHandler(
3304
3341
  },
3305
3342
  );
3306
3343
 
3344
+ addHandler(
3345
+ 'Lr16',
3346
+ () => false,
3347
+ (reader, _target, _left, psd, options) => {
3348
+ readLayerInfo(reader, psd, options);
3349
+ },
3350
+ (_writer, _target) => {
3351
+ },
3352
+ );
3353
+
3354
+ addHandler(
3355
+ 'Lr32',
3356
+ () => false,
3357
+ (reader, _target, _left, psd, options) => {
3358
+ readLayerInfo(reader, psd, options);
3359
+ },
3360
+ (_writer, _target) => {
3361
+ },
3362
+ );
3363
+
3364
+ addHandler(
3365
+ 'LMsk',
3366
+ hasKey('userMask'),
3367
+ (reader, target) => {
3368
+ target.userMask = {
3369
+ colorSpace: readColor(reader),
3370
+ opacity: readUint16(reader) / 0xff,
3371
+ };
3372
+ const flag = readUint8(reader);
3373
+ if (flag !== 128) throw new Error('Invalid flag value');
3374
+ skipBytes(reader, 1);
3375
+ },
3376
+ (writer, target) => {
3377
+ const userMask = target.userMask!;
3378
+ writeColor(writer, userMask.colorSpace);
3379
+ writeUint16(writer, clamp(userMask.opacity, 0, 1) * 0xff);
3380
+ writeUint8(writer, 128);
3381
+ writeZeros(writer, 1);
3382
+ },
3383
+ );
3384
+
3385
+ if (MOCK_HANDLERS) {
3386
+ addHandler(
3387
+ 'vowv', // appears with Lr16 section ?
3388
+ _ => false,
3389
+ (reader, target, left) => {
3390
+ const value = readUint32(reader); // 2 ????
3391
+ reader; target;
3392
+ console.log('vowv', { value }, left());
3393
+ },
3394
+ (_writer, _target) => {
3395
+ // TODO: write
3396
+ },
3397
+ );
3398
+ }
3399
+
3307
3400
  if (MOCK_HANDLERS) {
3308
3401
  addHandler(
3309
3402
  'Patt',
@@ -3614,30 +3707,33 @@ addHandlerAlias('lnkD', 'lnk2');
3614
3707
  addHandlerAlias('lnk3', 'lnk2');
3615
3708
  addHandlerAlias('lnkE', 'lnk2');
3616
3709
 
3617
- interface ExtensionDesc {
3618
- generatorSettings: {
3619
- generator_45_assets: { json: string; };
3620
- layerTime: number;
3621
- };
3710
+ interface PthsDescriptor {
3711
+ pathList: {
3712
+ _classID: 'pathInfoClass';
3713
+ pathUnicodeName: string;
3714
+ pathSymmetryClass: {
3715
+ _classID: 'pathSymmetryClass';
3716
+ pathSymmetryMode: string; // 'pathSymmetryModeEnum.pathSymmetryModeBasicPath'
3717
+ };
3718
+ }[];
3622
3719
  }
3623
3720
 
3624
3721
  addHandler(
3625
3722
  'pths',
3626
3723
  hasKey('pathList'),
3627
3724
  (reader, target) => {
3628
- const descriptor = readVersionAndDescriptor(reader);
3629
-
3630
- target.pathList = []; // TODO: read paths (find example with non-empty list)
3631
-
3632
- descriptor;
3633
- // console.log('pths', descriptor); // TODO: remove this
3725
+ const desc = readVersionAndDescriptor(reader, true) as PthsDescriptor;
3726
+ // console.log(require('util').inspect(desc, false, 99, true));
3727
+ // if (options.throwForMissingFeatures && desc?.pathList?.length) throw new Error('non-empty pathList in `pths`');
3728
+ desc;
3729
+ target.pathList = []; // TODO: read paths
3634
3730
  },
3635
3731
  (writer, _target) => {
3636
- const descriptor = {
3732
+ const desc: PthsDescriptor = {
3637
3733
  pathList: [], // TODO: write paths
3638
3734
  };
3639
3735
 
3640
- writeVersionAndDescriptor(writer, '', 'pathsDataClass', descriptor);
3736
+ writeVersionAndDescriptor(writer, '', 'pathsDataClass', desc);
3641
3737
  },
3642
3738
  );
3643
3739
 
@@ -4548,9 +4644,11 @@ addHandler(
4548
4644
  const data = readBytes(reader, left());
4549
4645
  target.engineData = fromByteArray(data);
4550
4646
  // const engineData = parseEngineData(data);
4647
+ // const engineData2 = decodeEngineData2(engineData);
4551
4648
  // console.log(require('util').inspect(engineData, false, 99, true));
4552
- // require('fs').writeFileSync('resources/engineData2Simple.txt', require('util').inspect(engineData, false, 99, false), 'utf8');
4553
- // require('fs').writeFileSync('test_data.json', JSON.stringify(ed, null, 2), 'utf8');
4649
+ // require('fs').writeFileSync('test_data.bin', data);
4650
+ // require('fs').writeFileSync('test_data.txt', require('util').inspect(engineData, false, 99, false), 'utf8');
4651
+ // require('fs').writeFileSync('test_data.json', JSON.stringify(engineData2, null, 2), 'utf8');
4554
4652
  },
4555
4653
  (writer, target) => {
4556
4654
  const buffer = toByteArray(target.engineData!);
@@ -4804,6 +4902,13 @@ addHandler(
4804
4902
  },
4805
4903
  );
4806
4904
 
4905
+ interface ExtensionDesc {
4906
+ generatorSettings: {
4907
+ generator_45_assets: { json: string; };
4908
+ layerTime: number;
4909
+ };
4910
+ }
4911
+
4807
4912
  // extension settings ?, ignore it
4808
4913
  addHandler(
4809
4914
  'extn',
package/src/descriptor.ts CHANGED
@@ -136,6 +136,8 @@ const fieldToExtType: ExtTypeDict = {
136
136
  sdwM: makeType('Parameters', 'adaptCorrectTones'),
137
137
  hglM: makeType('Parameters', 'adaptCorrectTones'),
138
138
  customShape: makeType('', 'customShape'),
139
+ origFXRefPoint: nullType,
140
+ FXRefPoint: nullType,
139
141
  };
140
142
 
141
143
  const fieldToArrayExtType: ExtTypeDict = {
@@ -167,6 +169,8 @@ const fieldToArrayExtType: ExtTypeDict = {
167
169
  puppetShapeList: makeType('', 'puppetShape'),
168
170
  channelDenoise: makeType('', 'channelDenoiseParams'),
169
171
  ShrP: makeType('', 'Pnt '),
172
+ layerSettings: nullType,
173
+ list: nullType,
170
174
  };
171
175
 
172
176
  const typeToField: { [key: string]: string[]; } = {
@@ -174,7 +178,7 @@ const typeToField: { [key: string]: string[]; } = {
174
178
  'Txt ', 'printerName', 'Nm ', 'Idnt', 'blackAndWhitePresetFileName', 'LUT3DFileName',
175
179
  'presetFileName', 'curvesPresetFileName', 'mixerPresetFileName', 'placed', 'description', 'reason',
176
180
  'artboardPresetName', 'json', 'clipID', 'relPath', 'fullPath', 'mediaDescriptor', 'Msge',
177
- 'altTag', 'url', 'cellText', 'preset', 'KnNm', 'FPth',
181
+ 'altTag', 'url', 'cellText', 'preset', 'KnNm', 'FPth', 'comment',
178
182
  ],
179
183
  'tdta': [
180
184
  'EngineData', 'LUT3DFileData', 'indexArray', 'originalVertexArray', 'deformedVertexArray',
@@ -192,7 +196,7 @@ const typeToField: { [key: string]: string[]; } = {
192
196
  'topOutset', 'leftOutset', 'bottomOutset', 'rightOutset', 'filterID', 'meshQuality',
193
197
  'meshExpansion', 'meshRigidity', 'VrsM', 'VrsN', 'NmbG', 'WLMn', 'WLMx', 'AmMn', 'AmMx', 'SclH', 'SclV',
194
198
  'Lvl ', 'TlNm', 'TlOf', 'FlRs', 'Thsh', 'ShrS', 'ShrE', 'FlRs', 'Vrnc', 'Strg', 'ExtS', 'ExtD',
195
- 'HrzS', 'VrtS', 'NmbR', 'EdgF', 'Ang1', 'Ang2', 'Ang3', 'Ang4',
199
+ 'HrzS', 'VrtS', 'NmbR', 'EdgF', 'Ang1', 'Ang2', 'Ang3', 'Ang4', 'lastAppliedComp', 'capturedInfo',
196
200
  ],
197
201
  'enum': [
198
202
  'textGridding', 'Ornt', 'warpStyle', 'warpRotate', 'Inte', 'Bltn', 'ClrS', 'BlrQ',
@@ -237,7 +241,7 @@ const typeToField: { [key: string]: string[]; } = {
237
241
  'sheetTimelineOptions', 'audioClipList', 'trackList', 'globalTrackList', 'keyList', 'audioClipList',
238
242
  'warpValues', 'selectedPin', 'Pts ', 'SbpL', 'pathComponents', 'pinOffsets', 'posFinalPins',
239
243
  'pinVertexIndices', 'PinP', 'PnRt', 'PnOv', 'PnDp', 'filterFXList', 'puppetShapeList', 'ShrP',
240
- 'channelDenoise', 'Mtrx',
244
+ 'channelDenoise', 'Mtrx', 'layerSettings', 'list', 'compList',
241
245
  ],
242
246
  'ObAr': ['meshPoints', 'quiltSliceX', 'quiltSliceY'],
243
247
  'obj ': ['null', 'Chnl'],
@@ -285,6 +289,7 @@ const fieldToArrayType: Dict = {
285
289
  ShrP: 'Objc',
286
290
  channelDenoise: 'Objc',
287
291
  Mtrx: 'long',
292
+ compList: 'long',
288
293
  };
289
294
 
290
295
  const fieldToType: Dict = {};
@@ -336,7 +341,7 @@ export function readAsciiStringOrClassId(reader: PsdReader) {
336
341
  }
337
342
 
338
343
  function writeAsciiStringOrClassId(writer: PsdWriter, value: string) {
339
- if (value.length === 4 && value !== 'warp' && value !== 'time' && value !== 'hold') {
344
+ if (value.length === 4 && value !== 'warp' && value !== 'time' && value !== 'hold' && value !== 'list') {
340
345
  // write classId
341
346
  writeInt32(writer, 0);
342
347
  writeSignature(writer, value);
@@ -473,9 +478,9 @@ function readOSType(reader: PsdReader, type: string, includeClass: boolean) {
473
478
  const items: any[] = [];
474
479
 
475
480
  for (let i = 0; i < length; i++) {
476
- const type = readSignature(reader);
477
- // console.log(' >', type);
478
- items.push(readOSType(reader, type, includeClass));
481
+ const itemType = readSignature(reader);
482
+ // console.log(' >', itemType);
483
+ items.push(readOSType(reader, itemType, includeClass));
479
484
  }
480
485
 
481
486
  return items;
@@ -497,9 +502,9 @@ function readOSType(reader: PsdReader, type: string, includeClass: boolean) {
497
502
  case 'TEXT': // String
498
503
  return readUnicodeString(reader);
499
504
  case 'enum': { // Enumerated
500
- const type = readAsciiStringOrClassId(reader);
505
+ const enumType = readAsciiStringOrClassId(reader);
501
506
  const value = readAsciiStringOrClassId(reader);
502
- return `${type}.${value}`;
507
+ return `${enumType}.${value}`;
503
508
  }
504
509
  case 'long': // Integer
505
510
  return readInt32(reader);