ag-psd 14.5.3 → 15.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/dist/bundle.js CHANGED
@@ -387,35 +387,35 @@ addHandler('TySh', hasKey('text'), function (reader, target, leftBytes) {
387
387
  addHandler('SoCo', function (target) { return target.vectorFill !== undefined && target.vectorStroke === undefined &&
388
388
  target.vectorFill.type === 'color'; }, function (reader, target) {
389
389
  var descriptor = (0, descriptor_1.readVersionAndDescriptor)(reader);
390
- target.vectorFill = parseVectorContent(descriptor);
390
+ target.vectorFill = (0, descriptor_1.parseVectorContent)(descriptor);
391
391
  }, function (writer, target) {
392
- var descriptor = serializeVectorContent(target.vectorFill).descriptor;
392
+ var descriptor = (0, descriptor_1.serializeVectorContent)(target.vectorFill).descriptor;
393
393
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', descriptor);
394
394
  });
395
395
  addHandler('GdFl', function (target) { return target.vectorFill !== undefined && target.vectorStroke === undefined &&
396
396
  (target.vectorFill.type === 'solid' || target.vectorFill.type === 'noise'); }, function (reader, target, left) {
397
397
  var descriptor = (0, descriptor_1.readVersionAndDescriptor)(reader);
398
- target.vectorFill = parseVectorContent(descriptor);
398
+ target.vectorFill = (0, descriptor_1.parseVectorContent)(descriptor);
399
399
  (0, psdReader_1.skipBytes)(reader, left());
400
400
  }, function (writer, target) {
401
- var descriptor = serializeVectorContent(target.vectorFill).descriptor;
401
+ var descriptor = (0, descriptor_1.serializeVectorContent)(target.vectorFill).descriptor;
402
402
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', descriptor);
403
403
  });
404
404
  addHandler('PtFl', function (target) { return target.vectorFill !== undefined && target.vectorStroke === undefined &&
405
405
  target.vectorFill.type === 'pattern'; }, function (reader, target) {
406
406
  var descriptor = (0, descriptor_1.readVersionAndDescriptor)(reader);
407
- target.vectorFill = parseVectorContent(descriptor);
407
+ target.vectorFill = (0, descriptor_1.parseVectorContent)(descriptor);
408
408
  }, function (writer, target) {
409
- var descriptor = serializeVectorContent(target.vectorFill).descriptor;
409
+ var descriptor = (0, descriptor_1.serializeVectorContent)(target.vectorFill).descriptor;
410
410
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', descriptor);
411
411
  });
412
412
  addHandler('vscg', function (target) { return target.vectorFill !== undefined && target.vectorStroke !== undefined; }, function (reader, target, left) {
413
413
  (0, psdReader_1.readSignature)(reader); // key
414
414
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
415
- target.vectorFill = parseVectorContent(desc);
415
+ target.vectorFill = (0, descriptor_1.parseVectorContent)(desc);
416
416
  (0, psdReader_1.skipBytes)(reader, left());
417
417
  }, function (writer, target) {
418
- var _a = serializeVectorContent(target.vectorFill), descriptor = _a.descriptor, key = _a.key;
418
+ var _a = (0, descriptor_1.serializeVectorContent)(target.vectorFill), descriptor = _a.descriptor, key = _a.key;
419
419
  (0, psdWriter_1.writeSignature)(writer, key);
420
420
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', descriptor);
421
421
  });
@@ -660,10 +660,10 @@ addHandler('lmfx', function (target) { return target.effects !== undefined && ha
660
660
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
661
661
  // console.log(require('util').inspect(info, false, 99, true));
662
662
  // discard if read in 'lrFX' or 'lfx2' section
663
- target.effects = parseEffects(desc, !!options.logMissingFeatures);
663
+ target.effects = (0, descriptor_1.parseEffects)(desc, !!options.logMissingFeatures);
664
664
  (0, psdReader_1.skipBytes)(reader, left());
665
665
  }, function (writer, target, _, options) {
666
- var desc = serializeEffects(target.effects, !!options.logMissingFeatures, true);
666
+ var desc = (0, descriptor_1.serializeEffects)(target.effects, !!options.logMissingFeatures, true);
667
667
  (0, psdWriter_1.writeUint32)(writer, 0); // version
668
668
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
669
669
  });
@@ -684,10 +684,11 @@ addHandler('luni', hasKey('name'), function (reader, target, left) {
684
684
  addHandler('lnsr', hasKey('nameSource'), function (reader, target) { return target.nameSource = (0, psdReader_1.readSignature)(reader); }, function (writer, target) { return (0, psdWriter_1.writeSignature)(writer, target.nameSource); });
685
685
  addHandler('lyid', hasKey('id'), function (reader, target) { return target.id = (0, psdReader_1.readUint32)(reader); }, function (writer, target, _psd, options) {
686
686
  var id = target.id;
687
- while (options.layerIds.indexOf(id) !== -1)
687
+ while (options.layerIds.has(id))
688
688
  id += 100; // make sure we don't have duplicate layer ids
689
689
  (0, psdWriter_1.writeUint32)(writer, id);
690
- options.layerIds.push(id);
690
+ options.layerIds.add(id);
691
+ options.layerToId.set(target, id);
691
692
  });
692
693
  addHandler('lsct', hasKey('sectionDivider'), function (reader, target, left) {
693
694
  target.sectionDivider = { type: (0, psdReader_1.readUint32)(reader) };
@@ -764,7 +765,8 @@ addHandler('lclr', hasKey('layerColor'), function (reader, target) {
764
765
  (0, psdWriter_1.writeUint16)(writer, index === -1 ? 0 : index);
765
766
  (0, psdWriter_1.writeZeros)(writer, 6);
766
767
  });
767
- addHandler('shmd', hasKey('timestamp'), function (reader, target, left, _, options) {
768
+ addHandler('shmd', function (target) { return target.timestamp !== undefined || target.animationFrames !== undefined ||
769
+ target.animationFrameFlags !== undefined || target.timeline !== undefined; }, function (reader, target, left, _, options) {
768
770
  var count = (0, psdReader_1.readUint32)(reader);
769
771
  var _loop_1 = function (i) {
770
772
  (0, psdReader_1.checkSignature)(reader, '8BIM');
@@ -774,28 +776,62 @@ addHandler('shmd', hasKey('timestamp'), function (reader, target, left, _, optio
774
776
  (0, psdReader_1.readSection)(reader, 1, function (left) {
775
777
  if (key === 'cust') {
776
778
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
779
+ // console.log('cust', target.name, require('util').inspect(desc, false, 99, true));
777
780
  if (desc.layerTime !== undefined)
778
781
  target.timestamp = desc.layerTime;
779
782
  }
780
783
  else if (key === 'mlst') {
781
784
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
782
- options.logDevFeatures && console.log('mlst', desc);
783
- // options.logDevFeatures && console.log('mlst', require('util').inspect(desc, false, 99, true));
785
+ // console.log('mlst', target.name, require('util').inspect(desc, false, 99, true));
786
+ target.animationFrames = [];
787
+ for (var i_1 = 0; i_1 < desc.LaSt.length; i_1++) {
788
+ var f = desc.LaSt[i_1];
789
+ var frame = { frames: f.FrLs };
790
+ if (f.enab !== undefined)
791
+ frame.enable = f.enab;
792
+ if (f.Ofst)
793
+ frame.offset = (0, descriptor_1.horzVrtcToXY)(f.Ofst);
794
+ if (f.FXRf)
795
+ frame.referencePoint = (0, descriptor_1.horzVrtcToXY)(f.FXRf);
796
+ if (f.Lefx)
797
+ frame.effects = (0, descriptor_1.parseEffects)(f.Lefx, !!options.logMissingFeatures);
798
+ if (f.blendOptions && f.blendOptions.Opct)
799
+ frame.opacity = (0, descriptor_1.parsePercent)(f.blendOptions.Opct);
800
+ target.animationFrames.push(frame);
801
+ }
784
802
  }
785
803
  else if (key === 'mdyn') {
786
804
  // frame flags
787
- var unknown = (0, psdReader_1.readUint16)(reader);
805
+ (0, psdReader_1.readUint16)(reader); // unknown
788
806
  var propagate = (0, psdReader_1.readUint8)(reader);
789
807
  var flags = (0, psdReader_1.readUint8)(reader);
790
- var unifyLayerPosition = (flags & 1) !== 0;
791
- var unifyLayerStyle = (flags & 2) !== 0;
792
- var unifyLayerVisibility = (flags & 4) !== 0;
793
- options.logDevFeatures && console.log('mdyn', 'unknown:', unknown, 'propagate:', propagate, 'flags:', flags, { unifyLayerPosition: unifyLayerPosition, unifyLayerStyle: unifyLayerStyle, unifyLayerVisibility: unifyLayerVisibility });
794
- // const desc = readVersionAndDescriptor(reader) as FrameListDescriptor;
795
- // console.log('mdyn', require('util').inspect(desc, false, 99, true));
808
+ target.animationFrameFlags = {
809
+ propagateFrameOne: !propagate,
810
+ unifyLayerPosition: (flags & 1) !== 0,
811
+ unifyLayerStyle: (flags & 2) !== 0,
812
+ unifyLayerVisibility: (flags & 4) !== 0,
813
+ };
814
+ }
815
+ else if (key === 'tmln') {
816
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
817
+ var timeScope = desc.timeScope;
818
+ // console.log('tmln', target.name, target.id, require('util').inspect(desc, false, 99, true));
819
+ var timeline = {
820
+ start: timeScope.Strt,
821
+ duration: timeScope.duration,
822
+ inTime: timeScope.inTime,
823
+ outTime: timeScope.outTime,
824
+ autoScope: desc.autoScope,
825
+ audioLevel: desc.audioLevel,
826
+ };
827
+ if (desc.trackList) {
828
+ timeline.tracks = (0, descriptor_1.parseTrackList)(desc.trackList, !!options.logMissingFeatures);
829
+ }
830
+ target.timeline = timeline;
831
+ // console.log('tmln:result', target.name, target.id, require('util').inspect(timeline, false, 99, true));
796
832
  }
797
833
  else {
798
- options.logDevFeatures && console.log('Unhandled metadata', key);
834
+ options.logDevFeatures && console.log('Unhandled "shmd" section key', key);
799
835
  }
800
836
  (0, psdReader_1.skipBytes)(reader, left());
801
837
  });
@@ -804,16 +840,102 @@ addHandler('shmd', hasKey('timestamp'), function (reader, target, left, _, optio
804
840
  _loop_1(i);
805
841
  }
806
842
  (0, psdReader_1.skipBytes)(reader, left());
807
- }, function (writer, target) {
808
- var desc = {
809
- layerTime: target.timestamp,
810
- };
811
- (0, psdWriter_1.writeUint32)(writer, 1); // count
812
- (0, psdWriter_1.writeSignature)(writer, '8BIM');
813
- (0, psdWriter_1.writeSignature)(writer, 'cust');
814
- (0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
815
- (0, psdWriter_1.writeZeros)(writer, 3);
816
- (0, psdWriter_1.writeSection)(writer, 2, function () { return (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'metadata', desc); }, true);
843
+ }, function (writer, target, _, options) {
844
+ var animationFrames = target.animationFrames, animationFrameFlags = target.animationFrameFlags, timestamp = target.timestamp, timeline = target.timeline;
845
+ var count = 0;
846
+ if (animationFrames)
847
+ count++;
848
+ if (animationFrameFlags)
849
+ count++;
850
+ if (timeline)
851
+ count++;
852
+ if (timestamp !== undefined)
853
+ count++;
854
+ (0, psdWriter_1.writeUint32)(writer, count);
855
+ if (animationFrames) {
856
+ (0, psdWriter_1.writeSignature)(writer, '8BIM');
857
+ (0, psdWriter_1.writeSignature)(writer, 'mlst');
858
+ (0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
859
+ (0, psdWriter_1.writeZeros)(writer, 3);
860
+ (0, psdWriter_1.writeSection)(writer, 2, function () {
861
+ var _a;
862
+ var desc = {
863
+ LaID: (_a = target.id) !== null && _a !== void 0 ? _a : 0,
864
+ LaSt: [],
865
+ };
866
+ for (var i = 0; i < animationFrames.length; i++) {
867
+ var f = animationFrames[i];
868
+ var frame = {};
869
+ if (f.enable !== undefined)
870
+ frame.enab = f.enable;
871
+ frame.FrLs = f.frames;
872
+ if (f.offset)
873
+ frame.Ofst = (0, descriptor_1.xyToHorzVrtc)(f.offset);
874
+ if (f.referencePoint)
875
+ frame.FXRf = (0, descriptor_1.xyToHorzVrtc)(f.referencePoint);
876
+ if (f.effects)
877
+ frame.Lefx = (0, descriptor_1.serializeEffects)(f.effects, false, false);
878
+ if (f.opacity !== undefined)
879
+ frame.blendOptions = { Opct: (0, descriptor_1.unitsPercent)(f.opacity) };
880
+ desc.LaSt.push(frame);
881
+ }
882
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
883
+ }, true);
884
+ }
885
+ if (animationFrameFlags) {
886
+ (0, psdWriter_1.writeSignature)(writer, '8BIM');
887
+ (0, psdWriter_1.writeSignature)(writer, 'mdyn');
888
+ (0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
889
+ (0, psdWriter_1.writeZeros)(writer, 3);
890
+ (0, psdWriter_1.writeSection)(writer, 2, function () {
891
+ (0, psdWriter_1.writeUint16)(writer, 0); // unknown
892
+ (0, psdWriter_1.writeUint8)(writer, animationFrameFlags.propagateFrameOne ? 0x0 : 0xf);
893
+ (0, psdWriter_1.writeUint8)(writer, (animationFrameFlags.unifyLayerPosition ? 1 : 0) |
894
+ (animationFrameFlags.unifyLayerStyle ? 2 : 0) |
895
+ (animationFrameFlags.unifyLayerVisibility ? 4 : 0));
896
+ });
897
+ }
898
+ if (timeline) {
899
+ (0, psdWriter_1.writeSignature)(writer, '8BIM');
900
+ (0, psdWriter_1.writeSignature)(writer, 'tmln');
901
+ (0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
902
+ (0, psdWriter_1.writeZeros)(writer, 3);
903
+ (0, psdWriter_1.writeSection)(writer, 2, function () {
904
+ var desc = {
905
+ Vrsn: 1,
906
+ timeScope: {
907
+ Vrsn: 1,
908
+ Strt: timeline.start,
909
+ duration: timeline.duration,
910
+ inTime: timeline.inTime,
911
+ outTime: timeline.outTime,
912
+ },
913
+ autoScope: timeline.autoScope,
914
+ audioLevel: timeline.audioLevel,
915
+ };
916
+ if (timeline.tracks) {
917
+ desc.trackList = (0, descriptor_1.serializeTrackList)(timeline.tracks);
918
+ }
919
+ var id = options.layerToId.get(target) || target.id || 0;
920
+ if (!id)
921
+ throw new Error('You need to provide layer.id value whan writing document with animations');
922
+ desc.LyrI = id;
923
+ // console.log('WRITE:tmln', target.name, target.id, require('util').inspect(desc, false, 99, true));
924
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc, 'anim');
925
+ }, true);
926
+ }
927
+ if (timestamp !== undefined) {
928
+ (0, psdWriter_1.writeSignature)(writer, '8BIM');
929
+ (0, psdWriter_1.writeSignature)(writer, 'cust');
930
+ (0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
931
+ (0, psdWriter_1.writeZeros)(writer, 3);
932
+ (0, psdWriter_1.writeSection)(writer, 2, function () {
933
+ var desc = {
934
+ layerTime: timestamp,
935
+ };
936
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'metadata', desc);
937
+ }, true);
938
+ }
817
939
  });
818
940
  addHandler('vstk', hasKey('vectorStroke'), function (reader, target, left) {
819
941
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
@@ -832,7 +954,7 @@ addHandler('vstk', hasKey('vectorStroke'), function (reader, target, left) {
832
954
  lineDashSet: desc.strokeStyleLineDashSet.map(descriptor_1.parseUnits),
833
955
  blendMode: descriptor_1.BlnM.decode(desc.strokeStyleBlendMode),
834
956
  opacity: (0, descriptor_1.parsePercent)(desc.strokeStyleOpacity),
835
- content: parseVectorContent(desc.strokeStyleContent),
957
+ content: (0, descriptor_1.parseVectorContent)(desc.strokeStyleContent),
836
958
  resolution: desc.strokeStyleResolution,
837
959
  };
838
960
  (0, psdReader_1.skipBytes)(reader, left());
@@ -854,7 +976,7 @@ addHandler('vstk', hasKey('vectorStroke'), function (reader, target, left) {
854
976
  strokeStyleLineDashSet: stroke.lineDashSet || [],
855
977
  strokeStyleBlendMode: descriptor_1.BlnM.encode(stroke.blendMode),
856
978
  strokeStyleOpacity: (0, descriptor_1.unitsPercent)((_b = stroke.opacity) !== null && _b !== void 0 ? _b : 1),
857
- strokeStyleContent: serializeVectorContent(stroke.content || { type: 'color', color: { r: 0, g: 0, b: 0 } }).descriptor,
979
+ strokeStyleContent: (0, descriptor_1.serializeVectorContent)(stroke.content || { type: 'color', color: { r: 0, g: 0, b: 0 } }).descriptor,
858
980
  strokeStyleResolution: (_c = stroke.resolution) !== null && _c !== void 0 ? _c : 72,
859
981
  };
860
982
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'strokeStyle', descriptor);
@@ -867,7 +989,7 @@ hasKey('artboard'), function (reader, target, left) {
867
989
  rect: { top: rect['Top '], left: rect.Left, bottom: rect.Btom, right: rect.Rght },
868
990
  guideIndices: desc.guideIndeces,
869
991
  presetName: desc.artboardPresetName,
870
- color: parseColor(desc['Clr ']),
992
+ color: (0, descriptor_1.parseColor)(desc['Clr ']),
871
993
  backgroundType: desc.artboardBackgroundType,
872
994
  };
873
995
  (0, psdReader_1.skipBytes)(reader, left());
@@ -879,7 +1001,7 @@ hasKey('artboard'), function (reader, target, left) {
879
1001
  artboardRect: { 'Top ': rect.top, Left: rect.left, Btom: rect.bottom, Rght: rect.right },
880
1002
  guideIndeces: artboard.guideIndices || [],
881
1003
  artboardPresetName: artboard.presetName || '',
882
- 'Clr ': serializeColor(artboard.color),
1004
+ 'Clr ': (0, descriptor_1.serializeColor)(artboard.color),
883
1005
  artboardBackgroundType: (_a = artboard.backgroundType) !== null && _a !== void 0 ? _a : 1,
884
1006
  };
885
1007
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'artboard', desc);
@@ -989,8 +1111,8 @@ addHandler('PlLd', hasKey('placedLayer'), function (reader, target, left) {
989
1111
  if ((0, psdReader_1.readInt32)(reader) !== 3)
990
1112
  throw new Error("Invalid PlLd version");
991
1113
  var id = (0, psdReader_1.readPascalString)(reader, 1);
992
- (0, psdReader_1.readInt32)(reader); // pageNumber
993
- (0, psdReader_1.readInt32)(reader); // totalPages, TODO: check how this works ?
1114
+ var pageNumber = (0, psdReader_1.readInt32)(reader);
1115
+ var totalPages = (0, psdReader_1.readInt32)(reader); // TODO: check how this works ?
994
1116
  (0, psdReader_1.readInt32)(reader); // anitAliasPolicy 16
995
1117
  var placedLayerType = (0, psdReader_1.readInt32)(reader); // 0 = unknown, 1 = vector, 2 = raster, 3 = image stack
996
1118
  if (!placedLayerTypes[placedLayerType])
@@ -1005,8 +1127,8 @@ addHandler('PlLd', hasKey('placedLayer'), function (reader, target, left) {
1005
1127
  target.placedLayer = target.placedLayer || {
1006
1128
  id: id,
1007
1129
  type: placedLayerTypes[placedLayerType],
1008
- // pageNumber,
1009
- // totalPages,
1130
+ pageNumber: pageNumber,
1131
+ totalPages: totalPages,
1010
1132
  transform: transform,
1011
1133
  warp: parseWarp(warp),
1012
1134
  };
@@ -1044,11 +1166,11 @@ addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
1044
1166
  id: desc.Idnt,
1045
1167
  placed: desc.placed,
1046
1168
  type: placedLayerTypes[desc.Type],
1047
- // pageNumber: info.PgNm,
1048
- // totalPages: info.totalPages,
1049
- // frameStep: info.frameStep,
1050
- // duration: info.duration,
1051
- // frameCount: info.frameCount,
1169
+ pageNumber: desc.PgNm,
1170
+ totalPages: desc.totalPages,
1171
+ frameStep: desc.frameStep,
1172
+ duration: desc.duration,
1173
+ frameCount: desc.frameCount,
1052
1174
  transform: desc.Trnf,
1053
1175
  width: desc['Sz '].Wdth,
1054
1176
  height: desc['Sz '].Hght,
@@ -1070,13 +1192,7 @@ addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
1070
1192
  (0, psdWriter_1.writeSignature)(writer, 'soLD');
1071
1193
  (0, psdWriter_1.writeInt32)(writer, 4); // version
1072
1194
  var placed = target.placedLayer;
1073
- var desc = __assign(__assign({ Idnt: placed.id, placed: (_a = placed.placed) !== null && _a !== void 0 ? _a : placed.id, PgNm: 1, totalPages: 1 }, (placed.crop ? { Crop: placed.crop } : {})), { frameStep: {
1074
- numerator: 0,
1075
- denominator: 600
1076
- }, duration: {
1077
- numerator: 0,
1078
- denominator: 600
1079
- }, frameCount: 1, Annt: 16, Type: placedLayerTypes.indexOf(placed.type), Trnf: placed.transform, nonAffineTransform: (_b = placed.nonAffineTransform) !== null && _b !== void 0 ? _b : placed.transform, quiltWarp: {}, warp: encodeWarp(placed.warp || {}), 'Sz ': {
1195
+ var desc = __assign(__assign({ Idnt: placed.id, placed: (_a = placed.placed) !== null && _a !== void 0 ? _a : placed.id, PgNm: placed.pageNumber || 1, totalPages: placed.totalPages || 1 }, (placed.crop ? { Crop: placed.crop } : {})), { frameStep: placed.frameStep || { numerator: 0, denominator: 600 }, duration: placed.duration || { numerator: 0, denominator: 600 }, frameCount: placed.frameCount || 0, Annt: 16, Type: placedLayerTypes.indexOf(placed.type), Trnf: placed.transform, nonAffineTransform: (_b = placed.nonAffineTransform) !== null && _b !== void 0 ? _b : placed.transform, quiltWarp: {}, warp: encodeWarp(placed.warp || {}), 'Sz ': {
1080
1196
  Wdth: placed.width || 0,
1081
1197
  Hght: placed.height || 0, // TODO: find size ?
1082
1198
  }, Rslt: placed.resolution ? (0, descriptor_1.unitsValue)(placed.resolution, 'resolution') : { units: 'Density', value: 72 } });
@@ -1647,7 +1763,7 @@ addHandler('blwh', adjustmentType('black & white'), function (reader, target, le
1647
1763
  presetFileName: desc.blackAndWhitePresetFileName,
1648
1764
  };
1649
1765
  if (desc.tintColor !== undefined)
1650
- target.adjustment.tintColor = parseColor(desc.tintColor);
1766
+ target.adjustment.tintColor = (0, descriptor_1.parseColor)(desc.tintColor);
1651
1767
  (0, psdReader_1.skipBytes)(reader, left());
1652
1768
  }, function (writer, target) {
1653
1769
  var info = target.adjustment;
@@ -1659,7 +1775,7 @@ addHandler('blwh', adjustmentType('black & white'), function (reader, target, le
1659
1775
  'Bl ': info.blues || 0,
1660
1776
  Mgnt: info.magentas || 0,
1661
1777
  useTint: !!info.useTint,
1662
- tintColor: serializeColor(info.tintColor),
1778
+ tintColor: (0, descriptor_1.serializeColor)(info.tintColor),
1663
1779
  bwPresetKind: info.presetKind || 0,
1664
1780
  blackAndWhitePresetFileName: info.presetFileName || '',
1665
1781
  };
@@ -2093,7 +2209,7 @@ target) { return target.artboards !== undefined; }, function (reader, target, le
2093
2209
  autoNestEnabled: desc.autoNestEnabled,
2094
2210
  autoPositionEnabled: desc.autoPositionEnabled,
2095
2211
  shrinkwrapOnSaveEnabled: desc.shrinkwrapOnSaveEnabled,
2096
- docDefaultNewArtboardBackgroundColor: parseColor(desc.docDefaultNewArtboardBackgroundColor),
2212
+ docDefaultNewArtboardBackgroundColor: (0, descriptor_1.parseColor)(desc.docDefaultNewArtboardBackgroundColor),
2097
2213
  docDefaultNewArtboardBackgroundType: desc.docDefaultNewArtboardBackgroundType,
2098
2214
  };
2099
2215
  (0, psdReader_1.skipBytes)(reader, left());
@@ -2108,155 +2224,11 @@ target) { return target.artboards !== undefined; }, function (reader, target, le
2108
2224
  autoNestEnabled: (_b = artb.autoNestEnabled) !== null && _b !== void 0 ? _b : true,
2109
2225
  autoPositionEnabled: (_c = artb.autoPositionEnabled) !== null && _c !== void 0 ? _c : true,
2110
2226
  shrinkwrapOnSaveEnabled: (_d = artb.shrinkwrapOnSaveEnabled) !== null && _d !== void 0 ? _d : true,
2111
- docDefaultNewArtboardBackgroundColor: serializeColor(artb.docDefaultNewArtboardBackgroundColor),
2227
+ docDefaultNewArtboardBackgroundColor: (0, descriptor_1.serializeColor)(artb.docDefaultNewArtboardBackgroundColor),
2112
2228
  docDefaultNewArtboardBackgroundType: (_e = artb.docDefaultNewArtboardBackgroundType) !== null && _e !== void 0 ? _e : 1,
2113
2229
  };
2114
2230
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc, 'artd');
2115
2231
  });
2116
- function parseFxObject(fx) {
2117
- var stroke = {
2118
- enabled: !!fx.enab,
2119
- position: descriptor_1.FStl.decode(fx.Styl),
2120
- fillType: descriptor_1.FrFl.decode(fx.PntT),
2121
- blendMode: descriptor_1.BlnM.decode(fx['Md ']),
2122
- opacity: (0, descriptor_1.parsePercent)(fx.Opct),
2123
- size: (0, descriptor_1.parseUnits)(fx['Sz ']),
2124
- };
2125
- if (fx.present !== undefined)
2126
- stroke.present = fx.present;
2127
- if (fx.showInDialog !== undefined)
2128
- stroke.showInDialog = fx.showInDialog;
2129
- if (fx.overprint !== undefined)
2130
- stroke.overprint = fx.overprint;
2131
- if (fx['Clr '])
2132
- stroke.color = parseColor(fx['Clr ']);
2133
- if (fx.Grad)
2134
- stroke.gradient = parseGradientContent(fx);
2135
- if (fx.Ptrn)
2136
- stroke.pattern = parsePatternContent(fx);
2137
- return stroke;
2138
- }
2139
- function serializeFxObject(stroke) {
2140
- var FrFX = {};
2141
- FrFX.enab = !!stroke.enabled;
2142
- if (stroke.present !== undefined)
2143
- FrFX.present = !!stroke.present;
2144
- if (stroke.showInDialog !== undefined)
2145
- FrFX.showInDialog = !!stroke.showInDialog;
2146
- FrFX.Styl = descriptor_1.FStl.encode(stroke.position);
2147
- FrFX.PntT = descriptor_1.FrFl.encode(stroke.fillType);
2148
- FrFX['Md '] = descriptor_1.BlnM.encode(stroke.blendMode);
2149
- FrFX.Opct = (0, descriptor_1.unitsPercent)(stroke.opacity);
2150
- FrFX['Sz '] = (0, descriptor_1.unitsValue)(stroke.size, 'size');
2151
- if (stroke.color)
2152
- FrFX['Clr '] = serializeColor(stroke.color);
2153
- if (stroke.gradient)
2154
- FrFX = __assign(__assign({}, FrFX), serializeGradientContent(stroke.gradient));
2155
- if (stroke.pattern)
2156
- FrFX = __assign(__assign({}, FrFX), serializePatternContent(stroke.pattern));
2157
- if (stroke.overprint !== undefined)
2158
- FrFX.overprint = !!stroke.overprint;
2159
- return FrFX;
2160
- }
2161
- function parseEffects(info, log) {
2162
- var effects = {};
2163
- if (!info.masterFXSwitch)
2164
- effects.disabled = true;
2165
- if (info['Scl '])
2166
- effects.scale = (0, descriptor_1.parsePercent)(info['Scl ']);
2167
- if (info.DrSh)
2168
- effects.dropShadow = [parseEffectObject(info.DrSh, log)];
2169
- if (info.dropShadowMulti)
2170
- effects.dropShadow = info.dropShadowMulti.map(function (i) { return parseEffectObject(i, log); });
2171
- if (info.IrSh)
2172
- effects.innerShadow = [parseEffectObject(info.IrSh, log)];
2173
- if (info.innerShadowMulti)
2174
- effects.innerShadow = info.innerShadowMulti.map(function (i) { return parseEffectObject(i, log); });
2175
- if (info.OrGl)
2176
- effects.outerGlow = parseEffectObject(info.OrGl, log);
2177
- if (info.IrGl)
2178
- effects.innerGlow = parseEffectObject(info.IrGl, log);
2179
- if (info.ebbl)
2180
- effects.bevel = parseEffectObject(info.ebbl, log);
2181
- if (info.SoFi)
2182
- effects.solidFill = [parseEffectObject(info.SoFi, log)];
2183
- if (info.solidFillMulti)
2184
- effects.solidFill = info.solidFillMulti.map(function (i) { return parseEffectObject(i, log); });
2185
- if (info.patternFill)
2186
- effects.patternOverlay = parseEffectObject(info.patternFill, log);
2187
- if (info.GrFl)
2188
- effects.gradientOverlay = [parseEffectObject(info.GrFl, log)];
2189
- if (info.gradientFillMulti)
2190
- effects.gradientOverlay = info.gradientFillMulti.map(function (i) { return parseEffectObject(i, log); });
2191
- if (info.ChFX)
2192
- effects.satin = parseEffectObject(info.ChFX, log);
2193
- if (info.FrFX)
2194
- effects.stroke = [parseFxObject(info.FrFX)];
2195
- if (info.frameFXMulti)
2196
- effects.stroke = info.frameFXMulti.map(function (i) { return parseFxObject(i); });
2197
- return effects;
2198
- }
2199
- function serializeEffects(e, log, multi) {
2200
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
2201
- var info = multi ? {
2202
- 'Scl ': (0, descriptor_1.unitsPercent)((_a = e.scale) !== null && _a !== void 0 ? _a : 1),
2203
- masterFXSwitch: !e.disabled,
2204
- } : {
2205
- masterFXSwitch: !e.disabled,
2206
- 'Scl ': (0, descriptor_1.unitsPercent)((_b = e.scale) !== null && _b !== void 0 ? _b : 1),
2207
- };
2208
- var arrayKeys = ['dropShadow', 'innerShadow', 'solidFill', 'gradientOverlay', 'stroke'];
2209
- for (var _i = 0, arrayKeys_1 = arrayKeys; _i < arrayKeys_1.length; _i++) {
2210
- var key = arrayKeys_1[_i];
2211
- if (e[key] && !Array.isArray(e[key]))
2212
- throw new Error("".concat(key, " should be an array"));
2213
- }
2214
- if (((_c = e.dropShadow) === null || _c === void 0 ? void 0 : _c[0]) && !multi)
2215
- info.DrSh = serializeEffectObject(e.dropShadow[0], 'dropShadow', log);
2216
- if (((_d = e.dropShadow) === null || _d === void 0 ? void 0 : _d[0]) && multi)
2217
- info.dropShadowMulti = e.dropShadow.map(function (i) { return serializeEffectObject(i, 'dropShadow', log); });
2218
- if (((_e = e.innerShadow) === null || _e === void 0 ? void 0 : _e[0]) && !multi)
2219
- info.IrSh = serializeEffectObject(e.innerShadow[0], 'innerShadow', log);
2220
- if (((_f = e.innerShadow) === null || _f === void 0 ? void 0 : _f[0]) && multi)
2221
- info.innerShadowMulti = e.innerShadow.map(function (i) { return serializeEffectObject(i, 'innerShadow', log); });
2222
- if (e.outerGlow)
2223
- info.OrGl = serializeEffectObject(e.outerGlow, 'outerGlow', log);
2224
- if (((_g = e.solidFill) === null || _g === void 0 ? void 0 : _g[0]) && multi)
2225
- info.solidFillMulti = e.solidFill.map(function (i) { return serializeEffectObject(i, 'solidFill', log); });
2226
- if (((_h = e.gradientOverlay) === null || _h === void 0 ? void 0 : _h[0]) && multi)
2227
- info.gradientFillMulti = e.gradientOverlay.map(function (i) { return serializeEffectObject(i, 'gradientOverlay', log); });
2228
- if (((_j = e.stroke) === null || _j === void 0 ? void 0 : _j[0]) && multi)
2229
- info.frameFXMulti = e.stroke.map(function (i) { return serializeFxObject(i); });
2230
- if (e.innerGlow)
2231
- info.IrGl = serializeEffectObject(e.innerGlow, 'innerGlow', log);
2232
- if (e.bevel)
2233
- info.ebbl = serializeEffectObject(e.bevel, 'bevel', log);
2234
- if (((_k = e.solidFill) === null || _k === void 0 ? void 0 : _k[0]) && !multi)
2235
- info.SoFi = serializeEffectObject(e.solidFill[0], 'solidFill', log);
2236
- if (e.patternOverlay)
2237
- info.patternFill = serializeEffectObject(e.patternOverlay, 'patternOverlay', log);
2238
- if (((_l = e.gradientOverlay) === null || _l === void 0 ? void 0 : _l[0]) && !multi)
2239
- info.GrFl = serializeEffectObject(e.gradientOverlay[0], 'gradientOverlay', log);
2240
- if (e.satin)
2241
- info.ChFX = serializeEffectObject(e.satin, 'satin', log);
2242
- if (((_m = e.stroke) === null || _m === void 0 ? void 0 : _m[0]) && !multi)
2243
- info.FrFX = serializeFxObject((_o = e.stroke) === null || _o === void 0 ? void 0 : _o[0]);
2244
- if (multi) {
2245
- info.numModifyingFX = 0;
2246
- for (var _p = 0, _q = Object.keys(e); _p < _q.length; _p++) {
2247
- var key = _q[_p];
2248
- var value = e[key];
2249
- if (Array.isArray(value)) {
2250
- for (var _r = 0, value_1 = value; _r < value_1.length; _r++) {
2251
- var effect = value_1[_r];
2252
- if (effect.enabled)
2253
- info.numModifyingFX++;
2254
- }
2255
- }
2256
- }
2257
- }
2258
- return info;
2259
- }
2260
2232
  function hasMultiEffects(effects) {
2261
2233
  return Object.keys(effects).map(function (key) { return effects[key]; }).some(function (v) { return Array.isArray(v) && v.length > 1; });
2262
2234
  }
@@ -2269,10 +2241,10 @@ addHandler('lfx2', function (target) { return target.effects !== undefined && !h
2269
2241
  // console.log(require('util').inspect(desc, false, 99, true));
2270
2242
  // TODO: don't discard if we got it from lmfx
2271
2243
  // discard if read in 'lrFX' section
2272
- target.effects = parseEffects(desc, !!options.logMissingFeatures);
2244
+ target.effects = (0, descriptor_1.parseEffects)(desc, !!options.logMissingFeatures);
2273
2245
  (0, psdReader_1.skipBytes)(reader, left());
2274
2246
  }, function (writer, target, _, options) {
2275
- var desc = serializeEffects(target.effects, !!options.logMissingFeatures, false);
2247
+ var desc = (0, descriptor_1.serializeEffects)(target.effects, !!options.logMissingFeatures, false);
2276
2248
  // console.log(require('util').inspect(desc, false, 99, true));
2277
2249
  (0, psdWriter_1.writeUint32)(writer, 0); // version
2278
2250
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
@@ -2324,6 +2296,17 @@ addHandler('iOpa', hasKey('fillOpacity'), function (reader, target) {
2324
2296
  (0, psdWriter_1.writeUint8)(writer, target.fillOpacity * 0xff);
2325
2297
  (0, psdWriter_1.writeZeros)(writer, 3);
2326
2298
  });
2299
+ addHandler('brst', hasKey('channelBlendingRestrictions'), function (reader, target, left) {
2300
+ target.channelBlendingRestrictions = [];
2301
+ while (left() > 4) {
2302
+ target.channelBlendingRestrictions.push((0, psdReader_1.readInt32)(reader));
2303
+ }
2304
+ }, function (writer, target) {
2305
+ for (var _i = 0, _a = target.channelBlendingRestrictions; _i < _a.length; _i++) {
2306
+ var channel = _a[_i];
2307
+ (0, psdWriter_1.writeInt32)(writer, channel);
2308
+ }
2309
+ });
2327
2310
  addHandler('tsly', hasKey('transparencyShapesLayer'), function (reader, target) {
2328
2311
  target.transparencyShapesLayer = !!(0, psdReader_1.readUint8)(reader);
2329
2312
  (0, psdReader_1.skipBytes)(reader, 3);
@@ -2331,481 +2314,1236 @@ addHandler('tsly', hasKey('transparencyShapesLayer'), function (reader, target)
2331
2314
  (0, psdWriter_1.writeUint8)(writer, target.transparencyShapesLayer ? 1 : 0);
2332
2315
  (0, psdWriter_1.writeZeros)(writer, 3);
2333
2316
  });
2334
- // descriptor helpers
2335
- function parseGradient(grad) {
2336
- if (grad.GrdF === 'GrdF.CstS') {
2337
- var samples_1 = grad.Intr || 4096;
2338
- return {
2339
- type: 'solid',
2340
- name: grad['Nm '],
2341
- smoothness: grad.Intr / 4096,
2342
- colorStops: grad.Clrs.map(function (s) { return ({
2343
- color: parseColor(s['Clr ']),
2344
- location: s.Lctn / samples_1,
2345
- midpoint: s.Mdpn / 100,
2346
- }); }),
2347
- opacityStops: grad.Trns.map(function (s) { return ({
2348
- opacity: (0, descriptor_1.parsePercent)(s.Opct),
2349
- location: s.Lctn / samples_1,
2350
- midpoint: s.Mdpn / 100,
2351
- }); }),
2352
- };
2353
- }
2354
- else {
2355
- return {
2356
- type: 'noise',
2357
- name: grad['Nm '],
2358
- roughness: grad.Smth / 4096,
2359
- colorModel: descriptor_1.ClrS.decode(grad.ClrS),
2360
- randomSeed: grad.RndS,
2361
- restrictColors: !!grad.VctC,
2362
- addTransparency: !!grad.ShTr,
2363
- min: grad['Mnm '].map(function (x) { return x / 100; }),
2364
- max: grad['Mxm '].map(function (x) { return x / 100; }),
2365
- };
2317
+
2318
+
2319
+ },{"./descriptor":4,"./effectsHelpers":5,"./engineData":6,"./helpers":7,"./psdReader":11,"./psdWriter":12,"./text":13,"base64-js":15}],3:[function(require,module,exports){
2320
+ "use strict";
2321
+ var __assign = (this && this.__assign) || function () {
2322
+ __assign = Object.assign || function(t) {
2323
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
2324
+ s = arguments[i];
2325
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
2326
+ t[p] = s[p];
2327
+ }
2328
+ return t;
2329
+ };
2330
+ return __assign.apply(this, arguments);
2331
+ };
2332
+ Object.defineProperty(exports, "__esModule", { value: true });
2333
+ exports.readCsh = void 0;
2334
+ var additionalInfo_1 = require("./additionalInfo");
2335
+ var psdReader_1 = require("./psdReader");
2336
+ function readCsh(buffer) {
2337
+ var reader = (0, psdReader_1.createReader)(buffer.buffer, buffer.byteOffset, buffer.byteLength);
2338
+ var csh = { shapes: [] };
2339
+ (0, psdReader_1.checkSignature)(reader, 'cush');
2340
+ if ((0, psdReader_1.readUint32)(reader) !== 2)
2341
+ throw new Error('Invalid version');
2342
+ var count = (0, psdReader_1.readUint32)(reader);
2343
+ for (var i = 0; i < count; i++) {
2344
+ var name_1 = (0, psdReader_1.readUnicodeString)(reader);
2345
+ while (reader.offset % 4)
2346
+ reader.offset++; // pad to 4byte bounds
2347
+ if ((0, psdReader_1.readUint32)(reader) !== 1)
2348
+ throw new Error('Invalid shape version');
2349
+ var size = (0, psdReader_1.readUint32)(reader);
2350
+ var end = reader.offset + size;
2351
+ var id = (0, psdReader_1.readPascalString)(reader, 1);
2352
+ // this might not be correct ???
2353
+ var y1 = (0, psdReader_1.readUint32)(reader);
2354
+ var x1 = (0, psdReader_1.readUint32)(reader);
2355
+ var y2 = (0, psdReader_1.readUint32)(reader);
2356
+ var x2 = (0, psdReader_1.readUint32)(reader);
2357
+ var width = x2 - x1;
2358
+ var height = y2 - y1;
2359
+ var mask = { paths: [] };
2360
+ (0, additionalInfo_1.readVectorMask)(reader, mask, width, height, end - reader.offset);
2361
+ csh.shapes.push(__assign({ name: name_1, id: id, width: width, height: height }, mask));
2362
+ reader.offset = end;
2366
2363
  }
2364
+ return csh;
2367
2365
  }
2368
- function serializeGradient(grad) {
2369
- var _a, _b;
2370
- if (grad.type === 'solid') {
2371
- var samples_2 = Math.round(((_a = grad.smoothness) !== null && _a !== void 0 ? _a : 1) * 4096);
2372
- return {
2373
- 'Nm ': grad.name || '',
2374
- GrdF: 'GrdF.CstS',
2375
- Intr: samples_2,
2376
- Clrs: grad.colorStops.map(function (s) {
2377
- var _a;
2378
- return ({
2379
- 'Clr ': serializeColor(s.color),
2380
- Type: 'Clry.UsrS',
2381
- Lctn: Math.round(s.location * samples_2),
2382
- Mdpn: Math.round(((_a = s.midpoint) !== null && _a !== void 0 ? _a : 0.5) * 100),
2383
- });
2384
- }),
2385
- Trns: grad.opacityStops.map(function (s) {
2386
- var _a;
2387
- return ({
2388
- Opct: (0, descriptor_1.unitsPercent)(s.opacity),
2389
- Lctn: Math.round(s.location * samples_2),
2390
- Mdpn: Math.round(((_a = s.midpoint) !== null && _a !== void 0 ? _a : 0.5) * 100),
2391
- });
2392
- }),
2393
- };
2394
- }
2395
- else {
2396
- return {
2397
- GrdF: 'GrdF.ClNs',
2398
- 'Nm ': grad.name || '',
2399
- ShTr: !!grad.addTransparency,
2400
- VctC: !!grad.restrictColors,
2401
- ClrS: descriptor_1.ClrS.encode(grad.colorModel),
2402
- RndS: grad.randomSeed || 0,
2403
- Smth: Math.round(((_b = grad.roughness) !== null && _b !== void 0 ? _b : 1) * 4096),
2404
- 'Mnm ': (grad.min || [0, 0, 0, 0]).map(function (x) { return x * 100; }),
2405
- 'Mxm ': (grad.max || [1, 1, 1, 1]).map(function (x) { return x * 100; }),
2406
- };
2407
- }
2366
+ exports.readCsh = readCsh;
2367
+
2368
+
2369
+ },{"./additionalInfo":2,"./psdReader":11}],4:[function(require,module,exports){
2370
+ "use strict";
2371
+ var __assign = (this && this.__assign) || function () {
2372
+ __assign = Object.assign || function(t) {
2373
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
2374
+ s = arguments[i];
2375
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
2376
+ t[p] = s[p];
2377
+ }
2378
+ return t;
2379
+ };
2380
+ return __assign.apply(this, arguments);
2381
+ };
2382
+ Object.defineProperty(exports, "__esModule", { value: true });
2383
+ exports.strokeStyleLineAlignment = exports.strokeStyleLineJoinType = exports.strokeStyleLineCapType = exports.FrFl = exports.FStl = exports.ClrS = exports.gradientInterpolationMethodType = exports.stdTrackID = exports.animInterpStyleEnum = exports.GrdT = exports.IGSr = exports.BETE = exports.BESs = exports.bvlT = exports.BESl = exports.BlnM = exports.warpStyle = exports.Annt = exports.Ornt = exports.textGridding = exports.unitsValue = exports.unitsPercent = exports.unitsAngle = exports.parseUnitsToNumber = exports.parseUnitsOrNumber = exports.parseUnits = exports.parsePercentOrAngle = exports.parsePercent = exports.parseAngle = exports.serializeColor = exports.parseColor = exports.serializeVectorContent = exports.parseVectorContent = exports.serializeTrackList = exports.parseTrackList = exports.parseEffects = exports.serializeEffects = exports.xyToHorzVrtc = exports.horzVrtcToXY = exports.writeVersionAndDescriptor = exports.readVersionAndDescriptor = exports.writeDescriptorStructure = exports.readDescriptorStructure = exports.readAsciiStringOrClassId = exports.setLogErrors = void 0;
2384
+ var helpers_1 = require("./helpers");
2385
+ var psdReader_1 = require("./psdReader");
2386
+ var psdWriter_1 = require("./psdWriter");
2387
+ function revMap(map) {
2388
+ var result = {};
2389
+ Object.keys(map).forEach(function (key) { return result[map[key]] = key; });
2390
+ return result;
2408
2391
  }
2409
- function parseGradientContent(descriptor) {
2410
- var result = parseGradient(descriptor.Grad);
2411
- result.style = descriptor_1.GrdT.decode(descriptor.Type);
2412
- if (descriptor.Dthr !== undefined)
2413
- result.dither = descriptor.Dthr;
2414
- if (descriptor.Rvrs !== undefined)
2415
- result.reverse = descriptor.Rvrs;
2416
- if (descriptor.Angl !== undefined)
2417
- result.angle = (0, descriptor_1.parseAngle)(descriptor.Angl);
2418
- if (descriptor['Scl '] !== undefined)
2419
- result.scale = (0, descriptor_1.parsePercent)(descriptor['Scl ']);
2420
- if (descriptor.Algn !== undefined)
2421
- result.align = descriptor.Algn;
2422
- if (descriptor.Ofst !== undefined) {
2423
- result.offset = {
2424
- x: (0, descriptor_1.parsePercent)(descriptor.Ofst.Hrzn),
2425
- y: (0, descriptor_1.parsePercent)(descriptor.Ofst.Vrtc)
2426
- };
2392
+ var unitsMap = {
2393
+ '#Ang': 'Angle',
2394
+ '#Rsl': 'Density',
2395
+ '#Rlt': 'Distance',
2396
+ '#Nne': 'None',
2397
+ '#Prc': 'Percent',
2398
+ '#Pxl': 'Pixels',
2399
+ '#Mlm': 'Millimeters',
2400
+ '#Pnt': 'Points',
2401
+ 'RrPi': 'Picas',
2402
+ 'RrIn': 'Inches',
2403
+ 'RrCm': 'Centimeters',
2404
+ };
2405
+ var unitsMapRev = revMap(unitsMap);
2406
+ var logErrors = false;
2407
+ function setLogErrors(value) {
2408
+ logErrors = value;
2409
+ }
2410
+ exports.setLogErrors = setLogErrors;
2411
+ function makeType(name, classID) {
2412
+ return { name: name, classID: classID };
2413
+ }
2414
+ var nullType = makeType('', 'null');
2415
+ var fieldToExtType = {
2416
+ strokeStyleContent: makeType('', 'solidColorLayer'),
2417
+ // printProofSetup: makeType('校样设置', 'proofSetup'), // TESTING
2418
+ printProofSetup: makeType('Proof Setup', 'proofSetup'),
2419
+ patternFill: makeType('', 'patternFill'),
2420
+ Grad: makeType('Gradient', 'Grdn'),
2421
+ ebbl: makeType('', 'ebbl'),
2422
+ SoFi: makeType('', 'SoFi'),
2423
+ GrFl: makeType('', 'GrFl'),
2424
+ sdwC: makeType('', 'RGBC'),
2425
+ hglC: makeType('', 'RGBC'),
2426
+ 'Clr ': makeType('', 'RGBC'),
2427
+ 'tintColor': makeType('', 'RGBC'),
2428
+ Ofst: makeType('', 'Pnt '),
2429
+ ChFX: makeType('', 'ChFX'),
2430
+ MpgS: makeType('', 'ShpC'),
2431
+ DrSh: makeType('', 'DrSh'),
2432
+ IrSh: makeType('', 'IrSh'),
2433
+ OrGl: makeType('', 'OrGl'),
2434
+ IrGl: makeType('', 'IrGl'),
2435
+ TrnS: makeType('', 'ShpC'),
2436
+ Ptrn: makeType('', 'Ptrn'),
2437
+ FrFX: makeType('', 'FrFX'),
2438
+ phase: makeType('', 'Pnt '),
2439
+ frameStep: nullType,
2440
+ duration: nullType,
2441
+ workInTime: nullType,
2442
+ workOutTime: nullType,
2443
+ audioClipGroupList: nullType,
2444
+ bounds: makeType('', 'Rctn'),
2445
+ customEnvelopeWarp: makeType('', 'customEnvelopeWarp'),
2446
+ warp: makeType('', 'warp'),
2447
+ 'Sz ': makeType('', 'Pnt '),
2448
+ origin: makeType('', 'Pnt '),
2449
+ autoExpandOffset: makeType('', 'Pnt '),
2450
+ keyOriginShapeBBox: makeType('', 'unitRect'),
2451
+ Vrsn: nullType,
2452
+ psVersion: nullType,
2453
+ docDefaultNewArtboardBackgroundColor: makeType('', 'RGBC'),
2454
+ artboardRect: makeType('', 'classFloatRect'),
2455
+ keyOriginRRectRadii: makeType('', 'radii'),
2456
+ keyOriginBoxCorners: nullType,
2457
+ rectangleCornerA: makeType('', 'Pnt '),
2458
+ rectangleCornerB: makeType('', 'Pnt '),
2459
+ rectangleCornerC: makeType('', 'Pnt '),
2460
+ rectangleCornerD: makeType('', 'Pnt '),
2461
+ compInfo: nullType,
2462
+ Trnf: makeType('Transform', 'Trnf'),
2463
+ quiltWarp: makeType('', 'quiltWarp'),
2464
+ generatorSettings: nullType,
2465
+ crema: nullType,
2466
+ FrIn: nullType,
2467
+ blendOptions: nullType,
2468
+ FXRf: nullType,
2469
+ Lefx: nullType,
2470
+ time: nullType,
2471
+ animKey: nullType,
2472
+ timeScope: nullType,
2473
+ inTime: nullType,
2474
+ outTime: nullType,
2475
+ sheetStyle: nullType,
2476
+ translation: nullType,
2477
+ Skew: nullType,
2478
+ 'Lnk ': makeType('', 'ExternalFileLink'),
2479
+ frameReader: makeType('', 'FrameReader'),
2480
+ effectParams: makeType('', 'motionTrackEffectParams'),
2481
+ };
2482
+ var fieldToArrayExtType = {
2483
+ 'Crv ': makeType('', 'CrPt'),
2484
+ Clrs: makeType('', 'Clrt'),
2485
+ Trns: makeType('', 'TrnS'),
2486
+ keyDescriptorList: nullType,
2487
+ solidFillMulti: makeType('', 'SoFi'),
2488
+ gradientFillMulti: makeType('', 'GrFl'),
2489
+ dropShadowMulti: makeType('', 'DrSh'),
2490
+ innerShadowMulti: makeType('', 'IrSh'),
2491
+ frameFXMulti: makeType('', 'FrFX'),
2492
+ FrIn: nullType,
2493
+ FSts: nullType,
2494
+ LaSt: nullType,
2495
+ sheetTimelineOptions: nullType,
2496
+ trackList: makeType('', 'animationTrack'),
2497
+ globalTrackList: makeType('', 'animationTrack'),
2498
+ keyList: nullType,
2499
+ audioClipGroupList: nullType,
2500
+ audioClipList: nullType,
2501
+ };
2502
+ var typeToField = {
2503
+ 'TEXT': [
2504
+ 'Txt ', 'printerName', 'Nm ', 'Idnt', 'blackAndWhitePresetFileName', 'LUT3DFileName',
2505
+ 'presetFileName', 'curvesPresetFileName', 'mixerPresetFileName', 'placed', 'description', 'reason',
2506
+ 'artboardPresetName', 'json', 'groupID', 'clipID', 'relPath', 'fullPath', 'mediaDescriptor',
2507
+ ],
2508
+ 'tdta': ['EngineData', 'LUT3DFileData'],
2509
+ 'long': [
2510
+ 'TextIndex', 'RndS', 'Mdpn', 'Smth', 'Lctn', 'strokeStyleVersion', 'LaID', 'Vrsn', 'Cnt ',
2511
+ 'Brgh', 'Cntr', 'means', 'vibrance', 'Strt', 'bwPresetKind', 'presetKind', 'comp', 'compID', 'originalCompID',
2512
+ 'curvesPresetKind', 'mixerPresetKind', 'uOrder', 'vOrder', 'PgNm', 'totalPages', 'Crop',
2513
+ 'numerator', 'denominator', 'frameCount', 'Annt', 'keyOriginType', 'unitValueQuadVersion',
2514
+ 'keyOriginIndex', 'major', 'minor', 'fix', 'docDefaultNewArtboardBackgroundType', 'artboardBackgroundType',
2515
+ 'numModifyingFX', 'deformNumRows', 'deformNumCols', 'FrID', 'FrDl', 'FsID', 'LCnt', 'AFrm', 'AFSt',
2516
+ 'numBefore', 'numAfter', 'Spcn', 'minOpacity', 'maxOpacity', 'BlnM', 'sheetID', 'gblA', 'globalAltitude',
2517
+ 'descVersion', 'frameReaderType', 'LyrI', 'zoomOrigin',
2518
+ ],
2519
+ 'enum': [
2520
+ 'textGridding', 'Ornt', 'warpStyle', 'warpRotate', 'Inte', 'Bltn', 'ClrS',
2521
+ 'sdwM', 'hglM', 'bvlT', 'bvlS', 'bvlD', 'Md ', 'glwS', 'GrdF', 'GlwT',
2522
+ 'strokeStyleLineCapType', 'strokeStyleLineJoinType', 'strokeStyleLineAlignment',
2523
+ 'strokeStyleBlendMode', 'PntT', 'Styl', 'lookupType', 'LUTFormat', 'dataOrder',
2524
+ 'tableOrder', 'enableCompCore', 'enableCompCoreGPU', 'compCoreSupport', 'compCoreGPUSupport', 'Engn',
2525
+ 'enableCompCoreThreads', 'gs99', 'FrDs', 'trackID', 'animInterpStyle',
2526
+ ],
2527
+ 'bool': [
2528
+ 'PstS', 'printSixteenBit', 'masterFXSwitch', 'enab', 'uglg', 'antialiasGloss',
2529
+ 'useShape', 'useTexture', 'uglg', 'antialiasGloss', 'useShape',
2530
+ 'useTexture', 'Algn', 'Rvrs', 'Dthr', 'Invr', 'VctC', 'ShTr', 'layerConceals',
2531
+ 'strokeEnabled', 'fillEnabled', 'strokeStyleScaleLock', 'strokeStyleStrokeAdjust',
2532
+ 'hardProof', 'MpBl', 'paperWhite', 'useLegacy', 'Auto', 'Lab ', 'useTint', 'keyShapeInvalidated',
2533
+ 'autoExpandEnabled', 'autoNestEnabled', 'autoPositionEnabled', 'shrinkwrapOnSaveEnabled',
2534
+ 'present', 'showInDialog', 'overprint', 'sheetDisclosed', 'lightsDisclosed', 'meshesDisclosed',
2535
+ 'materialsDisclosed', 'hasMotion', 'muted', 'Effc', 'selected', 'autoScope', 'fillCanvas',
2536
+ ],
2537
+ 'doub': [
2538
+ 'warpValue', 'warpPerspective', 'warpPerspectiveOther', 'Intr', 'Wdth', 'Hght',
2539
+ 'strokeStyleMiterLimit', 'strokeStyleResolution', 'layerTime', 'keyOriginResolution',
2540
+ 'xx', 'xy', 'yx', 'yy', 'tx', 'ty', 'FrGA', 'frameRate', 'audioLevel', 'rotation',
2541
+ ],
2542
+ 'UntF': [
2543
+ 'Scl ', 'sdwO', 'hglO', 'lagl', 'Lald', 'srgR', 'blur', 'Sftn', 'Opct', 'Dstn', 'Angl',
2544
+ 'Ckmt', 'Nose', 'Inpr', 'ShdN', 'strokeStyleLineWidth', 'strokeStyleLineDashOffset',
2545
+ 'strokeStyleOpacity', 'H ', 'Top ', 'Left', 'Btom', 'Rght', 'Rslt',
2546
+ 'topRight', 'topLeft', 'bottomLeft', 'bottomRight',
2547
+ ],
2548
+ 'VlLs': [
2549
+ 'Crv ', 'Clrs', 'Mnm ', 'Mxm ', 'Trns', 'pathList', 'strokeStyleLineDashSet', 'FrLs',
2550
+ 'LaSt', 'Trnf', 'nonAffineTransform', 'keyDescriptorList', 'guideIndeces', 'gradientFillMulti',
2551
+ 'solidFillMulti', 'frameFXMulti', 'innerShadowMulti', 'dropShadowMulti', 'FrIn', 'FSts', 'FsFr',
2552
+ 'sheetTimelineOptions', 'audioClipList', 'trackList', 'globalTrackList', 'keyList', 'audioClipList',
2553
+ ],
2554
+ 'ObAr': ['meshPoints', 'quiltSliceX', 'quiltSliceY'],
2555
+ 'obj ': ['null'],
2556
+ };
2557
+ var channels = [
2558
+ 'Rd ', 'Grn ', 'Bl ', 'Yllw', 'Ylw ', 'Cyn ', 'Mgnt', 'Blck', 'Gry ', 'Lmnc', 'A ', 'B ',
2559
+ ];
2560
+ var fieldToArrayType = {
2561
+ 'Mnm ': 'long',
2562
+ 'Mxm ': 'long',
2563
+ 'FrLs': 'long',
2564
+ 'strokeStyleLineDashSet': 'UntF',
2565
+ 'Trnf': 'doub',
2566
+ 'nonAffineTransform': 'doub',
2567
+ 'keyDescriptorList': 'Objc',
2568
+ 'gradientFillMulti': 'Objc',
2569
+ 'solidFillMulti': 'Objc',
2570
+ 'frameFXMulti': 'Objc',
2571
+ 'innerShadowMulti': 'Objc',
2572
+ 'dropShadowMulti': 'Objc',
2573
+ 'LaSt': 'Objc',
2574
+ 'FrIn': 'Objc',
2575
+ 'FSts': 'Objc',
2576
+ 'FsFr': 'long',
2577
+ 'blendOptions': 'Objc',
2578
+ 'sheetTimelineOptions': 'Objc',
2579
+ 'keyList': 'Objc',
2580
+ };
2581
+ var fieldToType = {};
2582
+ for (var _i = 0, _a = Object.keys(typeToField); _i < _a.length; _i++) {
2583
+ var type = _a[_i];
2584
+ for (var _b = 0, _c = typeToField[type]; _b < _c.length; _b++) {
2585
+ var field = _c[_b];
2586
+ fieldToType[field] = type;
2427
2587
  }
2428
- return result;
2429
2588
  }
2430
- function parsePatternContent(descriptor) {
2431
- var result = {
2432
- name: descriptor.Ptrn['Nm '],
2433
- id: descriptor.Ptrn.Idnt,
2434
- };
2435
- if (descriptor.Lnkd !== undefined)
2436
- result.linked = descriptor.Lnkd;
2437
- if (descriptor.phase !== undefined)
2438
- result.phase = { x: descriptor.phase.Hrzn, y: descriptor.phase.Vrtc };
2439
- return result;
2589
+ for (var _d = 0, _e = Object.keys(fieldToExtType); _d < _e.length; _d++) {
2590
+ var field = _e[_d];
2591
+ if (!fieldToType[field])
2592
+ fieldToType[field] = 'Objc';
2440
2593
  }
2441
- function parseVectorContent(descriptor) {
2442
- if ('Grad' in descriptor) {
2443
- return parseGradientContent(descriptor);
2594
+ for (var _f = 0, _g = Object.keys(fieldToArrayExtType); _f < _g.length; _f++) {
2595
+ var field = _g[_f];
2596
+ fieldToArrayType[field] = 'Objc';
2597
+ }
2598
+ function getTypeByKey(key, value, root, parent) {
2599
+ if (key === 'Sz ') {
2600
+ return ('Wdth' in value) ? 'Objc' : (('units' in value) ? 'UntF' : 'doub');
2444
2601
  }
2445
- else if ('Ptrn' in descriptor) {
2446
- return __assign({ type: 'pattern' }, parsePatternContent(descriptor));
2602
+ else if (key === 'Type') {
2603
+ return typeof value === 'string' ? 'enum' : 'long';
2447
2604
  }
2448
- else if ('Clr ' in descriptor) {
2449
- return { type: 'color', color: parseColor(descriptor['Clr ']) };
2605
+ else if (key === 'AntA') {
2606
+ return typeof value === 'string' ? 'enum' : 'bool';
2607
+ }
2608
+ else if ((key === 'Hrzn' || key === 'Vrtc') && parent.Type === 'keyType.Pstn') {
2609
+ return 'long';
2610
+ }
2611
+ else if (key === 'Hrzn' || key === 'Vrtc' || key === 'Top ' || key === 'Left' || key === 'Btom' || key === 'Rght') {
2612
+ return typeof value === 'number' ? 'doub' : 'UntF';
2613
+ }
2614
+ else if (key === 'Vrsn') {
2615
+ return typeof value === 'number' ? 'long' : 'Objc';
2616
+ }
2617
+ else if (key === 'Rd ' || key === 'Grn ' || key === 'Bl ') {
2618
+ return root === 'artd' ? 'long' : 'doub';
2619
+ }
2620
+ else if (key === 'Trnf') {
2621
+ return Array.isArray(value) ? 'VlLs' : 'Objc';
2450
2622
  }
2451
2623
  else {
2452
- throw new Error('Invalid vector content');
2624
+ return fieldToType[key];
2453
2625
  }
2454
2626
  }
2455
- function serializeGradientContent(content) {
2456
- var result = {};
2457
- if (content.dither !== undefined)
2458
- result.Dthr = content.dither;
2459
- if (content.reverse !== undefined)
2460
- result.Rvrs = content.reverse;
2461
- if (content.angle !== undefined)
2462
- result.Angl = (0, descriptor_1.unitsAngle)(content.angle);
2463
- result.Type = descriptor_1.GrdT.encode(content.style);
2464
- if (content.align !== undefined)
2465
- result.Algn = content.align;
2466
- if (content.scale !== undefined)
2467
- result['Scl '] = (0, descriptor_1.unitsPercent)(content.scale);
2468
- if (content.offset) {
2469
- result.Ofst = {
2470
- Hrzn: (0, descriptor_1.unitsPercent)(content.offset.x),
2471
- Vrtc: (0, descriptor_1.unitsPercent)(content.offset.y),
2472
- };
2473
- }
2474
- result.Grad = serializeGradient(content);
2475
- return result;
2476
- }
2477
- function serializePatternContent(content) {
2478
- var result = {
2479
- Ptrn: {
2480
- 'Nm ': content.name || '',
2481
- Idnt: content.id || '',
2482
- }
2483
- };
2484
- if (content.linked !== undefined)
2485
- result.Lnkd = !!content.linked;
2486
- if (content.phase !== undefined)
2487
- result.phase = { Hrzn: content.phase.x, Vrtc: content.phase.y };
2488
- return result;
2627
+ function readAsciiStringOrClassId(reader) {
2628
+ var length = (0, psdReader_1.readInt32)(reader);
2629
+ return (0, psdReader_1.readAsciiString)(reader, length || 4);
2489
2630
  }
2490
- function serializeVectorContent(content) {
2491
- if (content.type === 'color') {
2492
- return { key: 'SoCo', descriptor: { 'Clr ': serializeColor(content.color) } };
2493
- }
2494
- else if (content.type === 'pattern') {
2495
- return { key: 'PtFl', descriptor: serializePatternContent(content) };
2631
+ exports.readAsciiStringOrClassId = readAsciiStringOrClassId;
2632
+ function writeAsciiStringOrClassId(writer, value) {
2633
+ if (value.length === 4 && value !== 'warp' && value !== 'time' && value !== 'hold') {
2634
+ // write classId
2635
+ (0, psdWriter_1.writeInt32)(writer, 0);
2636
+ (0, psdWriter_1.writeSignature)(writer, value);
2496
2637
  }
2497
2638
  else {
2498
- return { key: 'GdFl', descriptor: serializeGradientContent(content) };
2639
+ // write ascii string
2640
+ (0, psdWriter_1.writeInt32)(writer, value.length);
2641
+ for (var i = 0; i < value.length; i++) {
2642
+ (0, psdWriter_1.writeUint8)(writer, value.charCodeAt(i));
2643
+ }
2499
2644
  }
2500
2645
  }
2501
- function parseColor(color) {
2502
- if ('H ' in color) {
2503
- return { h: (0, descriptor_1.parsePercentOrAngle)(color['H ']), s: color.Strt, b: color.Brgh };
2504
- }
2505
- else if ('Rd ' in color) {
2506
- return { r: color['Rd '], g: color['Grn '], b: color['Bl '] };
2507
- }
2508
- else if ('Cyn ' in color) {
2509
- return { c: color['Cyn '], m: color.Mgnt, y: color['Ylw '], k: color.Blck };
2510
- }
2511
- else if ('Gry ' in color) {
2512
- return { k: color['Gry '] };
2513
- }
2514
- else if ('Lmnc' in color) {
2515
- return { l: color.Lmnc, a: color['A '], b: color['B '] };
2516
- }
2517
- else {
2518
- throw new Error('Unsupported color descriptor');
2646
+ function readDescriptorStructure(reader) {
2647
+ var object = {};
2648
+ // object.__struct =
2649
+ readClassStructure(reader);
2650
+ var itemsCount = (0, psdReader_1.readUint32)(reader);
2651
+ // console.log('//', object.__struct);
2652
+ for (var i = 0; i < itemsCount; i++) {
2653
+ var key = readAsciiStringOrClassId(reader);
2654
+ var type = (0, psdReader_1.readSignature)(reader);
2655
+ // console.log(`> '${key}' '${type}'`);
2656
+ var data = readOSType(reader, type);
2657
+ // if (!getTypeByKey(key, data)) console.log(`> '${key}' '${type}'`, data);
2658
+ object[key] = data;
2519
2659
  }
2660
+ return object;
2520
2661
  }
2521
- function serializeColor(color) {
2522
- if (!color) {
2523
- return { 'Rd ': 0, 'Grn ': 0, 'Bl ': 0 };
2524
- }
2525
- else if ('r' in color) {
2526
- return { 'Rd ': color.r || 0, 'Grn ': color.g || 0, 'Bl ': color.b || 0 };
2527
- }
2528
- else if ('h' in color) {
2529
- return { 'H ': (0, descriptor_1.unitsAngle)(color.h * 360), Strt: color.s || 0, Brgh: color.b || 0 };
2530
- }
2531
- else if ('c' in color) {
2532
- return { 'Cyn ': color.c || 0, Mgnt: color.m || 0, 'Ylw ': color.y || 0, Blck: color.k || 0 };
2533
- }
2534
- else if ('l' in color) {
2535
- return { Lmnc: color.l || 0, 'A ': color.a || 0, 'B ': color.b || 0 };
2536
- }
2537
- else if ('k' in color) {
2538
- return { 'Gry ': color.k };
2662
+ exports.readDescriptorStructure = readDescriptorStructure;
2663
+ function writeDescriptorStructure(writer, name, classId, value, root) {
2664
+ if (logErrors && !classId)
2665
+ console.log('Missing classId for: ', name, classId, value);
2666
+ // write class structure
2667
+ (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, name);
2668
+ writeAsciiStringOrClassId(writer, classId);
2669
+ var keys = Object.keys(value);
2670
+ (0, psdWriter_1.writeUint32)(writer, keys.length);
2671
+ for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
2672
+ var key = keys_1[_i];
2673
+ var type = getTypeByKey(key, value[key], root, value);
2674
+ var extType = fieldToExtType[key];
2675
+ if (key === 'Scl ' && 'Hrzn' in value[key]) {
2676
+ type = 'Objc';
2677
+ extType = nullType;
2678
+ }
2679
+ else if (key === 'audioClipGroupList' && keys.length === 1) {
2680
+ type = 'VlLs';
2681
+ }
2682
+ else if ((key === 'Strt' || key === 'Brgh') && 'H ' in value) {
2683
+ type = 'doub';
2684
+ }
2685
+ else if (key === 'Strt') {
2686
+ type = 'Objc';
2687
+ extType = nullType;
2688
+ }
2689
+ else if (channels.indexOf(key) !== -1) {
2690
+ type = (classId === 'RGBC' && root !== 'artd') ? 'doub' : 'long';
2691
+ }
2692
+ else if (key === 'profile') {
2693
+ type = classId === 'printOutput' ? 'TEXT' : 'tdta';
2694
+ }
2695
+ else if (key === 'strokeStyleContent') {
2696
+ if (value[key]['Clr ']) {
2697
+ extType = makeType('', 'solidColorLayer');
2698
+ }
2699
+ else if (value[key].Grad) {
2700
+ extType = makeType('', 'gradientLayer');
2701
+ }
2702
+ else if (value[key].Ptrn) {
2703
+ extType = makeType('', 'patternLayer');
2704
+ }
2705
+ else {
2706
+ logErrors && console.log('Invalid strokeStyleContent value', value[key]);
2707
+ }
2708
+ }
2709
+ else if (key === 'bounds' && root === 'quiltWarp') {
2710
+ extType = makeType('', 'classFloatRect');
2711
+ }
2712
+ if (extType && extType.classID === 'RGBC') {
2713
+ if ('H ' in value[key])
2714
+ extType = { classID: 'HSBC', name: '' };
2715
+ // TODO: other color spaces
2716
+ }
2717
+ writeAsciiStringOrClassId(writer, key);
2718
+ (0, psdWriter_1.writeSignature)(writer, type || 'long');
2719
+ writeOSType(writer, type || 'long', value[key], key, extType, root);
2720
+ if (logErrors && !type)
2721
+ console.log("Missing descriptor field type for: '".concat(key, "' in"), value);
2539
2722
  }
2540
- else {
2541
- throw new Error('Invalid color value');
2723
+ }
2724
+ exports.writeDescriptorStructure = writeDescriptorStructure;
2725
+ function readOSType(reader, type) {
2726
+ switch (type) {
2727
+ case 'obj ': // Reference
2728
+ return readReferenceStructure(reader);
2729
+ case 'Objc': // Descriptor
2730
+ case 'GlbO': // GlobalObject same as Descriptor
2731
+ return readDescriptorStructure(reader);
2732
+ case 'VlLs': { // List
2733
+ var length_1 = (0, psdReader_1.readInt32)(reader);
2734
+ var items = [];
2735
+ for (var i = 0; i < length_1; i++) {
2736
+ var type_1 = (0, psdReader_1.readSignature)(reader);
2737
+ // console.log(' >', type);
2738
+ items.push(readOSType(reader, type_1));
2739
+ }
2740
+ return items;
2741
+ }
2742
+ case 'doub': // Double
2743
+ return (0, psdReader_1.readFloat64)(reader);
2744
+ case 'UntF': { // Unit double
2745
+ var units = (0, psdReader_1.readSignature)(reader);
2746
+ var value = (0, psdReader_1.readFloat64)(reader);
2747
+ if (!unitsMap[units])
2748
+ throw new Error("Invalid units: ".concat(units));
2749
+ return { units: unitsMap[units], value: value };
2750
+ }
2751
+ case 'UnFl': { // Unit float
2752
+ var units = (0, psdReader_1.readSignature)(reader);
2753
+ var value = (0, psdReader_1.readFloat32)(reader);
2754
+ if (!unitsMap[units])
2755
+ throw new Error("Invalid units: ".concat(units));
2756
+ return { units: unitsMap[units], value: value };
2757
+ }
2758
+ case 'TEXT': // String
2759
+ return (0, psdReader_1.readUnicodeString)(reader);
2760
+ case 'enum': { // Enumerated
2761
+ var type_2 = readAsciiStringOrClassId(reader);
2762
+ var value = readAsciiStringOrClassId(reader);
2763
+ return "".concat(type_2, ".").concat(value);
2764
+ }
2765
+ case 'long': // Integer
2766
+ return (0, psdReader_1.readInt32)(reader);
2767
+ case 'comp': { // Large Integer
2768
+ var low = (0, psdReader_1.readUint32)(reader);
2769
+ var high = (0, psdReader_1.readUint32)(reader);
2770
+ return { low: low, high: high };
2771
+ }
2772
+ case 'bool': // Boolean
2773
+ return !!(0, psdReader_1.readUint8)(reader);
2774
+ case 'type': // Class
2775
+ case 'GlbC': // Class
2776
+ return readClassStructure(reader);
2777
+ case 'alis': { // Alias
2778
+ var length_2 = (0, psdReader_1.readInt32)(reader);
2779
+ return (0, psdReader_1.readAsciiString)(reader, length_2);
2780
+ }
2781
+ case 'tdta': { // Raw Data
2782
+ var length_3 = (0, psdReader_1.readInt32)(reader);
2783
+ return (0, psdReader_1.readBytes)(reader, length_3);
2784
+ }
2785
+ case 'ObAr': { // Object array
2786
+ (0, psdReader_1.readInt32)(reader); // version: 16
2787
+ (0, psdReader_1.readUnicodeString)(reader); // name: ''
2788
+ readAsciiStringOrClassId(reader); // 'rationalPoint'
2789
+ var length_4 = (0, psdReader_1.readInt32)(reader);
2790
+ var items = [];
2791
+ for (var i = 0; i < length_4; i++) {
2792
+ var type1 = readAsciiStringOrClassId(reader); // type Hrzn | Vrtc
2793
+ (0, psdReader_1.readSignature)(reader); // UnFl
2794
+ (0, psdReader_1.readSignature)(reader); // units ? '#Pxl'
2795
+ var valuesCount = (0, psdReader_1.readInt32)(reader);
2796
+ var values = [];
2797
+ for (var j = 0; j < valuesCount; j++) {
2798
+ values.push((0, psdReader_1.readFloat64)(reader));
2799
+ }
2800
+ items.push({ type: type1, values: values });
2801
+ }
2802
+ return items;
2803
+ }
2804
+ case 'Pth ': { // File path
2805
+ /*const length =*/ (0, psdReader_1.readInt32)(reader);
2806
+ var sig = (0, psdReader_1.readSignature)(reader);
2807
+ /*const pathSize =*/ (0, psdReader_1.readInt32LE)(reader);
2808
+ var charsCount = (0, psdReader_1.readInt32LE)(reader);
2809
+ var path = (0, psdReader_1.readUnicodeStringWithLength)(reader, charsCount);
2810
+ return { sig: sig, path: path };
2811
+ }
2812
+ default:
2813
+ throw new Error("Invalid TySh descriptor OSType: ".concat(type, " at ").concat(reader.offset.toString(16)));
2542
2814
  }
2543
2815
  }
2544
- function parseEffectObject(obj, reportErrors) {
2545
- var result = {};
2546
- for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
2547
- var key = _a[_i];
2548
- var val = obj[key];
2549
- switch (key) {
2550
- case 'enab':
2551
- result.enabled = !!val;
2552
- break;
2553
- case 'uglg':
2554
- result.useGlobalLight = !!val;
2555
- break;
2556
- case 'AntA':
2557
- result.antialiased = !!val;
2558
- break;
2559
- case 'Algn':
2560
- result.align = !!val;
2561
- break;
2562
- case 'Dthr':
2563
- result.dither = !!val;
2564
- break;
2565
- case 'Invr':
2566
- result.invert = !!val;
2567
- break;
2568
- case 'Rvrs':
2569
- result.reverse = !!val;
2570
- break;
2571
- case 'Clr ':
2572
- result.color = parseColor(val);
2573
- break;
2574
- case 'hglC':
2575
- result.highlightColor = parseColor(val);
2576
- break;
2577
- case 'sdwC':
2578
- result.shadowColor = parseColor(val);
2579
- break;
2580
- case 'Styl':
2581
- result.position = descriptor_1.FStl.decode(val);
2582
- break;
2583
- case 'Md ':
2584
- result.blendMode = descriptor_1.BlnM.decode(val);
2585
- break;
2586
- case 'hglM':
2587
- result.highlightBlendMode = descriptor_1.BlnM.decode(val);
2588
- break;
2589
- case 'sdwM':
2590
- result.shadowBlendMode = descriptor_1.BlnM.decode(val);
2591
- break;
2592
- case 'bvlS':
2593
- result.style = descriptor_1.BESl.decode(val);
2594
- break;
2595
- case 'bvlD':
2596
- result.direction = descriptor_1.BESs.decode(val);
2597
- break;
2598
- case 'bvlT':
2599
- result.technique = descriptor_1.bvlT.decode(val);
2600
- break;
2601
- case 'GlwT':
2602
- result.technique = descriptor_1.BETE.decode(val);
2603
- break;
2604
- case 'glwS':
2605
- result.source = descriptor_1.IGSr.decode(val);
2606
- break;
2607
- case 'Type':
2608
- result.type = descriptor_1.GrdT.decode(val);
2609
- break;
2610
- case 'gs99':
2611
- result.interpolationMethod = descriptor_1.gradientInterpolationMethodType.decode(val);
2612
- break;
2613
- case 'Opct':
2614
- result.opacity = (0, descriptor_1.parsePercent)(val);
2615
- break;
2616
- case 'hglO':
2617
- result.highlightOpacity = (0, descriptor_1.parsePercent)(val);
2618
- break;
2619
- case 'sdwO':
2620
- result.shadowOpacity = (0, descriptor_1.parsePercent)(val);
2621
- break;
2622
- case 'lagl':
2623
- result.angle = (0, descriptor_1.parseAngle)(val);
2624
- break;
2625
- case 'Angl':
2626
- result.angle = (0, descriptor_1.parseAngle)(val);
2627
- break;
2628
- case 'Lald':
2629
- result.altitude = (0, descriptor_1.parseAngle)(val);
2630
- break;
2631
- case 'Sftn':
2632
- result.soften = (0, descriptor_1.parseUnits)(val);
2633
- break;
2634
- case 'srgR':
2635
- result.strength = (0, descriptor_1.parsePercent)(val);
2636
- break;
2637
- case 'blur':
2638
- result.size = (0, descriptor_1.parseUnits)(val);
2639
- break;
2640
- case 'Nose':
2641
- result.noise = (0, descriptor_1.parsePercent)(val);
2642
- break;
2643
- case 'Inpr':
2644
- result.range = (0, descriptor_1.parsePercent)(val);
2645
- break;
2646
- case 'Ckmt':
2647
- result.choke = (0, descriptor_1.parseUnits)(val);
2648
- break;
2649
- case 'ShdN':
2650
- result.jitter = (0, descriptor_1.parsePercent)(val);
2651
- break;
2652
- case 'Dstn':
2653
- result.distance = (0, descriptor_1.parseUnits)(val);
2654
- break;
2655
- case 'Scl ':
2656
- result.scale = (0, descriptor_1.parsePercent)(val);
2816
+ var ObArTypes = {
2817
+ meshPoints: 'rationalPoint',
2818
+ quiltSliceX: 'UntF',
2819
+ quiltSliceY: 'UntF',
2820
+ };
2821
+ function writeOSType(writer, type, value, key, extType, root) {
2822
+ switch (type) {
2823
+ case 'obj ': // Reference
2824
+ writeReferenceStructure(writer, key, value);
2825
+ break;
2826
+ case 'Objc': // Descriptor
2827
+ case 'GlbO': // GlobalObject same as Descriptor
2828
+ if (!extType)
2829
+ throw new Error("Missing ext type for: '".concat(key, "' (").concat(JSON.stringify(value), ")"));
2830
+ writeDescriptorStructure(writer, extType.name, extType.classID, value, root);
2831
+ break;
2832
+ case 'VlLs': // List
2833
+ (0, psdWriter_1.writeInt32)(writer, value.length);
2834
+ for (var i = 0; i < value.length; i++) {
2835
+ var type_3 = fieldToArrayType[key];
2836
+ (0, psdWriter_1.writeSignature)(writer, type_3 || 'long');
2837
+ writeOSType(writer, type_3 || 'long', value[i], '', fieldToArrayExtType[key], root);
2838
+ if (logErrors && !type_3)
2839
+ console.log("Missing descriptor array type for: '".concat(key, "' in"), value);
2840
+ }
2841
+ break;
2842
+ case 'doub': // Double
2843
+ (0, psdWriter_1.writeFloat64)(writer, value);
2844
+ break;
2845
+ case 'UntF': // Unit double
2846
+ if (!unitsMapRev[value.units])
2847
+ throw new Error("Invalid units: ".concat(value.units, " in ").concat(key));
2848
+ (0, psdWriter_1.writeSignature)(writer, unitsMapRev[value.units]);
2849
+ (0, psdWriter_1.writeFloat64)(writer, value.value);
2850
+ break;
2851
+ case 'UnFl': // Unit float
2852
+ if (!unitsMapRev[value.units])
2853
+ throw new Error("Invalid units: ".concat(value.units, " in ").concat(key));
2854
+ (0, psdWriter_1.writeSignature)(writer, unitsMapRev[value.units]);
2855
+ (0, psdWriter_1.writeFloat32)(writer, value.value);
2856
+ break;
2857
+ case 'TEXT': // String
2858
+ (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, value);
2859
+ break;
2860
+ case 'enum': { // Enumerated
2861
+ var _a = value.split('.'), _type = _a[0], val = _a[1];
2862
+ writeAsciiStringOrClassId(writer, _type);
2863
+ writeAsciiStringOrClassId(writer, val);
2864
+ break;
2865
+ }
2866
+ case 'long': // Integer
2867
+ (0, psdWriter_1.writeInt32)(writer, value);
2868
+ break;
2869
+ // case 'comp': // Large Integer
2870
+ // writeLargeInteger(reader);
2871
+ case 'bool': // Boolean
2872
+ (0, psdWriter_1.writeUint8)(writer, value ? 1 : 0);
2873
+ break;
2874
+ // case 'type': // Class
2875
+ // case 'GlbC': // Class
2876
+ // writeClassStructure(reader);
2877
+ // case 'alis': // Alias
2878
+ // writeAliasStructure(reader);
2879
+ case 'tdta': // Raw Data
2880
+ (0, psdWriter_1.writeInt32)(writer, value.byteLength);
2881
+ (0, psdWriter_1.writeBytes)(writer, value);
2882
+ break;
2883
+ case 'ObAr': { // Object array
2884
+ (0, psdWriter_1.writeInt32)(writer, 16); // version
2885
+ (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, ''); // name
2886
+ var type_4 = ObArTypes[key];
2887
+ if (!type_4)
2888
+ throw new Error("Not implemented ObArType for: ".concat(key));
2889
+ writeAsciiStringOrClassId(writer, type_4);
2890
+ (0, psdWriter_1.writeInt32)(writer, value.length);
2891
+ for (var i = 0; i < value.length; i++) {
2892
+ writeAsciiStringOrClassId(writer, value[i].type); // Hrzn | Vrtc
2893
+ (0, psdWriter_1.writeSignature)(writer, 'UnFl');
2894
+ (0, psdWriter_1.writeSignature)(writer, '#Pxl');
2895
+ (0, psdWriter_1.writeInt32)(writer, value[i].values.length);
2896
+ for (var j = 0; j < value[i].values.length; j++) {
2897
+ (0, psdWriter_1.writeFloat64)(writer, value[i].values[j]);
2898
+ }
2899
+ }
2900
+ break;
2901
+ }
2902
+ // case 'Pth ': // File path
2903
+ // writeFilePath(reader);
2904
+ default:
2905
+ throw new Error("Not implemented descriptor OSType: ".concat(type));
2906
+ }
2907
+ }
2908
+ function readReferenceStructure(reader) {
2909
+ var itemsCount = (0, psdReader_1.readInt32)(reader);
2910
+ var items = [];
2911
+ for (var i = 0; i < itemsCount; i++) {
2912
+ var type = (0, psdReader_1.readSignature)(reader);
2913
+ switch (type) {
2914
+ case 'prop': { // Property
2915
+ readClassStructure(reader);
2916
+ var keyID = readAsciiStringOrClassId(reader);
2917
+ items.push(keyID);
2657
2918
  break;
2658
- case 'Ptrn':
2659
- result.pattern = { name: val['Nm '], id: val.Idnt };
2919
+ }
2920
+ case 'Clss': // Class
2921
+ items.push(readClassStructure(reader));
2660
2922
  break;
2661
- case 'phase':
2662
- result.phase = { x: val.Hrzn, y: val.Vrtc };
2923
+ case 'Enmr': { // Enumerated Reference
2924
+ readClassStructure(reader);
2925
+ var typeID = readAsciiStringOrClassId(reader);
2926
+ var value = readAsciiStringOrClassId(reader);
2927
+ items.push("".concat(typeID, ".").concat(value));
2663
2928
  break;
2664
- case 'Ofst':
2665
- result.offset = { x: (0, descriptor_1.parsePercent)(val.Hrzn), y: (0, descriptor_1.parsePercent)(val.Vrtc) };
2929
+ }
2930
+ case 'rele': { // Offset
2931
+ // const { name, classID } =
2932
+ readClassStructure(reader);
2933
+ items.push((0, psdReader_1.readUint32)(reader));
2666
2934
  break;
2667
- case 'MpgS':
2668
- case 'TrnS':
2669
- result.contour = {
2670
- name: val['Nm '],
2671
- curve: val['Crv '].map(function (p) { return ({ x: p.Hrzn, y: p.Vrtc }); }),
2672
- };
2935
+ }
2936
+ case 'Idnt': // Identifier
2937
+ items.push((0, psdReader_1.readInt32)(reader));
2673
2938
  break;
2674
- case 'Grad':
2675
- result.gradient = parseGradient(val);
2939
+ case 'indx': // Index
2940
+ items.push((0, psdReader_1.readInt32)(reader));
2676
2941
  break;
2677
- case 'useTexture':
2678
- case 'useShape':
2679
- case 'layerConceals':
2680
- case 'present':
2681
- case 'showInDialog':
2682
- case 'antialiasGloss':
2683
- result[key] = val;
2942
+ case 'name': { // Name
2943
+ readClassStructure(reader);
2944
+ items.push((0, psdReader_1.readUnicodeString)(reader));
2684
2945
  break;
2946
+ }
2685
2947
  default:
2686
- reportErrors && console.log("Invalid effect key: '".concat(key, "', value:"), val);
2948
+ throw new Error("Invalid descriptor reference type: ".concat(type));
2687
2949
  }
2688
2950
  }
2689
- return result;
2951
+ return items;
2690
2952
  }
2691
- function serializeEffectObject(obj, objName, reportErrors) {
2692
- var result = {};
2693
- for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
2694
- var objKey = _a[_i];
2695
- var key = objKey;
2696
- var val = obj[key];
2697
- switch (key) {
2698
- case 'enabled':
2699
- result.enab = !!val;
2700
- break;
2701
- case 'useGlobalLight':
2702
- result.uglg = !!val;
2953
+ function writeReferenceStructure(writer, _key, items) {
2954
+ (0, psdWriter_1.writeInt32)(writer, items.length);
2955
+ for (var i = 0; i < items.length; i++) {
2956
+ var value = items[i];
2957
+ var type = 'unknown';
2958
+ if (typeof value === 'string') {
2959
+ if (/^[a-z]+\.[a-z]+$/i.test(value)) {
2960
+ type = 'Enmr';
2961
+ }
2962
+ else {
2963
+ type = 'name';
2964
+ }
2965
+ }
2966
+ (0, psdWriter_1.writeSignature)(writer, type);
2967
+ switch (type) {
2968
+ // case 'prop': // Property
2969
+ // case 'Clss': // Class
2970
+ case 'Enmr': { // Enumerated Reference
2971
+ var _a = value.split('.'), typeID = _a[0], enumValue = _a[1];
2972
+ writeClassStructure(writer, '\0', typeID);
2973
+ writeAsciiStringOrClassId(writer, typeID);
2974
+ writeAsciiStringOrClassId(writer, enumValue);
2703
2975
  break;
2704
- case 'antialiased':
2705
- result.AntA = !!val;
2976
+ }
2977
+ // case 'rele': // Offset
2978
+ // case 'Idnt': // Identifier
2979
+ // case 'indx': // Index
2980
+ case 'name': { // Name
2981
+ writeClassStructure(writer, '\0', 'Lyr ');
2982
+ (0, psdWriter_1.writeUnicodeString)(writer, value + '\0');
2706
2983
  break;
2707
- case 'align':
2708
- result.Algn = !!val;
2709
- break;
2710
- case 'dither':
2711
- result.Dthr = !!val;
2984
+ }
2985
+ default:
2986
+ throw new Error("Invalid descriptor reference type: ".concat(type));
2987
+ }
2988
+ }
2989
+ return items;
2990
+ }
2991
+ function readClassStructure(reader) {
2992
+ var name = (0, psdReader_1.readUnicodeString)(reader);
2993
+ var classID = readAsciiStringOrClassId(reader);
2994
+ // console.log({ name, classID });
2995
+ return { name: name, classID: classID };
2996
+ }
2997
+ function writeClassStructure(writer, name, classID) {
2998
+ (0, psdWriter_1.writeUnicodeString)(writer, name);
2999
+ writeAsciiStringOrClassId(writer, classID);
3000
+ }
3001
+ function readVersionAndDescriptor(reader) {
3002
+ var version = (0, psdReader_1.readUint32)(reader);
3003
+ if (version !== 16)
3004
+ throw new Error("Invalid descriptor version: ".concat(version));
3005
+ var desc = readDescriptorStructure(reader);
3006
+ // console.log(require('util').inspect(desc, false, 99, true));
3007
+ return desc;
3008
+ }
3009
+ exports.readVersionAndDescriptor = readVersionAndDescriptor;
3010
+ function writeVersionAndDescriptor(writer, name, classID, descriptor, root) {
3011
+ if (root === void 0) { root = ''; }
3012
+ (0, psdWriter_1.writeUint32)(writer, 16); // version
3013
+ writeDescriptorStructure(writer, name, classID, descriptor, root);
3014
+ }
3015
+ exports.writeVersionAndDescriptor = writeVersionAndDescriptor;
3016
+ function horzVrtcToXY(hv) {
3017
+ return { x: hv.Hrzn, y: hv.Vrtc };
3018
+ }
3019
+ exports.horzVrtcToXY = horzVrtcToXY;
3020
+ function xyToHorzVrtc(xy) {
3021
+ return { Hrzn: xy.x, Vrtc: xy.y };
3022
+ }
3023
+ exports.xyToHorzVrtc = xyToHorzVrtc;
3024
+ function parseFxObject(fx) {
3025
+ var stroke = {
3026
+ enabled: !!fx.enab,
3027
+ position: exports.FStl.decode(fx.Styl),
3028
+ fillType: exports.FrFl.decode(fx.PntT),
3029
+ blendMode: exports.BlnM.decode(fx['Md ']),
3030
+ opacity: parsePercent(fx.Opct),
3031
+ size: parseUnits(fx['Sz ']),
3032
+ };
3033
+ if (fx.present !== undefined)
3034
+ stroke.present = fx.present;
3035
+ if (fx.showInDialog !== undefined)
3036
+ stroke.showInDialog = fx.showInDialog;
3037
+ if (fx.overprint !== undefined)
3038
+ stroke.overprint = fx.overprint;
3039
+ if (fx['Clr '])
3040
+ stroke.color = parseColor(fx['Clr ']);
3041
+ if (fx.Grad)
3042
+ stroke.gradient = parseGradientContent(fx);
3043
+ if (fx.Ptrn)
3044
+ stroke.pattern = parsePatternContent(fx);
3045
+ return stroke;
3046
+ }
3047
+ function serializeFxObject(stroke) {
3048
+ var FrFX = {};
3049
+ FrFX.enab = !!stroke.enabled;
3050
+ if (stroke.present !== undefined)
3051
+ FrFX.present = !!stroke.present;
3052
+ if (stroke.showInDialog !== undefined)
3053
+ FrFX.showInDialog = !!stroke.showInDialog;
3054
+ FrFX.Styl = exports.FStl.encode(stroke.position);
3055
+ FrFX.PntT = exports.FrFl.encode(stroke.fillType);
3056
+ FrFX['Md '] = exports.BlnM.encode(stroke.blendMode);
3057
+ FrFX.Opct = unitsPercent(stroke.opacity);
3058
+ FrFX['Sz '] = unitsValue(stroke.size, 'size');
3059
+ if (stroke.color)
3060
+ FrFX['Clr '] = serializeColor(stroke.color);
3061
+ if (stroke.gradient)
3062
+ FrFX = __assign(__assign({}, FrFX), serializeGradientContent(stroke.gradient));
3063
+ if (stroke.pattern)
3064
+ FrFX = __assign(__assign({}, FrFX), serializePatternContent(stroke.pattern));
3065
+ if (stroke.overprint !== undefined)
3066
+ FrFX.overprint = !!stroke.overprint;
3067
+ return FrFX;
3068
+ }
3069
+ function serializeEffects(e, log, multi) {
3070
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
3071
+ var info = multi ? {
3072
+ 'Scl ': unitsPercent((_a = e.scale) !== null && _a !== void 0 ? _a : 1),
3073
+ masterFXSwitch: !e.disabled,
3074
+ } : {
3075
+ masterFXSwitch: !e.disabled,
3076
+ 'Scl ': unitsPercent((_b = e.scale) !== null && _b !== void 0 ? _b : 1),
3077
+ };
3078
+ var arrayKeys = ['dropShadow', 'innerShadow', 'solidFill', 'gradientOverlay', 'stroke'];
3079
+ for (var _i = 0, arrayKeys_1 = arrayKeys; _i < arrayKeys_1.length; _i++) {
3080
+ var key = arrayKeys_1[_i];
3081
+ if (e[key] && !Array.isArray(e[key]))
3082
+ throw new Error("".concat(key, " should be an array"));
3083
+ }
3084
+ if (((_c = e.dropShadow) === null || _c === void 0 ? void 0 : _c[0]) && !multi)
3085
+ info.DrSh = serializeEffectObject(e.dropShadow[0], 'dropShadow', log);
3086
+ if (((_d = e.dropShadow) === null || _d === void 0 ? void 0 : _d[0]) && multi)
3087
+ info.dropShadowMulti = e.dropShadow.map(function (i) { return serializeEffectObject(i, 'dropShadow', log); });
3088
+ if (((_e = e.innerShadow) === null || _e === void 0 ? void 0 : _e[0]) && !multi)
3089
+ info.IrSh = serializeEffectObject(e.innerShadow[0], 'innerShadow', log);
3090
+ if (((_f = e.innerShadow) === null || _f === void 0 ? void 0 : _f[0]) && multi)
3091
+ info.innerShadowMulti = e.innerShadow.map(function (i) { return serializeEffectObject(i, 'innerShadow', log); });
3092
+ if (e.outerGlow)
3093
+ info.OrGl = serializeEffectObject(e.outerGlow, 'outerGlow', log);
3094
+ if (((_g = e.solidFill) === null || _g === void 0 ? void 0 : _g[0]) && multi)
3095
+ info.solidFillMulti = e.solidFill.map(function (i) { return serializeEffectObject(i, 'solidFill', log); });
3096
+ if (((_h = e.gradientOverlay) === null || _h === void 0 ? void 0 : _h[0]) && multi)
3097
+ info.gradientFillMulti = e.gradientOverlay.map(function (i) { return serializeEffectObject(i, 'gradientOverlay', log); });
3098
+ if (((_j = e.stroke) === null || _j === void 0 ? void 0 : _j[0]) && multi)
3099
+ info.frameFXMulti = e.stroke.map(function (i) { return serializeFxObject(i); });
3100
+ if (e.innerGlow)
3101
+ info.IrGl = serializeEffectObject(e.innerGlow, 'innerGlow', log);
3102
+ if (e.bevel)
3103
+ info.ebbl = serializeEffectObject(e.bevel, 'bevel', log);
3104
+ if (((_k = e.solidFill) === null || _k === void 0 ? void 0 : _k[0]) && !multi)
3105
+ info.SoFi = serializeEffectObject(e.solidFill[0], 'solidFill', log);
3106
+ if (e.patternOverlay)
3107
+ info.patternFill = serializeEffectObject(e.patternOverlay, 'patternOverlay', log);
3108
+ if (((_l = e.gradientOverlay) === null || _l === void 0 ? void 0 : _l[0]) && !multi)
3109
+ info.GrFl = serializeEffectObject(e.gradientOverlay[0], 'gradientOverlay', log);
3110
+ if (e.satin)
3111
+ info.ChFX = serializeEffectObject(e.satin, 'satin', log);
3112
+ if (((_m = e.stroke) === null || _m === void 0 ? void 0 : _m[0]) && !multi)
3113
+ info.FrFX = serializeFxObject((_o = e.stroke) === null || _o === void 0 ? void 0 : _o[0]);
3114
+ if (multi) {
3115
+ info.numModifyingFX = 0;
3116
+ for (var _p = 0, _q = Object.keys(e); _p < _q.length; _p++) {
3117
+ var key = _q[_p];
3118
+ var value = e[key];
3119
+ if (Array.isArray(value)) {
3120
+ for (var _r = 0, value_1 = value; _r < value_1.length; _r++) {
3121
+ var effect = value_1[_r];
3122
+ if (effect.enabled)
3123
+ info.numModifyingFX++;
3124
+ }
3125
+ }
3126
+ }
3127
+ }
3128
+ return info;
3129
+ }
3130
+ exports.serializeEffects = serializeEffects;
3131
+ function parseEffects(info, log) {
3132
+ var effects = {};
3133
+ if (!info.masterFXSwitch)
3134
+ effects.disabled = true;
3135
+ if (info['Scl '])
3136
+ effects.scale = parsePercent(info['Scl ']);
3137
+ if (info.DrSh)
3138
+ effects.dropShadow = [parseEffectObject(info.DrSh, log)];
3139
+ if (info.dropShadowMulti)
3140
+ effects.dropShadow = info.dropShadowMulti.map(function (i) { return parseEffectObject(i, log); });
3141
+ if (info.IrSh)
3142
+ effects.innerShadow = [parseEffectObject(info.IrSh, log)];
3143
+ if (info.innerShadowMulti)
3144
+ effects.innerShadow = info.innerShadowMulti.map(function (i) { return parseEffectObject(i, log); });
3145
+ if (info.OrGl)
3146
+ effects.outerGlow = parseEffectObject(info.OrGl, log);
3147
+ if (info.IrGl)
3148
+ effects.innerGlow = parseEffectObject(info.IrGl, log);
3149
+ if (info.ebbl)
3150
+ effects.bevel = parseEffectObject(info.ebbl, log);
3151
+ if (info.SoFi)
3152
+ effects.solidFill = [parseEffectObject(info.SoFi, log)];
3153
+ if (info.solidFillMulti)
3154
+ effects.solidFill = info.solidFillMulti.map(function (i) { return parseEffectObject(i, log); });
3155
+ if (info.patternFill)
3156
+ effects.patternOverlay = parseEffectObject(info.patternFill, log);
3157
+ if (info.GrFl)
3158
+ effects.gradientOverlay = [parseEffectObject(info.GrFl, log)];
3159
+ if (info.gradientFillMulti)
3160
+ effects.gradientOverlay = info.gradientFillMulti.map(function (i) { return parseEffectObject(i, log); });
3161
+ if (info.ChFX)
3162
+ effects.satin = parseEffectObject(info.ChFX, log);
3163
+ if (info.FrFX)
3164
+ effects.stroke = [parseFxObject(info.FrFX)];
3165
+ if (info.frameFXMulti)
3166
+ effects.stroke = info.frameFXMulti.map(function (i) { return parseFxObject(i); });
3167
+ return effects;
3168
+ }
3169
+ exports.parseEffects = parseEffects;
3170
+ function parseKeyList(keyList, logMissingFeatures) {
3171
+ var keys = [];
3172
+ for (var j = 0; j < keyList.length; j++) {
3173
+ var key = keyList[j];
3174
+ var time = key.time, selected = key.selected, animKey = key.animKey;
3175
+ var interpolation = exports.animInterpStyleEnum.decode(key.animInterpStyle);
3176
+ switch (animKey.Type) {
3177
+ case 'keyType.Opct':
3178
+ keys.push({ interpolation: interpolation, time: time, selected: selected, type: 'opacity', value: parsePercent(animKey.Opct) });
2712
3179
  break;
2713
- case 'invert':
2714
- result.Invr = !!val;
3180
+ case 'keyType.Pstn':
3181
+ keys.push({ interpolation: interpolation, time: time, selected: selected, type: 'position', x: animKey.Hrzn, y: animKey.Vrtc });
2715
3182
  break;
2716
- case 'reverse':
2717
- result.Rvrs = !!val;
3183
+ case 'keyType.Trnf':
3184
+ keys.push({
3185
+ interpolation: interpolation,
3186
+ time: time,
3187
+ selected: selected,
3188
+ type: 'transform',
3189
+ scale: horzVrtcToXY(animKey['Scl ']), skew: horzVrtcToXY(animKey.Skew), rotation: animKey.rotation, translation: horzVrtcToXY(animKey.translation)
3190
+ });
2718
3191
  break;
2719
- case 'color':
2720
- result['Clr '] = serializeColor(val);
3192
+ case 'keyType.sheetStyle': {
3193
+ var key_1 = { interpolation: interpolation, time: time, selected: selected, type: 'style' };
3194
+ if (animKey.sheetStyle.Lefx)
3195
+ key_1.style = parseEffects(animKey.sheetStyle.Lefx, logMissingFeatures);
3196
+ keys.push(key_1);
2721
3197
  break;
2722
- case 'highlightColor':
2723
- result.hglC = serializeColor(val);
3198
+ }
3199
+ case 'keyType.globalLighting': {
3200
+ keys.push({
3201
+ interpolation: interpolation,
3202
+ time: time,
3203
+ selected: selected,
3204
+ type: 'globalLighting',
3205
+ globalAngle: animKey.gblA, globalAltitude: animKey.globalAltitude
3206
+ });
2724
3207
  break;
2725
- case 'shadowColor':
2726
- result.sdwC = serializeColor(val);
3208
+ }
3209
+ default: throw new Error("Unsupported keyType value");
3210
+ }
3211
+ }
3212
+ return keys;
3213
+ }
3214
+ function serializeKeyList(keys) {
3215
+ var keyList = [];
3216
+ for (var j = 0; j < keys.length; j++) {
3217
+ var key = keys[j];
3218
+ var time = key.time, _a = key.selected, selected = _a === void 0 ? false : _a, interpolation = key.interpolation;
3219
+ var animInterpStyle = exports.animInterpStyleEnum.encode(interpolation);
3220
+ var animKey = void 0;
3221
+ switch (key.type) {
3222
+ case 'opacity':
3223
+ animKey = { Type: 'keyType.Opct', Opct: unitsPercent(key.value) };
2727
3224
  break;
2728
3225
  case 'position':
2729
- result.Styl = descriptor_1.FStl.encode(val);
2730
- break;
2731
- case 'blendMode':
2732
- result['Md '] = descriptor_1.BlnM.encode(val);
2733
- break;
2734
- case 'highlightBlendMode':
2735
- result.hglM = descriptor_1.BlnM.encode(val);
3226
+ animKey = { Type: 'keyType.Pstn', Hrzn: key.x, Vrtc: key.y };
2736
3227
  break;
2737
- case 'shadowBlendMode':
2738
- result.sdwM = descriptor_1.BlnM.encode(val);
3228
+ case 'transform':
3229
+ animKey = { Type: 'keyType.Trnf', 'Scl ': xyToHorzVrtc(key.scale), Skew: xyToHorzVrtc(key.skew), rotation: key.rotation, translation: xyToHorzVrtc(key.translation) };
2739
3230
  break;
2740
3231
  case 'style':
2741
- result.bvlS = descriptor_1.BESl.encode(val);
3232
+ animKey = { Type: 'keyType.sheetStyle', sheetStyle: { Vrsn: 1, blendOptions: {} } };
3233
+ if (key.style)
3234
+ animKey.sheetStyle = { Vrsn: 1, Lefx: serializeEffects(key.style, false, false), blendOptions: {} };
2742
3235
  break;
2743
- case 'direction':
2744
- result.bvlD = descriptor_1.BESs.encode(val);
3236
+ case 'globalLighting': {
3237
+ animKey = { Type: 'keyType.globalLighting', gblA: key.globalAngle, globalAltitude: key.globalAltitude };
2745
3238
  break;
2746
- case 'technique':
2747
- if (objName === 'bevel') {
2748
- result.bvlT = descriptor_1.bvlT.encode(val);
2749
- }
2750
- else {
2751
- result.GlwT = descriptor_1.BETE.encode(val);
2752
- }
3239
+ }
3240
+ default: throw new Error("Unsupported keyType value");
3241
+ }
3242
+ keyList.push({ Vrsn: 1, animInterpStyle: animInterpStyle, time: time, animKey: animKey, selected: selected });
3243
+ }
3244
+ return keyList;
3245
+ }
3246
+ function parseTrackList(trackList, logMissingFeatures) {
3247
+ var tracks = [];
3248
+ for (var i = 0; i < trackList.length; i++) {
3249
+ var tr = trackList[i];
3250
+ var track = {
3251
+ type: exports.stdTrackID.decode(tr.trackID),
3252
+ enabled: tr.enab,
3253
+ keys: parseKeyList(tr.keyList, logMissingFeatures),
3254
+ };
3255
+ if (tr.effectParams) {
3256
+ track.effectParams = {
3257
+ fillCanvas: tr.effectParams.fillCanvas,
3258
+ zoomOrigin: tr.effectParams.zoomOrigin,
3259
+ keys: parseKeyList(tr.effectParams.keyList, logMissingFeatures),
3260
+ };
3261
+ }
3262
+ tracks.push(track);
3263
+ }
3264
+ return tracks;
3265
+ }
3266
+ exports.parseTrackList = parseTrackList;
3267
+ function serializeTrackList(tracks) {
3268
+ var trackList = [];
3269
+ for (var i = 0; i < tracks.length; i++) {
3270
+ var t = tracks[i];
3271
+ trackList.push(__assign(__assign({ trackID: exports.stdTrackID.encode(t.type), Vrsn: 1, enab: !!t.enabled, Effc: !!t.effectParams }, (t.effectParams ? {
3272
+ effectParams: {
3273
+ keyList: serializeKeyList(t.keys),
3274
+ fillCanvas: t.effectParams.fillCanvas,
3275
+ zoomOrigin: t.effectParams.zoomOrigin,
3276
+ }
3277
+ } : {})), { keyList: serializeKeyList(t.keys) }));
3278
+ }
3279
+ return trackList;
3280
+ }
3281
+ exports.serializeTrackList = serializeTrackList;
3282
+ function parseEffectObject(obj, reportErrors) {
3283
+ var result = {};
3284
+ for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
3285
+ var key = _a[_i];
3286
+ var val = obj[key];
3287
+ switch (key) {
3288
+ case 'enab':
3289
+ result.enabled = !!val;
2753
3290
  break;
2754
- case 'source':
2755
- result.glwS = descriptor_1.IGSr.encode(val);
3291
+ case 'uglg':
3292
+ result.useGlobalLight = !!val;
2756
3293
  break;
2757
- case 'type':
2758
- result.Type = descriptor_1.GrdT.encode(val);
3294
+ case 'AntA':
3295
+ result.antialiased = !!val;
2759
3296
  break;
2760
- case 'interpolationMethod':
2761
- result.gs99 = descriptor_1.gradientInterpolationMethodType.encode(val);
3297
+ case 'Algn':
3298
+ result.align = !!val;
2762
3299
  break;
2763
- case 'opacity':
2764
- result.Opct = (0, descriptor_1.unitsPercent)(val);
3300
+ case 'Dthr':
3301
+ result.dither = !!val;
2765
3302
  break;
2766
- case 'highlightOpacity':
2767
- result.hglO = (0, descriptor_1.unitsPercent)(val);
3303
+ case 'Invr':
3304
+ result.invert = !!val;
2768
3305
  break;
2769
- case 'shadowOpacity':
2770
- result.sdwO = (0, descriptor_1.unitsPercent)(val);
3306
+ case 'Rvrs':
3307
+ result.reverse = !!val;
2771
3308
  break;
2772
- case 'angle':
2773
- if (objName === 'gradientOverlay') {
2774
- result.Angl = (0, descriptor_1.unitsAngle)(val);
2775
- }
2776
- else {
2777
- result.lagl = (0, descriptor_1.unitsAngle)(val);
2778
- }
3309
+ case 'Clr ':
3310
+ result.color = parseColor(val);
2779
3311
  break;
2780
- case 'altitude':
2781
- result.Lald = (0, descriptor_1.unitsAngle)(val);
3312
+ case 'hglC':
3313
+ result.highlightColor = parseColor(val);
2782
3314
  break;
2783
- case 'soften':
2784
- result.Sftn = (0, descriptor_1.unitsValue)(val, key);
3315
+ case 'sdwC':
3316
+ result.shadowColor = parseColor(val);
2785
3317
  break;
2786
- case 'strength':
2787
- result.srgR = (0, descriptor_1.unitsPercent)(val);
3318
+ case 'Styl':
3319
+ result.position = exports.FStl.decode(val);
2788
3320
  break;
2789
- case 'size':
2790
- result.blur = (0, descriptor_1.unitsValue)(val, key);
3321
+ case 'Md ':
3322
+ result.blendMode = exports.BlnM.decode(val);
2791
3323
  break;
2792
- case 'noise':
2793
- result.Nose = (0, descriptor_1.unitsPercent)(val);
3324
+ case 'hglM':
3325
+ result.highlightBlendMode = exports.BlnM.decode(val);
3326
+ break;
3327
+ case 'sdwM':
3328
+ result.shadowBlendMode = exports.BlnM.decode(val);
3329
+ break;
3330
+ case 'bvlS':
3331
+ result.style = exports.BESl.decode(val);
3332
+ break;
3333
+ case 'bvlD':
3334
+ result.direction = exports.BESs.decode(val);
3335
+ break;
3336
+ case 'bvlT':
3337
+ result.technique = exports.bvlT.decode(val);
3338
+ break;
3339
+ case 'GlwT':
3340
+ result.technique = exports.BETE.decode(val);
3341
+ break;
3342
+ case 'glwS':
3343
+ result.source = exports.IGSr.decode(val);
3344
+ break;
3345
+ case 'Type':
3346
+ result.type = exports.GrdT.decode(val);
3347
+ break;
3348
+ case 'gs99':
3349
+ result.interpolationMethod = exports.gradientInterpolationMethodType.decode(val);
3350
+ break;
3351
+ case 'Opct':
3352
+ result.opacity = parsePercent(val);
3353
+ break;
3354
+ case 'hglO':
3355
+ result.highlightOpacity = parsePercent(val);
3356
+ break;
3357
+ case 'sdwO':
3358
+ result.shadowOpacity = parsePercent(val);
3359
+ break;
3360
+ case 'lagl':
3361
+ result.angle = parseAngle(val);
3362
+ break;
3363
+ case 'Angl':
3364
+ result.angle = parseAngle(val);
3365
+ break;
3366
+ case 'Lald':
3367
+ result.altitude = parseAngle(val);
3368
+ break;
3369
+ case 'Sftn':
3370
+ result.soften = parseUnits(val);
3371
+ break;
3372
+ case 'srgR':
3373
+ result.strength = parsePercent(val);
3374
+ break;
3375
+ case 'blur':
3376
+ result.size = parseUnits(val);
3377
+ break;
3378
+ case 'Nose':
3379
+ result.noise = parsePercent(val);
3380
+ break;
3381
+ case 'Inpr':
3382
+ result.range = parsePercent(val);
3383
+ break;
3384
+ case 'Ckmt':
3385
+ result.choke = parseUnits(val);
3386
+ break;
3387
+ case 'ShdN':
3388
+ result.jitter = parsePercent(val);
3389
+ break;
3390
+ case 'Dstn':
3391
+ result.distance = parseUnits(val);
3392
+ break;
3393
+ case 'Scl ':
3394
+ result.scale = parsePercent(val);
3395
+ break;
3396
+ case 'Ptrn':
3397
+ result.pattern = { name: val['Nm '], id: val.Idnt };
3398
+ break;
3399
+ case 'phase':
3400
+ result.phase = { x: val.Hrzn, y: val.Vrtc };
3401
+ break;
3402
+ case 'Ofst':
3403
+ result.offset = { x: parsePercent(val.Hrzn), y: parsePercent(val.Vrtc) };
3404
+ break;
3405
+ case 'MpgS':
3406
+ case 'TrnS':
3407
+ result.contour = {
3408
+ name: val['Nm '],
3409
+ curve: val['Crv '].map(function (p) { return ({ x: p.Hrzn, y: p.Vrtc }); }),
3410
+ };
3411
+ break;
3412
+ case 'Grad':
3413
+ result.gradient = parseGradient(val);
3414
+ break;
3415
+ case 'useTexture':
3416
+ case 'useShape':
3417
+ case 'layerConceals':
3418
+ case 'present':
3419
+ case 'showInDialog':
3420
+ case 'antialiasGloss':
3421
+ result[key] = val;
3422
+ break;
3423
+ default:
3424
+ reportErrors && console.log("Invalid effect key: '".concat(key, "', value:"), val);
3425
+ }
3426
+ }
3427
+ return result;
3428
+ }
3429
+ function serializeEffectObject(obj, objName, reportErrors) {
3430
+ var result = {};
3431
+ for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
3432
+ var objKey = _a[_i];
3433
+ var key = objKey;
3434
+ var val = obj[key];
3435
+ switch (key) {
3436
+ case 'enabled':
3437
+ result.enab = !!val;
3438
+ break;
3439
+ case 'useGlobalLight':
3440
+ result.uglg = !!val;
3441
+ break;
3442
+ case 'antialiased':
3443
+ result.AntA = !!val;
3444
+ break;
3445
+ case 'align':
3446
+ result.Algn = !!val;
3447
+ break;
3448
+ case 'dither':
3449
+ result.Dthr = !!val;
3450
+ break;
3451
+ case 'invert':
3452
+ result.Invr = !!val;
3453
+ break;
3454
+ case 'reverse':
3455
+ result.Rvrs = !!val;
3456
+ break;
3457
+ case 'color':
3458
+ result['Clr '] = serializeColor(val);
3459
+ break;
3460
+ case 'highlightColor':
3461
+ result.hglC = serializeColor(val);
3462
+ break;
3463
+ case 'shadowColor':
3464
+ result.sdwC = serializeColor(val);
3465
+ break;
3466
+ case 'position':
3467
+ result.Styl = exports.FStl.encode(val);
3468
+ break;
3469
+ case 'blendMode':
3470
+ result['Md '] = exports.BlnM.encode(val);
3471
+ break;
3472
+ case 'highlightBlendMode':
3473
+ result.hglM = exports.BlnM.encode(val);
3474
+ break;
3475
+ case 'shadowBlendMode':
3476
+ result.sdwM = exports.BlnM.encode(val);
3477
+ break;
3478
+ case 'style':
3479
+ result.bvlS = exports.BESl.encode(val);
3480
+ break;
3481
+ case 'direction':
3482
+ result.bvlD = exports.BESs.encode(val);
3483
+ break;
3484
+ case 'technique':
3485
+ if (objName === 'bevel') {
3486
+ result.bvlT = exports.bvlT.encode(val);
3487
+ }
3488
+ else {
3489
+ result.GlwT = exports.BETE.encode(val);
3490
+ }
3491
+ break;
3492
+ case 'source':
3493
+ result.glwS = exports.IGSr.encode(val);
3494
+ break;
3495
+ case 'type':
3496
+ result.Type = exports.GrdT.encode(val);
3497
+ break;
3498
+ case 'interpolationMethod':
3499
+ result.gs99 = exports.gradientInterpolationMethodType.encode(val);
3500
+ break;
3501
+ case 'opacity':
3502
+ result.Opct = unitsPercent(val);
3503
+ break;
3504
+ case 'highlightOpacity':
3505
+ result.hglO = unitsPercent(val);
3506
+ break;
3507
+ case 'shadowOpacity':
3508
+ result.sdwO = unitsPercent(val);
3509
+ break;
3510
+ case 'angle':
3511
+ if (objName === 'gradientOverlay') {
3512
+ result.Angl = unitsAngle(val);
3513
+ }
3514
+ else {
3515
+ result.lagl = unitsAngle(val);
3516
+ }
3517
+ break;
3518
+ case 'altitude':
3519
+ result.Lald = unitsAngle(val);
3520
+ break;
3521
+ case 'soften':
3522
+ result.Sftn = unitsValue(val, key);
3523
+ break;
3524
+ case 'strength':
3525
+ result.srgR = unitsPercent(val);
3526
+ break;
3527
+ case 'size':
3528
+ result.blur = unitsValue(val, key);
3529
+ break;
3530
+ case 'noise':
3531
+ result.Nose = unitsPercent(val);
2794
3532
  break;
2795
3533
  case 'range':
2796
- result.Inpr = (0, descriptor_1.unitsPercent)(val);
3534
+ result.Inpr = unitsPercent(val);
2797
3535
  break;
2798
3536
  case 'choke':
2799
- result.Ckmt = (0, descriptor_1.unitsValue)(val, key);
3537
+ result.Ckmt = unitsValue(val, key);
2800
3538
  break;
2801
3539
  case 'jitter':
2802
- result.ShdN = (0, descriptor_1.unitsPercent)(val);
3540
+ result.ShdN = unitsPercent(val);
2803
3541
  break;
2804
3542
  case 'distance':
2805
- result.Dstn = (0, descriptor_1.unitsValue)(val, key);
3543
+ result.Dstn = unitsValue(val, key);
2806
3544
  break;
2807
3545
  case 'scale':
2808
- result['Scl '] = (0, descriptor_1.unitsPercent)(val);
3546
+ result['Scl '] = unitsPercent(val);
2809
3547
  break;
2810
3548
  case 'pattern':
2811
3549
  result.Ptrn = { 'Nm ': val.name, Idnt: val.id };
@@ -2814,7 +3552,7 @@ function serializeEffectObject(obj, objName, reportErrors) {
2814
3552
  result.phase = { Hrzn: val.x, Vrtc: val.y };
2815
3553
  break;
2816
3554
  case 'offset':
2817
- result.Ofst = { Hrzn: (0, descriptor_1.unitsPercent)(val.x), Vrtc: (0, descriptor_1.unitsPercent)(val.y) };
3555
+ result.Ofst = { Hrzn: unitsPercent(val.x), Vrtc: unitsPercent(val.y) };
2818
3556
  break;
2819
3557
  case 'contour': {
2820
3558
  result[objName === 'satin' ? 'MpgS' : 'TrnS'] = {
@@ -2840,641 +3578,219 @@ function serializeEffectObject(obj, objName, reportErrors) {
2840
3578
  }
2841
3579
  return result;
2842
3580
  }
2843
-
2844
-
2845
- },{"./descriptor":4,"./effectsHelpers":5,"./engineData":6,"./helpers":7,"./psdReader":11,"./psdWriter":12,"./text":13,"base64-js":15}],3:[function(require,module,exports){
2846
- "use strict";
2847
- var __assign = (this && this.__assign) || function () {
2848
- __assign = Object.assign || function(t) {
2849
- for (var s, i = 1, n = arguments.length; i < n; i++) {
2850
- s = arguments[i];
2851
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
2852
- t[p] = s[p];
2853
- }
2854
- return t;
2855
- };
2856
- return __assign.apply(this, arguments);
2857
- };
2858
- Object.defineProperty(exports, "__esModule", { value: true });
2859
- exports.readCsh = void 0;
2860
- var additionalInfo_1 = require("./additionalInfo");
2861
- var psdReader_1 = require("./psdReader");
2862
- function readCsh(buffer) {
2863
- var reader = (0, psdReader_1.createReader)(buffer.buffer, buffer.byteOffset, buffer.byteLength);
2864
- var csh = { shapes: [] };
2865
- (0, psdReader_1.checkSignature)(reader, 'cush');
2866
- if ((0, psdReader_1.readUint32)(reader) !== 2)
2867
- throw new Error('Invalid version');
2868
- var count = (0, psdReader_1.readUint32)(reader);
2869
- for (var i = 0; i < count; i++) {
2870
- var name_1 = (0, psdReader_1.readUnicodeString)(reader);
2871
- while (reader.offset % 4)
2872
- reader.offset++; // pad to 4byte bounds
2873
- if ((0, psdReader_1.readUint32)(reader) !== 1)
2874
- throw new Error('Invalid shape version');
2875
- var size = (0, psdReader_1.readUint32)(reader);
2876
- var end = reader.offset + size;
2877
- var id = (0, psdReader_1.readPascalString)(reader, 1);
2878
- // this might not be correct ???
2879
- var y1 = (0, psdReader_1.readUint32)(reader);
2880
- var x1 = (0, psdReader_1.readUint32)(reader);
2881
- var y2 = (0, psdReader_1.readUint32)(reader);
2882
- var x2 = (0, psdReader_1.readUint32)(reader);
2883
- var width = x2 - x1;
2884
- var height = y2 - y1;
2885
- var mask = { paths: [] };
2886
- (0, additionalInfo_1.readVectorMask)(reader, mask, width, height, end - reader.offset);
2887
- csh.shapes.push(__assign({ name: name_1, id: id, width: width, height: height }, mask));
2888
- reader.offset = end;
3581
+ function parseGradient(grad) {
3582
+ if (grad.GrdF === 'GrdF.CstS') {
3583
+ var samples_1 = grad.Intr || 4096;
3584
+ return {
3585
+ type: 'solid',
3586
+ name: grad['Nm '],
3587
+ smoothness: grad.Intr / 4096,
3588
+ colorStops: grad.Clrs.map(function (s) { return ({
3589
+ color: parseColor(s['Clr ']),
3590
+ location: s.Lctn / samples_1,
3591
+ midpoint: s.Mdpn / 100,
3592
+ }); }),
3593
+ opacityStops: grad.Trns.map(function (s) { return ({
3594
+ opacity: parsePercent(s.Opct),
3595
+ location: s.Lctn / samples_1,
3596
+ midpoint: s.Mdpn / 100,
3597
+ }); }),
3598
+ };
3599
+ }
3600
+ else {
3601
+ return {
3602
+ type: 'noise',
3603
+ name: grad['Nm '],
3604
+ roughness: grad.Smth / 4096,
3605
+ colorModel: exports.ClrS.decode(grad.ClrS),
3606
+ randomSeed: grad.RndS,
3607
+ restrictColors: !!grad.VctC,
3608
+ addTransparency: !!grad.ShTr,
3609
+ min: grad['Mnm '].map(function (x) { return x / 100; }),
3610
+ max: grad['Mxm '].map(function (x) { return x / 100; }),
3611
+ };
2889
3612
  }
2890
- return csh;
2891
- }
2892
- exports.readCsh = readCsh;
2893
-
2894
-
2895
- },{"./additionalInfo":2,"./psdReader":11}],4:[function(require,module,exports){
2896
- "use strict";
2897
- Object.defineProperty(exports, "__esModule", { value: true });
2898
- exports.strokeStyleLineAlignment = exports.strokeStyleLineJoinType = exports.strokeStyleLineCapType = exports.FrFl = exports.FStl = exports.ClrS = exports.gradientInterpolationMethodType = exports.GrdT = exports.IGSr = exports.BETE = exports.BESs = exports.bvlT = exports.BESl = exports.BlnM = exports.warpStyle = exports.Annt = exports.Ornt = exports.textGridding = exports.unitsValue = exports.unitsPercent = exports.unitsAngle = exports.parseUnitsToNumber = exports.parseUnitsOrNumber = exports.parseUnits = exports.parsePercentOrAngle = exports.parsePercent = exports.parseAngle = exports.writeVersionAndDescriptor = exports.readVersionAndDescriptor = exports.writeDescriptorStructure = exports.readDescriptorStructure = exports.readAsciiStringOrClassId = exports.setLogErrors = void 0;
2899
- var helpers_1 = require("./helpers");
2900
- var psdReader_1 = require("./psdReader");
2901
- var psdWriter_1 = require("./psdWriter");
2902
- function revMap(map) {
2903
- var result = {};
2904
- Object.keys(map).forEach(function (key) { return result[map[key]] = key; });
2905
- return result;
2906
3613
  }
2907
- var unitsMap = {
2908
- '#Ang': 'Angle',
2909
- '#Rsl': 'Density',
2910
- '#Rlt': 'Distance',
2911
- '#Nne': 'None',
2912
- '#Prc': 'Percent',
2913
- '#Pxl': 'Pixels',
2914
- '#Mlm': 'Millimeters',
2915
- '#Pnt': 'Points',
2916
- 'RrPi': 'Picas',
2917
- 'RrIn': 'Inches',
2918
- 'RrCm': 'Centimeters',
2919
- };
2920
- var unitsMapRev = revMap(unitsMap);
2921
- var logErrors = false;
2922
- function setLogErrors(value) {
2923
- logErrors = value;
2924
- }
2925
- exports.setLogErrors = setLogErrors;
2926
- function makeType(name, classID) {
2927
- return { name: name, classID: classID };
2928
- }
2929
- var fieldToExtType = {
2930
- strokeStyleContent: makeType('', 'solidColorLayer'),
2931
- // printProofSetup: makeType('校样设置', 'proofSetup'), // TESTING
2932
- printProofSetup: makeType('Proof Setup', 'proofSetup'),
2933
- patternFill: makeType('', 'patternFill'),
2934
- Grad: makeType('Gradient', 'Grdn'),
2935
- ebbl: makeType('', 'ebbl'),
2936
- SoFi: makeType('', 'SoFi'),
2937
- GrFl: makeType('', 'GrFl'),
2938
- sdwC: makeType('', 'RGBC'),
2939
- hglC: makeType('', 'RGBC'),
2940
- 'Clr ': makeType('', 'RGBC'),
2941
- 'tintColor': makeType('', 'RGBC'),
2942
- Ofst: makeType('', 'Pnt '),
2943
- ChFX: makeType('', 'ChFX'),
2944
- MpgS: makeType('', 'ShpC'),
2945
- DrSh: makeType('', 'DrSh'),
2946
- IrSh: makeType('', 'IrSh'),
2947
- OrGl: makeType('', 'OrGl'),
2948
- IrGl: makeType('', 'IrGl'),
2949
- TrnS: makeType('', 'ShpC'),
2950
- Ptrn: makeType('', 'Ptrn'),
2951
- FrFX: makeType('', 'FrFX'),
2952
- phase: makeType('', 'Pnt '),
2953
- frameStep: makeType('', 'null'),
2954
- duration: makeType('', 'null'),
2955
- bounds: makeType('', 'Rctn'),
2956
- customEnvelopeWarp: makeType('', 'customEnvelopeWarp'),
2957
- warp: makeType('', 'warp'),
2958
- 'Sz ': makeType('', 'Pnt '),
2959
- origin: makeType('', 'Pnt '),
2960
- autoExpandOffset: makeType('', 'Pnt '),
2961
- keyOriginShapeBBox: makeType('', 'unitRect'),
2962
- Vrsn: makeType('', 'null'),
2963
- psVersion: makeType('', 'null'),
2964
- docDefaultNewArtboardBackgroundColor: makeType('', 'RGBC'),
2965
- artboardRect: makeType('', 'classFloatRect'),
2966
- keyOriginRRectRadii: makeType('', 'radii'),
2967
- keyOriginBoxCorners: makeType('', 'null'),
2968
- rectangleCornerA: makeType('', 'Pnt '),
2969
- rectangleCornerB: makeType('', 'Pnt '),
2970
- rectangleCornerC: makeType('', 'Pnt '),
2971
- rectangleCornerD: makeType('', 'Pnt '),
2972
- compInfo: makeType('', 'null'),
2973
- Trnf: makeType('Transform', 'Trnf'),
2974
- quiltWarp: makeType('', 'quiltWarp'),
2975
- generatorSettings: makeType('', 'null'),
2976
- crema: makeType('', 'null'),
2977
- };
2978
- var fieldToArrayExtType = {
2979
- 'Crv ': makeType('', 'CrPt'),
2980
- Clrs: makeType('', 'Clrt'),
2981
- Trns: makeType('', 'TrnS'),
2982
- keyDescriptorList: makeType('', 'null'),
2983
- solidFillMulti: makeType('', 'SoFi'),
2984
- gradientFillMulti: makeType('', 'GrFl'),
2985
- dropShadowMulti: makeType('', 'DrSh'),
2986
- innerShadowMulti: makeType('', 'IrSh'),
2987
- frameFXMulti: makeType('', 'FrFX'),
2988
- };
2989
- var typeToField = {
2990
- 'TEXT': [
2991
- 'Txt ', 'printerName', 'Nm ', 'Idnt', 'blackAndWhitePresetFileName', 'LUT3DFileName',
2992
- 'presetFileName', 'curvesPresetFileName', 'mixerPresetFileName', 'placed', 'description', 'reason',
2993
- 'artboardPresetName', 'json',
2994
- ],
2995
- 'tdta': ['EngineData', 'LUT3DFileData'],
2996
- 'long': [
2997
- 'TextIndex', 'RndS', 'Mdpn', 'Smth', 'Lctn', 'strokeStyleVersion', 'LaID', 'Vrsn', 'Cnt ',
2998
- 'Brgh', 'Cntr', 'means', 'vibrance', 'Strt', 'bwPresetKind', 'presetKind', 'comp', 'compID', 'originalCompID',
2999
- 'curvesPresetKind', 'mixerPresetKind', 'uOrder', 'vOrder', 'PgNm', 'totalPages', 'Crop',
3000
- 'numerator', 'denominator', 'frameCount', 'Annt', 'keyOriginType', 'unitValueQuadVersion',
3001
- 'keyOriginIndex', 'major', 'minor', 'fix', 'docDefaultNewArtboardBackgroundType', 'artboardBackgroundType',
3002
- 'numModifyingFX', 'deformNumRows', 'deformNumCols',
3003
- ],
3004
- 'enum': [
3005
- 'textGridding', 'Ornt', 'warpStyle', 'warpRotate', 'Inte', 'Bltn', 'ClrS',
3006
- 'sdwM', 'hglM', 'bvlT', 'bvlS', 'bvlD', 'Md ', 'glwS', 'GrdF', 'GlwT',
3007
- 'strokeStyleLineCapType', 'strokeStyleLineJoinType', 'strokeStyleLineAlignment',
3008
- 'strokeStyleBlendMode', 'PntT', 'Styl', 'lookupType', 'LUTFormat', 'dataOrder',
3009
- 'tableOrder', 'enableCompCore', 'enableCompCoreGPU', 'compCoreSupport', 'compCoreGPUSupport', 'Engn',
3010
- 'enableCompCoreThreads', 'gs99',
3011
- ],
3012
- 'bool': [
3013
- 'PstS', 'printSixteenBit', 'masterFXSwitch', 'enab', 'uglg', 'antialiasGloss',
3014
- 'useShape', 'useTexture', 'masterFXSwitch', 'uglg', 'antialiasGloss', 'useShape',
3015
- 'useTexture', 'Algn', 'Rvrs', 'Dthr', 'Invr', 'VctC', 'ShTr', 'layerConceals',
3016
- 'strokeEnabled', 'fillEnabled', 'strokeStyleScaleLock', 'strokeStyleStrokeAdjust',
3017
- 'hardProof', 'MpBl', 'paperWhite', 'useLegacy', 'Auto', 'Lab ', 'useTint', 'keyShapeInvalidated',
3018
- 'autoExpandEnabled', 'autoNestEnabled', 'autoPositionEnabled', 'shrinkwrapOnSaveEnabled',
3019
- 'present', 'showInDialog', 'overprint',
3020
- ],
3021
- 'doub': [
3022
- 'warpValue', 'warpPerspective', 'warpPerspectiveOther', 'Intr', 'Wdth', 'Hght',
3023
- 'strokeStyleMiterLimit', 'strokeStyleResolution', 'layerTime', 'keyOriginResolution',
3024
- 'xx', 'xy', 'yx', 'yy', 'tx', 'ty',
3025
- ],
3026
- 'UntF': [
3027
- 'Scl ', 'sdwO', 'hglO', 'lagl', 'Lald', 'srgR', 'blur', 'Sftn', 'Opct', 'Dstn', 'Angl',
3028
- 'Ckmt', 'Nose', 'Inpr', 'ShdN', 'strokeStyleLineWidth', 'strokeStyleLineDashOffset',
3029
- 'strokeStyleOpacity', 'H ', 'Top ', 'Left', 'Btom', 'Rght', 'Rslt',
3030
- 'topRight', 'topLeft', 'bottomLeft', 'bottomRight',
3031
- ],
3032
- 'VlLs': [
3033
- 'Crv ', 'Clrs', 'Mnm ', 'Mxm ', 'Trns', 'pathList', 'strokeStyleLineDashSet', 'FrLs',
3034
- 'LaSt', 'Trnf', 'nonAffineTransform', 'keyDescriptorList', 'guideIndeces', 'gradientFillMulti',
3035
- 'solidFillMulti', 'frameFXMulti', 'innerShadowMulti', 'dropShadowMulti',
3036
- ],
3037
- 'ObAr': ['meshPoints', 'quiltSliceX', 'quiltSliceY'],
3038
- 'obj ': ['null'],
3039
- };
3040
- var channels = [
3041
- 'Rd ', 'Grn ', 'Bl ', 'Yllw', 'Ylw ', 'Cyn ', 'Mgnt', 'Blck', 'Gry ', 'Lmnc', 'A ', 'B ',
3042
- ];
3043
- var fieldToArrayType = {
3044
- 'Mnm ': 'long',
3045
- 'Mxm ': 'long',
3046
- 'FrLs': 'long',
3047
- 'strokeStyleLineDashSet': 'UntF',
3048
- 'Trnf': 'doub',
3049
- 'nonAffineTransform': 'doub',
3050
- 'keyDescriptorList': 'Objc',
3051
- 'gradientFillMulti': 'Objc',
3052
- 'solidFillMulti': 'Objc',
3053
- 'frameFXMulti': 'Objc',
3054
- 'innerShadowMulti': 'Objc',
3055
- 'dropShadowMulti': 'Objc',
3056
- };
3057
- var fieldToType = {};
3058
- for (var _i = 0, _a = Object.keys(typeToField); _i < _a.length; _i++) {
3059
- var type = _a[_i];
3060
- for (var _b = 0, _c = typeToField[type]; _b < _c.length; _b++) {
3061
- var field = _c[_b];
3062
- fieldToType[field] = type;
3063
- }
3064
- }
3065
- for (var _d = 0, _e = Object.keys(fieldToExtType); _d < _e.length; _d++) {
3066
- var field = _e[_d];
3067
- if (!fieldToType[field])
3068
- fieldToType[field] = 'Objc';
3069
- }
3070
- for (var _f = 0, _g = Object.keys(fieldToArrayExtType); _f < _g.length; _f++) {
3071
- var field = _g[_f];
3072
- fieldToArrayType[field] = 'Objc';
3073
- }
3074
- function getTypeByKey(key, value, root) {
3075
- if (key === 'Sz ') {
3076
- return ('Wdth' in value) ? 'Objc' : (('units' in value) ? 'UntF' : 'doub');
3077
- }
3078
- else if (key === 'Type') {
3079
- return typeof value === 'string' ? 'enum' : 'long';
3080
- }
3081
- else if (key === 'AntA') {
3082
- return typeof value === 'string' ? 'enum' : 'bool';
3083
- }
3084
- else if (key === 'Hrzn' || key === 'Vrtc' || key === 'Top ' || key === 'Left' || key === 'Btom' || key === 'Rght') {
3085
- return typeof value === 'number' ? 'doub' : 'UntF';
3086
- }
3087
- else if (key === 'Vrsn') {
3088
- return typeof value === 'number' ? 'long' : 'Objc';
3089
- }
3090
- else if (key === 'Rd ' || key === 'Grn ' || key === 'Bl ') {
3091
- return root === 'artd' ? 'long' : 'doub';
3092
- }
3093
- else if (key === 'Trnf') {
3094
- return Array.isArray(value) ? 'VlLs' : 'Objc';
3095
- }
3096
- else {
3097
- return fieldToType[key];
3098
- }
3099
- }
3100
- function readAsciiStringOrClassId(reader) {
3101
- var length = (0, psdReader_1.readInt32)(reader);
3102
- return (0, psdReader_1.readAsciiString)(reader, length || 4);
3103
- }
3104
- exports.readAsciiStringOrClassId = readAsciiStringOrClassId;
3105
- function writeAsciiStringOrClassId(writer, value) {
3106
- if (value.length === 4 && value !== 'warp') {
3107
- // write classId
3108
- (0, psdWriter_1.writeInt32)(writer, 0);
3109
- (0, psdWriter_1.writeSignature)(writer, value);
3614
+ function serializeGradient(grad) {
3615
+ var _a, _b;
3616
+ if (grad.type === 'solid') {
3617
+ var samples_2 = Math.round(((_a = grad.smoothness) !== null && _a !== void 0 ? _a : 1) * 4096);
3618
+ return {
3619
+ 'Nm ': grad.name || '',
3620
+ GrdF: 'GrdF.CstS',
3621
+ Intr: samples_2,
3622
+ Clrs: grad.colorStops.map(function (s) {
3623
+ var _a;
3624
+ return ({
3625
+ 'Clr ': serializeColor(s.color),
3626
+ Type: 'Clry.UsrS',
3627
+ Lctn: Math.round(s.location * samples_2),
3628
+ Mdpn: Math.round(((_a = s.midpoint) !== null && _a !== void 0 ? _a : 0.5) * 100),
3629
+ });
3630
+ }),
3631
+ Trns: grad.opacityStops.map(function (s) {
3632
+ var _a;
3633
+ return ({
3634
+ Opct: unitsPercent(s.opacity),
3635
+ Lctn: Math.round(s.location * samples_2),
3636
+ Mdpn: Math.round(((_a = s.midpoint) !== null && _a !== void 0 ? _a : 0.5) * 100),
3637
+ });
3638
+ }),
3639
+ };
3110
3640
  }
3111
3641
  else {
3112
- // write ascii string
3113
- (0, psdWriter_1.writeInt32)(writer, value.length);
3114
- for (var i = 0; i < value.length; i++) {
3115
- (0, psdWriter_1.writeUint8)(writer, value.charCodeAt(i));
3116
- }
3117
- }
3118
- }
3119
- function readDescriptorStructure(reader) {
3120
- var object = {};
3121
- // object.__struct =
3122
- readClassStructure(reader);
3123
- var itemsCount = (0, psdReader_1.readUint32)(reader);
3124
- for (var i = 0; i < itemsCount; i++) {
3125
- var key = readAsciiStringOrClassId(reader);
3126
- var type = (0, psdReader_1.readSignature)(reader);
3127
- // console.log(`> '${key}' '${type}'`);
3128
- var data = readOSType(reader, type);
3129
- // if (!getTypeByKey(key, data)) console.log(`> '${key}' '${type}'`, data);
3130
- object[key] = data;
3131
- }
3132
- // console.log('//', struct);
3133
- return object;
3134
- }
3135
- exports.readDescriptorStructure = readDescriptorStructure;
3136
- function writeDescriptorStructure(writer, name, classId, value, root) {
3137
- if (logErrors && !classId)
3138
- console.log('Missing classId for: ', name, classId, value);
3139
- // write class structure
3140
- (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, name);
3141
- writeAsciiStringOrClassId(writer, classId);
3142
- var keys = Object.keys(value);
3143
- (0, psdWriter_1.writeUint32)(writer, keys.length);
3144
- for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
3145
- var key = keys_1[_i];
3146
- var type = getTypeByKey(key, value[key], root);
3147
- var extType = fieldToExtType[key];
3148
- if ((key === 'Strt' || key === 'Brgh') && 'H ' in value) {
3149
- type = 'doub';
3150
- }
3151
- else if (channels.indexOf(key) !== -1) {
3152
- type = (classId === 'RGBC' && root !== 'artd') ? 'doub' : 'long';
3153
- }
3154
- else if (key === 'profile') {
3155
- type = classId === 'printOutput' ? 'TEXT' : 'tdta';
3156
- }
3157
- else if (key === 'strokeStyleContent') {
3158
- if (value[key]['Clr ']) {
3159
- extType = makeType('', 'solidColorLayer');
3160
- }
3161
- else if (value[key].Grad) {
3162
- extType = makeType('', 'gradientLayer');
3163
- }
3164
- else if (value[key].Ptrn) {
3165
- extType = makeType('', 'patternLayer');
3166
- }
3167
- else {
3168
- logErrors && console.log('Invalid strokeStyleContent value', value[key]);
3169
- }
3170
- }
3171
- else if (key === 'bounds' && root === 'quiltWarp') {
3172
- extType = makeType('', 'classFloatRect');
3173
- }
3174
- if (extType && extType.classID === 'RGBC') {
3175
- if ('H ' in value[key])
3176
- extType = { classID: 'HSBC', name: '' };
3177
- // TODO: other color spaces
3178
- }
3179
- writeAsciiStringOrClassId(writer, key);
3180
- (0, psdWriter_1.writeSignature)(writer, type || 'long');
3181
- writeOSType(writer, type || 'long', value[key], key, extType, root);
3182
- if (logErrors && !type)
3183
- console.log("Missing descriptor field type for: '".concat(key, "' in"), value);
3184
- }
3185
- }
3186
- exports.writeDescriptorStructure = writeDescriptorStructure;
3187
- function readOSType(reader, type) {
3188
- switch (type) {
3189
- case 'obj ': // Reference
3190
- return readReferenceStructure(reader);
3191
- case 'Objc': // Descriptor
3192
- case 'GlbO': // GlobalObject same as Descriptor
3193
- return readDescriptorStructure(reader);
3194
- case 'VlLs': { // List
3195
- var length_1 = (0, psdReader_1.readInt32)(reader);
3196
- var items = [];
3197
- for (var i = 0; i < length_1; i++) {
3198
- var type_1 = (0, psdReader_1.readSignature)(reader);
3199
- // console.log(' >', type);
3200
- items.push(readOSType(reader, type_1));
3201
- }
3202
- return items;
3203
- }
3204
- case 'doub': // Double
3205
- return (0, psdReader_1.readFloat64)(reader);
3206
- case 'UntF': { // Unit double
3207
- var units = (0, psdReader_1.readSignature)(reader);
3208
- var value = (0, psdReader_1.readFloat64)(reader);
3209
- if (!unitsMap[units])
3210
- throw new Error("Invalid units: ".concat(units));
3211
- return { units: unitsMap[units], value: value };
3212
- }
3213
- case 'UnFl': { // Unit float
3214
- var units = (0, psdReader_1.readSignature)(reader);
3215
- var value = (0, psdReader_1.readFloat32)(reader);
3216
- if (!unitsMap[units])
3217
- throw new Error("Invalid units: ".concat(units));
3218
- return { units: unitsMap[units], value: value };
3219
- }
3220
- case 'TEXT': // String
3221
- return (0, psdReader_1.readUnicodeString)(reader);
3222
- case 'enum': { // Enumerated
3223
- var type_2 = readAsciiStringOrClassId(reader);
3224
- var value = readAsciiStringOrClassId(reader);
3225
- return "".concat(type_2, ".").concat(value);
3226
- }
3227
- case 'long': // Integer
3228
- return (0, psdReader_1.readInt32)(reader);
3229
- case 'comp': { // Large Integer
3230
- var low = (0, psdReader_1.readUint32)(reader);
3231
- var high = (0, psdReader_1.readUint32)(reader);
3232
- return { low: low, high: high };
3233
- }
3234
- case 'bool': // Boolean
3235
- return !!(0, psdReader_1.readUint8)(reader);
3236
- case 'type': // Class
3237
- case 'GlbC': // Class
3238
- return readClassStructure(reader);
3239
- case 'alis': { // Alias
3240
- var length_2 = (0, psdReader_1.readInt32)(reader);
3241
- return (0, psdReader_1.readAsciiString)(reader, length_2);
3242
- }
3243
- case 'tdta': { // Raw Data
3244
- var length_3 = (0, psdReader_1.readInt32)(reader);
3245
- return (0, psdReader_1.readBytes)(reader, length_3);
3246
- }
3247
- case 'ObAr': { // Object array
3248
- (0, psdReader_1.readInt32)(reader); // version: 16
3249
- (0, psdReader_1.readUnicodeString)(reader); // name: ''
3250
- readAsciiStringOrClassId(reader); // 'rationalPoint'
3251
- var length_4 = (0, psdReader_1.readInt32)(reader);
3252
- var items = [];
3253
- for (var i = 0; i < length_4; i++) {
3254
- var type1 = readAsciiStringOrClassId(reader); // type Hrzn | Vrtc
3255
- (0, psdReader_1.readSignature)(reader); // UnFl
3256
- (0, psdReader_1.readSignature)(reader); // units ? '#Pxl'
3257
- var valuesCount = (0, psdReader_1.readInt32)(reader);
3258
- var values = [];
3259
- for (var j = 0; j < valuesCount; j++) {
3260
- values.push((0, psdReader_1.readFloat64)(reader));
3261
- }
3262
- items.push({ type: type1, values: values });
3263
- }
3264
- return items;
3265
- }
3266
- case 'Pth ': { // File path
3267
- /*const length =*/ (0, psdReader_1.readInt32)(reader);
3268
- var sig = (0, psdReader_1.readSignature)(reader);
3269
- /*const pathSize =*/ (0, psdReader_1.readInt32LE)(reader);
3270
- var charsCount = (0, psdReader_1.readInt32LE)(reader);
3271
- var path = (0, psdReader_1.readUnicodeStringWithLength)(reader, charsCount);
3272
- return { sig: sig, path: path };
3273
- }
3274
- default:
3275
- throw new Error("Invalid TySh descriptor OSType: ".concat(type, " at ").concat(reader.offset.toString(16)));
3642
+ return {
3643
+ GrdF: 'GrdF.ClNs',
3644
+ 'Nm ': grad.name || '',
3645
+ ShTr: !!grad.addTransparency,
3646
+ VctC: !!grad.restrictColors,
3647
+ ClrS: exports.ClrS.encode(grad.colorModel),
3648
+ RndS: grad.randomSeed || 0,
3649
+ Smth: Math.round(((_b = grad.roughness) !== null && _b !== void 0 ? _b : 1) * 4096),
3650
+ 'Mnm ': (grad.min || [0, 0, 0, 0]).map(function (x) { return x * 100; }),
3651
+ 'Mxm ': (grad.max || [1, 1, 1, 1]).map(function (x) { return x * 100; }),
3652
+ };
3276
3653
  }
3277
3654
  }
3278
- var ObArTypes = {
3279
- meshPoints: 'rationalPoint',
3280
- quiltSliceX: 'UntF',
3281
- quiltSliceY: 'UntF',
3282
- };
3283
- function writeOSType(writer, type, value, key, extType, root) {
3284
- switch (type) {
3285
- case 'obj ': // Reference
3286
- writeReferenceStructure(writer, key, value);
3287
- break;
3288
- case 'Objc': // Descriptor
3289
- case 'GlbO': // GlobalObject same as Descriptor
3290
- if (!extType)
3291
- throw new Error("Missing ext type for: '".concat(key, "' (").concat(JSON.stringify(value), ")"));
3292
- writeDescriptorStructure(writer, extType.name, extType.classID, value, root);
3293
- break;
3294
- case 'VlLs': // List
3295
- (0, psdWriter_1.writeInt32)(writer, value.length);
3296
- for (var i = 0; i < value.length; i++) {
3297
- var type_3 = fieldToArrayType[key];
3298
- (0, psdWriter_1.writeSignature)(writer, type_3 || 'long');
3299
- writeOSType(writer, type_3 || 'long', value[i], '', fieldToArrayExtType[key], root);
3300
- if (logErrors && !type_3)
3301
- console.log("Missing descriptor array type for: '".concat(key, "' in"), value);
3302
- }
3303
- break;
3304
- case 'doub': // Double
3305
- (0, psdWriter_1.writeFloat64)(writer, value);
3306
- break;
3307
- case 'UntF': // Unit double
3308
- if (!unitsMapRev[value.units])
3309
- throw new Error("Invalid units: ".concat(value.units, " in ").concat(key));
3310
- (0, psdWriter_1.writeSignature)(writer, unitsMapRev[value.units]);
3311
- (0, psdWriter_1.writeFloat64)(writer, value.value);
3312
- break;
3313
- case 'UnFl': // Unit float
3314
- if (!unitsMapRev[value.units])
3315
- throw new Error("Invalid units: ".concat(value.units, " in ").concat(key));
3316
- (0, psdWriter_1.writeSignature)(writer, unitsMapRev[value.units]);
3317
- (0, psdWriter_1.writeFloat32)(writer, value.value);
3318
- break;
3319
- case 'TEXT': // String
3320
- (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, value);
3321
- break;
3322
- case 'enum': { // Enumerated
3323
- var _a = value.split('.'), _type = _a[0], val = _a[1];
3324
- writeAsciiStringOrClassId(writer, _type);
3325
- writeAsciiStringOrClassId(writer, val);
3326
- break;
3327
- }
3328
- case 'long': // Integer
3329
- (0, psdWriter_1.writeInt32)(writer, value);
3330
- break;
3331
- // case 'comp': // Large Integer
3332
- // writeLargeInteger(reader);
3333
- case 'bool': // Boolean
3334
- (0, psdWriter_1.writeUint8)(writer, value ? 1 : 0);
3335
- break;
3336
- // case 'type': // Class
3337
- // case 'GlbC': // Class
3338
- // writeClassStructure(reader);
3339
- // case 'alis': // Alias
3340
- // writeAliasStructure(reader);
3341
- case 'tdta': // Raw Data
3342
- (0, psdWriter_1.writeInt32)(writer, value.byteLength);
3343
- (0, psdWriter_1.writeBytes)(writer, value);
3344
- break;
3345
- case 'ObAr': { // Object array
3346
- (0, psdWriter_1.writeInt32)(writer, 16); // version
3347
- (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, ''); // name
3348
- var type_4 = ObArTypes[key];
3349
- if (!type_4)
3350
- throw new Error("Not implemented ObArType for: ".concat(key));
3351
- writeAsciiStringOrClassId(writer, type_4);
3352
- (0, psdWriter_1.writeInt32)(writer, value.length);
3353
- for (var i = 0; i < value.length; i++) {
3354
- writeAsciiStringOrClassId(writer, value[i].type); // Hrzn | Vrtc
3355
- (0, psdWriter_1.writeSignature)(writer, 'UnFl');
3356
- (0, psdWriter_1.writeSignature)(writer, '#Pxl');
3357
- (0, psdWriter_1.writeInt32)(writer, value[i].values.length);
3358
- for (var j = 0; j < value[i].values.length; j++) {
3359
- (0, psdWriter_1.writeFloat64)(writer, value[i].values[j]);
3360
- }
3361
- }
3362
- break;
3363
- }
3364
- // case 'Pth ': // File path
3365
- // writeFilePath(reader);
3366
- default:
3367
- throw new Error("Not implemented descriptor OSType: ".concat(type));
3655
+ function parseGradientContent(descriptor) {
3656
+ var result = parseGradient(descriptor.Grad);
3657
+ result.style = exports.GrdT.decode(descriptor.Type);
3658
+ if (descriptor.Dthr !== undefined)
3659
+ result.dither = descriptor.Dthr;
3660
+ if (descriptor.Rvrs !== undefined)
3661
+ result.reverse = descriptor.Rvrs;
3662
+ if (descriptor.Angl !== undefined)
3663
+ result.angle = parseAngle(descriptor.Angl);
3664
+ if (descriptor['Scl '] !== undefined)
3665
+ result.scale = parsePercent(descriptor['Scl ']);
3666
+ if (descriptor.Algn !== undefined)
3667
+ result.align = descriptor.Algn;
3668
+ if (descriptor.Ofst !== undefined) {
3669
+ result.offset = {
3670
+ x: parsePercent(descriptor.Ofst.Hrzn),
3671
+ y: parsePercent(descriptor.Ofst.Vrtc)
3672
+ };
3368
3673
  }
3674
+ return result;
3369
3675
  }
3370
- function readReferenceStructure(reader) {
3371
- var itemsCount = (0, psdReader_1.readInt32)(reader);
3372
- var items = [];
3373
- for (var i = 0; i < itemsCount; i++) {
3374
- var type = (0, psdReader_1.readSignature)(reader);
3375
- switch (type) {
3376
- case 'prop': { // Property
3377
- readClassStructure(reader);
3378
- var keyID = readAsciiStringOrClassId(reader);
3379
- items.push(keyID);
3380
- break;
3381
- }
3382
- case 'Clss': // Class
3383
- items.push(readClassStructure(reader));
3384
- break;
3385
- case 'Enmr': { // Enumerated Reference
3386
- readClassStructure(reader);
3387
- var typeID = readAsciiStringOrClassId(reader);
3388
- var value = readAsciiStringOrClassId(reader);
3389
- items.push("".concat(typeID, ".").concat(value));
3390
- break;
3391
- }
3392
- case 'rele': { // Offset
3393
- // const { name, classID } =
3394
- readClassStructure(reader);
3395
- items.push((0, psdReader_1.readUint32)(reader));
3396
- break;
3397
- }
3398
- case 'Idnt': // Identifier
3399
- items.push((0, psdReader_1.readInt32)(reader));
3400
- break;
3401
- case 'indx': // Index
3402
- items.push((0, psdReader_1.readInt32)(reader));
3403
- break;
3404
- case 'name': { // Name
3405
- readClassStructure(reader);
3406
- items.push((0, psdReader_1.readUnicodeString)(reader));
3407
- break;
3408
- }
3409
- default:
3410
- throw new Error("Invalid descriptor reference type: ".concat(type));
3411
- }
3676
+ function parsePatternContent(descriptor) {
3677
+ var result = {
3678
+ name: descriptor.Ptrn['Nm '],
3679
+ id: descriptor.Ptrn.Idnt,
3680
+ };
3681
+ if (descriptor.Lnkd !== undefined)
3682
+ result.linked = descriptor.Lnkd;
3683
+ if (descriptor.phase !== undefined)
3684
+ result.phase = { x: descriptor.phase.Hrzn, y: descriptor.phase.Vrtc };
3685
+ return result;
3686
+ }
3687
+ function parseVectorContent(descriptor) {
3688
+ if ('Grad' in descriptor) {
3689
+ return parseGradientContent(descriptor);
3690
+ }
3691
+ else if ('Ptrn' in descriptor) {
3692
+ return __assign({ type: 'pattern' }, parsePatternContent(descriptor));
3693
+ }
3694
+ else if ('Clr ' in descriptor) {
3695
+ return { type: 'color', color: parseColor(descriptor['Clr ']) };
3696
+ }
3697
+ else {
3698
+ throw new Error('Invalid vector content');
3412
3699
  }
3413
- return items;
3414
3700
  }
3415
- function writeReferenceStructure(writer, _key, items) {
3416
- (0, psdWriter_1.writeInt32)(writer, items.length);
3417
- for (var i = 0; i < items.length; i++) {
3418
- var value = items[i];
3419
- var type = 'unknown';
3420
- if (typeof value === 'string') {
3421
- if (/^[a-z]+\.[a-z]+$/i.test(value)) {
3422
- type = 'Enmr';
3423
- }
3424
- else {
3425
- type = 'name';
3426
- }
3427
- }
3428
- (0, psdWriter_1.writeSignature)(writer, type);
3429
- switch (type) {
3430
- // case 'prop': // Property
3431
- // case 'Clss': // Class
3432
- case 'Enmr': { // Enumerated Reference
3433
- var _a = value.split('.'), typeID = _a[0], enumValue = _a[1];
3434
- writeClassStructure(writer, '\0', typeID);
3435
- writeAsciiStringOrClassId(writer, typeID);
3436
- writeAsciiStringOrClassId(writer, enumValue);
3437
- break;
3438
- }
3439
- // case 'rele': // Offset
3440
- // case 'Idnt': // Identifier
3441
- // case 'indx': // Index
3442
- case 'name': { // Name
3443
- writeClassStructure(writer, '\0', 'Lyr ');
3444
- (0, psdWriter_1.writeUnicodeString)(writer, value + '\0');
3445
- break;
3446
- }
3447
- default:
3448
- throw new Error("Invalid descriptor reference type: ".concat(type));
3449
- }
3701
+ exports.parseVectorContent = parseVectorContent;
3702
+ function serializeGradientContent(content) {
3703
+ var result = {};
3704
+ if (content.dither !== undefined)
3705
+ result.Dthr = content.dither;
3706
+ if (content.reverse !== undefined)
3707
+ result.Rvrs = content.reverse;
3708
+ if (content.angle !== undefined)
3709
+ result.Angl = unitsAngle(content.angle);
3710
+ result.Type = exports.GrdT.encode(content.style);
3711
+ if (content.align !== undefined)
3712
+ result.Algn = content.align;
3713
+ if (content.scale !== undefined)
3714
+ result['Scl '] = unitsPercent(content.scale);
3715
+ if (content.offset) {
3716
+ result.Ofst = {
3717
+ Hrzn: unitsPercent(content.offset.x),
3718
+ Vrtc: unitsPercent(content.offset.y),
3719
+ };
3450
3720
  }
3451
- return items;
3721
+ result.Grad = serializeGradient(content);
3722
+ return result;
3452
3723
  }
3453
- function readClassStructure(reader) {
3454
- var name = (0, psdReader_1.readUnicodeString)(reader);
3455
- var classID = readAsciiStringOrClassId(reader);
3456
- // console.log({ name, classID });
3457
- return { name: name, classID: classID };
3724
+ function serializePatternContent(content) {
3725
+ var result = {
3726
+ Ptrn: {
3727
+ 'Nm ': content.name || '',
3728
+ Idnt: content.id || '',
3729
+ }
3730
+ };
3731
+ if (content.linked !== undefined)
3732
+ result.Lnkd = !!content.linked;
3733
+ if (content.phase !== undefined)
3734
+ result.phase = { Hrzn: content.phase.x, Vrtc: content.phase.y };
3735
+ return result;
3458
3736
  }
3459
- function writeClassStructure(writer, name, classID) {
3460
- (0, psdWriter_1.writeUnicodeString)(writer, name);
3461
- writeAsciiStringOrClassId(writer, classID);
3737
+ function serializeVectorContent(content) {
3738
+ if (content.type === 'color') {
3739
+ return { key: 'SoCo', descriptor: { 'Clr ': serializeColor(content.color) } };
3740
+ }
3741
+ else if (content.type === 'pattern') {
3742
+ return { key: 'PtFl', descriptor: serializePatternContent(content) };
3743
+ }
3744
+ else {
3745
+ return { key: 'GdFl', descriptor: serializeGradientContent(content) };
3746
+ }
3462
3747
  }
3463
- function readVersionAndDescriptor(reader) {
3464
- var version = (0, psdReader_1.readUint32)(reader);
3465
- if (version !== 16)
3466
- throw new Error("Invalid descriptor version: ".concat(version));
3467
- var desc = readDescriptorStructure(reader);
3468
- // console.log(require('util').inspect(desc, false, 99, true));
3469
- return desc;
3748
+ exports.serializeVectorContent = serializeVectorContent;
3749
+ function parseColor(color) {
3750
+ if ('H ' in color) {
3751
+ return { h: parsePercentOrAngle(color['H ']), s: color.Strt, b: color.Brgh };
3752
+ }
3753
+ else if ('Rd ' in color) {
3754
+ return { r: color['Rd '], g: color['Grn '], b: color['Bl '] };
3755
+ }
3756
+ else if ('Cyn ' in color) {
3757
+ return { c: color['Cyn '], m: color.Mgnt, y: color['Ylw '], k: color.Blck };
3758
+ }
3759
+ else if ('Gry ' in color) {
3760
+ return { k: color['Gry '] };
3761
+ }
3762
+ else if ('Lmnc' in color) {
3763
+ return { l: color.Lmnc, a: color['A '], b: color['B '] };
3764
+ }
3765
+ else {
3766
+ throw new Error('Unsupported color descriptor');
3767
+ }
3470
3768
  }
3471
- exports.readVersionAndDescriptor = readVersionAndDescriptor;
3472
- function writeVersionAndDescriptor(writer, name, classID, descriptor, root) {
3473
- if (root === void 0) { root = ''; }
3474
- (0, psdWriter_1.writeUint32)(writer, 16); // version
3475
- writeDescriptorStructure(writer, name, classID, descriptor, root);
3769
+ exports.parseColor = parseColor;
3770
+ function serializeColor(color) {
3771
+ if (!color) {
3772
+ return { 'Rd ': 0, 'Grn ': 0, 'Bl ': 0 };
3773
+ }
3774
+ else if ('r' in color) {
3775
+ return { 'Rd ': color.r || 0, 'Grn ': color.g || 0, 'Bl ': color.b || 0 };
3776
+ }
3777
+ else if ('h' in color) {
3778
+ return { 'H ': unitsAngle(color.h * 360), Strt: color.s || 0, Brgh: color.b || 0 };
3779
+ }
3780
+ else if ('c' in color) {
3781
+ return { 'Cyn ': color.c || 0, Mgnt: color.m || 0, 'Ylw ': color.y || 0, Blck: color.k || 0 };
3782
+ }
3783
+ else if ('l' in color) {
3784
+ return { Lmnc: color.l || 0, 'A ': color.a || 0, 'B ': color.b || 0 };
3785
+ }
3786
+ else if ('k' in color) {
3787
+ return { 'Gry ': color.k };
3788
+ }
3789
+ else {
3790
+ throw new Error('Invalid color value');
3791
+ }
3476
3792
  }
3477
- exports.writeVersionAndDescriptor = writeVersionAndDescriptor;
3793
+ exports.serializeColor = serializeColor;
3478
3794
  function parseAngle(x) {
3479
3795
  if (x === undefined)
3480
3796
  return 0;
@@ -3647,6 +3963,17 @@ exports.GrdT = (0, helpers_1.createEnum)('GrdT', 'linear', {
3647
3963
  reflected: 'Rflc',
3648
3964
  diamond: 'Dmnd',
3649
3965
  });
3966
+ exports.animInterpStyleEnum = (0, helpers_1.createEnum)('animInterpStyle', 'linear', {
3967
+ linear: 'Lnr ',
3968
+ hold: 'hold',
3969
+ });
3970
+ exports.stdTrackID = (0, helpers_1.createEnum)('stdTrackID', 'opacity', {
3971
+ opacity: 'opacityTrack',
3972
+ style: 'styleTrack',
3973
+ sheetTransform: 'sheetTransformTrack',
3974
+ sheetPosition: 'sheetPositionTrack',
3975
+ globalLighting: 'globalLightingTrack',
3976
+ });
3650
3977
  exports.gradientInterpolationMethodType = (0, helpers_1.createEnum)('gradientInterpolationMethodType', 'perceptual', {
3651
3978
  perceptual: 'Perc',
3652
3979
  linear: 'Lnr',
@@ -5003,6 +5330,163 @@ addHandler(1032, function (target) { return target.gridAndGuidesInformation !==
5003
5330
  (0, psdWriter_1.writeUint8)(writer, g.direction === 'horizontal' ? 1 : 0);
5004
5331
  }
5005
5332
  });
5333
+ // 0 - normal, 7 - multiply, 8 - screen, 23 - difference
5334
+ var onionSkinsBlendModes = [
5335
+ 'normal', undefined, undefined, undefined, undefined, undefined, undefined, 'multiply',
5336
+ 'screen', undefined, undefined, undefined, undefined, undefined, undefined, undefined,
5337
+ undefined, undefined, undefined, undefined, undefined, undefined, undefined, 'difference',
5338
+ ];
5339
+ addHandler(1078, // Onion Skins
5340
+ function (// Onion Skins
5341
+ target) { return target.onionSkins !== undefined; }, function (reader, target) {
5342
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
5343
+ // console.log('1078', require('util').inspect(desc, false, 99, true));
5344
+ target.onionSkins = {
5345
+ enabled: desc.enab,
5346
+ framesBefore: desc.numBefore,
5347
+ framesAfter: desc.numAfter,
5348
+ frameSpacing: desc.Spcn,
5349
+ minOpacity: desc.minOpacity / 100,
5350
+ maxOpacity: desc.maxOpacity / 100,
5351
+ blendMode: onionSkinsBlendModes[desc.BlnM] || 'normal',
5352
+ };
5353
+ }, function (writer, target) {
5354
+ var onionSkins = target.onionSkins;
5355
+ var desc = {
5356
+ Vrsn: 1,
5357
+ enab: onionSkins.enabled,
5358
+ numBefore: onionSkins.framesBefore,
5359
+ numAfter: onionSkins.framesAfter,
5360
+ Spcn: onionSkins.frameSpacing,
5361
+ minOpacity: (onionSkins.minOpacity * 100) | 0,
5362
+ maxOpacity: (onionSkins.maxOpacity * 100) | 0,
5363
+ BlnM: Math.max(0, onionSkinsBlendModes.indexOf(onionSkins.blendMode)),
5364
+ };
5365
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
5366
+ });
5367
+ addHandler(1075, // Timeline Information
5368
+ function (// Timeline Information
5369
+ target) { return target.timelineInformation !== undefined; }, function (reader, target, _, options) {
5370
+ var _a, _b;
5371
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
5372
+ // console.log('1075', require('util').inspect(desc, false, 99, true));
5373
+ target.timelineInformation = {
5374
+ enabled: desc.enab,
5375
+ frameStep: desc.frameStep,
5376
+ frameRate: desc.frameRate,
5377
+ time: desc.time,
5378
+ duration: desc.duration,
5379
+ workInTime: desc.workInTime,
5380
+ workOutTime: desc.workOutTime,
5381
+ repeats: desc.LCnt,
5382
+ hasMotion: desc.hasMotion,
5383
+ globalTracks: (0, descriptor_1.parseTrackList)(desc.globalTrackList, !!options.logMissingFeatures),
5384
+ };
5385
+ if ((_b = (_a = desc.audioClipGroupList) === null || _a === void 0 ? void 0 : _a.audioClipGroupList) === null || _b === void 0 ? void 0 : _b.length) {
5386
+ target.timelineInformation.audioClipGroups = desc.audioClipGroupList.audioClipGroupList.map(function (g) { return ({
5387
+ id: g.groupID,
5388
+ muted: g.muted,
5389
+ audioClips: g.audioClipList.map(function (_a) {
5390
+ var clipID = _a.clipID, timeScope = _a.timeScope, muted = _a.muted, audioLevel = _a.audioLevel, frameReader = _a.frameReader;
5391
+ return ({
5392
+ id: clipID,
5393
+ start: timeScope.Strt,
5394
+ duration: timeScope.duration,
5395
+ inTime: timeScope.inTime,
5396
+ outTime: timeScope.outTime,
5397
+ muted: muted,
5398
+ audioLevel: audioLevel,
5399
+ frameReader: {
5400
+ type: frameReader.frameReaderType,
5401
+ mediaDescriptor: frameReader.mediaDescriptor,
5402
+ link: {
5403
+ name: frameReader['Lnk ']['Nm '],
5404
+ fullPath: frameReader['Lnk '].fullPath,
5405
+ relativePath: frameReader['Lnk '].relPath,
5406
+ },
5407
+ },
5408
+ });
5409
+ }),
5410
+ }); });
5411
+ }
5412
+ }, function (writer, target) {
5413
+ var _a;
5414
+ var timeline = target.timelineInformation;
5415
+ var desc = {
5416
+ Vrsn: 1,
5417
+ enab: timeline.enabled,
5418
+ frameStep: timeline.frameStep,
5419
+ frameRate: timeline.frameRate,
5420
+ time: timeline.time,
5421
+ duration: timeline.duration,
5422
+ workInTime: timeline.workInTime,
5423
+ workOutTime: timeline.workOutTime,
5424
+ LCnt: timeline.repeats,
5425
+ globalTrackList: (0, descriptor_1.serializeTrackList)(timeline.globalTracks),
5426
+ audioClipGroupList: {
5427
+ audioClipGroupList: (_a = timeline.audioClipGroups) === null || _a === void 0 ? void 0 : _a.map(function (a) { return ({
5428
+ groupID: a.id,
5429
+ muted: a.muted,
5430
+ audioClipList: a.audioClips.map(function (c) { return ({
5431
+ clipID: c.id,
5432
+ timeScope: {
5433
+ Vrsn: 1,
5434
+ Strt: c.start,
5435
+ duration: c.duration,
5436
+ inTime: c.inTime,
5437
+ outTime: c.outTime,
5438
+ },
5439
+ frameReader: {
5440
+ frameReaderType: c.frameReader.type,
5441
+ descVersion: 1,
5442
+ 'Lnk ': {
5443
+ descVersion: 1,
5444
+ 'Nm ': c.frameReader.link.name,
5445
+ fullPath: c.frameReader.link.fullPath,
5446
+ relPath: c.frameReader.link.relativePath,
5447
+ },
5448
+ mediaDescriptor: c.frameReader.mediaDescriptor,
5449
+ },
5450
+ muted: c.muted,
5451
+ audioLevel: c.audioLevel,
5452
+ }); }),
5453
+ }); }),
5454
+ },
5455
+ hasMotion: timeline.hasMotion,
5456
+ };
5457
+ // console.log('WRITE:1075', require('util').inspect(desc, false, 99, true));
5458
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc, 'anim');
5459
+ });
5460
+ addHandler(1076, // Sheet Disclosure
5461
+ function (// Sheet Disclosure
5462
+ target) { return target.sheetDisclosure !== undefined; }, function (reader, target) {
5463
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
5464
+ // console.log('1076', require('util').inspect(desc, false, 99, true));
5465
+ target.sheetDisclosure = {};
5466
+ if (desc.sheetTimelineOptions) {
5467
+ target.sheetDisclosure.sheetTimelineOptions = desc.sheetTimelineOptions.map(function (o) { return ({
5468
+ sheetID: o.sheetID,
5469
+ sheetDisclosed: o.sheetDisclosed,
5470
+ lightsDisclosed: o.lightsDisclosed,
5471
+ meshesDisclosed: o.meshesDisclosed,
5472
+ materialsDisclosed: o.materialsDisclosed,
5473
+ }); });
5474
+ }
5475
+ }, function (writer, target) {
5476
+ var disclosure = target.sheetDisclosure;
5477
+ var desc = { Vrsn: 1 };
5478
+ if (disclosure.sheetTimelineOptions) {
5479
+ desc.sheetTimelineOptions = disclosure.sheetTimelineOptions.map(function (d) { return ({
5480
+ Vrsn: 2,
5481
+ sheetID: d.sheetID,
5482
+ sheetDisclosed: d.sheetDisclosed,
5483
+ lightsDisclosed: d.lightsDisclosed,
5484
+ meshesDisclosed: d.meshesDisclosed,
5485
+ materialsDisclosed: d.materialsDisclosed,
5486
+ }); });
5487
+ }
5488
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
5489
+ });
5006
5490
  addHandler(1054, function (target) { return target.urlsList !== undefined; }, function (reader, target, _, options) {
5007
5491
  var count = (0, psdReader_1.readUint32)(reader);
5008
5492
  if (count) {
@@ -5163,16 +5647,10 @@ var FrmD = (0, helpers_1.createEnum)('FrmD', '', {
5163
5647
  none: 'None',
5164
5648
  dispose: 'Disp',
5165
5649
  });
5166
- // TODO: Unfinished
5167
- helpers_1.MOCK_HANDLERS && addHandler(4000, // Plug-In resource(s)
5650
+ addHandler(4000, // Plug-In resource(s)
5168
5651
  function (// Plug-In resource(s)
5169
- target) { return target._ir4000 !== undefined; }, function (reader, target, left, _a) {
5652
+ target) { return target.animations !== undefined; }, function (reader, target, left, _a) {
5170
5653
  var logMissingFeatures = _a.logMissingFeatures, logDevFeatures = _a.logDevFeatures;
5171
- if (helpers_1.MOCK_HANDLERS) {
5172
- LOG_MOCK_HANDLERS && console.log('image resource 4000', left());
5173
- target._ir4000 = (0, psdReader_1.readBytes)(reader, left());
5174
- return;
5175
- }
5176
5654
  var key = (0, psdReader_1.readSignature)(reader);
5177
5655
  if (key === 'mani') {
5178
5656
  (0, psdReader_1.checkSignature)(reader, 'IRFR');
@@ -5183,14 +5661,11 @@ target) { return target._ir4000 !== undefined; }, function (reader, target, left
5183
5661
  (0, psdReader_1.readSection)(reader, 1, function (left) {
5184
5662
  if (key_1 === 'AnDs') {
5185
5663
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
5186
- // console.log('AnDs', desc);
5187
- logDevFeatures && console.log('#4000 AnDs', desc);
5188
- // logDevFeatures && console.log('#4000 AnDs', require('util').inspect(desc, false, 99, true));
5189
- var result = {
5664
+ target.animations = {
5190
5665
  // desc.AFSt ???
5191
5666
  frames: desc.FrIn.map(function (x) { return ({
5192
5667
  id: x.FrID,
5193
- delay: x.FrDl / 100,
5668
+ delay: (x.FrDl || 0) / 100,
5194
5669
  dispose: x.FrDs ? FrmD.decode(x.FrDs) : 'auto', // missing == auto
5195
5670
  // x.FrGA ???
5196
5671
  }); }),
@@ -5198,11 +5673,11 @@ target) { return target._ir4000 !== undefined; }, function (reader, target, left
5198
5673
  id: x.FsID,
5199
5674
  frames: x.FsFr,
5200
5675
  repeats: x.LCnt,
5201
- // x.AFrm ???
5676
+ activeFrame: x.AFrm || 0,
5202
5677
  }); }),
5203
5678
  };
5204
- logDevFeatures && console.log('#4000 AnDs:result', result);
5205
- // logDevFeatures && console.log('#4000 AnDs:result', require('util').inspect(result, false, 99, true));
5679
+ // console.log('#4000 AnDs', require('util').inspect(desc, false, 99, true));
5680
+ // console.log('#4000 AnDs:result', require('util').inspect(target.animations, false, 99, true));
5206
5681
  }
5207
5682
  else if (key_1 === 'Roll') {
5208
5683
  var bytes = (0, psdReader_1.readBytes)(reader, left());
@@ -5224,10 +5699,50 @@ target) { return target._ir4000 !== undefined; }, function (reader, target, left
5224
5699
  }
5225
5700
  else {
5226
5701
  logMissingFeatures && console.log('Unhandled key in #4000:', key);
5227
- return;
5228
5702
  }
5229
5703
  }, function (writer, target) {
5230
- (0, psdWriter_1.writeBytes)(writer, target._ir4000);
5704
+ if (target.animations) {
5705
+ (0, psdWriter_1.writeSignature)(writer, 'mani');
5706
+ (0, psdWriter_1.writeSignature)(writer, 'IRFR');
5707
+ (0, psdWriter_1.writeSection)(writer, 1, function () {
5708
+ (0, psdWriter_1.writeSignature)(writer, '8BIM');
5709
+ (0, psdWriter_1.writeSignature)(writer, 'AnDs');
5710
+ (0, psdWriter_1.writeSection)(writer, 1, function () {
5711
+ var desc = {
5712
+ // AFSt: 0, // ???
5713
+ FrIn: [],
5714
+ FSts: [],
5715
+ };
5716
+ for (var i = 0; i < target.animations.frames.length; i++) {
5717
+ var f = target.animations.frames[i];
5718
+ var frame = {
5719
+ FrID: f.id,
5720
+ };
5721
+ if (f.delay)
5722
+ frame.FrDl = (f.delay * 100) | 0;
5723
+ frame.FrDs = FrmD.encode(f.dispose);
5724
+ // if (i === 0) frame.FrGA = 30; // ???
5725
+ desc.FrIn.push(frame);
5726
+ }
5727
+ for (var i = 0; i < target.animations.animations.length; i++) {
5728
+ var a = target.animations.animations[i];
5729
+ var anim = {
5730
+ FsID: a.id,
5731
+ AFrm: a.activeFrame | 0,
5732
+ FsFr: a.frames,
5733
+ LCnt: a.repeats | 0,
5734
+ };
5735
+ desc.FSts.push(anim);
5736
+ }
5737
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
5738
+ });
5739
+ // writeSignature(writer, '8BIM');
5740
+ // writeSignature(writer, 'Roll');
5741
+ // writeSection(writer, 1, () => {
5742
+ // writeZeros(writer, 8);
5743
+ // });
5744
+ });
5745
+ }
5231
5746
  });
5232
5747
  // TODO: Unfinished
5233
5748
  helpers_1.MOCK_HANDLERS && addHandler(4001, // Plug-In resource(s)
@@ -5364,7 +5879,7 @@ var __assign = (this && this.__assign) || function () {
5364
5879
  return __assign.apply(this, arguments);
5365
5880
  };
5366
5881
  Object.defineProperty(exports, "__esModule", { value: true });
5367
- exports.readPattern = exports.readColor = exports.readSection = exports.readDataRLE = exports.readDataZipWithoutPrediction = exports.readPsd = exports.checkSignature = exports.skipBytes = exports.readAsciiString = exports.readUnicodeStringWithLength = exports.readUnicodeString = exports.readPascalString = exports.readSignature = exports.readBytes = exports.readFixedPointPath32 = exports.readFixedPoint32 = exports.readFloat64 = exports.readFloat32 = exports.readUint32 = exports.readInt32LE = exports.readInt32 = exports.readUint16 = exports.readInt16 = exports.peekUint8 = exports.readUint8 = exports.createReader = exports.supportedColorModes = void 0;
5882
+ exports.readPattern = exports.readColor = exports.readSection = exports.readDataRLE = exports.readDataZipWithoutPrediction = exports.readPsd = exports.checkSignature = exports.skipBytes = exports.readAsciiString = exports.readUnicodeStringWithLength = exports.readUnicodeString = exports.readPascalString = exports.readSignature = exports.readBytes = exports.readFixedPointPath32 = exports.readFixedPoint32 = exports.readFloat64 = exports.readFloat32 = exports.readUint32 = exports.readInt32LE = exports.readInt32 = exports.readUint16 = exports.readInt16 = exports.peekUint8 = exports.readUint8 = exports.warnOrThrow = exports.createReader = exports.supportedColorModes = void 0;
5368
5883
  var pako_1 = require("pako");
5369
5884
  var helpers_1 = require("./helpers");
5370
5885
  var additionalInfo_1 = require("./additionalInfo");
@@ -5380,9 +5895,16 @@ function setupGrayscale(data) {
5380
5895
  }
5381
5896
  function createReader(buffer, offset, length) {
5382
5897
  var view = new DataView(buffer, offset, length);
5383
- return { view: view, offset: 0, strict: false };
5898
+ return { view: view, offset: 0, strict: false, debug: false };
5384
5899
  }
5385
5900
  exports.createReader = createReader;
5901
+ function warnOrThrow(reader, message) {
5902
+ if (reader.strict)
5903
+ throw new Error(message);
5904
+ if (reader.debug)
5905
+ console.warn(message);
5906
+ }
5907
+ exports.warnOrThrow = warnOrThrow;
5386
5908
  function readUint8(reader) {
5387
5909
  reader.offset += 1;
5388
5910
  return reader.view.getUint8(reader.offset - 1);
@@ -5438,8 +5960,22 @@ function readFixedPointPath32(reader) {
5438
5960
  }
5439
5961
  exports.readFixedPointPath32 = readFixedPointPath32;
5440
5962
  function readBytes(reader, length) {
5963
+ var start = reader.view.byteOffset + reader.offset;
5441
5964
  reader.offset += length;
5442
- return new Uint8Array(reader.view.buffer, reader.view.byteOffset + reader.offset - length, length);
5965
+ if ((start + length) > reader.view.buffer.byteLength) {
5966
+ // fix for broken PSD files that are missing part of file at the end
5967
+ warnOrThrow(reader, 'Reading bytes exceeding buffer length');
5968
+ if (length > (100 * 1024 * 1024))
5969
+ throw new Error('Reading past end of file'); // limit to 100MB
5970
+ var result = new Uint8Array(length);
5971
+ var len = Math.min(length, reader.view.byteLength - start);
5972
+ if (len > 0)
5973
+ result.set(new Uint8Array(reader.view.buffer, start, len));
5974
+ return result;
5975
+ }
5976
+ else {
5977
+ return new Uint8Array(reader.view.buffer, start, length);
5978
+ }
5443
5979
  }
5444
5980
  exports.readBytes = readBytes;
5445
5981
  function readSignature(reader) {
@@ -5828,7 +6364,7 @@ function readLayerChannelImageData(reader, psd, layer, channels, options) {
5828
6364
  }
5829
6365
  readData(reader, channel.length, targetData, compression, layerWidth, layerHeight, offset, options.large, cmyk ? 5 : 4);
5830
6366
  if (helpers_1.RAW_IMAGE_DATA) {
5831
- layer.imageDataRaw[channel.id] = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start, reader.offset - start);
6367
+ layer.imageDataRaw[channel.id] = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start + 2, channel.length - 2);
5832
6368
  }
5833
6369
  reader.offset = start + channel.length;
5834
6370
  if (targetData && psd.colorMode === 1 /* ColorMode.Grayscale */) {
@@ -6098,9 +6634,8 @@ function readDataRLE(reader, pixelData, _width, height, step, offsets, large) {
6098
6634
  else {
6099
6635
  // ignore 128
6100
6636
  }
6101
- if (i >= length_1) {
6102
- throw new Error("Invalid RLE data: exceeded buffer size ".concat(i, "/").concat(length_1));
6103
- }
6637
+ // This showed up on some images from non-photoshop programs, ignoring it seems to work just fine.
6638
+ // if (i >= length) throw new Error(`Invalid RLE data: exceeded buffer size ${i}/${length}`);
6104
6639
  }
6105
6640
  }
6106
6641
  }
@@ -6122,14 +6657,12 @@ function readSection(reader, round, func, skipEmpty, eightBytes) {
6122
6657
  if (end > reader.view.byteLength)
6123
6658
  throw new Error('Section exceeds file size');
6124
6659
  var result = func(function () { return end - reader.offset; });
6125
- if (reader.offset !== end && reader.strict) {
6660
+ if (reader.offset !== end) {
6126
6661
  if (reader.offset > end) {
6127
- // throw new Error('Exceeded section limits');
6128
- console.warn('Exceeded section limits');
6662
+ warnOrThrow(reader, 'Exceeded section limits');
6129
6663
  }
6130
6664
  else {
6131
- // throw new Error(`Unread section data: ${end - reader.offset} bytes at 0x${reader.offset.toString(16)}`);
6132
- console.warn('Unread section data');
6665
+ warnOrThrow(reader, "Unread section data"); // : ${end - reader.offset} bytes at 0x${reader.offset.toString(16)}`);
6133
6666
  }
6134
6667
  }
6135
6668
  while (end % round)
@@ -6463,7 +6996,7 @@ function writePsd(writer, psd, options) {
6463
6996
  if ((psd.width > 30000 || psd.height > 30000) && !options.psb)
6464
6997
  throw new Error('Document size is too large (max is 30000x30000, use PSB format instead)');
6465
6998
  var imageResources = psd.imageResources || {};
6466
- var opt = __assign(__assign({}, options), { layerIds: [] });
6999
+ var opt = __assign(__assign({}, options), { layerIds: new Set(), layerToId: new Map() });
6467
7000
  if (opt.generateThumbnail) {
6468
7001
  imageResources = __assign(__assign({}, imageResources), { thumbnail: createThumbnail(psd) });
6469
7002
  }