ag-psd 16.0.0 → 17.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,6 +20,7 @@ var psdWriter_1 = require("./psdWriter");
20
20
  var descriptor_1 = require("./descriptor");
21
21
  var engineData_1 = require("./engineData");
22
22
  var text_1 = require("./text");
23
+ var fromAtoZ = 'abcdefghijklmnopqrstuvwxyz';
23
24
  exports.infoHandlers = [];
24
25
  exports.infoHandlersMap = {};
25
26
  function addHandler(key, has, read, write) {
@@ -73,6 +74,10 @@ addHandler('TySh', hasKey('text'), function (reader, target, leftBytes) {
73
74
  rotate: descriptor_1.Ornt.decode(warp.warpRotate),
74
75
  },
75
76
  };
77
+ if (text.bounds)
78
+ target.text.bounds = (0, descriptor_1.descBoundsToBounds)(text.bounds);
79
+ if (text.boundingBox)
80
+ target.text.boundingBox = (0, descriptor_1.descBoundsToBounds)(text.boundingBox);
76
81
  if (text.EngineData) {
77
82
  var engineData = (0, engineData_1.parseEngineData)(text.EngineData);
78
83
  var textData = (0, text_1.decodeEngineData)(engineData);
@@ -90,20 +95,13 @@ addHandler('TySh', hasKey('text'), function (reader, target, leftBytes) {
90
95
  var text = target.text;
91
96
  var warp = text.warp || {};
92
97
  var transform = text.transform || [1, 0, 0, 1, 0, 0];
93
- var textDescriptor = {
94
- 'Txt ': (text.text || '').replace(/\r?\n/g, '\r'),
95
- textGridding: descriptor_1.textGridding.encode(text.gridding),
96
- Ornt: descriptor_1.Ornt.encode(text.orientation),
97
- AntA: descriptor_1.Annt.encode(text.antiAlias),
98
- TextIndex: text.index || 0,
99
- EngineData: (0, engineData_1.serializeEngineData)((0, text_1.encodeEngineData)(text)),
100
- };
98
+ var textDescriptor = __assign(__assign(__assign({ 'Txt ': (text.text || '').replace(/\r?\n/g, '\r'), textGridding: descriptor_1.textGridding.encode(text.gridding), Ornt: descriptor_1.Ornt.encode(text.orientation), AntA: descriptor_1.Annt.encode(text.antiAlias) }, (text.bounds ? { bounds: (0, descriptor_1.boundsToDescBounds)(text.bounds) } : {})), (text.boundingBox ? { boundingBox: (0, descriptor_1.boundsToDescBounds)(text.boundingBox) } : {})), { TextIndex: text.index || 0, EngineData: (0, engineData_1.serializeEngineData)((0, text_1.encodeEngineData)(text)) });
101
99
  (0, psdWriter_1.writeInt16)(writer, 1); // version
102
100
  for (var i = 0; i < 6; i++) {
103
101
  (0, psdWriter_1.writeFloat64)(writer, transform[i]);
104
102
  }
105
103
  (0, psdWriter_1.writeInt16)(writer, 50); // text version
106
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'TxLr', textDescriptor);
104
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'TxLr', textDescriptor, 'text');
107
105
  (0, psdWriter_1.writeInt16)(writer, 1); // warp version
108
106
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'warp', encodeWarp(warp));
109
107
  (0, psdWriter_1.writeFloat32)(writer, text.left);
@@ -546,10 +544,10 @@ addHandler('shmd', function (target) { return target.timestamp !== undefined ||
546
544
  var timeScope = desc.timeScope;
547
545
  // console.log('tmln', target.name, target.id, require('util').inspect(desc, false, 99, true));
548
546
  var timeline = {
549
- start: timeScope.Strt,
550
- duration: timeScope.duration,
551
- inTime: timeScope.inTime,
552
- outTime: timeScope.outTime,
547
+ start: (0, descriptor_1.frac)(timeScope.Strt),
548
+ duration: (0, descriptor_1.frac)(timeScope.duration),
549
+ inTime: (0, descriptor_1.frac)(timeScope.inTime),
550
+ outTime: (0, descriptor_1.frac)(timeScope.outTime),
553
551
  autoScope: desc.autoScope,
554
552
  audioLevel: desc.audioLevel,
555
553
  };
@@ -690,7 +688,7 @@ addHandler('vstk', hasKey('vectorStroke'), function (reader, target, left) {
690
688
  }, function (writer, target) {
691
689
  var _a, _b, _c;
692
690
  var stroke = target.vectorStroke;
693
- var descriptor = {
691
+ var desc = {
694
692
  strokeStyleVersion: 2,
695
693
  strokeEnabled: !!stroke.strokeEnabled,
696
694
  fillEnabled: !!stroke.fillEnabled,
@@ -708,7 +706,7 @@ addHandler('vstk', hasKey('vectorStroke'), function (reader, target, left) {
708
706
  strokeStyleContent: (0, descriptor_1.serializeVectorContent)(stroke.content || { type: 'color', color: { r: 0, g: 0, b: 0 } }).descriptor,
709
707
  strokeStyleResolution: (_c = stroke.resolution) !== null && _c !== void 0 ? _c : 72,
710
708
  };
711
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'strokeStyle', descriptor);
709
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'strokeStyle', desc);
712
710
  });
713
711
  addHandler('artb', // per-layer arboard info
714
712
  hasKey('artboard'), function (reader, target, left) {
@@ -773,7 +771,7 @@ function isQuiltWarp(warp) {
773
771
  }
774
772
  function encodeWarp(warp) {
775
773
  var bounds = warp.bounds;
776
- var desc = __assign(__assign({ warpStyle: descriptor_1.warpStyle.encode(warp.style) }, (warp.values ? { warpValues: warp.values } : { warpValue: warp.value })), { warpPerspective: warp.perspective || 0, warpPerspectiveOther: warp.perspectiveOther || 0, warpRotate: descriptor_1.Ornt.encode(warp.rotate), bounds: {
774
+ var desc = __assign(__assign({ warpStyle: descriptor_1.warpStyle.encode(warp.style) }, (warp.values ? { warpValues: warp.values } : { warpValue: warp.value || 0 })), { warpPerspective: warp.perspective || 0, warpPerspectiveOther: warp.perspectiveOther || 0, warpRotate: descriptor_1.Ornt.encode(warp.rotate), bounds: {
777
775
  'Top ': (0, descriptor_1.unitsValue)(bounds && bounds.top || { units: 'Pixels', value: 0 }, 'bounds.top'),
778
776
  Left: (0, descriptor_1.unitsValue)(bounds && bounds.left || { units: 'Pixels', value: 0 }, 'bounds.left'),
779
777
  Btom: (0, descriptor_1.unitsValue)(bounds && bounds.bottom || { units: 'Pixels', value: 0 }, 'bounds.bottom'),
@@ -791,6 +789,8 @@ function encodeWarp(warp) {
791
789
  if (isQuilt) {
792
790
  var desc2 = desc;
793
791
  desc2.customEnvelopeWarp = {
792
+ _name: '',
793
+ _classID: 'customEnvelopeWarp',
794
794
  quiltSliceX: [{
795
795
  type: 'quiltSliceX',
796
796
  values: customEnvelopeWarp.quiltSliceX || [],
@@ -807,6 +807,8 @@ function encodeWarp(warp) {
807
807
  }
808
808
  else {
809
809
  desc.customEnvelopeWarp = {
810
+ _name: '',
811
+ _classID: 'customEnvelopeWarp',
810
812
  meshPoints: [
811
813
  { type: 'Hrzn', values: meshPoints.map(function (p) { return p.x; }) },
812
814
  { type: 'Vrtc', values: meshPoints.map(function (p) { return p.y; }) },
@@ -898,58 +900,345 @@ function hrznVrtcToPoint(desc) {
898
900
  }
899
901
  function pointToHrznVrtc(point) {
900
902
  return {
903
+ _name: '',
904
+ _classID: 'Pnt ',
901
905
  Hrzn: (0, descriptor_1.unitsValue)(point.x, 'x'),
902
906
  Vrtc: (0, descriptor_1.unitsValue)(point.y, 'y'),
903
907
  };
904
908
  }
905
- function parseFilterFXFilter(Fltr) {
906
- if ('puppetShapeList' in Fltr) {
907
- return {
908
- rigidType: Fltr.rigidType,
909
- bounds: [
910
- { x: Fltr.PuX0, y: Fltr.PuY0, },
911
- { x: Fltr.PuX1, y: Fltr.PuY1, },
912
- { x: Fltr.PuX2, y: Fltr.PuY2, },
913
- { x: Fltr.PuX3, y: Fltr.PuY3, },
914
- ],
915
- puppetShapeList: Fltr.puppetShapeList.map(function (p) { return ({
916
- rigidType: p.rigidType,
917
- // TODO: VrsM
918
- // TODO: VrsN
919
- originalVertexArray: uint8ToPoints(p.originalVertexArray),
920
- deformedVertexArray: uint8ToPoints(p.deformedVertexArray),
921
- indexArray: Array.from(uint8ToUint32(p.indexArray)),
922
- pinOffsets: arrayToPoints(p.pinOffsets),
923
- posFinalPins: arrayToPoints(p.posFinalPins),
924
- pinVertexIndices: p.pinVertexIndices,
925
- selectedPin: p.selectedPin,
926
- pinPosition: arrayToPoints(p.PinP),
927
- pinRotation: p.PnRt,
928
- pinOverlay: p.PnOv,
929
- pinDepth: p.PnDp,
930
- meshQuality: p.meshQuality,
931
- meshExpansion: p.meshExpansion,
932
- meshRigidity: p.meshRigidity,
933
- imageResolution: p.imageResolution,
934
- meshBoundaryPath: {
935
- pathComponents: p.meshBoundaryPath.pathComponents.map(function (c) { return ({
936
- shapeOperation: c.shapeOperation.split('.')[1],
937
- paths: c.SbpL.map(function (t) { return ({
938
- closed: t.Clsp,
939
- points: t['Pts '].map(function (pt) { return ({
940
- anchor: hrznVrtcToPoint(pt.Anch),
941
- forward: hrznVrtcToPoint(pt['Fwd ']),
942
- backward: hrznVrtcToPoint(pt['Bwd ']),
943
- smooth: pt.Smoo,
909
+ function parseFilterFXItem(f) {
910
+ var base = {
911
+ name: f['Nm '],
912
+ opacity: (0, descriptor_1.parsePercent)(f.blendOptions.Opct),
913
+ blendMode: descriptor_1.BlnM.decode(f.blendOptions['Md ']),
914
+ enabled: f.enab,
915
+ hasOptions: f.hasoptions,
916
+ foregroundColor: (0, descriptor_1.parseColor)(f.FrgC),
917
+ backgroundColor: (0, descriptor_1.parseColor)(f.BckC),
918
+ };
919
+ switch (f.filterID) {
920
+ case 1098281575: return __assign(__assign({}, base), { type: 'average' });
921
+ case 1114403360: return __assign(__assign({}, base), { type: 'blur' });
922
+ case 1114403405: return __assign(__assign({}, base), { type: 'blur more' });
923
+ case 697: return __assign(__assign({}, base), { type: 'box blur', filter: {
924
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
925
+ } });
926
+ case 1198747202: return __assign(__assign({}, base), { type: 'gaussian blur', filter: {
927
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
928
+ } });
929
+ case 1299476034: return __assign(__assign({}, base), { type: 'motion blur', filter: {
930
+ angle: f.Fltr.Angl,
931
+ distance: (0, descriptor_1.parseUnits)(f.Fltr.Dstn),
932
+ } });
933
+ case 1382313026: return __assign(__assign({}, base), { type: 'radial blur', filter: {
934
+ amount: f.Fltr.Amnt,
935
+ method: descriptor_1.BlrM.decode(f.Fltr.BlrM),
936
+ quality: descriptor_1.BlrQ.decode(f.Fltr.BlrQ),
937
+ } });
938
+ case 702: return __assign(__assign({}, base), { type: 'shape blur', filter: {
939
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
940
+ customShape: { name: f.Fltr.customShape['Nm '], id: f.Fltr.customShape.Idnt },
941
+ } });
942
+ case 1399681602: return __assign(__assign({}, base), { type: 'smart blur', filter: {
943
+ radius: f.Fltr['Rds '],
944
+ threshold: f.Fltr.Thsh,
945
+ quality: descriptor_1.SmBQ.decode(f.Fltr.SmBQ),
946
+ mode: descriptor_1.SmBM.decode(f.Fltr.SmBM),
947
+ } });
948
+ case 701: return __assign(__assign({}, base), { type: 'surface blur', filter: {
949
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
950
+ threshold: f.Fltr.Thsh,
951
+ } });
952
+ case 1148416108: return __assign(__assign({}, base), { type: 'displace', filter: {
953
+ horizontalScale: f.Fltr.HrzS,
954
+ verticalScale: f.Fltr.VrtS,
955
+ displacementMap: descriptor_1.DspM.decode(f.Fltr.DspM),
956
+ undefinedAreas: descriptor_1.UndA.decode(f.Fltr.UndA),
957
+ displacementFile: {
958
+ signature: f.Fltr.DspF.sig,
959
+ path: f.Fltr.DspF.path, // TODO: this is decoded incorrectly ???
960
+ },
961
+ } });
962
+ case 1349411688: return __assign(__assign({}, base), { type: 'pinch', filter: {
963
+ amount: f.Fltr.Amnt,
964
+ } });
965
+ case 1349284384: return __assign(__assign({}, base), { type: 'polar coordinates', filter: {
966
+ conversion: descriptor_1.Cnvr.decode(f.Fltr.Cnvr),
967
+ } });
968
+ case 1383099493: return __assign(__assign({}, base), { type: 'ripple', filter: {
969
+ amount: f.Fltr.Amnt,
970
+ size: descriptor_1.RplS.decode(f.Fltr.RplS),
971
+ } });
972
+ case 1399353888: return __assign(__assign({}, base), { type: 'shear', filter: {
973
+ shearPoints: f.Fltr.ShrP.map(function (p) { return ({ x: p.Hrzn, y: p.Vrtc }); }),
974
+ shearStart: f.Fltr.ShrS,
975
+ shearEnd: f.Fltr.ShrE,
976
+ undefinedAreas: descriptor_1.UndA.decode(f.Fltr.UndA),
977
+ } });
978
+ case 1399875698: return __assign(__assign({}, base), { type: 'spherize', filter: {
979
+ amount: f.Fltr.Amnt,
980
+ mode: descriptor_1.SphM.decode(f.Fltr.SphM),
981
+ } });
982
+ case 1417114220: return __assign(__assign({}, base), { type: 'twirl', filter: {
983
+ angle: f.Fltr.Angl,
984
+ } });
985
+ case 1466005093: return __assign(__assign({}, base), { type: 'wave', filter: {
986
+ numberOfGenerators: f.Fltr.NmbG,
987
+ type: descriptor_1.Wvtp.decode(f.Fltr.Wvtp),
988
+ wavelength: { min: f.Fltr.WLMn, max: f.Fltr.WLMx },
989
+ amplitude: { min: f.Fltr.AmMn, max: f.Fltr.AmMx },
990
+ scale: { x: f.Fltr.SclH, y: f.Fltr.SclV },
991
+ randomSeed: f.Fltr.RndS,
992
+ undefinedAreas: descriptor_1.UndA.decode(f.Fltr.UndA),
993
+ } });
994
+ case 1516722791: return __assign(__assign({}, base), { type: 'zigzag', filter: {
995
+ amount: f.Fltr.Amnt,
996
+ ridges: f.Fltr.NmbR,
997
+ style: descriptor_1.ZZTy.decode(f.Fltr.ZZTy),
998
+ } });
999
+ case 1097092723: return __assign(__assign({}, base), { type: 'add noise', filter: {
1000
+ amount: (0, descriptor_1.parsePercent)(f.Fltr.Nose),
1001
+ distribution: descriptor_1.Dstr.decode(f.Fltr.Dstr),
1002
+ monochromatic: f.Fltr.Mnch,
1003
+ randomSeed: f.Fltr.FlRs,
1004
+ } });
1005
+ case 1148416099: return __assign(__assign({}, base), { type: 'despeckle' });
1006
+ case 1148417107: return __assign(__assign({}, base), { type: 'dust and scratches', filter: {
1007
+ radius: f.Fltr['Rds '],
1008
+ threshold: f.Fltr.Thsh,
1009
+ } });
1010
+ case 1298427424: return __assign(__assign({}, base), { type: 'median', filter: {
1011
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
1012
+ } });
1013
+ case 633: return __assign(__assign({}, base), { type: 'reduce noise', filter: {
1014
+ preset: f.Fltr.preset,
1015
+ removeJpegArtifact: f.Fltr.removeJPEGArtifact,
1016
+ reduceColorNoise: (0, descriptor_1.parsePercent)(f.Fltr.ClNs),
1017
+ sharpenDetails: (0, descriptor_1.parsePercent)(f.Fltr.Shrp),
1018
+ channelDenoise: f.Fltr.channelDenoise.map(function (c) { return (__assign({ channels: c.Chnl.map(function (i) { return descriptor_1.Chnl.decode(i); }), amount: c.Amnt }, (c.EdgF ? { preserveDetails: c.EdgF } : {}))); }),
1019
+ } });
1020
+ case 1131180616: return __assign(__assign({}, base), { type: 'color halftone', filter: {
1021
+ radius: f.Fltr['Rds '],
1022
+ angle1: f.Fltr.Ang1,
1023
+ angle2: f.Fltr.Ang2,
1024
+ angle3: f.Fltr.Ang3,
1025
+ angle4: f.Fltr.Ang4,
1026
+ } });
1027
+ case 1131574132: return __assign(__assign({}, base), { type: 'crystallize', filter: {
1028
+ cellSize: f.Fltr.ClSz,
1029
+ randomSeed: f.Fltr.FlRs,
1030
+ } });
1031
+ case 1180922912: return __assign(__assign({}, base), { type: 'facet' });
1032
+ case 1181902701: return __assign(__assign({}, base), { type: 'fragment' });
1033
+ case 1299870830: return __assign(__assign({}, base), { type: 'mezzotint', filter: {
1034
+ type: descriptor_1.MztT.decode(f.Fltr.MztT),
1035
+ randomSeed: f.Fltr.FlRs,
1036
+ } });
1037
+ case 1299407648: return __assign(__assign({}, base), { type: 'mosaic', filter: {
1038
+ cellSize: (0, descriptor_1.parseUnits)(f.Fltr.ClSz),
1039
+ } });
1040
+ case 1349416044: return __assign(__assign({}, base), { type: 'pointillize', filter: {
1041
+ cellSize: f.Fltr.ClSz,
1042
+ randomSeed: f.Fltr.FlRs,
1043
+ } });
1044
+ case 1131177075: return __assign(__assign({}, base), { type: 'clouds', filter: {
1045
+ randomSeed: f.Fltr.FlRs,
1046
+ } });
1047
+ case 1147564611: return __assign(__assign({}, base), { type: 'difference clouds', filter: {
1048
+ randomSeed: f.Fltr.FlRs,
1049
+ } });
1050
+ case 1180856947: return __assign(__assign({}, base), { type: 'fibers', filter: {
1051
+ variance: f.Fltr.Vrnc,
1052
+ strength: f.Fltr.Strg,
1053
+ randomSeed: f.Fltr.RndS,
1054
+ } });
1055
+ case 1282306886: return __assign(__assign({}, base), { type: 'lens flare', filter: {
1056
+ brightness: f.Fltr.Brgh,
1057
+ position: { x: f.Fltr.FlrC.Hrzn, y: f.Fltr.FlrC.Vrtc },
1058
+ lensType: descriptor_1.Lns.decode(f.Fltr['Lns ']),
1059
+ } });
1060
+ case 1399353968: return __assign(__assign({}, base), { type: 'sharpen' });
1061
+ case 1399353925: return __assign(__assign({}, base), { type: 'sharpen edges' });
1062
+ case 1399353933: return __assign(__assign({}, base), { type: 'sharpen more' });
1063
+ case 698: return __assign(__assign({}, base), { type: 'smart sharpen', filter: {
1064
+ amount: (0, descriptor_1.parsePercent)(f.Fltr.Amnt),
1065
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
1066
+ threshold: f.Fltr.Thsh,
1067
+ angle: f.Fltr.Angl,
1068
+ moreAccurate: f.Fltr.moreAccurate,
1069
+ blur: descriptor_1.blurType.decode(f.Fltr.blur),
1070
+ preset: f.Fltr.preset,
1071
+ shadow: {
1072
+ fadeAmount: (0, descriptor_1.parsePercent)(f.Fltr.sdwM.Amnt),
1073
+ tonalWidth: (0, descriptor_1.parsePercent)(f.Fltr.sdwM.Wdth),
1074
+ radius: f.Fltr.sdwM['Rds '],
1075
+ },
1076
+ highlight: {
1077
+ fadeAmount: (0, descriptor_1.parsePercent)(f.Fltr.hglM.Amnt),
1078
+ tonalWidth: (0, descriptor_1.parsePercent)(f.Fltr.hglM.Wdth),
1079
+ radius: f.Fltr.hglM['Rds '],
1080
+ },
1081
+ } });
1082
+ case 1433301837: return __assign(__assign({}, base), { type: 'unsharp mask', filter: {
1083
+ amount: (0, descriptor_1.parsePercent)(f.Fltr.Amnt),
1084
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
1085
+ threshold: f.Fltr.Thsh,
1086
+ } });
1087
+ case 1147564832: return __assign(__assign({}, base), { type: 'diffuse', filter: {
1088
+ mode: descriptor_1.DfsM.decode(f.Fltr['Md ']),
1089
+ randomSeed: f.Fltr.FlRs,
1090
+ } });
1091
+ case 1164796531: return __assign(__assign({}, base), { type: 'emboss', filter: {
1092
+ angle: f.Fltr.Angl,
1093
+ height: f.Fltr.Hght,
1094
+ amount: f.Fltr.Amnt,
1095
+ } });
1096
+ case 1165522034: return __assign(__assign({}, base), { type: 'extrude', filter: {
1097
+ type: descriptor_1.ExtT.decode(f.Fltr.ExtT),
1098
+ size: f.Fltr.ExtS,
1099
+ depth: f.Fltr.ExtD,
1100
+ depthMode: descriptor_1.ExtR.decode(f.Fltr.ExtR),
1101
+ randomSeed: f.Fltr.FlRs,
1102
+ solidFrontFaces: f.Fltr.ExtF,
1103
+ maskIncompleteBlocks: f.Fltr.ExtM,
1104
+ } });
1105
+ case 1181639749: return __assign(__assign({}, base), { type: 'find edges' });
1106
+ case 1399616122: return __assign(__assign({}, base), { type: 'solarize' });
1107
+ case 1416393504: return __assign(__assign({}, base), { type: 'tiles', filter: {
1108
+ numberOfTiles: f.Fltr.TlNm,
1109
+ maximumOffset: f.Fltr.TlOf,
1110
+ fillEmptyAreaWith: descriptor_1.FlCl.decode(f.Fltr.FlCl),
1111
+ randomSeed: f.Fltr.FlRs,
1112
+ } });
1113
+ case 1416782659: return __assign(__assign({}, base), { type: 'trace contour', filter: {
1114
+ level: f.Fltr['Lvl '],
1115
+ edge: descriptor_1.CntE.decode(f.Fltr['Edg ']),
1116
+ } });
1117
+ case 1466852384: return __assign(__assign({}, base), { type: 'wind', filter: {
1118
+ method: descriptor_1.WndM.decode(f.Fltr.WndM),
1119
+ direction: descriptor_1.Drct.decode(f.Fltr.Drct),
1120
+ } });
1121
+ case 1148089458: return __assign(__assign({}, base), { type: 'de-interlace', filter: {
1122
+ eliminate: descriptor_1.IntE.decode(f.Fltr.IntE),
1123
+ newFieldsBy: descriptor_1.IntC.decode(f.Fltr.IntC),
1124
+ } });
1125
+ case 1314149187: return __assign(__assign({}, base), { type: 'ntsc colors' });
1126
+ case 1131639917: return __assign(__assign({}, base), { type: 'custom', filter: {
1127
+ scale: f.Fltr['Scl '],
1128
+ offset: f.Fltr.Ofst,
1129
+ matrix: f.Fltr.Mtrx,
1130
+ } });
1131
+ case 1214736464: return __assign(__assign({}, base), { type: 'high pass', filter: {
1132
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
1133
+ } });
1134
+ case 1299737888: return __assign(__assign({}, base), { type: 'maximum', filter: {
1135
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
1136
+ } });
1137
+ case 1299082528: return __assign(__assign({}, base), { type: 'minimum', filter: {
1138
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
1139
+ } });
1140
+ case 1332114292: return __assign(__assign({}, base), { type: 'offset', filter: {
1141
+ horizontal: f.Fltr.Hrzn,
1142
+ vertical: f.Fltr.Vrtc,
1143
+ undefinedAreas: descriptor_1.FlMd.decode(f.Fltr['Fl ']),
1144
+ } });
1145
+ case 991: return __assign(__assign({}, base), { type: 'puppet', filter: {
1146
+ rigidType: f.Fltr.rigidType,
1147
+ bounds: [
1148
+ { x: f.Fltr.PuX0, y: f.Fltr.PuY0, },
1149
+ { x: f.Fltr.PuX1, y: f.Fltr.PuY1, },
1150
+ { x: f.Fltr.PuX2, y: f.Fltr.PuY2, },
1151
+ { x: f.Fltr.PuX3, y: f.Fltr.PuY3, },
1152
+ ],
1153
+ puppetShapeList: f.Fltr.puppetShapeList.map(function (p) { return ({
1154
+ rigidType: p.rigidType,
1155
+ // TODO: VrsM
1156
+ // TODO: VrsN
1157
+ originalVertexArray: uint8ToPoints(p.originalVertexArray),
1158
+ deformedVertexArray: uint8ToPoints(p.deformedVertexArray),
1159
+ indexArray: Array.from(uint8ToUint32(p.indexArray)),
1160
+ pinOffsets: arrayToPoints(p.pinOffsets),
1161
+ posFinalPins: arrayToPoints(p.posFinalPins),
1162
+ pinVertexIndices: p.pinVertexIndices,
1163
+ selectedPin: p.selectedPin,
1164
+ pinPosition: arrayToPoints(p.PinP),
1165
+ pinRotation: p.PnRt,
1166
+ pinOverlay: p.PnOv,
1167
+ pinDepth: p.PnDp,
1168
+ meshQuality: p.meshQuality,
1169
+ meshExpansion: p.meshExpansion,
1170
+ meshRigidity: p.meshRigidity,
1171
+ imageResolution: p.imageResolution,
1172
+ meshBoundaryPath: {
1173
+ pathComponents: p.meshBoundaryPath.pathComponents.map(function (c) { return ({
1174
+ shapeOperation: c.shapeOperation.split('.')[1],
1175
+ paths: c.SbpL.map(function (t) { return ({
1176
+ closed: t.Clsp,
1177
+ points: t['Pts '].map(function (pt) { return ({
1178
+ anchor: hrznVrtcToPoint(pt.Anch),
1179
+ forward: hrznVrtcToPoint(pt['Fwd ']),
1180
+ backward: hrznVrtcToPoint(pt['Bwd ']),
1181
+ smooth: pt.Smoo,
1182
+ }); }),
944
1183
  }); }),
945
1184
  }); }),
946
- }); }),
947
- },
948
- }); }),
949
- };
950
- }
951
- else {
952
- return {};
1185
+ },
1186
+ }); }),
1187
+ } });
1188
+ case 1348620396: {
1189
+ var parameters = [];
1190
+ var Flrt = f.Fltr;
1191
+ for (var i = 0; i < fromAtoZ.length; i++) {
1192
+ if (!Flrt["PN".concat(fromAtoZ[i], "a")])
1193
+ break;
1194
+ for (var j = 0; j < fromAtoZ.length; j++) {
1195
+ if (!Flrt["PN".concat(fromAtoZ[i]).concat(fromAtoZ[j])])
1196
+ break;
1197
+ parameters.push({
1198
+ name: Flrt["PN".concat(fromAtoZ[i]).concat(fromAtoZ[j])],
1199
+ value: Flrt["PF".concat(fromAtoZ[i]).concat(fromAtoZ[j])]
1200
+ });
1201
+ }
1202
+ }
1203
+ return __assign(__assign({}, base), { type: 'oil paint plugin', filter: {
1204
+ name: f.Fltr.KnNm,
1205
+ gpu: f.Fltr.GpuY,
1206
+ lighting: f.Fltr.LIWy,
1207
+ parameters: parameters,
1208
+ } });
1209
+ }
1210
+ // case 2089: return {
1211
+ // ...base,
1212
+ // type: 'adaptive wide angle',
1213
+ // params: {
1214
+ // correction: prjM.decode(f.Fltr.prjM),
1215
+ // focalLength: f.Fltr.focL,
1216
+ // cropFactor: f.Fltr.CrpF,
1217
+ // imageScale: f.Fltr.imgS,
1218
+ // imageX: f.Fltr.imgX,
1219
+ // imageY: f.Fltr.imgY,
1220
+ // },
1221
+ // };
1222
+ case 1215521360: return __assign(__assign({}, base), { type: 'hsb/hsl', filter: {
1223
+ inputMode: descriptor_1.ClrS.decode(f.Fltr.Inpt),
1224
+ rowOrder: descriptor_1.ClrS.decode(f.Fltr.Otpt),
1225
+ } });
1226
+ case 1122: return __assign(__assign({}, base), { type: 'oil paint', filter: {
1227
+ lightingOn: f.Fltr.lightingOn,
1228
+ stylization: f.Fltr.stylization,
1229
+ cleanliness: f.Fltr.cleanliness,
1230
+ brushScale: f.Fltr.brushScale,
1231
+ microBrush: f.Fltr.microBrush,
1232
+ lightDirection: f.Fltr.LghD,
1233
+ specularity: f.Fltr.specularity,
1234
+ } });
1235
+ case 1282492025: {
1236
+ return __assign(__assign({}, base), { type: 'liquify', filter: {
1237
+ liquifyMesh: f.Fltr.LqMe,
1238
+ } });
1239
+ }
1240
+ default:
1241
+ throw new Error("Unknown filterID: ".concat(f.filterID));
953
1242
  }
954
1243
  }
955
1244
  function parseFilterFX(desc) {
@@ -959,96 +1248,446 @@ function parseFilterFX(desc) {
959
1248
  maskEnabled: desc.filterMaskEnable,
960
1249
  maskLinked: desc.filterMaskLinked,
961
1250
  maskExtendWithWhite: desc.filterMaskExtendWithWhite,
962
- list: desc.filterFXList.map(function (f) { return ({
963
- id: f.filterID,
964
- name: f['Nm '],
965
- opacity: (0, descriptor_1.parsePercent)(f.blendOptions.Opct),
966
- blendMode: descriptor_1.BlnM.decode(f.blendOptions['Md ']),
967
- enabled: f.enab,
968
- hasOptions: f.hasoptions,
969
- foregroundColor: (0, descriptor_1.parseColor)(f.FrgC),
970
- backgroundColor: (0, descriptor_1.parseColor)(f.BckC),
971
- filter: parseFilterFXFilter(f.Fltr),
972
- }); }),
1251
+ list: desc.filterFXList.map(parseFilterFXItem),
973
1252
  };
974
1253
  }
975
- function serializeFltr(filter) {
976
- if ('puppetShapeList' in filter) {
977
- return {
978
- 'null': ['Ordn.Trgt'],
979
- rigidType: filter.rigidType,
980
- puppetShapeList: filter.puppetShapeList.map(function (p) { return ({
981
- rigidType: p.rigidType,
982
- VrsM: 1,
983
- VrsN: 0,
984
- originalVertexArray: toUint8(new Float32Array(pointsToArray(p.originalVertexArray))),
985
- deformedVertexArray: toUint8(new Float32Array(pointsToArray(p.deformedVertexArray))),
986
- indexArray: toUint8(new Uint32Array(p.indexArray)),
987
- pinOffsets: pointsToArray(p.pinOffsets),
988
- posFinalPins: pointsToArray(p.posFinalPins),
989
- selectedPin: p.selectedPin,
990
- pinVertexIndices: p.pinVertexIndices,
991
- PinP: pointsToArray(p.pinPosition),
992
- PnRt: p.pinRotation,
993
- PnOv: p.pinOverlay,
994
- PnDp: p.pinDepth,
995
- meshQuality: p.meshQuality,
996
- meshExpansion: p.meshExpansion,
997
- meshRigidity: p.meshRigidity,
998
- imageResolution: p.imageResolution,
999
- meshBoundaryPath: {
1000
- pathComponents: (p.meshBoundaryPath.pathComponents || []).map(function (c) { return ({
1001
- shapeOperation: "shapeOperation.".concat(c.shapeOperation),
1002
- SbpL: (c.paths || []).map(function (path) { return ({
1003
- Clsp: path.closed,
1004
- 'Pts ': (path.points || []).map(function (pt) { return ({
1005
- Anch: pointToHrznVrtc(pt.anchor),
1006
- 'Fwd ': pointToHrznVrtc(pt.forward),
1007
- 'Bwd ': pointToHrznVrtc(pt.backward),
1008
- Smoo: pt.smooth,
1254
+ function uvRadius(t) {
1255
+ return (0, descriptor_1.unitsValue)(t.radius, 'radius');
1256
+ }
1257
+ function serializeFilterFXItem(f) {
1258
+ var base = {
1259
+ _name: '',
1260
+ _classID: 'filterFX',
1261
+ 'Nm ': f.name,
1262
+ blendOptions: {
1263
+ _name: '',
1264
+ _classID: 'blendOptions',
1265
+ Opct: (0, descriptor_1.unitsPercentF)(f.opacity),
1266
+ 'Md ': descriptor_1.BlnM.encode(f.blendMode),
1267
+ },
1268
+ enab: f.enabled,
1269
+ hasoptions: f.hasOptions,
1270
+ FrgC: (0, descriptor_1.serializeColor)(f.foregroundColor),
1271
+ BckC: (0, descriptor_1.serializeColor)(f.backgroundColor),
1272
+ };
1273
+ switch (f.type) {
1274
+ case 'average': return __assign(__assign({}, base), { filterID: 1098281575 });
1275
+ case 'blur': return __assign(__assign({}, base), { filterID: 1114403360 });
1276
+ case 'blur more': return __assign(__assign({}, base), { filterID: 1114403405 });
1277
+ case 'box blur': return __assign(__assign({}, base), { Fltr: {
1278
+ _name: 'Box Blur',
1279
+ _classID: 'boxblur',
1280
+ 'Rds ': uvRadius(f.filter),
1281
+ }, filterID: 697 });
1282
+ case 'gaussian blur': return __assign(__assign({}, base), { Fltr: {
1283
+ _name: 'Gaussian Blur',
1284
+ _classID: 'GsnB',
1285
+ 'Rds ': uvRadius(f.filter),
1286
+ }, filterID: 1198747202 });
1287
+ case 'motion blur': return __assign(__assign({}, base), { Fltr: {
1288
+ _name: 'Motion Blur',
1289
+ _classID: 'MtnB',
1290
+ Angl: f.filter.angle,
1291
+ Dstn: (0, descriptor_1.unitsValue)(f.filter.distance, 'distance'),
1292
+ }, filterID: 1299476034 });
1293
+ case 'radial blur': return __assign(__assign({}, base), { Fltr: {
1294
+ _name: 'Radial Blur',
1295
+ _classID: 'RdlB',
1296
+ Amnt: f.filter.amount,
1297
+ BlrM: descriptor_1.BlrM.encode(f.filter.method),
1298
+ BlrQ: descriptor_1.BlrQ.encode(f.filter.quality),
1299
+ }, filterID: 1382313026 });
1300
+ case 'shape blur': return __assign(__assign({}, base), { Fltr: {
1301
+ _name: 'Shape Blur',
1302
+ _classID: 'shapeBlur',
1303
+ 'Rds ': uvRadius(f.filter),
1304
+ customShape: {
1305
+ _name: '',
1306
+ _classID: 'customShape',
1307
+ 'Nm ': f.filter.customShape.name,
1308
+ Idnt: f.filter.customShape.id,
1309
+ }
1310
+ }, filterID: 702 });
1311
+ case 'smart blur': return __assign(__assign({}, base), { Fltr: {
1312
+ _name: 'Smart Blur',
1313
+ _classID: 'SmrB',
1314
+ 'Rds ': f.filter.radius,
1315
+ Thsh: f.filter.threshold,
1316
+ SmBQ: descriptor_1.SmBQ.encode(f.filter.quality),
1317
+ SmBM: descriptor_1.SmBM.encode(f.filter.mode),
1318
+ }, filterID: 1399681602 });
1319
+ case 'surface blur': return __assign(__assign({}, base), { Fltr: {
1320
+ _name: 'Surface Blur',
1321
+ _classID: 'surfaceBlur',
1322
+ 'Rds ': uvRadius(f.filter),
1323
+ Thsh: f.filter.threshold,
1324
+ }, filterID: 701 });
1325
+ case 'displace': return __assign(__assign({}, base), { Fltr: {
1326
+ _name: 'Displace',
1327
+ _classID: 'Dspl',
1328
+ HrzS: f.filter.horizontalScale,
1329
+ VrtS: f.filter.verticalScale,
1330
+ DspM: descriptor_1.DspM.encode(f.filter.displacementMap),
1331
+ UndA: descriptor_1.UndA.encode(f.filter.undefinedAreas),
1332
+ DspF: {
1333
+ sig: f.filter.displacementFile.signature,
1334
+ path: f.filter.displacementFile.path,
1335
+ },
1336
+ }, filterID: 1148416108 });
1337
+ case 'pinch': return __assign(__assign({}, base), { Fltr: {
1338
+ _name: 'Pinch',
1339
+ _classID: 'Pnch',
1340
+ Amnt: f.filter.amount,
1341
+ }, filterID: 1349411688 });
1342
+ case 'polar coordinates': return __assign(__assign({}, base), { Fltr: {
1343
+ _name: 'Polar Coordinates',
1344
+ _classID: 'Plr ',
1345
+ Cnvr: descriptor_1.Cnvr.encode(f.filter.conversion),
1346
+ }, filterID: 1349284384 });
1347
+ case 'ripple': return __assign(__assign({}, base), { Fltr: {
1348
+ _name: 'Ripple',
1349
+ _classID: 'Rple',
1350
+ Amnt: f.filter.amount,
1351
+ RplS: descriptor_1.RplS.encode(f.filter.size),
1352
+ }, filterID: 1383099493 });
1353
+ case 'shear': return __assign(__assign({}, base), { Fltr: {
1354
+ _name: 'Shear',
1355
+ _classID: 'Shr ',
1356
+ ShrP: f.filter.shearPoints.map(function (p) { return ({ _name: '', _classID: 'Pnt ', Hrzn: p.x, Vrtc: p.y }); }),
1357
+ UndA: descriptor_1.UndA.encode(f.filter.undefinedAreas),
1358
+ ShrS: f.filter.shearStart,
1359
+ ShrE: f.filter.shearEnd,
1360
+ }, filterID: 1399353888 });
1361
+ case 'spherize': return __assign(__assign({}, base), { Fltr: {
1362
+ _name: 'Spherize',
1363
+ _classID: 'Sphr',
1364
+ Amnt: f.filter.amount,
1365
+ SphM: descriptor_1.SphM.encode(f.filter.mode),
1366
+ }, filterID: 1399875698 });
1367
+ case 'twirl': return __assign(__assign({}, base), { Fltr: {
1368
+ _name: 'Twirl',
1369
+ _classID: 'Twrl',
1370
+ Angl: f.filter.angle,
1371
+ }, filterID: 1417114220 });
1372
+ case 'wave': return __assign(__assign({}, base), { Fltr: {
1373
+ _name: 'Wave',
1374
+ _classID: 'Wave',
1375
+ Wvtp: descriptor_1.Wvtp.encode(f.filter.type),
1376
+ NmbG: f.filter.numberOfGenerators,
1377
+ WLMn: f.filter.wavelength.min,
1378
+ WLMx: f.filter.wavelength.max,
1379
+ AmMn: f.filter.amplitude.min,
1380
+ AmMx: f.filter.amplitude.max,
1381
+ SclH: f.filter.scale.x,
1382
+ SclV: f.filter.scale.y,
1383
+ UndA: descriptor_1.UndA.encode(f.filter.undefinedAreas),
1384
+ RndS: f.filter.randomSeed,
1385
+ }, filterID: 1466005093 });
1386
+ case 'zigzag': return __assign(__assign({}, base), { Fltr: {
1387
+ _name: 'ZigZag',
1388
+ _classID: 'ZgZg',
1389
+ Amnt: f.filter.amount,
1390
+ NmbR: f.filter.ridges,
1391
+ ZZTy: descriptor_1.ZZTy.encode(f.filter.style),
1392
+ }, filterID: 1516722791 });
1393
+ case 'add noise': return __assign(__assign({}, base), { Fltr: {
1394
+ _name: 'Add Noise',
1395
+ _classID: 'AdNs',
1396
+ Dstr: descriptor_1.Dstr.encode(f.filter.distribution),
1397
+ Nose: (0, descriptor_1.unitsPercentF)(f.filter.amount),
1398
+ Mnch: f.filter.monochromatic,
1399
+ FlRs: f.filter.randomSeed,
1400
+ }, filterID: 1097092723 });
1401
+ case 'despeckle': return __assign(__assign({}, base), { filterID: 1148416099 });
1402
+ case 'dust and scratches': return __assign(__assign({}, base), { Fltr: {
1403
+ _name: 'Dust & Scratches',
1404
+ _classID: 'DstS',
1405
+ 'Rds ': f.filter.radius,
1406
+ Thsh: f.filter.threshold,
1407
+ }, filterID: 1148417107 });
1408
+ case 'median': return __assign(__assign({}, base), { Fltr: {
1409
+ _name: 'Median',
1410
+ _classID: 'Mdn ',
1411
+ 'Rds ': uvRadius(f.filter),
1412
+ }, filterID: 1298427424 });
1413
+ case 'reduce noise': return __assign(__assign({}, base), { Fltr: {
1414
+ _name: 'Reduce Noise',
1415
+ _classID: 'denoise',
1416
+ ClNs: (0, descriptor_1.unitsPercentF)(f.filter.reduceColorNoise),
1417
+ Shrp: (0, descriptor_1.unitsPercentF)(f.filter.sharpenDetails),
1418
+ removeJPEGArtifact: f.filter.removeJpegArtifact,
1419
+ channelDenoise: f.filter.channelDenoise.map(function (c) { return (__assign({ _name: '', _classID: 'channelDenoiseParams', Chnl: c.channels.map(function (i) { return descriptor_1.Chnl.encode(i); }), Amnt: c.amount }, (c.preserveDetails ? { EdgF: c.preserveDetails } : {}))); }),
1420
+ preset: f.filter.preset,
1421
+ }, filterID: 633 });
1422
+ case 'color halftone': return __assign(__assign({}, base), { Fltr: {
1423
+ _name: 'Color Halftone',
1424
+ _classID: 'ClrH',
1425
+ 'Rds ': f.filter.radius,
1426
+ Ang1: f.filter.angle1,
1427
+ Ang2: f.filter.angle2,
1428
+ Ang3: f.filter.angle3,
1429
+ Ang4: f.filter.angle4,
1430
+ }, filterID: 1131180616 });
1431
+ case 'crystallize': return __assign(__assign({}, base), { Fltr: {
1432
+ _name: 'Crystallize',
1433
+ _classID: 'Crst',
1434
+ ClSz: f.filter.cellSize,
1435
+ FlRs: f.filter.randomSeed,
1436
+ }, filterID: 1131574132 });
1437
+ case 'facet': return __assign(__assign({}, base), { filterID: 1180922912 });
1438
+ case 'fragment': return __assign(__assign({}, base), { filterID: 1181902701 });
1439
+ case 'mezzotint': return __assign(__assign({}, base), { Fltr: {
1440
+ _name: 'Mezzotint',
1441
+ _classID: 'Mztn',
1442
+ MztT: descriptor_1.MztT.encode(f.filter.type),
1443
+ FlRs: f.filter.randomSeed,
1444
+ }, filterID: 1299870830 });
1445
+ case 'mosaic': return __assign(__assign({}, base), { Fltr: {
1446
+ _name: 'Mosaic',
1447
+ _classID: 'Msc ',
1448
+ ClSz: (0, descriptor_1.unitsValue)(f.filter.cellSize, 'cellSize'),
1449
+ }, filterID: 1299407648 });
1450
+ case 'pointillize': return __assign(__assign({}, base), { Fltr: {
1451
+ _name: 'Pointillize',
1452
+ _classID: 'Pntl',
1453
+ ClSz: f.filter.cellSize,
1454
+ FlRs: f.filter.randomSeed,
1455
+ }, filterID: 1349416044 });
1456
+ case 'clouds': return __assign(__assign({}, base), { Fltr: {
1457
+ _name: 'Clouds',
1458
+ _classID: 'Clds',
1459
+ FlRs: f.filter.randomSeed,
1460
+ }, filterID: 1131177075 });
1461
+ case 'difference clouds': return __assign(__assign({}, base), { Fltr: {
1462
+ _name: 'Difference Clouds',
1463
+ _classID: 'DfrC',
1464
+ FlRs: f.filter.randomSeed,
1465
+ }, filterID: 1147564611 });
1466
+ case 'fibers': return __assign(__assign({}, base), { Fltr: {
1467
+ _name: 'Fibers',
1468
+ _classID: 'Fbrs',
1469
+ Vrnc: f.filter.variance,
1470
+ Strg: f.filter.strength,
1471
+ RndS: f.filter.randomSeed,
1472
+ }, filterID: 1180856947 });
1473
+ case 'lens flare': return __assign(__assign({}, base), { Fltr: {
1474
+ _name: 'Lens Flare',
1475
+ _classID: 'LnsF',
1476
+ Brgh: f.filter.brightness,
1477
+ FlrC: {
1478
+ _name: '',
1479
+ _classID: 'Pnt ',
1480
+ Hrzn: f.filter.position.x,
1481
+ Vrtc: f.filter.position.y,
1482
+ },
1483
+ 'Lns ': descriptor_1.Lns.encode(f.filter.lensType),
1484
+ }, filterID: 1282306886 });
1485
+ case 'sharpen': return __assign(__assign({}, base), { filterID: 1399353968 });
1486
+ case 'sharpen edges': return __assign(__assign({}, base), { filterID: 1399353925 });
1487
+ case 'sharpen more': return __assign(__assign({}, base), { filterID: 1399353933 });
1488
+ case 'smart sharpen': return __assign(__assign({}, base), { Fltr: {
1489
+ _name: 'Smart Sharpen',
1490
+ _classID: 'smartSharpen',
1491
+ Amnt: (0, descriptor_1.unitsPercentF)(f.filter.amount),
1492
+ 'Rds ': uvRadius(f.filter),
1493
+ Thsh: f.filter.threshold,
1494
+ Angl: f.filter.angle,
1495
+ moreAccurate: f.filter.moreAccurate,
1496
+ blur: descriptor_1.blurType.encode(f.filter.blur),
1497
+ preset: f.filter.preset,
1498
+ sdwM: {
1499
+ _name: 'Parameters',
1500
+ _classID: 'adaptCorrectTones',
1501
+ Amnt: (0, descriptor_1.unitsPercentF)(f.filter.shadow.fadeAmount),
1502
+ Wdth: (0, descriptor_1.unitsPercentF)(f.filter.shadow.tonalWidth),
1503
+ 'Rds ': f.filter.shadow.radius,
1504
+ },
1505
+ hglM: {
1506
+ _name: 'Parameters',
1507
+ _classID: 'adaptCorrectTones',
1508
+ Amnt: (0, descriptor_1.unitsPercentF)(f.filter.highlight.fadeAmount),
1509
+ Wdth: (0, descriptor_1.unitsPercentF)(f.filter.highlight.tonalWidth),
1510
+ 'Rds ': f.filter.highlight.radius,
1511
+ },
1512
+ }, filterID: 698 });
1513
+ case 'unsharp mask': return __assign(__assign({}, base), { Fltr: {
1514
+ _name: 'Unsharp Mask',
1515
+ _classID: 'UnsM',
1516
+ Amnt: (0, descriptor_1.unitsPercentF)(f.filter.amount),
1517
+ 'Rds ': uvRadius(f.filter),
1518
+ Thsh: f.filter.threshold,
1519
+ }, filterID: 1433301837 });
1520
+ case 'diffuse': return __assign(__assign({}, base), { Fltr: {
1521
+ _name: 'Diffuse',
1522
+ _classID: 'Dfs ',
1523
+ 'Md ': descriptor_1.DfsM.encode(f.filter.mode),
1524
+ FlRs: f.filter.randomSeed,
1525
+ }, filterID: 1147564832 });
1526
+ case 'emboss': return __assign(__assign({}, base), { Fltr: {
1527
+ _name: 'Emboss',
1528
+ _classID: 'Embs',
1529
+ Angl: f.filter.angle,
1530
+ Hght: f.filter.height,
1531
+ Amnt: f.filter.amount,
1532
+ }, filterID: 1164796531 });
1533
+ case 'extrude': return __assign(__assign({}, base), { Fltr: {
1534
+ _name: 'Extrude',
1535
+ _classID: 'Extr',
1536
+ ExtS: f.filter.size,
1537
+ ExtD: f.filter.depth,
1538
+ ExtF: f.filter.solidFrontFaces,
1539
+ ExtM: f.filter.maskIncompleteBlocks,
1540
+ ExtT: descriptor_1.ExtT.encode(f.filter.type),
1541
+ ExtR: descriptor_1.ExtR.encode(f.filter.depthMode),
1542
+ FlRs: f.filter.randomSeed,
1543
+ }, filterID: 1165522034 });
1544
+ case 'find edges': return __assign(__assign({}, base), { filterID: 1181639749 });
1545
+ case 'solarize': return __assign(__assign({}, base), { filterID: 1399616122 });
1546
+ case 'tiles': return __assign(__assign({}, base), { Fltr: {
1547
+ _name: 'Tiles',
1548
+ _classID: 'Tls ',
1549
+ TlNm: f.filter.numberOfTiles,
1550
+ TlOf: f.filter.maximumOffset,
1551
+ FlCl: descriptor_1.FlCl.encode(f.filter.fillEmptyAreaWith),
1552
+ FlRs: f.filter.randomSeed,
1553
+ }, filterID: 1416393504 });
1554
+ case 'trace contour': return __assign(__assign({}, base), { Fltr: {
1555
+ _name: 'Trace Contour',
1556
+ _classID: 'TrcC',
1557
+ 'Lvl ': f.filter.level,
1558
+ 'Edg ': descriptor_1.CntE.encode(f.filter.edge),
1559
+ }, filterID: 1416782659 });
1560
+ case 'wind': return __assign(__assign({}, base), { Fltr: {
1561
+ _name: 'Wind',
1562
+ _classID: 'Wnd ',
1563
+ WndM: descriptor_1.WndM.encode(f.filter.method),
1564
+ Drct: descriptor_1.Drct.encode(f.filter.direction),
1565
+ }, filterID: 1466852384 });
1566
+ case 'de-interlace': return __assign(__assign({}, base), { Fltr: {
1567
+ _name: 'De-Interlace',
1568
+ _classID: 'Dntr',
1569
+ IntE: descriptor_1.IntE.encode(f.filter.eliminate),
1570
+ IntC: descriptor_1.IntC.encode(f.filter.newFieldsBy),
1571
+ }, filterID: 1148089458 });
1572
+ case 'ntsc colors': return __assign(__assign({}, base), { filterID: 1314149187 });
1573
+ case 'custom': return __assign(__assign({}, base), { Fltr: {
1574
+ _name: 'Custom',
1575
+ _classID: 'Cstm',
1576
+ 'Scl ': f.filter.scale,
1577
+ Ofst: f.filter.offset,
1578
+ Mtrx: f.filter.matrix,
1579
+ }, filterID: 1131639917 });
1580
+ case 'high pass': return __assign(__assign({}, base), { Fltr: {
1581
+ _name: 'High Pass',
1582
+ _classID: 'HghP',
1583
+ 'Rds ': uvRadius(f.filter),
1584
+ }, filterID: 1214736464 });
1585
+ case 'maximum': return __assign(__assign({}, base), { Fltr: {
1586
+ _name: 'Maximum',
1587
+ _classID: 'Mxm ',
1588
+ 'Rds ': uvRadius(f.filter),
1589
+ }, filterID: 1299737888 });
1590
+ case 'minimum': return __assign(__assign({}, base), { Fltr: {
1591
+ _name: 'Minimum',
1592
+ _classID: 'Mnm ',
1593
+ 'Rds ': uvRadius(f.filter),
1594
+ }, filterID: 1299082528 });
1595
+ case 'offset': return __assign(__assign({}, base), { Fltr: {
1596
+ _name: 'Offset',
1597
+ _classID: 'Ofst',
1598
+ Hrzn: f.filter.horizontal,
1599
+ Vrtc: f.filter.vertical,
1600
+ 'Fl ': descriptor_1.FlMd.encode(f.filter.undefinedAreas),
1601
+ }, filterID: 1332114292 });
1602
+ case 'puppet': return __assign(__assign({}, base), { Fltr: {
1603
+ _name: 'Rigid Transform',
1604
+ _classID: 'rigidTransform',
1605
+ 'null': ['Ordn.Trgt'],
1606
+ rigidType: f.filter.rigidType,
1607
+ puppetShapeList: f.filter.puppetShapeList.map(function (p) { return ({
1608
+ _name: '',
1609
+ _classID: 'puppetShape',
1610
+ rigidType: p.rigidType,
1611
+ VrsM: 1,
1612
+ VrsN: 0,
1613
+ originalVertexArray: toUint8(new Float32Array(pointsToArray(p.originalVertexArray))),
1614
+ deformedVertexArray: toUint8(new Float32Array(pointsToArray(p.deformedVertexArray))),
1615
+ indexArray: toUint8(new Uint32Array(p.indexArray)),
1616
+ pinOffsets: pointsToArray(p.pinOffsets),
1617
+ posFinalPins: pointsToArray(p.posFinalPins),
1618
+ pinVertexIndices: p.pinVertexIndices,
1619
+ PinP: pointsToArray(p.pinPosition),
1620
+ PnRt: p.pinRotation,
1621
+ PnOv: p.pinOverlay,
1622
+ PnDp: p.pinDepth,
1623
+ meshQuality: p.meshQuality,
1624
+ meshExpansion: p.meshExpansion,
1625
+ meshRigidity: p.meshRigidity,
1626
+ imageResolution: p.imageResolution,
1627
+ meshBoundaryPath: {
1628
+ _name: '',
1629
+ _classID: 'pathClass',
1630
+ pathComponents: p.meshBoundaryPath.pathComponents.map(function (c) { return ({
1631
+ _name: '',
1632
+ _classID: 'PaCm',
1633
+ shapeOperation: "shapeOperation.".concat(c.shapeOperation),
1634
+ SbpL: c.paths.map(function (path) { return ({
1635
+ _name: '',
1636
+ _classID: 'Sbpl',
1637
+ Clsp: path.closed,
1638
+ 'Pts ': path.points.map(function (pt) { return ({
1639
+ _name: '',
1640
+ _classID: 'Pthp',
1641
+ Anch: pointToHrznVrtc(pt.anchor),
1642
+ 'Fwd ': pointToHrznVrtc(pt.forward),
1643
+ 'Bwd ': pointToHrznVrtc(pt.backward),
1644
+ Smoo: pt.smooth,
1645
+ }); }),
1009
1646
  }); }),
1010
1647
  }); }),
1011
- }); }),
1012
- },
1013
- }); }),
1014
- PuX0: filter.bounds[0].x,
1015
- PuX1: filter.bounds[1].x,
1016
- PuX2: filter.bounds[2].x,
1017
- PuX3: filter.bounds[3].x,
1018
- PuY0: filter.bounds[0].y,
1019
- PuY1: filter.bounds[1].y,
1020
- PuY2: filter.bounds[2].y,
1021
- PuY3: filter.bounds[3].y,
1022
- };
1023
- }
1024
- else {
1025
- return {
1026
- LqMe: new Uint8Array(),
1027
- };
1648
+ },
1649
+ selectedPin: p.selectedPin,
1650
+ }); }),
1651
+ PuX0: f.filter.bounds[0].x,
1652
+ PuX1: f.filter.bounds[1].x,
1653
+ PuX2: f.filter.bounds[2].x,
1654
+ PuX3: f.filter.bounds[3].x,
1655
+ PuY0: f.filter.bounds[0].y,
1656
+ PuY1: f.filter.bounds[1].y,
1657
+ PuY2: f.filter.bounds[2].y,
1658
+ PuY3: f.filter.bounds[3].y,
1659
+ }, filterID: 991 });
1660
+ case 'oil paint plugin': {
1661
+ var params = {};
1662
+ for (var i = 0; i < f.filter.parameters.length; i++) {
1663
+ var _a = f.filter.parameters[i], name_1 = _a.name, value = _a.value;
1664
+ var suffix = "".concat(fromAtoZ[Math.floor(i / fromAtoZ.length)]).concat(fromAtoZ[i % fromAtoZ.length]);
1665
+ params["PN".concat(suffix)] = name_1;
1666
+ params["PT".concat(suffix)] = 0;
1667
+ params["PF".concat(suffix)] = value;
1668
+ }
1669
+ return __assign(__assign({}, base), { Fltr: __assign({ _name: 'Oil Paint Plugin', _classID: 'PbPl', KnNm: f.filter.name, GpuY: f.filter.gpu, LIWy: f.filter.lighting, FPth: '1' }, params), filterID: 1348620396 });
1670
+ }
1671
+ case 'oil paint': return __assign(__assign({}, base), { Fltr: {
1672
+ _name: 'Oil Paint',
1673
+ _classID: 'oilPaint',
1674
+ lightingOn: f.filter.lightingOn,
1675
+ stylization: f.filter.stylization,
1676
+ cleanliness: f.filter.cleanliness,
1677
+ brushScale: f.filter.brushScale,
1678
+ microBrush: f.filter.microBrush,
1679
+ LghD: f.filter.lightDirection,
1680
+ specularity: f.filter.specularity,
1681
+ }, filterID: 1122 });
1682
+ case 'liquify': return __assign(__assign({}, base), { Fltr: {
1683
+ _name: 'Liquify',
1684
+ _classID: 'LqFy',
1685
+ LqMe: f.filter.liquifyMesh,
1686
+ }, filterID: 1282492025 });
1687
+ default: throw new Error("Unknow filter type: ".concat(f.type));
1028
1688
  }
1029
1689
  }
1030
- function serializeFilterFX(filter) {
1031
- return {
1032
- enab: filter.enabled,
1033
- validAtPosition: filter.validAtPosition,
1034
- filterMaskEnable: filter.maskEnabled,
1035
- filterMaskLinked: filter.maskLinked,
1036
- filterMaskExtendWithWhite: filter.maskExtendWithWhite,
1037
- filterFXList: (filter.list || []).map(function (f) { return ({
1038
- 'Nm ': f.name,
1039
- blendOptions: {
1040
- Opct: (0, descriptor_1.unitsPercent)(f.opacity),
1041
- 'Md ': descriptor_1.BlnM.encode(f.blendMode),
1042
- },
1043
- enab: f.enabled,
1044
- hasoptions: f.hasOptions,
1045
- FrgC: (0, descriptor_1.serializeColor)(f.foregroundColor),
1046
- BckC: (0, descriptor_1.serializeColor)(f.backgroundColor),
1047
- Fltr: serializeFltr(f.filter),
1048
- filterID: f.id,
1049
- }); }),
1050
- };
1051
- }
1690
+ // let t: any;
1052
1691
  addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
1053
1692
  if ((0, psdReader_1.readSignature)(reader) !== 'soLD')
1054
1693
  throw new Error("Invalid SoLd type");
@@ -1060,15 +1699,17 @@ addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
1060
1699
  // console.log('SoLd.warp', require('util').inspect(desc.warp, false, 99, true));
1061
1700
  // console.log('SoLd.quiltWarp', require('util').inspect(desc.quiltWarp, false, 99, true));
1062
1701
  // desc.filterFX!.filterFXList[0].Fltr.puppetShapeList[0].meshBoundaryPath.pathComponents[0].SbpL[0]['Pts '] = [];
1063
- // console.log('filterFX', require('util').inspect(desc.filterFX, false, 99, true));
1702
+ // console.log('read', require('util').inspect(desc.filterFX, false, 99, true));
1703
+ // console.log('filterFXList[0]', require('util').inspect((desc as any).filterFX.filterFXList[0], false, 99, true));
1704
+ // t = desc;
1064
1705
  target.placedLayer = {
1065
1706
  id: desc.Idnt,
1066
1707
  placed: desc.placed,
1067
1708
  type: placedLayerTypes[desc.Type],
1068
1709
  pageNumber: desc.PgNm,
1069
1710
  totalPages: desc.totalPages,
1070
- frameStep: desc.frameStep,
1071
- duration: desc.duration,
1711
+ frameStep: (0, descriptor_1.frac)(desc.frameStep),
1712
+ duration: (0, descriptor_1.frac)(desc.duration),
1072
1713
  frameCount: desc.frameCount,
1073
1714
  transform: desc.Trnf,
1074
1715
  width: desc['Sz '].Wdth,
@@ -1083,22 +1724,48 @@ addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
1083
1724
  target.placedLayer.crop = desc.Crop;
1084
1725
  if (desc.comp)
1085
1726
  target.placedLayer.comp = desc.comp;
1086
- if (desc.compInfo)
1087
- target.placedLayer.compInfo = desc.compInfo;
1727
+ if (desc.compInfo) {
1728
+ target.placedLayer.compInfo = {
1729
+ compID: desc.compInfo.compID,
1730
+ originalCompID: desc.compInfo.originalCompID,
1731
+ };
1732
+ }
1088
1733
  if (desc.filterFX)
1089
1734
  target.placedLayer.filter = parseFilterFX(desc.filterFX);
1735
+ // console.log('filter', require('util').inspect(target.placedLayer.filter, false, 99, true));
1090
1736
  (0, psdReader_1.skipBytes)(reader, left()); // HACK
1091
1737
  }, function (writer, target) {
1092
1738
  var _a, _b;
1093
1739
  (0, psdWriter_1.writeSignature)(writer, 'soLD');
1094
1740
  (0, psdWriter_1.writeInt32)(writer, 4); // version
1095
1741
  var placed = target.placedLayer;
1096
- 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 ': {
1742
+ 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,
1743
+ // quiltWarp: {} as any,
1744
+ warp: encodeWarp(placed.warp || {}), 'Sz ': {
1745
+ _name: '',
1746
+ _classID: 'Pnt ',
1097
1747
  Wdth: placed.width || 0,
1098
1748
  Hght: placed.height || 0, // TODO: find size ?
1099
1749
  }, Rslt: placed.resolution ? (0, descriptor_1.unitsValue)(placed.resolution, 'resolution') : { units: 'Density', value: 72 } });
1100
- if (placed.filter)
1101
- desc.filterFX = serializeFilterFX(placed.filter);
1750
+ if (placed.filter) {
1751
+ desc.filterFX = {
1752
+ _name: '',
1753
+ _classID: 'filterFXStyle',
1754
+ enab: placed.filter.enabled,
1755
+ validAtPosition: placed.filter.validAtPosition,
1756
+ filterMaskEnable: placed.filter.maskEnabled,
1757
+ filterMaskLinked: placed.filter.maskLinked,
1758
+ filterMaskExtendWithWhite: placed.filter.maskExtendWithWhite,
1759
+ filterFXList: placed.filter.list.map(function (f) { return serializeFilterFXItem(f); }),
1760
+ };
1761
+ }
1762
+ // console.log('write', require('util').inspect(desc.filterFX, false, 99, true)); ///
1763
+ // if (JSON.stringify(t) !== JSON.stringify(desc)) {
1764
+ // console.log('read', require('util').inspect(t, false, 99, true));
1765
+ // console.log('write', require('util').inspect(desc, false, 99, true));
1766
+ // console.error('DIFFERENT');
1767
+ // // throw new Error('DIFFERENT');
1768
+ // }
1102
1769
  if (placed.warp && isQuiltWarp(placed.warp)) {
1103
1770
  var quiltWarp = encodeWarp(placed.warp);
1104
1771
  desc.quiltWarp = quiltWarp;
@@ -1184,7 +1851,7 @@ addHandler('Anno', function (target) { return target.annotations !== undefined;
1184
1851
  var popupLocation = readRect(reader);
1185
1852
  var color = (0, psdReader_1.readColor)(reader);
1186
1853
  var author = (0, psdReader_1.readPascalString)(reader, 2);
1187
- var name_1 = (0, psdReader_1.readPascalString)(reader, 2);
1854
+ var name_2 = (0, psdReader_1.readPascalString)(reader, 2);
1188
1855
  var date = (0, psdReader_1.readPascalString)(reader, 2);
1189
1856
  /*const contentLength =*/ (0, psdReader_1.readUint32)(reader);
1190
1857
  /*const dataType =*/ (0, psdReader_1.readSignature)(reader);
@@ -1213,7 +1880,7 @@ addHandler('Anno', function (target) { return target.annotations !== undefined;
1213
1880
  popupLocation: popupLocation,
1214
1881
  color: color,
1215
1882
  author: author,
1216
- name: name_1,
1883
+ name: name_2,
1217
1884
  date: date,
1218
1885
  data: data,
1219
1886
  });
@@ -1272,20 +1939,26 @@ addHandler('lnk2', function (target) { return !!target.linkedFiles && target.lin
1272
1939
  var type = (0, psdReader_1.readSignature)(reader);
1273
1940
  var version = (0, psdReader_1.readInt32)(reader);
1274
1941
  var id = (0, psdReader_1.readPascalString)(reader, 1);
1275
- var name_2 = (0, psdReader_1.readUnicodeString)(reader);
1942
+ var name_3 = (0, psdReader_1.readUnicodeString)(reader);
1276
1943
  var fileType = (0, psdReader_1.readSignature)(reader).trim(); // ' ' if empty
1277
1944
  var fileCreator = (0, psdReader_1.readSignature)(reader).trim(); // ' ' or '\0\0\0\0' if empty
1278
1945
  var dataSize = readLength64(reader);
1279
1946
  var hasFileOpenDescriptor = (0, psdReader_1.readUint8)(reader);
1280
1947
  var fileOpenDescriptor = hasFileOpenDescriptor ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
1281
1948
  var linkedFileDescriptor = type === 'liFE' ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
1282
- var file = { id: id, name: name_2, data: undefined };
1949
+ var file = { id: id, name: name_3, data: undefined };
1283
1950
  if (fileType)
1284
1951
  file.type = fileType;
1285
1952
  if (fileCreator)
1286
1953
  file.creator = fileCreator;
1287
- if (fileOpenDescriptor)
1288
- file.descriptor = fileOpenDescriptor;
1954
+ if (fileOpenDescriptor) {
1955
+ file.descriptor = {
1956
+ compInfo: {
1957
+ compID: fileOpenDescriptor.compInfo.compID,
1958
+ originalCompID: fileOpenDescriptor.compInfo.originalCompID,
1959
+ }
1960
+ };
1961
+ }
1289
1962
  if (type === 'liFE' && version > 3) {
1290
1963
  var year = (0, psdReader_1.readInt32)(reader);
1291
1964
  var month = (0, psdReader_1.readUint8)(reader);
@@ -1343,7 +2016,10 @@ addHandler('lnk2', function (target) { return !!target.linkedFiles && target.lin
1343
2016
  writeLength64(writer, file.data ? file.data.byteLength : 0);
1344
2017
  if (file.descriptor && file.descriptor.compInfo) {
1345
2018
  var desc = {
1346
- compInfo: file.descriptor.compInfo,
2019
+ compInfo: {
2020
+ compID: file.descriptor.compInfo.compID,
2021
+ originalCompID: file.descriptor.compInfo.originalCompID,
2022
+ }
1347
2023
  };
1348
2024
  (0, psdWriter_1.writeUint8)(writer, 1);
1349
2025
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
@@ -2083,6 +2759,94 @@ addHandler('Txt2', hasKey('engineData'), function (reader, target, left) {
2083
2759
  var buffer = (0, base64_js_1.toByteArray)(target.engineData);
2084
2760
  (0, psdWriter_1.writeBytes)(writer, buffer);
2085
2761
  });
2762
+ addHandler('FEid', hasKey('filterEffectsMasks'), function (reader, target, leftBytes) {
2763
+ var version = (0, psdReader_1.readInt32)(reader);
2764
+ if (version < 1 || version > 3)
2765
+ throw new Error("Invalid filterEffects version ".concat(version));
2766
+ if ((0, psdReader_1.readUint32)(reader))
2767
+ throw new Error('filterEffects: 64 bit length is not supported');
2768
+ var length = (0, psdReader_1.readUint32)(reader);
2769
+ var end = reader.offset + length;
2770
+ target.filterEffectsMasks = [];
2771
+ while (reader.offset < end) {
2772
+ var id = (0, psdReader_1.readPascalString)(reader, 1);
2773
+ var effectVersion = (0, psdReader_1.readInt32)(reader);
2774
+ if (effectVersion !== 1)
2775
+ throw new Error("Invalid filterEffect version ".concat(effectVersion));
2776
+ if ((0, psdReader_1.readUint32)(reader))
2777
+ throw new Error('filterEffect: 64 bit length is not supported');
2778
+ /*const effectLength =*/ (0, psdReader_1.readUint32)(reader);
2779
+ // const endOfEffect = reader.offset + effectLength;
2780
+ var top_2 = (0, psdReader_1.readInt32)(reader);
2781
+ var left = (0, psdReader_1.readInt32)(reader);
2782
+ var bottom = (0, psdReader_1.readInt32)(reader);
2783
+ var right = (0, psdReader_1.readInt32)(reader);
2784
+ var depth = (0, psdReader_1.readInt32)(reader);
2785
+ var maxChannels = (0, psdReader_1.readInt32)(reader);
2786
+ var channels = [];
2787
+ // 0 -> R, 1 -> G, 2 -> B, 25 -> A
2788
+ for (var i = 0; i < (maxChannels + 2); i++) {
2789
+ var exists = (0, psdReader_1.readInt32)(reader);
2790
+ if (exists) {
2791
+ if ((0, psdReader_1.readUint32)(reader))
2792
+ throw new Error('filterEffect: 64 bit length is not supported');
2793
+ var channelLength = (0, psdReader_1.readUint32)(reader);
2794
+ var compressionMode = (0, psdReader_1.readUint16)(reader);
2795
+ var data = (0, psdReader_1.readBytes)(reader, channelLength - 2);
2796
+ channels.push({ compressionMode: compressionMode, data: data });
2797
+ }
2798
+ else {
2799
+ channels.push(undefined);
2800
+ }
2801
+ }
2802
+ target.filterEffectsMasks.push({ id: id, top: top_2, left: left, bottom: bottom, right: right, depth: depth, channels: channels });
2803
+ if (leftBytes() && (0, psdReader_1.readUint8)(reader)) {
2804
+ var compressionMode = (0, psdReader_1.readUint16)(reader);
2805
+ var data = (0, psdReader_1.readBytes)(reader, leftBytes());
2806
+ target.filterEffectsMasks[target.filterEffectsMasks.length - 1].extra = { compressionMode: compressionMode, data: data };
2807
+ }
2808
+ }
2809
+ }, function (writer, target) {
2810
+ var _a;
2811
+ (0, psdWriter_1.writeInt32)(writer, 3);
2812
+ (0, psdWriter_1.writeUint32)(writer, 0);
2813
+ (0, psdWriter_1.writeUint32)(writer, 0);
2814
+ var lengthOffset = writer.offset;
2815
+ for (var _i = 0, _b = target.filterEffectsMasks; _i < _b.length; _i++) {
2816
+ var mask = _b[_i];
2817
+ (0, psdWriter_1.writePascalString)(writer, mask.id, 1);
2818
+ (0, psdWriter_1.writeInt32)(writer, 1);
2819
+ (0, psdWriter_1.writeUint32)(writer, 0);
2820
+ (0, psdWriter_1.writeUint32)(writer, 0);
2821
+ var length2Offset = writer.offset;
2822
+ (0, psdWriter_1.writeInt32)(writer, mask.top);
2823
+ (0, psdWriter_1.writeInt32)(writer, mask.left);
2824
+ (0, psdWriter_1.writeInt32)(writer, mask.bottom);
2825
+ (0, psdWriter_1.writeInt32)(writer, mask.right);
2826
+ (0, psdWriter_1.writeInt32)(writer, mask.depth);
2827
+ var maxChannels = Math.max(0, mask.channels.length - 2);
2828
+ (0, psdWriter_1.writeInt32)(writer, maxChannels);
2829
+ for (var i = 0; i < (maxChannels + 2); i++) {
2830
+ var channel = mask.channels[i];
2831
+ (0, psdWriter_1.writeInt32)(writer, channel ? 1 : 0);
2832
+ if (channel) {
2833
+ (0, psdWriter_1.writeUint32)(writer, 0);
2834
+ (0, psdWriter_1.writeUint32)(writer, channel.data.length + 2);
2835
+ (0, psdWriter_1.writeUint16)(writer, channel.compressionMode);
2836
+ (0, psdWriter_1.writeBytes)(writer, channel.data);
2837
+ }
2838
+ }
2839
+ writer.view.setUint32(length2Offset - 4, writer.offset - length2Offset, false);
2840
+ }
2841
+ var extra = (_a = target.filterEffectsMasks[target.filterEffectsMasks.length - 1]) === null || _a === void 0 ? void 0 : _a.extra;
2842
+ if (extra) {
2843
+ (0, psdWriter_1.writeUint8)(writer, 1);
2844
+ (0, psdWriter_1.writeUint16)(writer, extra.compressionMode);
2845
+ (0, psdWriter_1.writeBytes)(writer, extra.data);
2846
+ }
2847
+ writer.view.setUint32(lengthOffset - 4, writer.offset - lengthOffset, false);
2848
+ });
2849
+ addHandlerAlias('FXid', 'FEid');
2086
2850
  addHandler('FMsk', hasKey('filterMask'), function (reader, target) {
2087
2851
  target.filterMask = {
2088
2852
  colorSpace: (0, psdReader_1.readColor)(reader),
@@ -2148,14 +2912,17 @@ addHandler('lfx2', function (target) { return target.effects !== undefined && !h
2148
2912
  addHandler('cinf', hasKey('compositorUsed'), function (reader, target, left) {
2149
2913
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
2150
2914
  // console.log(require('util').inspect(desc, false, 99, true));
2915
+ function enumValue(desc) {
2916
+ return desc.split('.')[1];
2917
+ }
2151
2918
  target.compositorUsed = {
2152
2919
  description: desc.description,
2153
2920
  reason: desc.reason,
2154
- engine: desc.Engn.split('.')[1],
2155
- enableCompCore: desc.enableCompCore.split('.')[1],
2156
- enableCompCoreGPU: desc.enableCompCoreGPU.split('.')[1],
2157
- compCoreSupport: desc.compCoreSupport.split('.')[1],
2158
- compCoreGPUSupport: desc.compCoreGPUSupport.split('.')[1],
2921
+ engine: enumValue(desc.Engn),
2922
+ enableCompCore: enumValue(desc.enableCompCore),
2923
+ enableCompCoreGPU: enumValue(desc.enableCompCoreGPU),
2924
+ compCoreSupport: enumValue(desc.compCoreSupport),
2925
+ compCoreGPUSupport: enumValue(desc.compCoreGPUSupport),
2159
2926
  };
2160
2927
  (0, psdReader_1.skipBytes)(reader, left());
2161
2928
  }, function (writer, target) {
@@ -2210,85 +2977,4 @@ addHandler('tsly', hasKey('transparencyShapesLayer'), function (reader, target)
2210
2977
  (0, psdWriter_1.writeUint8)(writer, target.transparencyShapesLayer ? 1 : 0);
2211
2978
  (0, psdWriter_1.writeZeros)(writer, 3);
2212
2979
  });
2213
- /*addHandler(
2214
- 'FEid',
2215
- hasKey('filterEffects'),
2216
- (reader, _target) => {
2217
- const version = readInt32(reader);
2218
- if (version < 1 || version > 3) throw new Error(`Invalid filterEffects version ${version}`);
2219
-
2220
- if (readUint32(reader)) throw new Error('filterEffects: 64 bit length is not supported');
2221
- const length = readUint32(reader);
2222
- const end = reader.offset + length;
2223
-
2224
- while (reader.offset < end) {
2225
- console.log('bytes to go', end - reader.offset, 'at', reader.offset.toString(16));
2226
- //
2227
- const id = readPascalString(reader, 1);
2228
- const effectVersion = readInt32(reader);
2229
- if (effectVersion !== 1) throw new Error(`Invalid filterEffect version ${effectVersion}`);
2230
- if (readUint32(reader)) throw new Error('filterEffect: 64 bit length is not supported');
2231
- const effectLength = readUint32(reader);
2232
- const endOfEffect = reader.offset + effectLength;
2233
- const top = readInt32(reader);
2234
- const left = readInt32(reader);
2235
- const bottom = readInt32(reader);
2236
- const right = readInt32(reader);
2237
- const depth = readInt32(reader);
2238
- const maxChannels = readInt32(reader);
2239
- const channels: any[] = [];
2240
-
2241
- for (let i = 0; i < (maxChannels + 2); i++) {
2242
- const exists = readInt32(reader);
2243
- if (exists) {
2244
- if (readUint32(reader)) throw new Error('filterEffect: 64 bit length is not supported');
2245
- const channelLength = readUint32(reader);
2246
- const compressionMode = readUint16(reader);
2247
- const data = readBytes(reader, channelLength - 2);
2248
- channels.push({ channelLength, compressionMode, data: data?.length + ' bytes' });
2249
- // if (c < 3 || c == 25) e_ = _F.Cn(!0, rL, m, b.rect.F, b.rect.V, X, rp);
2250
- // if (c == 0) _c.S = e_;
2251
- // if (c == 1) _c.v = e_;
2252
- // if (c == 2) _c.e = e_;
2253
- // if (c == 25) _c.w = e_;
2254
- } else {
2255
- channels.push(undefined);
2256
- }
2257
- }
2258
-
2259
- console.log('left at the end', endOfEffect - reader.offset);
2260
- if (endOfEffect > reader.offset) {
2261
- if (readUint8(reader)) {
2262
- const compressionMode = readUint16(reader);
2263
- const data = endOfEffect > reader.offset ? readBytes(reader, endOfEffect - reader.offset) : undefined;
2264
- console.log('extra data', { compressionMode, data: data?.length + ' bytes' });
2265
- } else {
2266
- console.log('no extra');
2267
- }
2268
- }
2269
-
2270
- console.log('effect', {
2271
- id,
2272
- effectVersion,
2273
- effectLength,
2274
- top,
2275
- left,
2276
- bottom,
2277
- right,
2278
- depth,
2279
- maxChannels,
2280
- channels,
2281
- });
2282
-
2283
- console.log('bytes left after effect', endOfEffect - reader.offset);
2284
- // if (length % 4) skipBytes(reader, 4 - length % 4);
2285
- }
2286
-
2287
- console.log({ version, length });
2288
- },
2289
- (_writer, _target) => {
2290
- },
2291
- );
2292
-
2293
- addHandlerAlias('FXid', 'FEid');*/
2294
2980
  //# sourceMappingURL=additionalInfo.js.map