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