ag-psd 15.3.1 → 17.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +1 -0
  3. package/dist/additionalInfo.js +864 -157
  4. package/dist/additionalInfo.js.map +1 -1
  5. package/dist/bundle.js +1223 -242
  6. package/dist/descriptor.d.ts +129 -0
  7. package/dist/descriptor.js +272 -36
  8. package/dist/descriptor.js.map +1 -1
  9. package/dist/imageResources.js +9 -17
  10. package/dist/imageResources.js.map +1 -1
  11. package/dist/psd.d.ts +450 -74
  12. package/dist/psdReader.d.ts +2 -0
  13. package/dist/psdReader.js +30 -13
  14. package/dist/psdReader.js.map +1 -1
  15. package/dist/psdWriter.d.ts +4 -0
  16. package/dist/psdWriter.js +25 -7
  17. package/dist/psdWriter.js.map +1 -1
  18. package/dist/text.js +23 -12
  19. package/dist/text.js.map +1 -1
  20. package/dist-es/additionalInfo.js +865 -158
  21. package/dist-es/additionalInfo.js.map +1 -1
  22. package/dist-es/descriptor.d.ts +129 -0
  23. package/dist-es/descriptor.js +270 -37
  24. package/dist-es/descriptor.js.map +1 -1
  25. package/dist-es/imageResources.js +10 -18
  26. package/dist-es/imageResources.js.map +1 -1
  27. package/dist-es/psd.d.ts +450 -74
  28. package/dist-es/psdReader.d.ts +2 -0
  29. package/dist-es/psdReader.js +27 -12
  30. package/dist-es/psdReader.js.map +1 -1
  31. package/dist-es/psdWriter.d.ts +4 -0
  32. package/dist-es/psdWriter.js +21 -7
  33. package/dist-es/psdWriter.js.map +1 -1
  34. package/dist-es/text.js +23 -12
  35. package/dist-es/text.js.map +1 -1
  36. package/package.json +1 -1
  37. package/src/additionalInfo.ts +1956 -212
  38. package/src/descriptor.ts +297 -37
  39. package/src/imageResources.ts +14 -19
  40. package/src/psd.ts +472 -49
  41. package/src/psdReader.ts +26 -7
  42. package/src/psdWriter.ts +24 -8
  43. package/src/text.ts +22 -14
package/dist/bundle.js CHANGED
@@ -292,6 +292,7 @@ var psdWriter_1 = require("./psdWriter");
292
292
  var descriptor_1 = require("./descriptor");
293
293
  var engineData_1 = require("./engineData");
294
294
  var text_1 = require("./text");
295
+ var fromAtoZ = 'abcdefghijklmnopqrstuvwxyz';
295
296
  exports.infoHandlers = [];
296
297
  exports.infoHandlersMap = {};
297
298
  function addHandler(key, has, read, write) {
@@ -818,10 +819,10 @@ addHandler('shmd', function (target) { return target.timestamp !== undefined ||
818
819
  var timeScope = desc.timeScope;
819
820
  // console.log('tmln', target.name, target.id, require('util').inspect(desc, false, 99, true));
820
821
  var timeline = {
821
- start: timeScope.Strt,
822
- duration: timeScope.duration,
823
- inTime: timeScope.inTime,
824
- outTime: timeScope.outTime,
822
+ start: (0, descriptor_1.frac)(timeScope.Strt),
823
+ duration: (0, descriptor_1.frac)(timeScope.duration),
824
+ inTime: (0, descriptor_1.frac)(timeScope.inTime),
825
+ outTime: (0, descriptor_1.frac)(timeScope.outTime),
825
826
  autoScope: desc.autoScope,
826
827
  audioLevel: desc.audioLevel,
827
828
  };
@@ -962,7 +963,7 @@ addHandler('vstk', hasKey('vectorStroke'), function (reader, target, left) {
962
963
  }, function (writer, target) {
963
964
  var _a, _b, _c;
964
965
  var stroke = target.vectorStroke;
965
- var descriptor = {
966
+ var desc = {
966
967
  strokeStyleVersion: 2,
967
968
  strokeEnabled: !!stroke.strokeEnabled,
968
969
  fillEnabled: !!stroke.fillEnabled,
@@ -980,7 +981,7 @@ addHandler('vstk', hasKey('vectorStroke'), function (reader, target, left) {
980
981
  strokeStyleContent: (0, descriptor_1.serializeVectorContent)(stroke.content || { type: 'color', color: { r: 0, g: 0, b: 0 } }).descriptor,
981
982
  strokeStyleResolution: (_c = stroke.resolution) !== null && _c !== void 0 ? _c : 72,
982
983
  };
983
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'strokeStyle', descriptor);
984
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'strokeStyle', desc);
984
985
  });
985
986
  addHandler('artb', // per-layer arboard info
986
987
  hasKey('artboard'), function (reader, target, left) {
@@ -1045,7 +1046,7 @@ function isQuiltWarp(warp) {
1045
1046
  }
1046
1047
  function encodeWarp(warp) {
1047
1048
  var bounds = warp.bounds;
1048
- 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: {
1049
+ 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: {
1049
1050
  'Top ': (0, descriptor_1.unitsValue)(bounds && bounds.top || { units: 'Pixels', value: 0 }, 'bounds.top'),
1050
1051
  Left: (0, descriptor_1.unitsValue)(bounds && bounds.left || { units: 'Pixels', value: 0 }, 'bounds.left'),
1051
1052
  Btom: (0, descriptor_1.unitsValue)(bounds && bounds.bottom || { units: 'Pixels', value: 0 }, 'bounds.bottom'),
@@ -1063,6 +1064,8 @@ function encodeWarp(warp) {
1063
1064
  if (isQuilt) {
1064
1065
  var desc2 = desc;
1065
1066
  desc2.customEnvelopeWarp = {
1067
+ _name: '',
1068
+ _classID: 'customEnvelopeWarp',
1066
1069
  quiltSliceX: [{
1067
1070
  type: 'quiltSliceX',
1068
1071
  values: customEnvelopeWarp.quiltSliceX || [],
@@ -1079,6 +1082,8 @@ function encodeWarp(warp) {
1079
1082
  }
1080
1083
  else {
1081
1084
  desc.customEnvelopeWarp = {
1085
+ _name: '',
1086
+ _classID: 'customEnvelopeWarp',
1082
1087
  meshPoints: [
1083
1088
  { type: 'Hrzn', values: meshPoints.map(function (p) { return p.x; }) },
1084
1089
  { type: 'Vrtc', values: meshPoints.map(function (p) { return p.y; }) },
@@ -1159,7 +1164,7 @@ function pointsToArray(points) {
1159
1164
  }
1160
1165
  return array;
1161
1166
  }
1162
- function uin8ToPoints(array) {
1167
+ function uint8ToPoints(array) {
1163
1168
  return arrayToPoints(uint8ToFloat32(array));
1164
1169
  }
1165
1170
  function hrznVrtcToPoint(desc) {
@@ -1170,27 +1175,249 @@ function hrznVrtcToPoint(desc) {
1170
1175
  }
1171
1176
  function pointToHrznVrtc(point) {
1172
1177
  return {
1178
+ _name: '',
1179
+ _classID: 'Pnt ',
1173
1180
  Hrzn: (0, descriptor_1.unitsValue)(point.x, 'x'),
1174
1181
  Vrtc: (0, descriptor_1.unitsValue)(point.y, 'y'),
1175
1182
  };
1176
1183
  }
1177
- function parseFilterFX(desc) {
1178
- return {
1179
- enabled: desc.enab,
1180
- validAtPosition: desc.validAtPosition,
1181
- maskEnabled: desc.filterMaskEnable,
1182
- maskLinked: desc.filterMaskLinked,
1183
- maskExtendWithWhite: desc.filterMaskExtendWithWhite,
1184
- list: desc.filterFXList.map(function (f) { return ({
1185
- id: f.filterID,
1186
- name: f['Nm '],
1187
- opacity: (0, descriptor_1.parsePercent)(f.blendOptions.Opct),
1188
- blendMode: descriptor_1.BlnM.decode(f.blendOptions['Md ']),
1189
- enabled: f.enab,
1190
- hasOptions: f.hasoptions,
1191
- foregroundColor: (0, descriptor_1.parseColor)(f.FrgC),
1192
- backgroundColor: (0, descriptor_1.parseColor)(f.BckC),
1193
- filter: {
1184
+ function parseFilterFXItem(f) {
1185
+ var base = {
1186
+ name: f['Nm '],
1187
+ opacity: (0, descriptor_1.parsePercent)(f.blendOptions.Opct),
1188
+ blendMode: descriptor_1.BlnM.decode(f.blendOptions['Md ']),
1189
+ enabled: f.enab,
1190
+ hasOptions: f.hasoptions,
1191
+ foregroundColor: (0, descriptor_1.parseColor)(f.FrgC),
1192
+ backgroundColor: (0, descriptor_1.parseColor)(f.BckC),
1193
+ };
1194
+ switch (f.filterID) {
1195
+ case 1098281575: return __assign(__assign({}, base), { type: 'average' });
1196
+ case 1114403360: return __assign(__assign({}, base), { type: 'blur' });
1197
+ case 1114403405: return __assign(__assign({}, base), { type: 'blur more' });
1198
+ case 697: return __assign(__assign({}, base), { type: 'box blur', filter: {
1199
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
1200
+ } });
1201
+ case 1198747202: return __assign(__assign({}, base), { type: 'gaussian blur', filter: {
1202
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
1203
+ } });
1204
+ case 1299476034: return __assign(__assign({}, base), { type: 'motion blur', filter: {
1205
+ angle: f.Fltr.Angl,
1206
+ distance: (0, descriptor_1.parseUnits)(f.Fltr.Dstn),
1207
+ } });
1208
+ case 1382313026: return __assign(__assign({}, base), { type: 'radial blur', filter: {
1209
+ amount: f.Fltr.Amnt,
1210
+ method: descriptor_1.BlrM.decode(f.Fltr.BlrM),
1211
+ quality: descriptor_1.BlrQ.decode(f.Fltr.BlrQ),
1212
+ } });
1213
+ case 702: return __assign(__assign({}, base), { type: 'shape blur', filter: {
1214
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
1215
+ customShape: { name: f.Fltr.customShape['Nm '], id: f.Fltr.customShape.Idnt },
1216
+ } });
1217
+ case 1399681602: return __assign(__assign({}, base), { type: 'smart blur', filter: {
1218
+ radius: f.Fltr['Rds '],
1219
+ threshold: f.Fltr.Thsh,
1220
+ quality: descriptor_1.SmBQ.decode(f.Fltr.SmBQ),
1221
+ mode: descriptor_1.SmBM.decode(f.Fltr.SmBM),
1222
+ } });
1223
+ case 701: return __assign(__assign({}, base), { type: 'surface blur', filter: {
1224
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
1225
+ threshold: f.Fltr.Thsh,
1226
+ } });
1227
+ case 1148416108: return __assign(__assign({}, base), { type: 'displace', filter: {
1228
+ horizontalScale: f.Fltr.HrzS,
1229
+ verticalScale: f.Fltr.VrtS,
1230
+ displacementMap: descriptor_1.DspM.decode(f.Fltr.DspM),
1231
+ undefinedAreas: descriptor_1.UndA.decode(f.Fltr.UndA),
1232
+ displacementFile: {
1233
+ signature: f.Fltr.DspF.sig,
1234
+ path: f.Fltr.DspF.path, // TODO: this is decoded incorrectly ???
1235
+ },
1236
+ } });
1237
+ case 1349411688: return __assign(__assign({}, base), { type: 'pinch', filter: {
1238
+ amount: f.Fltr.Amnt,
1239
+ } });
1240
+ case 1349284384: return __assign(__assign({}, base), { type: 'polar coordinates', filter: {
1241
+ conversion: descriptor_1.Cnvr.decode(f.Fltr.Cnvr),
1242
+ } });
1243
+ case 1383099493: return __assign(__assign({}, base), { type: 'ripple', filter: {
1244
+ amount: f.Fltr.Amnt,
1245
+ size: descriptor_1.RplS.decode(f.Fltr.RplS),
1246
+ } });
1247
+ case 1399353888: return __assign(__assign({}, base), { type: 'shear', filter: {
1248
+ shearPoints: f.Fltr.ShrP.map(function (p) { return ({ x: p.Hrzn, y: p.Vrtc }); }),
1249
+ shearStart: f.Fltr.ShrS,
1250
+ shearEnd: f.Fltr.ShrE,
1251
+ undefinedAreas: descriptor_1.UndA.decode(f.Fltr.UndA),
1252
+ } });
1253
+ case 1399875698: return __assign(__assign({}, base), { type: 'spherize', filter: {
1254
+ amount: f.Fltr.Amnt,
1255
+ mode: descriptor_1.SphM.decode(f.Fltr.SphM),
1256
+ } });
1257
+ case 1417114220: return __assign(__assign({}, base), { type: 'twirl', filter: {
1258
+ angle: f.Fltr.Angl,
1259
+ } });
1260
+ case 1466005093: return __assign(__assign({}, base), { type: 'wave', filter: {
1261
+ numberOfGenerators: f.Fltr.NmbG,
1262
+ type: descriptor_1.Wvtp.decode(f.Fltr.Wvtp),
1263
+ wavelength: { min: f.Fltr.WLMn, max: f.Fltr.WLMx },
1264
+ amplitude: { min: f.Fltr.AmMn, max: f.Fltr.AmMx },
1265
+ scale: { x: f.Fltr.SclH, y: f.Fltr.SclV },
1266
+ randomSeed: f.Fltr.RndS,
1267
+ undefinedAreas: descriptor_1.UndA.decode(f.Fltr.UndA),
1268
+ } });
1269
+ case 1516722791: return __assign(__assign({}, base), { type: 'zigzag', filter: {
1270
+ amount: f.Fltr.Amnt,
1271
+ ridges: f.Fltr.NmbR,
1272
+ style: descriptor_1.ZZTy.decode(f.Fltr.ZZTy),
1273
+ } });
1274
+ case 1097092723: return __assign(__assign({}, base), { type: 'add noise', filter: {
1275
+ amount: (0, descriptor_1.parsePercent)(f.Fltr.Nose),
1276
+ distribution: descriptor_1.Dstr.decode(f.Fltr.Dstr),
1277
+ monochromatic: f.Fltr.Mnch,
1278
+ randomSeed: f.Fltr.FlRs,
1279
+ } });
1280
+ case 1148416099: return __assign(__assign({}, base), { type: 'despeckle' });
1281
+ case 1148417107: return __assign(__assign({}, base), { type: 'dust and scratches', filter: {
1282
+ radius: f.Fltr['Rds '],
1283
+ threshold: f.Fltr.Thsh,
1284
+ } });
1285
+ case 1298427424: return __assign(__assign({}, base), { type: 'median', filter: {
1286
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
1287
+ } });
1288
+ case 633: return __assign(__assign({}, base), { type: 'reduce noise', filter: {
1289
+ preset: f.Fltr.preset,
1290
+ removeJpegArtifact: f.Fltr.removeJPEGArtifact,
1291
+ reduceColorNoise: (0, descriptor_1.parsePercent)(f.Fltr.ClNs),
1292
+ sharpenDetails: (0, descriptor_1.parsePercent)(f.Fltr.Shrp),
1293
+ 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 } : {}))); }),
1294
+ } });
1295
+ case 1131180616: return __assign(__assign({}, base), { type: 'color halftone', filter: {
1296
+ radius: f.Fltr['Rds '],
1297
+ angle1: f.Fltr.Ang1,
1298
+ angle2: f.Fltr.Ang2,
1299
+ angle3: f.Fltr.Ang3,
1300
+ angle4: f.Fltr.Ang4,
1301
+ } });
1302
+ case 1131574132: return __assign(__assign({}, base), { type: 'crystallize', filter: {
1303
+ cellSize: f.Fltr.ClSz,
1304
+ randomSeed: f.Fltr.FlRs,
1305
+ } });
1306
+ case 1180922912: return __assign(__assign({}, base), { type: 'facet' });
1307
+ case 1181902701: return __assign(__assign({}, base), { type: 'fragment' });
1308
+ case 1299870830: return __assign(__assign({}, base), { type: 'mezzotint', filter: {
1309
+ type: descriptor_1.MztT.decode(f.Fltr.MztT),
1310
+ randomSeed: f.Fltr.FlRs,
1311
+ } });
1312
+ case 1299407648: return __assign(__assign({}, base), { type: 'mosaic', filter: {
1313
+ cellSize: (0, descriptor_1.parseUnits)(f.Fltr.ClSz),
1314
+ } });
1315
+ case 1349416044: return __assign(__assign({}, base), { type: 'pointillize', filter: {
1316
+ cellSize: f.Fltr.ClSz,
1317
+ randomSeed: f.Fltr.FlRs,
1318
+ } });
1319
+ case 1131177075: return __assign(__assign({}, base), { type: 'clouds', filter: {
1320
+ randomSeed: f.Fltr.FlRs,
1321
+ } });
1322
+ case 1147564611: return __assign(__assign({}, base), { type: 'difference clouds', filter: {
1323
+ randomSeed: f.Fltr.FlRs,
1324
+ } });
1325
+ case 1180856947: return __assign(__assign({}, base), { type: 'fibers', filter: {
1326
+ variance: f.Fltr.Vrnc,
1327
+ strength: f.Fltr.Strg,
1328
+ randomSeed: f.Fltr.RndS,
1329
+ } });
1330
+ case 1282306886: return __assign(__assign({}, base), { type: 'lens flare', filter: {
1331
+ brightness: f.Fltr.Brgh,
1332
+ position: { x: f.Fltr.FlrC.Hrzn, y: f.Fltr.FlrC.Vrtc },
1333
+ lensType: descriptor_1.Lns.decode(f.Fltr['Lns ']),
1334
+ } });
1335
+ case 1399353968: return __assign(__assign({}, base), { type: 'sharpen' });
1336
+ case 1399353925: return __assign(__assign({}, base), { type: 'sharpen edges' });
1337
+ case 1399353933: return __assign(__assign({}, base), { type: 'sharpen more' });
1338
+ case 698: return __assign(__assign({}, base), { type: 'smart sharpen', filter: {
1339
+ amount: (0, descriptor_1.parsePercent)(f.Fltr.Amnt),
1340
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
1341
+ threshold: f.Fltr.Thsh,
1342
+ angle: f.Fltr.Angl,
1343
+ moreAccurate: f.Fltr.moreAccurate,
1344
+ blur: descriptor_1.blurType.decode(f.Fltr.blur),
1345
+ preset: f.Fltr.preset,
1346
+ shadow: {
1347
+ fadeAmount: (0, descriptor_1.parsePercent)(f.Fltr.sdwM.Amnt),
1348
+ tonalWidth: (0, descriptor_1.parsePercent)(f.Fltr.sdwM.Wdth),
1349
+ radius: f.Fltr.sdwM['Rds '],
1350
+ },
1351
+ highlight: {
1352
+ fadeAmount: (0, descriptor_1.parsePercent)(f.Fltr.hglM.Amnt),
1353
+ tonalWidth: (0, descriptor_1.parsePercent)(f.Fltr.hglM.Wdth),
1354
+ radius: f.Fltr.hglM['Rds '],
1355
+ },
1356
+ } });
1357
+ case 1433301837: return __assign(__assign({}, base), { type: 'unsharp mask', filter: {
1358
+ amount: (0, descriptor_1.parsePercent)(f.Fltr.Amnt),
1359
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
1360
+ threshold: f.Fltr.Thsh,
1361
+ } });
1362
+ case 1147564832: return __assign(__assign({}, base), { type: 'diffuse', filter: {
1363
+ mode: descriptor_1.DfsM.decode(f.Fltr['Md ']),
1364
+ randomSeed: f.Fltr.FlRs,
1365
+ } });
1366
+ case 1164796531: return __assign(__assign({}, base), { type: 'emboss', filter: {
1367
+ angle: f.Fltr.Angl,
1368
+ height: f.Fltr.Hght,
1369
+ amount: f.Fltr.Amnt,
1370
+ } });
1371
+ case 1165522034: return __assign(__assign({}, base), { type: 'extrude', filter: {
1372
+ type: descriptor_1.ExtT.decode(f.Fltr.ExtT),
1373
+ size: f.Fltr.ExtS,
1374
+ depth: f.Fltr.ExtD,
1375
+ depthMode: descriptor_1.ExtR.decode(f.Fltr.ExtR),
1376
+ randomSeed: f.Fltr.FlRs,
1377
+ solidFrontFaces: f.Fltr.ExtF,
1378
+ maskIncompleteBlocks: f.Fltr.ExtM,
1379
+ } });
1380
+ case 1181639749: return __assign(__assign({}, base), { type: 'find edges' });
1381
+ case 1399616122: return __assign(__assign({}, base), { type: 'solarize' });
1382
+ case 1416393504: return __assign(__assign({}, base), { type: 'tiles', filter: {
1383
+ numberOfTiles: f.Fltr.TlNm,
1384
+ maximumOffset: f.Fltr.TlOf,
1385
+ fillEmptyAreaWith: descriptor_1.FlCl.decode(f.Fltr.FlCl),
1386
+ randomSeed: f.Fltr.FlRs,
1387
+ } });
1388
+ case 1416782659: return __assign(__assign({}, base), { type: 'trace contour', filter: {
1389
+ level: f.Fltr['Lvl '],
1390
+ edge: descriptor_1.CntE.decode(f.Fltr['Edg ']),
1391
+ } });
1392
+ case 1466852384: return __assign(__assign({}, base), { type: 'wind', filter: {
1393
+ method: descriptor_1.WndM.decode(f.Fltr.WndM),
1394
+ direction: descriptor_1.Drct.decode(f.Fltr.Drct),
1395
+ } });
1396
+ case 1148089458: return __assign(__assign({}, base), { type: 'de-interlace', filter: {
1397
+ eliminate: descriptor_1.IntE.decode(f.Fltr.IntE),
1398
+ newFieldsBy: descriptor_1.IntC.decode(f.Fltr.IntC),
1399
+ } });
1400
+ case 1314149187: return __assign(__assign({}, base), { type: 'ntsc colors' });
1401
+ case 1131639917: return __assign(__assign({}, base), { type: 'custom', filter: {
1402
+ scale: f.Fltr['Scl '],
1403
+ offset: f.Fltr.Ofst,
1404
+ matrix: f.Fltr.Mtrx,
1405
+ } });
1406
+ case 1214736464: return __assign(__assign({}, base), { type: 'high pass', filter: {
1407
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
1408
+ } });
1409
+ case 1299737888: return __assign(__assign({}, base), { type: 'maximum', filter: {
1410
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
1411
+ } });
1412
+ case 1299082528: return __assign(__assign({}, base), { type: 'minimum', filter: {
1413
+ radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
1414
+ } });
1415
+ case 1332114292: return __assign(__assign({}, base), { type: 'offset', filter: {
1416
+ horizontal: f.Fltr.Hrzn,
1417
+ vertical: f.Fltr.Vrtc,
1418
+ undefinedAreas: descriptor_1.FlMd.decode(f.Fltr['Fl ']),
1419
+ } });
1420
+ case 991: return __assign(__assign({}, base), { type: 'puppet', filter: {
1194
1421
  rigidType: f.Fltr.rigidType,
1195
1422
  bounds: [
1196
1423
  { x: f.Fltr.PuX0, y: f.Fltr.PuY0, },
@@ -1202,8 +1429,8 @@ function parseFilterFX(desc) {
1202
1429
  rigidType: p.rigidType,
1203
1430
  // TODO: VrsM
1204
1431
  // TODO: VrsN
1205
- originalVertexArray: uin8ToPoints(p.originalVertexArray),
1206
- deformedVertexArray: uin8ToPoints(p.deformedVertexArray),
1432
+ originalVertexArray: uint8ToPoints(p.originalVertexArray),
1433
+ deformedVertexArray: uint8ToPoints(p.deformedVertexArray),
1207
1434
  indexArray: Array.from(uint8ToUint32(p.indexArray)),
1208
1435
  pinOffsets: arrayToPoints(p.pinOffsets),
1209
1436
  posFinalPins: arrayToPoints(p.posFinalPins),
@@ -1232,31 +1459,429 @@ function parseFilterFX(desc) {
1232
1459
  }); }),
1233
1460
  },
1234
1461
  }); }),
1235
- },
1236
- }); }),
1237
- };
1462
+ } });
1463
+ case 1348620396: {
1464
+ var parameters = [];
1465
+ var Flrt = f.Fltr;
1466
+ for (var i = 0; i < fromAtoZ.length; i++) {
1467
+ if (!Flrt["PN".concat(fromAtoZ[i], "a")])
1468
+ break;
1469
+ for (var j = 0; j < fromAtoZ.length; j++) {
1470
+ if (!Flrt["PN".concat(fromAtoZ[i]).concat(fromAtoZ[j])])
1471
+ break;
1472
+ parameters.push({
1473
+ name: Flrt["PN".concat(fromAtoZ[i]).concat(fromAtoZ[j])],
1474
+ value: Flrt["PF".concat(fromAtoZ[i]).concat(fromAtoZ[j])]
1475
+ });
1476
+ }
1477
+ }
1478
+ return __assign(__assign({}, base), { type: 'oil paint plugin', filter: {
1479
+ name: f.Fltr.KnNm,
1480
+ gpu: f.Fltr.GpuY,
1481
+ lighting: f.Fltr.LIWy,
1482
+ parameters: parameters,
1483
+ } });
1484
+ }
1485
+ // case 2089: return {
1486
+ // ...base,
1487
+ // type: 'adaptive wide angle',
1488
+ // params: {
1489
+ // correction: prjM.decode(f.Fltr.prjM),
1490
+ // focalLength: f.Fltr.focL,
1491
+ // cropFactor: f.Fltr.CrpF,
1492
+ // imageScale: f.Fltr.imgS,
1493
+ // imageX: f.Fltr.imgX,
1494
+ // imageY: f.Fltr.imgY,
1495
+ // },
1496
+ // };
1497
+ case 1215521360: return __assign(__assign({}, base), { type: 'hsb/hsl', filter: {
1498
+ inputMode: descriptor_1.ClrS.decode(f.Fltr.Inpt),
1499
+ rowOrder: descriptor_1.ClrS.decode(f.Fltr.Otpt),
1500
+ } });
1501
+ case 1122: return __assign(__assign({}, base), { type: 'oil paint', filter: {
1502
+ lightingOn: f.Fltr.lightingOn,
1503
+ stylization: f.Fltr.stylization,
1504
+ cleanliness: f.Fltr.cleanliness,
1505
+ brushScale: f.Fltr.brushScale,
1506
+ microBrush: f.Fltr.microBrush,
1507
+ lightDirection: f.Fltr.LghD,
1508
+ specularity: f.Fltr.specularity,
1509
+ } });
1510
+ case 1282492025: {
1511
+ return __assign(__assign({}, base), { type: 'liquify', filter: {
1512
+ liquifyMesh: f.Fltr.LqMe,
1513
+ } });
1514
+ }
1515
+ default:
1516
+ throw new Error("Unknown filterID: ".concat(f.filterID));
1517
+ }
1238
1518
  }
1239
- function serializeFilterFX(filter) {
1519
+ function parseFilterFX(desc) {
1240
1520
  return {
1241
- enab: filter.enabled,
1242
- validAtPosition: filter.validAtPosition,
1243
- filterMaskEnable: filter.maskEnabled,
1244
- filterMaskLinked: filter.maskLinked,
1245
- filterMaskExtendWithWhite: filter.maskExtendWithWhite,
1246
- filterFXList: (filter.list || []).map(function (f) { return ({
1247
- 'Nm ': f.name,
1248
- blendOptions: {
1249
- Opct: (0, descriptor_1.unitsPercent)(f.opacity),
1250
- 'Md ': descriptor_1.BlnM.encode(f.blendMode),
1251
- },
1252
- enab: f.enabled,
1253
- hasoptions: f.hasOptions,
1254
- FrgC: (0, descriptor_1.serializeColor)(f.foregroundColor),
1255
- BckC: (0, descriptor_1.serializeColor)(f.backgroundColor),
1256
- Fltr: {
1521
+ enabled: desc.enab,
1522
+ validAtPosition: desc.validAtPosition,
1523
+ maskEnabled: desc.filterMaskEnable,
1524
+ maskLinked: desc.filterMaskLinked,
1525
+ maskExtendWithWhite: desc.filterMaskExtendWithWhite,
1526
+ list: desc.filterFXList.map(parseFilterFXItem),
1527
+ };
1528
+ }
1529
+ function uvRadius(t) {
1530
+ return (0, descriptor_1.unitsValue)(t.radius, 'radius');
1531
+ }
1532
+ function serializeFilterFXItem(f) {
1533
+ var base = {
1534
+ _name: '',
1535
+ _classID: 'filterFX',
1536
+ 'Nm ': f.name,
1537
+ blendOptions: {
1538
+ _name: '',
1539
+ _classID: 'blendOptions',
1540
+ Opct: (0, descriptor_1.unitsPercentF)(f.opacity),
1541
+ 'Md ': descriptor_1.BlnM.encode(f.blendMode),
1542
+ },
1543
+ enab: f.enabled,
1544
+ hasoptions: f.hasOptions,
1545
+ FrgC: (0, descriptor_1.serializeColor)(f.foregroundColor),
1546
+ BckC: (0, descriptor_1.serializeColor)(f.backgroundColor),
1547
+ };
1548
+ switch (f.type) {
1549
+ case 'average': return __assign(__assign({}, base), { filterID: 1098281575 });
1550
+ case 'blur': return __assign(__assign({}, base), { filterID: 1114403360 });
1551
+ case 'blur more': return __assign(__assign({}, base), { filterID: 1114403405 });
1552
+ case 'box blur': return __assign(__assign({}, base), { Fltr: {
1553
+ _name: 'Box Blur',
1554
+ _classID: 'boxblur',
1555
+ 'Rds ': uvRadius(f.filter),
1556
+ }, filterID: 697 });
1557
+ case 'gaussian blur': return __assign(__assign({}, base), { Fltr: {
1558
+ _name: 'Gaussian Blur',
1559
+ _classID: 'GsnB',
1560
+ 'Rds ': uvRadius(f.filter),
1561
+ }, filterID: 1198747202 });
1562
+ case 'motion blur': return __assign(__assign({}, base), { Fltr: {
1563
+ _name: 'Motion Blur',
1564
+ _classID: 'MtnB',
1565
+ Angl: f.filter.angle,
1566
+ Dstn: (0, descriptor_1.unitsValue)(f.filter.distance, 'distance'),
1567
+ }, filterID: 1299476034 });
1568
+ case 'radial blur': return __assign(__assign({}, base), { Fltr: {
1569
+ _name: 'Radial Blur',
1570
+ _classID: 'RdlB',
1571
+ Amnt: f.filter.amount,
1572
+ BlrM: descriptor_1.BlrM.encode(f.filter.method),
1573
+ BlrQ: descriptor_1.BlrQ.encode(f.filter.quality),
1574
+ }, filterID: 1382313026 });
1575
+ case 'shape blur': return __assign(__assign({}, base), { Fltr: {
1576
+ _name: 'Shape Blur',
1577
+ _classID: 'shapeBlur',
1578
+ 'Rds ': uvRadius(f.filter),
1579
+ customShape: {
1580
+ _name: '',
1581
+ _classID: 'customShape',
1582
+ 'Nm ': f.filter.customShape.name,
1583
+ Idnt: f.filter.customShape.id,
1584
+ }
1585
+ }, filterID: 702 });
1586
+ case 'smart blur': return __assign(__assign({}, base), { Fltr: {
1587
+ _name: 'Smart Blur',
1588
+ _classID: 'SmrB',
1589
+ 'Rds ': f.filter.radius,
1590
+ Thsh: f.filter.threshold,
1591
+ SmBQ: descriptor_1.SmBQ.encode(f.filter.quality),
1592
+ SmBM: descriptor_1.SmBM.encode(f.filter.mode),
1593
+ }, filterID: 1399681602 });
1594
+ case 'surface blur': return __assign(__assign({}, base), { Fltr: {
1595
+ _name: 'Surface Blur',
1596
+ _classID: 'surfaceBlur',
1597
+ 'Rds ': uvRadius(f.filter),
1598
+ Thsh: f.filter.threshold,
1599
+ }, filterID: 701 });
1600
+ case 'displace': return __assign(__assign({}, base), { Fltr: {
1601
+ _name: 'Displace',
1602
+ _classID: 'Dspl',
1603
+ HrzS: f.filter.horizontalScale,
1604
+ VrtS: f.filter.verticalScale,
1605
+ DspM: descriptor_1.DspM.encode(f.filter.displacementMap),
1606
+ UndA: descriptor_1.UndA.encode(f.filter.undefinedAreas),
1607
+ DspF: {
1608
+ sig: f.filter.displacementFile.signature,
1609
+ path: f.filter.displacementFile.path,
1610
+ },
1611
+ }, filterID: 1148416108 });
1612
+ case 'pinch': return __assign(__assign({}, base), { Fltr: {
1613
+ _name: 'Pinch',
1614
+ _classID: 'Pnch',
1615
+ Amnt: f.filter.amount,
1616
+ }, filterID: 1349411688 });
1617
+ case 'polar coordinates': return __assign(__assign({}, base), { Fltr: {
1618
+ _name: 'Polar Coordinates',
1619
+ _classID: 'Plr ',
1620
+ Cnvr: descriptor_1.Cnvr.encode(f.filter.conversion),
1621
+ }, filterID: 1349284384 });
1622
+ case 'ripple': return __assign(__assign({}, base), { Fltr: {
1623
+ _name: 'Ripple',
1624
+ _classID: 'Rple',
1625
+ Amnt: f.filter.amount,
1626
+ RplS: descriptor_1.RplS.encode(f.filter.size),
1627
+ }, filterID: 1383099493 });
1628
+ case 'shear': return __assign(__assign({}, base), { Fltr: {
1629
+ _name: 'Shear',
1630
+ _classID: 'Shr ',
1631
+ ShrP: f.filter.shearPoints.map(function (p) { return ({ _name: '', _classID: 'Pnt ', Hrzn: p.x, Vrtc: p.y }); }),
1632
+ UndA: descriptor_1.UndA.encode(f.filter.undefinedAreas),
1633
+ ShrS: f.filter.shearStart,
1634
+ ShrE: f.filter.shearEnd,
1635
+ }, filterID: 1399353888 });
1636
+ case 'spherize': return __assign(__assign({}, base), { Fltr: {
1637
+ _name: 'Spherize',
1638
+ _classID: 'Sphr',
1639
+ Amnt: f.filter.amount,
1640
+ SphM: descriptor_1.SphM.encode(f.filter.mode),
1641
+ }, filterID: 1399875698 });
1642
+ case 'twirl': return __assign(__assign({}, base), { Fltr: {
1643
+ _name: 'Twirl',
1644
+ _classID: 'Twrl',
1645
+ Angl: f.filter.angle,
1646
+ }, filterID: 1417114220 });
1647
+ case 'wave': return __assign(__assign({}, base), { Fltr: {
1648
+ _name: 'Wave',
1649
+ _classID: 'Wave',
1650
+ Wvtp: descriptor_1.Wvtp.encode(f.filter.type),
1651
+ NmbG: f.filter.numberOfGenerators,
1652
+ WLMn: f.filter.wavelength.min,
1653
+ WLMx: f.filter.wavelength.max,
1654
+ AmMn: f.filter.amplitude.min,
1655
+ AmMx: f.filter.amplitude.max,
1656
+ SclH: f.filter.scale.x,
1657
+ SclV: f.filter.scale.y,
1658
+ UndA: descriptor_1.UndA.encode(f.filter.undefinedAreas),
1659
+ RndS: f.filter.randomSeed,
1660
+ }, filterID: 1466005093 });
1661
+ case 'zigzag': return __assign(__assign({}, base), { Fltr: {
1662
+ _name: 'ZigZag',
1663
+ _classID: 'ZgZg',
1664
+ Amnt: f.filter.amount,
1665
+ NmbR: f.filter.ridges,
1666
+ ZZTy: descriptor_1.ZZTy.encode(f.filter.style),
1667
+ }, filterID: 1516722791 });
1668
+ case 'add noise': return __assign(__assign({}, base), { Fltr: {
1669
+ _name: 'Add Noise',
1670
+ _classID: 'AdNs',
1671
+ Dstr: descriptor_1.Dstr.encode(f.filter.distribution),
1672
+ Nose: (0, descriptor_1.unitsPercentF)(f.filter.amount),
1673
+ Mnch: f.filter.monochromatic,
1674
+ FlRs: f.filter.randomSeed,
1675
+ }, filterID: 1097092723 });
1676
+ case 'despeckle': return __assign(__assign({}, base), { filterID: 1148416099 });
1677
+ case 'dust and scratches': return __assign(__assign({}, base), { Fltr: {
1678
+ _name: 'Dust & Scratches',
1679
+ _classID: 'DstS',
1680
+ 'Rds ': f.filter.radius,
1681
+ Thsh: f.filter.threshold,
1682
+ }, filterID: 1148417107 });
1683
+ case 'median': return __assign(__assign({}, base), { Fltr: {
1684
+ _name: 'Median',
1685
+ _classID: 'Mdn ',
1686
+ 'Rds ': uvRadius(f.filter),
1687
+ }, filterID: 1298427424 });
1688
+ case 'reduce noise': return __assign(__assign({}, base), { Fltr: {
1689
+ _name: 'Reduce Noise',
1690
+ _classID: 'denoise',
1691
+ ClNs: (0, descriptor_1.unitsPercentF)(f.filter.reduceColorNoise),
1692
+ Shrp: (0, descriptor_1.unitsPercentF)(f.filter.sharpenDetails),
1693
+ removeJPEGArtifact: f.filter.removeJpegArtifact,
1694
+ 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 } : {}))); }),
1695
+ preset: f.filter.preset,
1696
+ }, filterID: 633 });
1697
+ case 'color halftone': return __assign(__assign({}, base), { Fltr: {
1698
+ _name: 'Color Halftone',
1699
+ _classID: 'ClrH',
1700
+ 'Rds ': f.filter.radius,
1701
+ Ang1: f.filter.angle1,
1702
+ Ang2: f.filter.angle2,
1703
+ Ang3: f.filter.angle3,
1704
+ Ang4: f.filter.angle4,
1705
+ }, filterID: 1131180616 });
1706
+ case 'crystallize': return __assign(__assign({}, base), { Fltr: {
1707
+ _name: 'Crystallize',
1708
+ _classID: 'Crst',
1709
+ ClSz: f.filter.cellSize,
1710
+ FlRs: f.filter.randomSeed,
1711
+ }, filterID: 1131574132 });
1712
+ case 'facet': return __assign(__assign({}, base), { filterID: 1180922912 });
1713
+ case 'fragment': return __assign(__assign({}, base), { filterID: 1181902701 });
1714
+ case 'mezzotint': return __assign(__assign({}, base), { Fltr: {
1715
+ _name: 'Mezzotint',
1716
+ _classID: 'Mztn',
1717
+ MztT: descriptor_1.MztT.encode(f.filter.type),
1718
+ FlRs: f.filter.randomSeed,
1719
+ }, filterID: 1299870830 });
1720
+ case 'mosaic': return __assign(__assign({}, base), { Fltr: {
1721
+ _name: 'Mosaic',
1722
+ _classID: 'Msc ',
1723
+ ClSz: (0, descriptor_1.unitsValue)(f.filter.cellSize, 'cellSize'),
1724
+ }, filterID: 1299407648 });
1725
+ case 'pointillize': return __assign(__assign({}, base), { Fltr: {
1726
+ _name: 'Pointillize',
1727
+ _classID: 'Pntl',
1728
+ ClSz: f.filter.cellSize,
1729
+ FlRs: f.filter.randomSeed,
1730
+ }, filterID: 1349416044 });
1731
+ case 'clouds': return __assign(__assign({}, base), { Fltr: {
1732
+ _name: 'Clouds',
1733
+ _classID: 'Clds',
1734
+ FlRs: f.filter.randomSeed,
1735
+ }, filterID: 1131177075 });
1736
+ case 'difference clouds': return __assign(__assign({}, base), { Fltr: {
1737
+ _name: 'Difference Clouds',
1738
+ _classID: 'DfrC',
1739
+ FlRs: f.filter.randomSeed,
1740
+ }, filterID: 1147564611 });
1741
+ case 'fibers': return __assign(__assign({}, base), { Fltr: {
1742
+ _name: 'Fibers',
1743
+ _classID: 'Fbrs',
1744
+ Vrnc: f.filter.variance,
1745
+ Strg: f.filter.strength,
1746
+ RndS: f.filter.randomSeed,
1747
+ }, filterID: 1180856947 });
1748
+ case 'lens flare': return __assign(__assign({}, base), { Fltr: {
1749
+ _name: 'Lens Flare',
1750
+ _classID: 'LnsF',
1751
+ Brgh: f.filter.brightness,
1752
+ FlrC: {
1753
+ _name: '',
1754
+ _classID: 'Pnt ',
1755
+ Hrzn: f.filter.position.x,
1756
+ Vrtc: f.filter.position.y,
1757
+ },
1758
+ 'Lns ': descriptor_1.Lns.encode(f.filter.lensType),
1759
+ }, filterID: 1282306886 });
1760
+ case 'sharpen': return __assign(__assign({}, base), { filterID: 1399353968 });
1761
+ case 'sharpen edges': return __assign(__assign({}, base), { filterID: 1399353925 });
1762
+ case 'sharpen more': return __assign(__assign({}, base), { filterID: 1399353933 });
1763
+ case 'smart sharpen': return __assign(__assign({}, base), { Fltr: {
1764
+ _name: 'Smart Sharpen',
1765
+ _classID: 'smartSharpen',
1766
+ Amnt: (0, descriptor_1.unitsPercentF)(f.filter.amount),
1767
+ 'Rds ': uvRadius(f.filter),
1768
+ Thsh: f.filter.threshold,
1769
+ Angl: f.filter.angle,
1770
+ moreAccurate: f.filter.moreAccurate,
1771
+ blur: descriptor_1.blurType.encode(f.filter.blur),
1772
+ preset: f.filter.preset,
1773
+ sdwM: {
1774
+ _name: 'Parameters',
1775
+ _classID: 'adaptCorrectTones',
1776
+ Amnt: (0, descriptor_1.unitsPercentF)(f.filter.shadow.fadeAmount),
1777
+ Wdth: (0, descriptor_1.unitsPercentF)(f.filter.shadow.tonalWidth),
1778
+ 'Rds ': f.filter.shadow.radius,
1779
+ },
1780
+ hglM: {
1781
+ _name: 'Parameters',
1782
+ _classID: 'adaptCorrectTones',
1783
+ Amnt: (0, descriptor_1.unitsPercentF)(f.filter.highlight.fadeAmount),
1784
+ Wdth: (0, descriptor_1.unitsPercentF)(f.filter.highlight.tonalWidth),
1785
+ 'Rds ': f.filter.highlight.radius,
1786
+ },
1787
+ }, filterID: 698 });
1788
+ case 'unsharp mask': return __assign(__assign({}, base), { Fltr: {
1789
+ _name: 'Unsharp Mask',
1790
+ _classID: 'UnsM',
1791
+ Amnt: (0, descriptor_1.unitsPercentF)(f.filter.amount),
1792
+ 'Rds ': uvRadius(f.filter),
1793
+ Thsh: f.filter.threshold,
1794
+ }, filterID: 1433301837 });
1795
+ case 'diffuse': return __assign(__assign({}, base), { Fltr: {
1796
+ _name: 'Diffuse',
1797
+ _classID: 'Dfs ',
1798
+ 'Md ': descriptor_1.DfsM.encode(f.filter.mode),
1799
+ FlRs: f.filter.randomSeed,
1800
+ }, filterID: 1147564832 });
1801
+ case 'emboss': return __assign(__assign({}, base), { Fltr: {
1802
+ _name: 'Emboss',
1803
+ _classID: 'Embs',
1804
+ Angl: f.filter.angle,
1805
+ Hght: f.filter.height,
1806
+ Amnt: f.filter.amount,
1807
+ }, filterID: 1164796531 });
1808
+ case 'extrude': return __assign(__assign({}, base), { Fltr: {
1809
+ _name: 'Extrude',
1810
+ _classID: 'Extr',
1811
+ ExtS: f.filter.size,
1812
+ ExtD: f.filter.depth,
1813
+ ExtF: f.filter.solidFrontFaces,
1814
+ ExtM: f.filter.maskIncompleteBlocks,
1815
+ ExtT: descriptor_1.ExtT.encode(f.filter.type),
1816
+ ExtR: descriptor_1.ExtR.encode(f.filter.depthMode),
1817
+ FlRs: f.filter.randomSeed,
1818
+ }, filterID: 1165522034 });
1819
+ case 'find edges': return __assign(__assign({}, base), { filterID: 1181639749 });
1820
+ case 'solarize': return __assign(__assign({}, base), { filterID: 1399616122 });
1821
+ case 'tiles': return __assign(__assign({}, base), { Fltr: {
1822
+ _name: 'Tiles',
1823
+ _classID: 'Tls ',
1824
+ TlNm: f.filter.numberOfTiles,
1825
+ TlOf: f.filter.maximumOffset,
1826
+ FlCl: descriptor_1.FlCl.encode(f.filter.fillEmptyAreaWith),
1827
+ FlRs: f.filter.randomSeed,
1828
+ }, filterID: 1416393504 });
1829
+ case 'trace contour': return __assign(__assign({}, base), { Fltr: {
1830
+ _name: 'Trace Contour',
1831
+ _classID: 'TrcC',
1832
+ 'Lvl ': f.filter.level,
1833
+ 'Edg ': descriptor_1.CntE.encode(f.filter.edge),
1834
+ }, filterID: 1416782659 });
1835
+ case 'wind': return __assign(__assign({}, base), { Fltr: {
1836
+ _name: 'Wind',
1837
+ _classID: 'Wnd ',
1838
+ WndM: descriptor_1.WndM.encode(f.filter.method),
1839
+ Drct: descriptor_1.Drct.encode(f.filter.direction),
1840
+ }, filterID: 1466852384 });
1841
+ case 'de-interlace': return __assign(__assign({}, base), { Fltr: {
1842
+ _name: 'De-Interlace',
1843
+ _classID: 'Dntr',
1844
+ IntE: descriptor_1.IntE.encode(f.filter.eliminate),
1845
+ IntC: descriptor_1.IntC.encode(f.filter.newFieldsBy),
1846
+ }, filterID: 1148089458 });
1847
+ case 'ntsc colors': return __assign(__assign({}, base), { filterID: 1314149187 });
1848
+ case 'custom': return __assign(__assign({}, base), { Fltr: {
1849
+ _name: 'Custom',
1850
+ _classID: 'Cstm',
1851
+ 'Scl ': f.filter.scale,
1852
+ Ofst: f.filter.offset,
1853
+ Mtrx: f.filter.matrix,
1854
+ }, filterID: 1131639917 });
1855
+ case 'high pass': return __assign(__assign({}, base), { Fltr: {
1856
+ _name: 'High Pass',
1857
+ _classID: 'HghP',
1858
+ 'Rds ': uvRadius(f.filter),
1859
+ }, filterID: 1214736464 });
1860
+ case 'maximum': return __assign(__assign({}, base), { Fltr: {
1861
+ _name: 'Maximum',
1862
+ _classID: 'Mxm ',
1863
+ 'Rds ': uvRadius(f.filter),
1864
+ }, filterID: 1299737888 });
1865
+ case 'minimum': return __assign(__assign({}, base), { Fltr: {
1866
+ _name: 'Minimum',
1867
+ _classID: 'Mnm ',
1868
+ 'Rds ': uvRadius(f.filter),
1869
+ }, filterID: 1299082528 });
1870
+ case 'offset': return __assign(__assign({}, base), { Fltr: {
1871
+ _name: 'Offset',
1872
+ _classID: 'Ofst',
1873
+ Hrzn: f.filter.horizontal,
1874
+ Vrtc: f.filter.vertical,
1875
+ 'Fl ': descriptor_1.FlMd.encode(f.filter.undefinedAreas),
1876
+ }, filterID: 1332114292 });
1877
+ case 'puppet': return __assign(__assign({}, base), { Fltr: {
1878
+ _name: 'Rigid Transform',
1879
+ _classID: 'rigidTransform',
1257
1880
  'null': ['Ordn.Trgt'],
1258
1881
  rigidType: f.filter.rigidType,
1259
- puppetShapeList: (f.filter.puppetShapeList || []).map(function (p) { return ({
1882
+ puppetShapeList: f.filter.puppetShapeList.map(function (p) { return ({
1883
+ _name: '',
1884
+ _classID: 'puppetShape',
1260
1885
  rigidType: p.rigidType,
1261
1886
  VrsM: 1,
1262
1887
  VrsN: 0,
@@ -1265,7 +1890,6 @@ function serializeFilterFX(filter) {
1265
1890
  indexArray: toUint8(new Uint32Array(p.indexArray)),
1266
1891
  pinOffsets: pointsToArray(p.pinOffsets),
1267
1892
  posFinalPins: pointsToArray(p.posFinalPins),
1268
- selectedPin: p.selectedPin,
1269
1893
  pinVertexIndices: p.pinVertexIndices,
1270
1894
  PinP: pointsToArray(p.pinPosition),
1271
1895
  PnRt: p.pinRotation,
@@ -1276,11 +1900,19 @@ function serializeFilterFX(filter) {
1276
1900
  meshRigidity: p.meshRigidity,
1277
1901
  imageResolution: p.imageResolution,
1278
1902
  meshBoundaryPath: {
1279
- pathComponents: (p.meshBoundaryPath.pathComponents || []).map(function (c) { return ({
1903
+ _name: '',
1904
+ _classID: 'pathClass',
1905
+ pathComponents: p.meshBoundaryPath.pathComponents.map(function (c) { return ({
1906
+ _name: '',
1907
+ _classID: 'PaCm',
1280
1908
  shapeOperation: "shapeOperation.".concat(c.shapeOperation),
1281
- SbpL: (c.paths || []).map(function (path) { return ({
1909
+ SbpL: c.paths.map(function (path) { return ({
1910
+ _name: '',
1911
+ _classID: 'Sbpl',
1282
1912
  Clsp: path.closed,
1283
- 'Pts ': (path.points || []).map(function (pt) { return ({
1913
+ 'Pts ': path.points.map(function (pt) { return ({
1914
+ _name: '',
1915
+ _classID: 'Pthp',
1284
1916
  Anch: pointToHrznVrtc(pt.anchor),
1285
1917
  'Fwd ': pointToHrznVrtc(pt.forward),
1286
1918
  'Bwd ': pointToHrznVrtc(pt.backward),
@@ -1289,6 +1921,7 @@ function serializeFilterFX(filter) {
1289
1921
  }); }),
1290
1922
  }); }),
1291
1923
  },
1924
+ selectedPin: p.selectedPin,
1292
1925
  }); }),
1293
1926
  PuX0: f.filter.bounds[0].x,
1294
1927
  PuX1: f.filter.bounds[1].x,
@@ -1298,11 +1931,38 @@ function serializeFilterFX(filter) {
1298
1931
  PuY1: f.filter.bounds[1].y,
1299
1932
  PuY2: f.filter.bounds[2].y,
1300
1933
  PuY3: f.filter.bounds[3].y,
1301
- },
1302
- filterID: f.id,
1303
- }); }),
1304
- };
1934
+ }, filterID: 991 });
1935
+ case 'oil paint plugin': {
1936
+ var params = {};
1937
+ for (var i = 0; i < f.filter.parameters.length; i++) {
1938
+ var _a = f.filter.parameters[i], name_1 = _a.name, value = _a.value;
1939
+ var suffix = "".concat(fromAtoZ[Math.floor(i / fromAtoZ.length)]).concat(fromAtoZ[i % fromAtoZ.length]);
1940
+ params["PN".concat(suffix)] = name_1;
1941
+ params["PT".concat(suffix)] = 0;
1942
+ params["PF".concat(suffix)] = value;
1943
+ }
1944
+ 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 });
1945
+ }
1946
+ case 'oil paint': return __assign(__assign({}, base), { Fltr: {
1947
+ _name: 'Oil Paint',
1948
+ _classID: 'oilPaint',
1949
+ lightingOn: f.filter.lightingOn,
1950
+ stylization: f.filter.stylization,
1951
+ cleanliness: f.filter.cleanliness,
1952
+ brushScale: f.filter.brushScale,
1953
+ microBrush: f.filter.microBrush,
1954
+ LghD: f.filter.lightDirection,
1955
+ specularity: f.filter.specularity,
1956
+ }, filterID: 1122 });
1957
+ case 'liquify': return __assign(__assign({}, base), { Fltr: {
1958
+ _name: 'Liquify',
1959
+ _classID: 'LqFy',
1960
+ LqMe: f.filter.liquifyMesh,
1961
+ }, filterID: 1282492025 });
1962
+ default: throw new Error("Unknow filter type: ".concat(f.type));
1963
+ }
1305
1964
  }
1965
+ // let t: any;
1306
1966
  addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
1307
1967
  if ((0, psdReader_1.readSignature)(reader) !== 'soLD')
1308
1968
  throw new Error("Invalid SoLd type");
@@ -1314,15 +1974,17 @@ addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
1314
1974
  // console.log('SoLd.warp', require('util').inspect(desc.warp, false, 99, true));
1315
1975
  // console.log('SoLd.quiltWarp', require('util').inspect(desc.quiltWarp, false, 99, true));
1316
1976
  // desc.filterFX!.filterFXList[0].Fltr.puppetShapeList[0].meshBoundaryPath.pathComponents[0].SbpL[0]['Pts '] = [];
1317
- // console.log('filterFX', require('util').inspect(desc.filterFX, false, 99, true));
1977
+ // console.log('read', require('util').inspect(desc.filterFX, false, 99, true));
1978
+ // console.log('filterFXList[0]', require('util').inspect((desc as any).filterFX.filterFXList[0], false, 99, true));
1979
+ // t = desc;
1318
1980
  target.placedLayer = {
1319
1981
  id: desc.Idnt,
1320
1982
  placed: desc.placed,
1321
1983
  type: placedLayerTypes[desc.Type],
1322
1984
  pageNumber: desc.PgNm,
1323
1985
  totalPages: desc.totalPages,
1324
- frameStep: desc.frameStep,
1325
- duration: desc.duration,
1986
+ frameStep: (0, descriptor_1.frac)(desc.frameStep),
1987
+ duration: (0, descriptor_1.frac)(desc.duration),
1326
1988
  frameCount: desc.frameCount,
1327
1989
  transform: desc.Trnf,
1328
1990
  width: desc['Sz '].Wdth,
@@ -1337,22 +1999,48 @@ addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
1337
1999
  target.placedLayer.crop = desc.Crop;
1338
2000
  if (desc.comp)
1339
2001
  target.placedLayer.comp = desc.comp;
1340
- if (desc.compInfo)
1341
- target.placedLayer.compInfo = desc.compInfo;
2002
+ if (desc.compInfo) {
2003
+ target.placedLayer.compInfo = {
2004
+ compID: desc.compInfo.compID,
2005
+ originalCompID: desc.compInfo.originalCompID,
2006
+ };
2007
+ }
1342
2008
  if (desc.filterFX)
1343
2009
  target.placedLayer.filter = parseFilterFX(desc.filterFX);
2010
+ // console.log('filter', require('util').inspect(target.placedLayer.filter, false, 99, true));
1344
2011
  (0, psdReader_1.skipBytes)(reader, left()); // HACK
1345
2012
  }, function (writer, target) {
1346
2013
  var _a, _b;
1347
2014
  (0, psdWriter_1.writeSignature)(writer, 'soLD');
1348
2015
  (0, psdWriter_1.writeInt32)(writer, 4); // version
1349
2016
  var placed = target.placedLayer;
1350
- 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 ': {
2017
+ 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,
2018
+ // quiltWarp: {} as any,
2019
+ warp: encodeWarp(placed.warp || {}), 'Sz ': {
2020
+ _name: '',
2021
+ _classID: 'Pnt ',
1351
2022
  Wdth: placed.width || 0,
1352
2023
  Hght: placed.height || 0, // TODO: find size ?
1353
2024
  }, Rslt: placed.resolution ? (0, descriptor_1.unitsValue)(placed.resolution, 'resolution') : { units: 'Density', value: 72 } });
1354
- if (placed.filter)
1355
- desc.filterFX = serializeFilterFX(placed.filter);
2025
+ if (placed.filter) {
2026
+ desc.filterFX = {
2027
+ _name: '',
2028
+ _classID: 'filterFXStyle',
2029
+ enab: placed.filter.enabled,
2030
+ validAtPosition: placed.filter.validAtPosition,
2031
+ filterMaskEnable: placed.filter.maskEnabled,
2032
+ filterMaskLinked: placed.filter.maskLinked,
2033
+ filterMaskExtendWithWhite: placed.filter.maskExtendWithWhite,
2034
+ filterFXList: placed.filter.list.map(function (f) { return serializeFilterFXItem(f); }),
2035
+ };
2036
+ }
2037
+ // console.log('write', require('util').inspect(desc.filterFX, false, 99, true)); ///
2038
+ // if (JSON.stringify(t) !== JSON.stringify(desc)) {
2039
+ // console.log('read', require('util').inspect(t, false, 99, true));
2040
+ // console.log('write', require('util').inspect(desc, false, 99, true));
2041
+ // console.error('DIFFERENT');
2042
+ // // throw new Error('DIFFERENT');
2043
+ // }
1356
2044
  if (placed.warp && isQuiltWarp(placed.warp)) {
1357
2045
  var quiltWarp = encodeWarp(placed.warp);
1358
2046
  desc.quiltWarp = quiltWarp;
@@ -1438,7 +2126,7 @@ addHandler('Anno', function (target) { return target.annotations !== undefined;
1438
2126
  var popupLocation = readRect(reader);
1439
2127
  var color = (0, psdReader_1.readColor)(reader);
1440
2128
  var author = (0, psdReader_1.readPascalString)(reader, 2);
1441
- var name_1 = (0, psdReader_1.readPascalString)(reader, 2);
2129
+ var name_2 = (0, psdReader_1.readPascalString)(reader, 2);
1442
2130
  var date = (0, psdReader_1.readPascalString)(reader, 2);
1443
2131
  /*const contentLength =*/ (0, psdReader_1.readUint32)(reader);
1444
2132
  /*const dataType =*/ (0, psdReader_1.readSignature)(reader);
@@ -1467,7 +2155,7 @@ addHandler('Anno', function (target) { return target.annotations !== undefined;
1467
2155
  popupLocation: popupLocation,
1468
2156
  color: color,
1469
2157
  author: author,
1470
- name: name_1,
2158
+ name: name_2,
1471
2159
  date: date,
1472
2160
  data: data,
1473
2161
  });
@@ -1526,20 +2214,26 @@ addHandler('lnk2', function (target) { return !!target.linkedFiles && target.lin
1526
2214
  var type = (0, psdReader_1.readSignature)(reader);
1527
2215
  var version = (0, psdReader_1.readInt32)(reader);
1528
2216
  var id = (0, psdReader_1.readPascalString)(reader, 1);
1529
- var name_2 = (0, psdReader_1.readUnicodeString)(reader);
2217
+ var name_3 = (0, psdReader_1.readUnicodeString)(reader);
1530
2218
  var fileType = (0, psdReader_1.readSignature)(reader).trim(); // ' ' if empty
1531
2219
  var fileCreator = (0, psdReader_1.readSignature)(reader).trim(); // ' ' or '\0\0\0\0' if empty
1532
2220
  var dataSize = readLength64(reader);
1533
2221
  var hasFileOpenDescriptor = (0, psdReader_1.readUint8)(reader);
1534
2222
  var fileOpenDescriptor = hasFileOpenDescriptor ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
1535
2223
  var linkedFileDescriptor = type === 'liFE' ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
1536
- var file = { id: id, name: name_2, data: undefined };
2224
+ var file = { id: id, name: name_3, data: undefined };
1537
2225
  if (fileType)
1538
2226
  file.type = fileType;
1539
2227
  if (fileCreator)
1540
2228
  file.creator = fileCreator;
1541
- if (fileOpenDescriptor)
1542
- file.descriptor = fileOpenDescriptor;
2229
+ if (fileOpenDescriptor) {
2230
+ file.descriptor = {
2231
+ compInfo: {
2232
+ compID: fileOpenDescriptor.compInfo.compID,
2233
+ originalCompID: fileOpenDescriptor.compInfo.originalCompID,
2234
+ }
2235
+ };
2236
+ }
1543
2237
  if (type === 'liFE' && version > 3) {
1544
2238
  var year = (0, psdReader_1.readInt32)(reader);
1545
2239
  var month = (0, psdReader_1.readUint8)(reader);
@@ -1597,7 +2291,10 @@ addHandler('lnk2', function (target) { return !!target.linkedFiles && target.lin
1597
2291
  writeLength64(writer, file.data ? file.data.byteLength : 0);
1598
2292
  if (file.descriptor && file.descriptor.compInfo) {
1599
2293
  var desc = {
1600
- compInfo: file.descriptor.compInfo,
2294
+ compInfo: {
2295
+ compID: file.descriptor.compInfo.compID,
2296
+ originalCompID: file.descriptor.compInfo.originalCompID,
2297
+ }
1601
2298
  };
1602
2299
  (0, psdWriter_1.writeUint8)(writer, 1);
1603
2300
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
@@ -2337,6 +3034,94 @@ addHandler('Txt2', hasKey('engineData'), function (reader, target, left) {
2337
3034
  var buffer = (0, base64_js_1.toByteArray)(target.engineData);
2338
3035
  (0, psdWriter_1.writeBytes)(writer, buffer);
2339
3036
  });
3037
+ addHandler('FEid', hasKey('filterEffectsMasks'), function (reader, target, leftBytes) {
3038
+ var version = (0, psdReader_1.readInt32)(reader);
3039
+ if (version < 1 || version > 3)
3040
+ throw new Error("Invalid filterEffects version ".concat(version));
3041
+ if ((0, psdReader_1.readUint32)(reader))
3042
+ throw new Error('filterEffects: 64 bit length is not supported');
3043
+ var length = (0, psdReader_1.readUint32)(reader);
3044
+ var end = reader.offset + length;
3045
+ target.filterEffectsMasks = [];
3046
+ while (reader.offset < end) {
3047
+ var id = (0, psdReader_1.readPascalString)(reader, 1);
3048
+ var effectVersion = (0, psdReader_1.readInt32)(reader);
3049
+ if (effectVersion !== 1)
3050
+ throw new Error("Invalid filterEffect version ".concat(effectVersion));
3051
+ if ((0, psdReader_1.readUint32)(reader))
3052
+ throw new Error('filterEffect: 64 bit length is not supported');
3053
+ /*const effectLength =*/ (0, psdReader_1.readUint32)(reader);
3054
+ // const endOfEffect = reader.offset + effectLength;
3055
+ var top_2 = (0, psdReader_1.readInt32)(reader);
3056
+ var left = (0, psdReader_1.readInt32)(reader);
3057
+ var bottom = (0, psdReader_1.readInt32)(reader);
3058
+ var right = (0, psdReader_1.readInt32)(reader);
3059
+ var depth = (0, psdReader_1.readInt32)(reader);
3060
+ var maxChannels = (0, psdReader_1.readInt32)(reader);
3061
+ var channels = [];
3062
+ // 0 -> R, 1 -> G, 2 -> B, 25 -> A
3063
+ for (var i = 0; i < (maxChannels + 2); i++) {
3064
+ var exists = (0, psdReader_1.readInt32)(reader);
3065
+ if (exists) {
3066
+ if ((0, psdReader_1.readUint32)(reader))
3067
+ throw new Error('filterEffect: 64 bit length is not supported');
3068
+ var channelLength = (0, psdReader_1.readUint32)(reader);
3069
+ var compressionMode = (0, psdReader_1.readUint16)(reader);
3070
+ var data = (0, psdReader_1.readBytes)(reader, channelLength - 2);
3071
+ channels.push({ compressionMode: compressionMode, data: data });
3072
+ }
3073
+ else {
3074
+ channels.push(undefined);
3075
+ }
3076
+ }
3077
+ target.filterEffectsMasks.push({ id: id, top: top_2, left: left, bottom: bottom, right: right, depth: depth, channels: channels });
3078
+ if (leftBytes() && (0, psdReader_1.readUint8)(reader)) {
3079
+ var compressionMode = (0, psdReader_1.readUint16)(reader);
3080
+ var data = (0, psdReader_1.readBytes)(reader, leftBytes());
3081
+ target.filterEffectsMasks[target.filterEffectsMasks.length - 1].extra = { compressionMode: compressionMode, data: data };
3082
+ }
3083
+ }
3084
+ }, function (writer, target) {
3085
+ var _a;
3086
+ (0, psdWriter_1.writeInt32)(writer, 3);
3087
+ (0, psdWriter_1.writeUint32)(writer, 0);
3088
+ (0, psdWriter_1.writeUint32)(writer, 0);
3089
+ var lengthOffset = writer.offset;
3090
+ for (var _i = 0, _b = target.filterEffectsMasks; _i < _b.length; _i++) {
3091
+ var mask = _b[_i];
3092
+ (0, psdWriter_1.writePascalString)(writer, mask.id, 1);
3093
+ (0, psdWriter_1.writeInt32)(writer, 1);
3094
+ (0, psdWriter_1.writeUint32)(writer, 0);
3095
+ (0, psdWriter_1.writeUint32)(writer, 0);
3096
+ var length2Offset = writer.offset;
3097
+ (0, psdWriter_1.writeInt32)(writer, mask.top);
3098
+ (0, psdWriter_1.writeInt32)(writer, mask.left);
3099
+ (0, psdWriter_1.writeInt32)(writer, mask.bottom);
3100
+ (0, psdWriter_1.writeInt32)(writer, mask.right);
3101
+ (0, psdWriter_1.writeInt32)(writer, mask.depth);
3102
+ var maxChannels = Math.max(0, mask.channels.length - 2);
3103
+ (0, psdWriter_1.writeInt32)(writer, maxChannels);
3104
+ for (var i = 0; i < (maxChannels + 2); i++) {
3105
+ var channel = mask.channels[i];
3106
+ (0, psdWriter_1.writeInt32)(writer, channel ? 1 : 0);
3107
+ if (channel) {
3108
+ (0, psdWriter_1.writeUint32)(writer, 0);
3109
+ (0, psdWriter_1.writeUint32)(writer, channel.data.length + 2);
3110
+ (0, psdWriter_1.writeUint16)(writer, channel.compressionMode);
3111
+ (0, psdWriter_1.writeBytes)(writer, channel.data);
3112
+ }
3113
+ }
3114
+ writer.view.setUint32(length2Offset - 4, writer.offset - length2Offset, false);
3115
+ }
3116
+ var extra = (_a = target.filterEffectsMasks[target.filterEffectsMasks.length - 1]) === null || _a === void 0 ? void 0 : _a.extra;
3117
+ if (extra) {
3118
+ (0, psdWriter_1.writeUint8)(writer, 1);
3119
+ (0, psdWriter_1.writeUint16)(writer, extra.compressionMode);
3120
+ (0, psdWriter_1.writeBytes)(writer, extra.data);
3121
+ }
3122
+ writer.view.setUint32(lengthOffset - 4, writer.offset - lengthOffset, false);
3123
+ });
3124
+ addHandlerAlias('FXid', 'FEid');
2340
3125
  addHandler('FMsk', hasKey('filterMask'), function (reader, target) {
2341
3126
  target.filterMask = {
2342
3127
  colorSpace: (0, psdReader_1.readColor)(reader),
@@ -2402,14 +3187,17 @@ addHandler('lfx2', function (target) { return target.effects !== undefined && !h
2402
3187
  addHandler('cinf', hasKey('compositorUsed'), function (reader, target, left) {
2403
3188
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
2404
3189
  // console.log(require('util').inspect(desc, false, 99, true));
3190
+ function enumValue(desc) {
3191
+ return desc.split('.')[1];
3192
+ }
2405
3193
  target.compositorUsed = {
2406
3194
  description: desc.description,
2407
3195
  reason: desc.reason,
2408
- engine: desc.Engn.split('.')[1],
2409
- enableCompCore: desc.enableCompCore.split('.')[1],
2410
- enableCompCoreGPU: desc.enableCompCoreGPU.split('.')[1],
2411
- compCoreSupport: desc.compCoreSupport.split('.')[1],
2412
- compCoreGPUSupport: desc.compCoreGPUSupport.split('.')[1],
3196
+ engine: enumValue(desc.Engn),
3197
+ enableCompCore: enumValue(desc.enableCompCore),
3198
+ enableCompCoreGPU: enumValue(desc.enableCompCoreGPU),
3199
+ compCoreSupport: enumValue(desc.compCoreSupport),
3200
+ compCoreGPUSupport: enumValue(desc.compCoreGPUSupport),
2413
3201
  };
2414
3202
  (0, psdReader_1.skipBytes)(reader, left());
2415
3203
  }, function (writer, target) {
@@ -2464,87 +3252,6 @@ addHandler('tsly', hasKey('transparencyShapesLayer'), function (reader, target)
2464
3252
  (0, psdWriter_1.writeUint8)(writer, target.transparencyShapesLayer ? 1 : 0);
2465
3253
  (0, psdWriter_1.writeZeros)(writer, 3);
2466
3254
  });
2467
- /*addHandler(
2468
- 'FEid',
2469
- hasKey('filterEffects'),
2470
- (reader, _target) => {
2471
- const version = readInt32(reader);
2472
- if (version < 1 || version > 3) throw new Error(`Invalid filterEffects version ${version}`);
2473
-
2474
- if (readUint32(reader)) throw new Error('filterEffects: 64 bit length is not supported');
2475
- const length = readUint32(reader);
2476
- const end = reader.offset + length;
2477
-
2478
- while (reader.offset < end) {
2479
- console.log('bytes to go', end - reader.offset, 'at', reader.offset.toString(16));
2480
- //
2481
- const id = readPascalString(reader, 1);
2482
- const effectVersion = readInt32(reader);
2483
- if (effectVersion !== 1) throw new Error(`Invalid filterEffect version ${effectVersion}`);
2484
- if (readUint32(reader)) throw new Error('filterEffect: 64 bit length is not supported');
2485
- const effectLength = readUint32(reader);
2486
- const endOfEffect = reader.offset + effectLength;
2487
- const top = readInt32(reader);
2488
- const left = readInt32(reader);
2489
- const bottom = readInt32(reader);
2490
- const right = readInt32(reader);
2491
- const depth = readInt32(reader);
2492
- const maxChannels = readInt32(reader);
2493
- const channels: any[] = [];
2494
-
2495
- for (let i = 0; i < (maxChannels + 2); i++) {
2496
- const exists = readInt32(reader);
2497
- if (exists) {
2498
- if (readUint32(reader)) throw new Error('filterEffect: 64 bit length is not supported');
2499
- const channelLength = readUint32(reader);
2500
- const compressionMode = readUint16(reader);
2501
- const data = readBytes(reader, channelLength - 2);
2502
- channels.push({ channelLength, compressionMode, data: data?.length + ' bytes' });
2503
- // if (c < 3 || c == 25) e_ = _F.Cn(!0, rL, m, b.rect.F, b.rect.V, X, rp);
2504
- // if (c == 0) _c.S = e_;
2505
- // if (c == 1) _c.v = e_;
2506
- // if (c == 2) _c.e = e_;
2507
- // if (c == 25) _c.w = e_;
2508
- } else {
2509
- channels.push(undefined);
2510
- }
2511
- }
2512
-
2513
- console.log('left at the end', endOfEffect - reader.offset);
2514
- if (endOfEffect > reader.offset) {
2515
- if (readUint8(reader)) {
2516
- const compressionMode = readUint16(reader);
2517
- const data = endOfEffect > reader.offset ? readBytes(reader, endOfEffect - reader.offset) : undefined;
2518
- console.log('extra data', { compressionMode, data: data?.length + ' bytes' });
2519
- } else {
2520
- console.log('no extra');
2521
- }
2522
- }
2523
-
2524
- console.log('effect', {
2525
- id,
2526
- effectVersion,
2527
- effectLength,
2528
- top,
2529
- left,
2530
- bottom,
2531
- right,
2532
- depth,
2533
- maxChannels,
2534
- channels,
2535
- });
2536
-
2537
- console.log('bytes left after effect', endOfEffect - reader.offset);
2538
- // if (length % 4) skipBytes(reader, 4 - length % 4);
2539
- }
2540
-
2541
- console.log({ version, length });
2542
- },
2543
- (_writer, _target) => {
2544
- },
2545
- );
2546
-
2547
- addHandlerAlias('FXid', 'FEid');*/
2548
3255
 
2549
3256
  },{"./descriptor":4,"./effectsHelpers":5,"./engineData":6,"./helpers":7,"./psdReader":11,"./psdWriter":12,"./text":13,"base64-js":15}],3:[function(require,module,exports){
2550
3257
  "use strict";
@@ -2609,7 +3316,8 @@ var __assign = (this && this.__assign) || function () {
2609
3316
  return __assign.apply(this, arguments);
2610
3317
  };
2611
3318
  Object.defineProperty(exports, "__esModule", { value: true });
2612
- exports.strokeStyleLineAlignment = exports.strokeStyleLineJoinType = exports.strokeStyleLineCapType = exports.ESliceBGColorType = exports.ESliceOrigin = exports.ESliceVertAlign = exports.ESliceHorzAlign = exports.ESliceType = exports.FrFl = exports.FStl = exports.ClrS = exports.gradientInterpolationMethodType = exports.stdTrackID = exports.animInterpStyleEnum = exports.GrdT = exports.IGSr = exports.BETE = exports.BESs = exports.bvlT = exports.BESl = exports.BlnM = exports.warpStyle = exports.Annt = exports.Ornt = exports.textGridding = exports.unitsValue = exports.unitsPercent = exports.unitsAngle = exports.parseUnitsToNumber = exports.parseUnitsOrNumber = exports.parseUnits = exports.parsePercentOrAngle = exports.parsePercent = exports.parseAngle = exports.serializeColor = exports.parseColor = exports.serializeVectorContent = exports.parseVectorContent = exports.serializeTrackList = exports.parseTrackList = exports.parseEffects = exports.serializeEffects = exports.xyToHorzVrtc = exports.horzVrtcToXY = exports.writeVersionAndDescriptor = exports.readVersionAndDescriptor = exports.writeDescriptorStructure = exports.readDescriptorStructure = exports.readAsciiStringOrClassId = exports.setLogErrors = void 0;
3319
+ exports.strokeStyleLineCapType = exports.ESliceBGColorType = exports.ESliceOrigin = exports.ESliceVertAlign = exports.ESliceHorzAlign = exports.ESliceType = exports.FrFl = exports.FStl = exports.ClrS = exports.gradientInterpolationMethodType = exports.stdTrackID = exports.animInterpStyleEnum = exports.GrdT = exports.IGSr = exports.BETE = exports.BESs = exports.bvlT = exports.BESl = exports.BlnM = exports.warpStyle = exports.Annt = exports.Ornt = exports.textGridding = exports.frac = exports.unitsValue = exports.unitsPercentF = exports.unitsPercent = exports.unitsAngle = exports.parseUnitsToNumber = exports.parseUnitsOrNumber = exports.parseUnits = exports.parsePercentOrAngle = exports.parsePercent = exports.parseAngle = exports.serializeColor = exports.parseColor = exports.serializeVectorContent = exports.parseVectorContent = exports.serializeTrackList = exports.parseTrackList = exports.parseEffects = exports.serializeEffects = exports.xyToHorzVrtc = exports.horzVrtcToXY = exports.writeVersionAndDescriptor = exports.readVersionAndDescriptor = exports.writeDescriptorStructure = exports.readDescriptorStructure = exports.readAsciiStringOrClassId = exports.setLogErrors = void 0;
3320
+ exports.prjM = exports.FlMd = exports.IntC = exports.IntE = exports.Drct = exports.WndM = exports.CntE = exports.FlCl = exports.ExtR = exports.ExtT = exports.DfsM = exports.blurType = exports.Lns = exports.MztT = exports.Chnl = exports.Dstr = exports.ZZTy = exports.Wvtp = exports.SphM = exports.RplS = exports.Cnvr = exports.UndA = exports.DspM = exports.SmBQ = exports.SmBM = exports.BlrQ = exports.BlrM = exports.strokeStyleLineAlignment = exports.strokeStyleLineJoinType = void 0;
2613
3321
  var helpers_1 = require("./helpers");
2614
3322
  var psdReader_1 = require("./psdReader");
2615
3323
  var psdWriter_1 = require("./psdWriter");
@@ -2711,11 +3419,15 @@ var fieldToExtType = {
2711
3419
  Anch: makeType('', 'Pnt '),
2712
3420
  'Fwd ': makeType('', 'Pnt '),
2713
3421
  'Bwd ': makeType('', 'Pnt '),
3422
+ FlrC: makeType('', 'Pnt '),
2714
3423
  meshBoundaryPath: makeType('', 'pathClass'),
2715
3424
  filterFX: makeType('', 'filterFXStyle'),
2716
3425
  Fltr: makeType('', 'rigidTransform'),
2717
3426
  FrgC: makeType('', 'RGBC'),
2718
3427
  BckC: makeType('', 'RGBC'),
3428
+ sdwM: makeType('Parameters', 'adaptCorrectTones'),
3429
+ hglM: makeType('Parameters', 'adaptCorrectTones'),
3430
+ customShape: makeType('', 'customShape'),
2719
3431
  };
2720
3432
  var fieldToArrayExtType = {
2721
3433
  'Crv ': makeType('', 'CrPt'),
@@ -2744,15 +3456,20 @@ var fieldToArrayExtType = {
2744
3456
  pathComponents: makeType('', 'PaCm'),
2745
3457
  filterFXList: makeType('', 'filterFX'),
2746
3458
  puppetShapeList: makeType('', 'puppetShape'),
3459
+ channelDenoise: makeType('', 'channelDenoiseParams'),
3460
+ ShrP: makeType('', 'Pnt '),
2747
3461
  };
2748
3462
  var typeToField = {
2749
3463
  'TEXT': [
2750
3464
  'Txt ', 'printerName', 'Nm ', 'Idnt', 'blackAndWhitePresetFileName', 'LUT3DFileName',
2751
3465
  'presetFileName', 'curvesPresetFileName', 'mixerPresetFileName', 'placed', 'description', 'reason',
2752
3466
  'artboardPresetName', 'json', 'clipID', 'relPath', 'fullPath', 'mediaDescriptor', 'Msge',
2753
- 'altTag', 'url', 'cellText',
3467
+ 'altTag', 'url', 'cellText', 'preset', 'KnNm', 'FPth',
3468
+ ],
3469
+ 'tdta': [
3470
+ 'EngineData', 'LUT3DFileData', 'indexArray', 'originalVertexArray', 'deformedVertexArray',
3471
+ 'LqMe',
2754
3472
  ],
2755
- 'tdta': ['EngineData', 'LUT3DFileData', 'indexArray', 'originalVertexArray', 'deformedVertexArray'],
2756
3473
  'long': [
2757
3474
  'TextIndex', 'RndS', 'Mdpn', 'Smth', 'Lctn', 'strokeStyleVersion', 'LaID', 'Vrsn', 'Cnt ',
2758
3475
  'Brgh', 'Cntr', 'means', 'vibrance', 'Strt', 'bwPresetKind', 'presetKind', 'comp', 'compID', 'originalCompID',
@@ -2763,16 +3480,19 @@ var typeToField = {
2763
3480
  'numBefore', 'numAfter', 'Spcn', 'minOpacity', 'maxOpacity', 'BlnM', 'sheetID', 'gblA', 'globalAltitude',
2764
3481
  'descVersion', 'frameReaderType', 'LyrI', 'zoomOrigin', 'fontSize', 'Rds ', 'sliceID',
2765
3482
  'topOutset', 'leftOutset', 'bottomOutset', 'rightOutset', 'filterID', 'meshQuality',
2766
- 'meshExpansion', 'meshRigidity', 'VrsM', 'VrsN',
3483
+ 'meshExpansion', 'meshRigidity', 'VrsM', 'VrsN', 'NmbG', 'WLMn', 'WLMx', 'AmMn', 'AmMx', 'SclH', 'SclV',
3484
+ 'Lvl ', 'TlNm', 'TlOf', 'FlRs', 'Thsh', 'ShrS', 'ShrE', 'FlRs', 'Vrnc', 'Strg', 'ExtS', 'ExtD',
3485
+ 'HrzS', 'VrtS', 'NmbR', 'EdgF', 'Ang1', 'Ang2', 'Ang3', 'Ang4',
2767
3486
  ],
2768
3487
  'enum': [
2769
- 'textGridding', 'Ornt', 'warpStyle', 'warpRotate', 'Inte', 'Bltn', 'ClrS',
2770
- 'sdwM', 'hglM', 'bvlT', 'bvlS', 'bvlD', 'Md ', 'glwS', 'GrdF', 'GlwT',
3488
+ 'textGridding', 'Ornt', 'warpStyle', 'warpRotate', 'Inte', 'Bltn', 'ClrS', 'BlrQ',
3489
+ 'bvlT', 'bvlS', 'bvlD', 'Md ', 'glwS', 'GrdF', 'GlwT', 'RplS', 'BlrM', 'SmBM',
2771
3490
  'strokeStyleLineCapType', 'strokeStyleLineJoinType', 'strokeStyleLineAlignment',
2772
3491
  'strokeStyleBlendMode', 'PntT', 'Styl', 'lookupType', 'LUTFormat', 'dataOrder',
2773
3492
  'tableOrder', 'enableCompCore', 'enableCompCoreGPU', 'compCoreSupport', 'compCoreGPUSupport', 'Engn',
2774
3493
  'enableCompCoreThreads', 'gs99', 'FrDs', 'trackID', 'animInterpStyle', 'horzAlign',
2775
- 'vertAlign', 'bgColorType', 'shapeOperation',
3494
+ 'vertAlign', 'bgColorType', 'shapeOperation', 'UndA', 'Wvtp', 'Drct', 'WndM', 'Edg ', 'FlCl', 'IntE',
3495
+ 'IntC', 'Cnvr', 'Fl ', 'Dstr', 'MztT', 'Lns ', 'ExtT', 'DspM', 'ExtR', 'ZZTy', 'SphM', 'SmBQ',
2776
3496
  ],
2777
3497
  'bool': [
2778
3498
  'PstS', 'printSixteenBit', 'masterFXSwitch', 'enab', 'uglg', 'antialiasGloss',
@@ -2784,7 +3504,8 @@ var typeToField = {
2784
3504
  'present', 'showInDialog', 'overprint', 'sheetDisclosed', 'lightsDisclosed', 'meshesDisclosed',
2785
3505
  'materialsDisclosed', 'hasMotion', 'muted', 'Effc', 'selected', 'autoScope', 'fillCanvas',
2786
3506
  'cellTextIsHTML', 'Smoo', 'Clsp', 'validAtPosition', 'rigidType', 'hasoptions', 'filterMaskEnable',
2787
- 'filterMaskLinked', 'filterMaskExtendWithWhite',
3507
+ 'filterMaskLinked', 'filterMaskExtendWithWhite', 'removeJPEGArtifact', 'Mnch', 'ExtF', 'ExtM',
3508
+ 'moreAccurate', 'GpuY', 'LIWy',
2788
3509
  ],
2789
3510
  'doub': [
2790
3511
  'warpValue', 'warpPerspective', 'warpPerspectiveOther', 'Intr', 'Wdth', 'Hght',
@@ -2794,10 +3515,10 @@ var typeToField = {
2794
3515
  'PuX0', 'PuX1', 'PuX2', 'PuX3', 'PuY0', 'PuY1', 'PuY2', 'PuY3'
2795
3516
  ],
2796
3517
  'UntF': [
2797
- 'Scl ', 'sdwO', 'hglO', 'lagl', 'Lald', 'srgR', 'blur', 'Sftn', 'Opct', 'Dstn', 'Angl',
3518
+ 'sdwO', 'hglO', 'lagl', 'Lald', 'srgR', 'blur', 'Sftn', 'Opct', 'Dstn', 'Angl',
2798
3519
  'Ckmt', 'Nose', 'Inpr', 'ShdN', 'strokeStyleLineWidth', 'strokeStyleLineDashOffset',
2799
3520
  'strokeStyleOpacity', 'H ', 'Top ', 'Left', 'Btom', 'Rght', 'Rslt',
2800
- 'topRight', 'topLeft', 'bottomLeft', 'bottomRight',
3521
+ 'topRight', 'topLeft', 'bottomLeft', 'bottomRight', 'ClNs', 'Shrp',
2801
3522
  ],
2802
3523
  'VlLs': [
2803
3524
  'Crv ', 'Clrs', 'Mnm ', 'Mxm ', 'Trns', 'pathList', 'strokeStyleLineDashSet', 'FrLs', 'slices',
@@ -2805,10 +3526,12 @@ var typeToField = {
2805
3526
  'solidFillMulti', 'frameFXMulti', 'innerShadowMulti', 'dropShadowMulti', 'FrIn', 'FSts', 'FsFr',
2806
3527
  'sheetTimelineOptions', 'audioClipList', 'trackList', 'globalTrackList', 'keyList', 'audioClipList',
2807
3528
  'warpValues', 'selectedPin', 'Pts ', 'SbpL', 'pathComponents', 'pinOffsets', 'posFinalPins',
2808
- 'pinVertexIndices', 'PinP', 'PnRt', 'PnOv', 'PnDp', 'filterFXList', 'puppetShapeList',
3529
+ 'pinVertexIndices', 'PinP', 'PnRt', 'PnOv', 'PnDp', 'filterFXList', 'puppetShapeList', 'ShrP',
3530
+ 'channelDenoise', 'Mtrx',
2809
3531
  ],
2810
3532
  'ObAr': ['meshPoints', 'quiltSliceX', 'quiltSliceY'],
2811
- 'obj ': ['null'],
3533
+ 'obj ': ['null', 'Chnl'],
3534
+ 'Pth ': ['DspF'],
2812
3535
  };
2813
3536
  var channels = [
2814
3537
  'Rd ', 'Grn ', 'Bl ', 'Yllw', 'Ylw ', 'Cyn ', 'Mgnt', 'Blck', 'Gry ', 'Lmnc', 'A ', 'B ',
@@ -2847,6 +3570,9 @@ var fieldToArrayType = {
2847
3570
  PnDp: 'doub',
2848
3571
  filterFXList: 'Objc',
2849
3572
  puppetShapeList: 'Objc',
3573
+ ShrP: 'Objc',
3574
+ channelDenoise: 'Objc',
3575
+ Mtrx: 'long',
2850
3576
  };
2851
3577
  var fieldToType = {};
2852
3578
  for (var _i = 0, _a = Object.keys(typeToField); _i < _a.length; _i++) {
@@ -2922,11 +3648,12 @@ function writeAsciiStringOrClassId(writer, value) {
2922
3648
  }
2923
3649
  }
2924
3650
  function readDescriptorStructure(reader) {
2925
- var object = {};
2926
- // object.__struct =
3651
+ // const struct =
2927
3652
  readClassStructure(reader);
3653
+ // const object: any = { _name: struct.name, _classID: struct.classID };
3654
+ var object = {};
3655
+ // console.log('>> ', struct);
2928
3656
  var itemsCount = (0, psdReader_1.readUint32)(reader);
2929
- // console.log('//', object.__struct);
2930
3657
  for (var i = 0; i < itemsCount; i++) {
2931
3658
  var key = readAsciiStringOrClassId(reader);
2932
3659
  var type = (0, psdReader_1.readSignature)(reader);
@@ -2945,21 +3672,60 @@ function writeDescriptorStructure(writer, name, classId, value, root) {
2945
3672
  (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, name);
2946
3673
  writeAsciiStringOrClassId(writer, classId);
2947
3674
  var keys = Object.keys(value);
2948
- (0, psdWriter_1.writeUint32)(writer, keys.length);
3675
+ var keyCount = keys.length;
3676
+ if ('_name' in value)
3677
+ keyCount--;
3678
+ if ('_classID' in value)
3679
+ keyCount--;
3680
+ (0, psdWriter_1.writeUint32)(writer, keyCount);
2949
3681
  for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
2950
3682
  var key = keys_1[_i];
3683
+ if (key === '_name' || key === '_classID')
3684
+ continue;
2951
3685
  var type = getTypeByKey(key, value[key], root, value);
2952
3686
  var extType = fieldToExtType[key];
2953
3687
  if (key === 'origin') {
2954
3688
  type = root === 'slices' ? 'enum' : 'Objc';
2955
3689
  }
3690
+ else if ((key === 'Cyn ' || key === 'Mgnt' || key === 'Ylw ' || key === 'Blck') && value._classID === 'CMYC') {
3691
+ type = 'doub';
3692
+ }
3693
+ else if (/^PN[a-z][a-z]$/.test(key)) {
3694
+ type = 'TEXT';
3695
+ }
3696
+ else if (/^PT[a-z][a-z]$/.test(key)) {
3697
+ type = 'long';
3698
+ }
3699
+ else if (/^PF[a-z][a-z]$/.test(key)) {
3700
+ type = 'doub';
3701
+ }
3702
+ else if (key === 'ClSz' || key === 'Rds ' || key === 'Amnt') {
3703
+ type = typeof value[key] === 'number' ? 'long' : 'UntF';
3704
+ }
3705
+ else if ((key === 'sdwM' || key === 'hglM') && typeof value[key] === 'string') {
3706
+ type = 'enum';
3707
+ }
3708
+ else if (key === 'blur' && typeof value[key] === 'string') {
3709
+ type = 'enum';
3710
+ }
3711
+ else if (key === 'Angl' && typeof value[key] === 'number') {
3712
+ type = 'doub'; // ???
3713
+ }
2956
3714
  else if (key === 'bounds' && root === 'slices') {
2957
3715
  type = 'Objc';
2958
3716
  extType = makeType('', 'Rct1');
2959
3717
  }
2960
- else if (key === 'Scl ' && 'Hrzn' in value[key]) {
2961
- type = 'Objc';
2962
- extType = nullType;
3718
+ else if (key === 'Scl ') {
3719
+ if (typeof value[key] === 'object' && 'Hrzn' in value[key]) {
3720
+ type = 'Objc';
3721
+ extType = nullType;
3722
+ }
3723
+ else if (typeof value[key] === 'number') {
3724
+ type = 'long';
3725
+ }
3726
+ else {
3727
+ type = 'UntF';
3728
+ }
2963
3729
  }
2964
3730
  else if (key === 'audioClipGroupList' && keys.length === 1) {
2965
3731
  type = 'VlLs';
@@ -2967,7 +3733,13 @@ function writeDescriptorStructure(writer, name, classId, value, root) {
2967
3733
  else if ((key === 'Strt' || key === 'Brgh') && 'H ' in value) {
2968
3734
  type = 'doub';
2969
3735
  }
2970
- else if (key === 'Strt') {
3736
+ else if (key === 'Wdth' && typeof value[key] === 'object') {
3737
+ type = 'UntF';
3738
+ }
3739
+ else if (key === 'Ofst' && typeof value[key] === 'number') {
3740
+ type = 'long';
3741
+ }
3742
+ else if (key === 'Strt' && typeof value[key] === 'object') {
2971
3743
  type = 'Objc';
2972
3744
  extType = nullType;
2973
3745
  }
@@ -3087,11 +3859,11 @@ function readOSType(reader, type) {
3087
3859
  return items;
3088
3860
  }
3089
3861
  case 'Pth ': { // File path
3090
- /*const length =*/ (0, psdReader_1.readInt32)(reader);
3862
+ /*const length =*/ (0, psdReader_1.readInt32)(reader); // total size of all fields below
3091
3863
  var sig = (0, psdReader_1.readSignature)(reader);
3092
- /*const pathSize =*/ (0, psdReader_1.readInt32LE)(reader);
3864
+ /*const pathSize =*/ (0, psdReader_1.readInt32LE)(reader); // the same as length
3093
3865
  var charsCount = (0, psdReader_1.readInt32LE)(reader);
3094
- var path = (0, psdReader_1.readUnicodeStringWithLength)(reader, charsCount);
3866
+ var path = (0, psdReader_1.readUnicodeStringWithLengthLE)(reader, charsCount);
3095
3867
  return { sig: sig, path: path };
3096
3868
  }
3097
3869
  default:
@@ -3109,12 +3881,19 @@ function writeOSType(writer, type, value, key, extType, root) {
3109
3881
  writeReferenceStructure(writer, key, value);
3110
3882
  break;
3111
3883
  case 'Objc': // Descriptor
3112
- case 'GlbO': // GlobalObject same as Descriptor
3884
+ case 'GlbO': { // GlobalObject same as Descriptor
3885
+ if (typeof value !== 'object')
3886
+ throw new Error("Invalid struct value: ".concat(JSON.stringify(value), ", key: ").concat(key));
3113
3887
  if (!extType)
3114
3888
  throw new Error("Missing ext type for: '".concat(key, "' (").concat(JSON.stringify(value), ")"));
3115
- writeDescriptorStructure(writer, extType.name, extType.classID, value, root);
3889
+ var name_1 = value._name || extType.name;
3890
+ var classID = value._classID || extType.classID;
3891
+ writeDescriptorStructure(writer, name_1, classID, value, root);
3116
3892
  break;
3893
+ }
3117
3894
  case 'VlLs': // List
3895
+ if (!Array.isArray(value))
3896
+ throw new Error("Invalid list value: ".concat(JSON.stringify(value), ", key: ").concat(key));
3118
3897
  (0, psdWriter_1.writeInt32)(writer, value.length);
3119
3898
  for (var i = 0; i < value.length; i++) {
3120
3899
  var type_3 = fieldToArrayType[key];
@@ -3125,6 +3904,8 @@ function writeOSType(writer, type, value, key, extType, root) {
3125
3904
  }
3126
3905
  break;
3127
3906
  case 'doub': // Double
3907
+ if (typeof value !== 'number')
3908
+ throw new Error("Invalid number value: ".concat(JSON.stringify(value), ", key: ").concat(key));
3128
3909
  (0, psdWriter_1.writeFloat64)(writer, value);
3129
3910
  break;
3130
3911
  case 'UntF': // Unit double
@@ -3143,17 +3924,23 @@ function writeOSType(writer, type, value, key, extType, root) {
3143
3924
  (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, value);
3144
3925
  break;
3145
3926
  case 'enum': { // Enumerated
3927
+ if (typeof value !== 'string')
3928
+ throw new Error("Invalid enum value: ".concat(JSON.stringify(value), ", key: ").concat(key));
3146
3929
  var _a = value.split('.'), _type = _a[0], val = _a[1];
3147
3930
  writeAsciiStringOrClassId(writer, _type);
3148
3931
  writeAsciiStringOrClassId(writer, val);
3149
3932
  break;
3150
3933
  }
3151
3934
  case 'long': // Integer
3935
+ if (typeof value !== 'number')
3936
+ throw new Error("Invalid integer value: ".concat(JSON.stringify(value), ", key: ").concat(key));
3152
3937
  (0, psdWriter_1.writeInt32)(writer, value);
3153
3938
  break;
3154
3939
  // case 'comp': // Large Integer
3155
3940
  // writeLargeInteger(reader);
3156
3941
  case 'bool': // Boolean
3942
+ if (typeof value !== 'boolean')
3943
+ throw new Error("Invalid boolean value: ".concat(JSON.stringify(value), ", key: ").concat(key));
3157
3944
  (0, psdWriter_1.writeUint8)(writer, value ? 1 : 0);
3158
3945
  break;
3159
3946
  // case 'type': // Class
@@ -3184,8 +3971,15 @@ function writeOSType(writer, type, value, key, extType, root) {
3184
3971
  }
3185
3972
  break;
3186
3973
  }
3187
- // case 'Pth ': // File path
3188
- // writeFilePath(reader);
3974
+ case 'Pth ': { // File path
3975
+ var length_5 = 4 + 4 + 4 + value.path.length * 2;
3976
+ (0, psdWriter_1.writeInt32)(writer, length_5);
3977
+ (0, psdWriter_1.writeSignature)(writer, value.sig);
3978
+ (0, psdWriter_1.writeInt32LE)(writer, length_5);
3979
+ (0, psdWriter_1.writeInt32LE)(writer, value.path.length);
3980
+ (0, psdWriter_1.writeUnicodeStringWithoutLengthLE)(writer, value.path);
3981
+ break;
3982
+ }
3189
3983
  default:
3190
3984
  throw new Error("Not implemented descriptor OSType: ".concat(type));
3191
3985
  }
@@ -3276,7 +4070,6 @@ function writeReferenceStructure(writer, _key, items) {
3276
4070
  function readClassStructure(reader) {
3277
4071
  var name = (0, psdReader_1.readUnicodeString)(reader);
3278
4072
  var classID = readAsciiStringOrClassId(reader);
3279
- // console.log({ name, classID });
3280
4073
  return { name: name, classID: classID };
3281
4074
  }
3282
4075
  function writeClassStructure(writer, name, classID) {
@@ -3456,7 +4249,8 @@ function parseKeyList(keyList, logMissingFeatures) {
3456
4249
  var keys = [];
3457
4250
  for (var j = 0; j < keyList.length; j++) {
3458
4251
  var key = keyList[j];
3459
- var time = key.time, selected = key.selected, animKey = key.animKey;
4252
+ var _a = key.time, denominator = _a.denominator, numerator = _a.numerator, selected = key.selected, animKey = key.animKey;
4253
+ var time = { numerator: numerator, denominator: denominator };
3460
4254
  var interpolation = exports.animInterpStyleEnum.decode(key.animInterpStyle);
3461
4255
  switch (animKey.Type) {
3462
4256
  case 'keyType.Opct':
@@ -3705,6 +4499,9 @@ function parseEffectObject(obj, reportErrors) {
3705
4499
  case 'antialiasGloss':
3706
4500
  result[key] = val;
3707
4501
  break;
4502
+ case '_name':
4503
+ case '_classID':
4504
+ break;
3708
4505
  default:
3709
4506
  reportErrors && console.log("Invalid effect key: '".concat(key, "', value:"), val);
3710
4507
  }
@@ -4057,25 +4854,25 @@ function parseColor(color) {
4057
4854
  exports.parseColor = parseColor;
4058
4855
  function serializeColor(color) {
4059
4856
  if (!color) {
4060
- return { 'Rd ': 0, 'Grn ': 0, 'Bl ': 0 };
4857
+ return { _name: '', _classID: 'RGBC', 'Rd ': 0, 'Grn ': 0, 'Bl ': 0 };
4061
4858
  }
4062
4859
  else if ('r' in color) {
4063
- return { 'Rd ': color.r || 0, 'Grn ': color.g || 0, 'Bl ': color.b || 0 };
4860
+ return { _name: '', _classID: 'RGBC', 'Rd ': color.r || 0, 'Grn ': color.g || 0, 'Bl ': color.b || 0 };
4064
4861
  }
4065
4862
  else if ('fr' in color) {
4066
- return { redFloat: color.fr, greenFloat: color.fg, blueFloat: color.fb };
4863
+ return { _name: '', _classID: 'XXXX', redFloat: color.fr, greenFloat: color.fg, blueFloat: color.fb };
4067
4864
  }
4068
4865
  else if ('h' in color) {
4069
- return { 'H ': unitsAngle(color.h * 360), Strt: color.s || 0, Brgh: color.b || 0 };
4866
+ return { _name: '', _classID: 'HSBC', 'H ': unitsAngle(color.h * 360), Strt: color.s || 0, Brgh: color.b || 0 };
4070
4867
  }
4071
4868
  else if ('c' in color) {
4072
- return { 'Cyn ': color.c || 0, Mgnt: color.m || 0, 'Ylw ': color.y || 0, Blck: color.k || 0 };
4869
+ return { _name: '', _classID: 'CMYC', 'Cyn ': color.c || 0, Mgnt: color.m || 0, 'Ylw ': color.y || 0, Blck: color.k || 0 };
4073
4870
  }
4074
4871
  else if ('l' in color) {
4075
- return { Lmnc: color.l || 0, 'A ': color.a || 0, 'B ': color.b || 0 };
4872
+ return { _name: '', _classID: 'LABC', Lmnc: color.l || 0, 'A ': color.a || 0, 'B ': color.b || 0 };
4076
4873
  }
4077
4874
  else if ('k' in color) {
4078
- return { 'Gry ': color.k };
4875
+ return { _name: '', _classID: 'GRYC', 'Gry ': color.k };
4079
4876
  }
4080
4877
  else {
4081
4878
  throw new Error('Invalid color value');
@@ -4139,6 +4936,10 @@ function unitsPercent(value) {
4139
4936
  return { units: 'Percent', value: Math.round((value || 0) * 100) };
4140
4937
  }
4141
4938
  exports.unitsPercent = unitsPercent;
4939
+ function unitsPercentF(value) {
4940
+ return { units: 'Percent', value: (value || 0) * 100 };
4941
+ }
4942
+ exports.unitsPercentF = unitsPercentF;
4142
4943
  function unitsValue(x, key) {
4143
4944
  if (x == null)
4144
4945
  return { units: 'Pixels', value: 0 };
@@ -4154,6 +4955,11 @@ function unitsValue(x, key) {
4154
4955
  return { units: units, value: value };
4155
4956
  }
4156
4957
  exports.unitsValue = unitsValue;
4958
+ function frac(_a) {
4959
+ var numerator = _a.numerator, denominator = _a.denominator;
4960
+ return { numerator: numerator, denominator: denominator };
4961
+ }
4962
+ exports.frac = frac;
4157
4963
  exports.textGridding = (0, helpers_1.createEnum)('textGridding', 'none', {
4158
4964
  none: 'None',
4159
4965
  round: 'Rnd ',
@@ -4275,6 +5081,7 @@ exports.ClrS = (0, helpers_1.createEnum)('ClrS', 'rgb', {
4275
5081
  rgb: 'RGBC',
4276
5082
  hsb: 'HSBl',
4277
5083
  lab: 'LbCl',
5084
+ hsl: 'HSLC',
4278
5085
  });
4279
5086
  exports.FStl = (0, helpers_1.createEnum)('FStl', 'outside', {
4280
5087
  outside: 'OutF',
@@ -4321,6 +5128,142 @@ exports.strokeStyleLineAlignment = (0, helpers_1.createEnum)('strokeStyleLineAli
4321
5128
  center: 'strokeStyleAlignCenter',
4322
5129
  outside: 'strokeStyleAlignOutside',
4323
5130
  });
5131
+ exports.BlrM = (0, helpers_1.createEnum)('BlrM', 'ispinmage', {
5132
+ spin: 'Spn ',
5133
+ zoom: 'Zm ',
5134
+ });
5135
+ exports.BlrQ = (0, helpers_1.createEnum)('BlrQ', 'good', {
5136
+ draft: 'Drft',
5137
+ good: 'Gd ',
5138
+ best: 'Bst ',
5139
+ });
5140
+ exports.SmBM = (0, helpers_1.createEnum)('SmBM', 'normal', {
5141
+ normal: 'SBMN',
5142
+ 'edge only': 'SBME',
5143
+ 'overlay edge': 'SBMO',
5144
+ });
5145
+ exports.SmBQ = (0, helpers_1.createEnum)('SmBQ', 'medium', {
5146
+ low: 'SBQL',
5147
+ medium: 'SBQM',
5148
+ high: 'SBQH',
5149
+ });
5150
+ exports.DspM = (0, helpers_1.createEnum)('DspM', 'stretch to fit', {
5151
+ 'stretch to fit': 'StrF',
5152
+ 'tile': 'Tile',
5153
+ });
5154
+ exports.UndA = (0, helpers_1.createEnum)('UndA', 'repeat edge pixels', {
5155
+ 'wrap around': 'WrpA',
5156
+ 'repeat edge pixels': 'RptE',
5157
+ });
5158
+ exports.Cnvr = (0, helpers_1.createEnum)('Cnvr', 'rectangular to polar', {
5159
+ 'rectangular to polar': 'RctP',
5160
+ 'polar to rectangular': 'PlrR',
5161
+ });
5162
+ exports.RplS = (0, helpers_1.createEnum)('RplS', 'medium', {
5163
+ small: 'Sml ',
5164
+ medium: 'Mdm ',
5165
+ large: 'Lrg ',
5166
+ });
5167
+ exports.SphM = (0, helpers_1.createEnum)('SphM', 'normal', {
5168
+ 'normal': 'Nrml',
5169
+ 'horizontal only': 'HrzO',
5170
+ 'vertical only': 'VrtO',
5171
+ });
5172
+ exports.Wvtp = (0, helpers_1.createEnum)('Wvtp', 'sine', {
5173
+ sine: 'WvSn',
5174
+ triangle: 'WvTr',
5175
+ square: 'WvSq',
5176
+ });
5177
+ exports.ZZTy = (0, helpers_1.createEnum)('ZZTy', 'pond ripples', {
5178
+ 'around center': 'ArnC',
5179
+ 'out from center': 'OtFr',
5180
+ 'pond ripples': 'PndR',
5181
+ });
5182
+ exports.Dstr = (0, helpers_1.createEnum)('Dstr', 'uniform', {
5183
+ uniform: 'Unfr',
5184
+ gaussian: 'Gsn ',
5185
+ });
5186
+ exports.Chnl = (0, helpers_1.createEnum)('Chnl', 'composite', {
5187
+ red: 'Rd ',
5188
+ green: 'Grn ',
5189
+ blue: 'Bl ',
5190
+ composite: 'Cmps',
5191
+ });
5192
+ exports.MztT = (0, helpers_1.createEnum)('MztT', 'fine dots', {
5193
+ 'fine dots': 'FnDt',
5194
+ 'medium dots': 'MdmD',
5195
+ 'grainy dots': 'GrnD',
5196
+ 'coarse dots': 'CrsD',
5197
+ 'short lines': 'ShrL',
5198
+ 'medium lines': 'MdmL',
5199
+ 'long lines': 'LngL',
5200
+ 'short strokes': 'ShSt',
5201
+ 'medium strokes': 'MdmS',
5202
+ 'long strokes': 'LngS',
5203
+ });
5204
+ exports.Lns = (0, helpers_1.createEnum)('Lns ', '50-300mm zoom', {
5205
+ '50-300mm zoom': 'Zm ',
5206
+ '32mm prime': 'Nkn ',
5207
+ '105mm prime': 'Nkn1',
5208
+ 'movie prime': 'PnVs',
5209
+ });
5210
+ exports.blurType = (0, helpers_1.createEnum)('blurType', 'gaussian blur', {
5211
+ 'gaussian blur': 'GsnB',
5212
+ 'lens blur': 'lensBlur',
5213
+ 'motion blur': 'MtnB',
5214
+ });
5215
+ exports.DfsM = (0, helpers_1.createEnum)('DfsM', 'normal', {
5216
+ 'normal': 'Nrml',
5217
+ 'darken only': 'DrkO',
5218
+ 'lighten only': 'LghO',
5219
+ 'anisotropic': 'anisotropic',
5220
+ });
5221
+ exports.ExtT = (0, helpers_1.createEnum)('ExtT', 'blocks', {
5222
+ blocks: 'Blks',
5223
+ pyramids: 'Pyrm',
5224
+ });
5225
+ exports.ExtR = (0, helpers_1.createEnum)('ExtR', 'random', {
5226
+ random: 'Rndm',
5227
+ 'level-based': 'LvlB',
5228
+ });
5229
+ exports.FlCl = (0, helpers_1.createEnum)('FlCl', 'background color', {
5230
+ 'background color': 'FlBc',
5231
+ 'foreground color': 'FlFr',
5232
+ 'inverse image': 'FlIn',
5233
+ 'unaltered image': 'FlSm',
5234
+ });
5235
+ exports.CntE = (0, helpers_1.createEnum)('CntE', 'upper', {
5236
+ lower: 'Lwr ',
5237
+ upper: 'Upr ',
5238
+ });
5239
+ exports.WndM = (0, helpers_1.createEnum)('WndM', 'wind', {
5240
+ wind: 'Wnd ',
5241
+ blast: 'Blst',
5242
+ stagger: 'Stgr',
5243
+ });
5244
+ exports.Drct = (0, helpers_1.createEnum)('Drct', 'from the right', {
5245
+ left: 'Left',
5246
+ right: 'Rght',
5247
+ });
5248
+ exports.IntE = (0, helpers_1.createEnum)('IntE', 'odd lines', {
5249
+ 'odd lines': 'ElmO',
5250
+ 'even lines': 'ElmE',
5251
+ });
5252
+ exports.IntC = (0, helpers_1.createEnum)('IntC', 'interpolation', {
5253
+ duplication: 'CrtD',
5254
+ interpolation: 'CrtI',
5255
+ });
5256
+ exports.FlMd = (0, helpers_1.createEnum)('FlMd', 'wrap around', {
5257
+ 'set to transparent': 'Bckg',
5258
+ 'repeat edge pixels': 'Rpt ',
5259
+ 'wrap around': 'Wrp ',
5260
+ });
5261
+ exports.prjM = (0, helpers_1.createEnum)('prjM', 'fisheye', {
5262
+ 'fisheye': 'fisP',
5263
+ 'perspective': 'perP',
5264
+ 'auto': 'auto',
5265
+ 'full spherical': 'fusP',
5266
+ });
4324
5267
 
4325
5268
  },{"./helpers":7,"./psdReader":11,"./psdWriter":12}],5:[function(require,module,exports){
4326
5269
  "use strict";
@@ -5716,15 +6659,14 @@ function (// Timeline Information
5716
6659
  target) { return target.timelineInformation !== undefined; }, function (reader, target, _, options) {
5717
6660
  var _a, _b;
5718
6661
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
5719
- // console.log('1075', require('util').inspect(desc, false, 99, true));
5720
6662
  target.timelineInformation = {
5721
6663
  enabled: desc.enab,
5722
- frameStep: desc.frameStep,
6664
+ frameStep: (0, descriptor_1.frac)(desc.frameStep),
5723
6665
  frameRate: desc.frameRate,
5724
- time: desc.time,
5725
- duration: desc.duration,
5726
- workInTime: desc.workInTime,
5727
- workOutTime: desc.workOutTime,
6666
+ time: (0, descriptor_1.frac)(desc.time),
6667
+ duration: (0, descriptor_1.frac)(desc.duration),
6668
+ workInTime: (0, descriptor_1.frac)(desc.workInTime),
6669
+ workOutTime: (0, descriptor_1.frac)(desc.workOutTime),
5728
6670
  repeats: desc.LCnt,
5729
6671
  hasMotion: desc.hasMotion,
5730
6672
  globalTracks: (0, descriptor_1.parseTrackList)(desc.globalTrackList, !!options.logMissingFeatures),
@@ -5737,10 +6679,10 @@ target) { return target.timelineInformation !== undefined; }, function (reader,
5737
6679
  var clipID = _a.clipID, timeScope = _a.timeScope, muted = _a.muted, audioLevel = _a.audioLevel, frameReader = _a.frameReader;
5738
6680
  return ({
5739
6681
  id: clipID,
5740
- start: timeScope.Strt,
5741
- duration: timeScope.duration,
5742
- inTime: timeScope.inTime,
5743
- outTime: timeScope.outTime,
6682
+ start: (0, descriptor_1.frac)(timeScope.Strt),
6683
+ duration: (0, descriptor_1.frac)(timeScope.duration),
6684
+ inTime: (0, descriptor_1.frac)(timeScope.inTime),
6685
+ outTime: (0, descriptor_1.frac)(timeScope.outTime),
5744
6686
  muted: muted,
5745
6687
  audioLevel: audioLevel,
5746
6688
  frameReader: {
@@ -5801,14 +6743,12 @@ target) { return target.timelineInformation !== undefined; }, function (reader,
5801
6743
  },
5802
6744
  hasMotion: timeline.hasMotion,
5803
6745
  };
5804
- // console.log('WRITE:1075', require('util').inspect(desc, false, 99, true));
5805
6746
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc, 'anim');
5806
6747
  });
5807
6748
  addHandler(1076, // Sheet Disclosure
5808
6749
  function (// Sheet Disclosure
5809
6750
  target) { return target.sheetDisclosure !== undefined; }, function (reader, target) {
5810
6751
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
5811
- // console.log('1076', require('util').inspect(desc, false, 99, true));
5812
6752
  target.sheetDisclosure = {};
5813
6753
  if (desc.sheetTimelineOptions) {
5814
6754
  target.sheetDisclosure.sheetTimelineOptions = desc.sheetTimelineOptions.map(function (o) { return ({
@@ -5926,7 +6866,6 @@ target) { return target.slices ? target.slices.length : 0; }, function (reader,
5926
6866
  backgroundColorType: backgroundColorType,
5927
6867
  backgroundColor: { r: r, g: g, b: b, a: a },
5928
6868
  });
5929
- // console.log(require('util').inspect(slices[slices.length - 1], false, 99, true));
5930
6869
  }
5931
6870
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
5932
6871
  desc.slices.forEach(function (d) {
@@ -5938,12 +6877,9 @@ target) { return target.slices ? target.slices.length : 0; }, function (reader,
5938
6877
  slice.rightOutset = d.rightOutset;
5939
6878
  }
5940
6879
  });
5941
- // console.log(require('util').inspect(desc, false, 99, true));
5942
- // console.log(require('util').inspect(target.slices, false, 99, true));
5943
6880
  }
5944
6881
  else if (version == 7 || version == 8) {
5945
6882
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
5946
- // console.log(require('util').inspect(desc, false, 99, true));
5947
6883
  if (!target.slices)
5948
6884
  target.slices = [];
5949
6885
  target.slices.push({
@@ -6158,7 +7094,6 @@ addHandler(7001, function (target) { return target.imageReadyDataSets !== undefi
6158
7094
  });
6159
7095
  addHandler(1088, function (target) { return target.pathSelectionState !== undefined; }, function (reader, target, _left) {
6160
7096
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
6161
- // console.log(require('util').inspect(desc, false, 99, true));
6162
7097
  target.pathSelectionState = desc['null'];
6163
7098
  }, function (writer, target) {
6164
7099
  var desc = { 'null': target.pathSelectionState };
@@ -6404,7 +7339,7 @@ var __assign = (this && this.__assign) || function () {
6404
7339
  return __assign.apply(this, arguments);
6405
7340
  };
6406
7341
  Object.defineProperty(exports, "__esModule", { value: true });
6407
- exports.readPattern = exports.readColor = exports.readSection = exports.readDataRLE = exports.readDataZipWithoutPrediction = exports.readPsd = exports.checkSignature = exports.skipBytes = exports.readAsciiString = exports.readUnicodeStringWithLength = exports.readUnicodeString = exports.readPascalString = exports.readSignature = exports.readBytes = exports.readFixedPointPath32 = exports.readFixedPoint32 = exports.readFloat64 = exports.readFloat32 = exports.readUint32 = exports.readInt32LE = exports.readInt32 = exports.readUint16 = exports.readInt16 = exports.peekUint8 = exports.readUint8 = exports.warnOrThrow = exports.createReader = exports.supportedColorModes = void 0;
7342
+ exports.readPattern = exports.readColor = exports.readSection = exports.readDataRLE = exports.readDataZipWithoutPrediction = exports.readPsd = exports.checkSignature = exports.skipBytes = exports.readAsciiString = exports.readUnicodeStringWithLengthLE = exports.readUnicodeStringWithLength = exports.readUnicodeString = exports.readPascalString = exports.readSignature = exports.readBytes = exports.readFixedPointPath32 = exports.readFixedPoint32 = exports.readFloat64 = exports.readFloat32 = exports.readUint32 = exports.readInt32LE = exports.readInt32 = exports.readUint16LE = exports.readUint16 = exports.readInt16 = exports.peekUint8 = exports.readUint8 = exports.warnOrThrow = exports.createReader = exports.supportedColorModes = void 0;
6408
7343
  var pako_1 = require("pako");
6409
7344
  var helpers_1 = require("./helpers");
6410
7345
  var additionalInfo_1 = require("./additionalInfo");
@@ -6449,6 +7384,11 @@ function readUint16(reader) {
6449
7384
  return reader.view.getUint16(reader.offset - 2, false);
6450
7385
  }
6451
7386
  exports.readUint16 = readUint16;
7387
+ function readUint16LE(reader) {
7388
+ reader.offset += 2;
7389
+ return reader.view.getUint16(reader.offset - 2, true);
7390
+ }
7391
+ exports.readUint16LE = readUint16LE;
6452
7392
  function readInt32(reader) {
6453
7393
  reader.offset += 4;
6454
7394
  return reader.view.getInt32(reader.offset - 4, false);
@@ -6532,6 +7472,17 @@ function readUnicodeStringWithLength(reader, length) {
6532
7472
  return text;
6533
7473
  }
6534
7474
  exports.readUnicodeStringWithLength = readUnicodeStringWithLength;
7475
+ function readUnicodeStringWithLengthLE(reader, length) {
7476
+ var text = '';
7477
+ while (length--) {
7478
+ var value = readUint16LE(reader);
7479
+ if (value || length > 0) { // remove trailing \0
7480
+ text += String.fromCharCode(value);
7481
+ }
7482
+ }
7483
+ return text;
7484
+ }
7485
+ exports.readUnicodeStringWithLengthLE = readUnicodeStringWithLengthLE;
6535
7486
  function readAsciiString(reader, length) {
6536
7487
  var text = '';
6537
7488
  while (length--) {
@@ -6739,14 +7690,14 @@ function readLayerRecord(reader, psd, options) {
6739
7690
  var channelCount = readUint16(reader);
6740
7691
  var channels = [];
6741
7692
  for (var i = 0; i < channelCount; i++) {
6742
- var channelID = readInt16(reader);
6743
- var channelLength = readUint32(reader);
7693
+ var id = readInt16(reader);
7694
+ var length_1 = readUint32(reader);
6744
7695
  if (options.large) {
6745
- if (channelLength !== 0)
7696
+ if (length_1 !== 0)
6746
7697
  throw new Error('Sizes larger than 4GB are not supported');
6747
- channelLength = readUint32(reader);
7698
+ length_1 = readUint32(reader);
6748
7699
  }
6749
- channels.push({ id: channelID, length: channelLength });
7700
+ channels.push({ id: id, length: length_1 });
6750
7701
  }
6751
7702
  checkSignature(reader, '8BIM');
6752
7703
  var blendMode = readSignature(reader);
@@ -6758,11 +7709,12 @@ function readLayerRecord(reader, psd, options) {
6758
7709
  var flags = readUint8(reader);
6759
7710
  layer.transparencyProtected = (flags & 0x01) !== 0;
6760
7711
  layer.hidden = (flags & 0x02) !== 0;
7712
+ if (flags & 0x20)
7713
+ layer.effectsOpen = true;
6761
7714
  // 0x04 - obsolete
6762
7715
  // 0x08 - 1 for Photoshop 5.0 and later, tells if bit 4 has useful information
6763
7716
  // 0x10 - pixel data irrelevant to appearance of document
6764
- // 0x20 - ???
6765
- // if (flags & 0x20) (layer as any)._2 = true; // TEMP !!!!
7717
+ // 0x20 - effects/filters panel is expanded
6766
7718
  skipBytes(reader, 1);
6767
7719
  readSection(reader, 1, function (left) {
6768
7720
  var mask = readLayerMaskData(reader, options);
@@ -7166,9 +8118,9 @@ function readDataRLE(reader, pixelData, _width, height, step, offsets, large) {
7166
8118
  }
7167
8119
  else {
7168
8120
  for (var y = 0, p = offset | 0; y < height; y++, li++) {
7169
- var length_1 = lengths[li];
7170
- var buffer = readBytes(reader, length_1);
7171
- for (var i = 0; i < length_1; i++) {
8121
+ var length_2 = lengths[li];
8122
+ var buffer = readBytes(reader, length_2);
8123
+ for (var i = 0; i < length_2; i++) {
7172
8124
  var header = buffer[i];
7173
8125
  if (header > 128) {
7174
8126
  var value = buffer[++i];
@@ -7312,7 +8264,7 @@ function readPattern(reader) {
7312
8264
  var has = readUint32(reader);
7313
8265
  if (!has)
7314
8266
  continue;
7315
- var length_2 = readUint32(reader);
8267
+ var length_3 = readUint32(reader);
7316
8268
  var pixelDepth = readUint32(reader);
7317
8269
  var ctop = readUint32(reader);
7318
8270
  var cleft = readUint32(reader);
@@ -7320,7 +8272,7 @@ function readPattern(reader) {
7320
8272
  var cright = readUint32(reader);
7321
8273
  var pixelDepth2 = readUint16(reader);
7322
8274
  var compressionMode = readUint8(reader); // 0 - raw, 1 - zip
7323
- var dataLength = length_2 - (4 + 16 + 2 + 1);
8275
+ var dataLength = length_3 - (4 + 16 + 2 + 1);
7324
8276
  var cdata = readBytes(reader, dataLength);
7325
8277
  if (pixelDepth !== 8 || pixelDepth2 !== 8) {
7326
8278
  throw new Error('16bit pixel depth not supported for patterns');
@@ -7391,7 +8343,7 @@ var __assign = (this && this.__assign) || function () {
7391
8343
  return __assign.apply(this, arguments);
7392
8344
  };
7393
8345
  Object.defineProperty(exports, "__esModule", { value: true });
7394
- exports.writeColor = exports.writePsd = exports.writeSection = exports.writeUnicodeStringWithPadding = exports.writeUnicodeString = exports.writePascalString = exports.writeSignature = exports.writeZeros = exports.writeBytes = exports.writeFixedPointPath32 = exports.writeFixedPoint32 = exports.writeFloat64 = exports.writeFloat32 = exports.writeUint32 = exports.writeInt32 = exports.writeUint16 = exports.writeInt16 = exports.writeUint8 = exports.getWriterBufferNoCopy = exports.getWriterBuffer = exports.createWriter = void 0;
8346
+ exports.writeColor = exports.writePsd = exports.writeSection = exports.writeUnicodeStringWithPadding = exports.writeUnicodeString = exports.writeUnicodeStringWithoutLengthLE = exports.writeUnicodeStringWithoutLength = exports.writePascalString = exports.writeSignature = exports.writeZeros = exports.writeBytes = exports.writeFixedPointPath32 = exports.writeFixedPoint32 = exports.writeFloat64 = exports.writeFloat32 = exports.writeUint32 = exports.writeInt32LE = exports.writeInt32 = exports.writeUint16LE = exports.writeUint16 = exports.writeInt16 = exports.writeUint8 = exports.getWriterBufferNoCopy = exports.getWriterBuffer = exports.createWriter = void 0;
7395
8347
  var helpers_1 = require("./helpers");
7396
8348
  var additionalInfo_1 = require("./additionalInfo");
7397
8349
  var imageResources_1 = require("./imageResources");
@@ -7426,11 +8378,21 @@ function writeUint16(writer, value) {
7426
8378
  writer.view.setUint16(offset, value, false);
7427
8379
  }
7428
8380
  exports.writeUint16 = writeUint16;
8381
+ function writeUint16LE(writer, value) {
8382
+ var offset = addSize(writer, 2);
8383
+ writer.view.setUint16(offset, value, true);
8384
+ }
8385
+ exports.writeUint16LE = writeUint16LE;
7429
8386
  function writeInt32(writer, value) {
7430
8387
  var offset = addSize(writer, 4);
7431
8388
  writer.view.setInt32(offset, value, false);
7432
8389
  }
7433
8390
  exports.writeInt32 = writeInt32;
8391
+ function writeInt32LE(writer, value) {
8392
+ var offset = addSize(writer, 4);
8393
+ writer.view.setInt32(offset, value, true);
8394
+ }
8395
+ exports.writeInt32LE = writeInt32LE;
7434
8396
  function writeUint32(writer, value) {
7435
8397
  var offset = addSize(writer, 4);
7436
8398
  writer.view.setUint32(offset, value, false);
@@ -7491,12 +8453,22 @@ function writePascalString(writer, text, padTo) {
7491
8453
  }
7492
8454
  }
7493
8455
  exports.writePascalString = writePascalString;
7494
- function writeUnicodeString(writer, text) {
7495
- writeUint32(writer, text.length);
8456
+ function writeUnicodeStringWithoutLength(writer, text) {
7496
8457
  for (var i = 0; i < text.length; i++) {
7497
8458
  writeUint16(writer, text.charCodeAt(i));
7498
8459
  }
7499
8460
  }
8461
+ exports.writeUnicodeStringWithoutLength = writeUnicodeStringWithoutLength;
8462
+ function writeUnicodeStringWithoutLengthLE(writer, text) {
8463
+ for (var i = 0; i < text.length; i++) {
8464
+ writeUint16LE(writer, text.charCodeAt(i));
8465
+ }
8466
+ }
8467
+ exports.writeUnicodeStringWithoutLengthLE = writeUnicodeStringWithoutLengthLE;
8468
+ function writeUnicodeString(writer, text) {
8469
+ writeUint32(writer, text.length);
8470
+ writeUnicodeStringWithoutLength(writer, text);
8471
+ }
7500
8472
  exports.writeUnicodeString = writeUnicodeString;
7501
8473
  function writeUnicodeStringWithPadding(writer, text) {
7502
8474
  writeUint32(writer, text.length + 1);
@@ -7667,10 +8639,8 @@ function writeLayerInfo(tempBuffer, writer, psd, globalAlpha, options) {
7667
8639
  if (layer.vectorMask || (layer.sectionDivider && layer.sectionDivider.type !== 0 /* SectionDividerType.Other */)) {
7668
8640
  flags |= 0x10; // pixel data irrelevant to appearance of document
7669
8641
  }
7670
- if (layer.effects && (0, additionalInfo_1.hasMultiEffects)(layer.effects)) { // TODO: this is not correct
7671
- flags |= 0x20; // just guessing this one, might be completely incorrect
7672
- }
7673
- // if ('_2' in layer) flags |= 0x20; // TEMP!!!
8642
+ if (layer.effectsOpen)
8643
+ flags |= 0x20;
7674
8644
  writeUint8(writer, flags);
7675
8645
  writeUint8(writer, 0); // filler
7676
8646
  writeSection(writer, 1, function () {
@@ -8200,23 +9170,34 @@ var styleKeys = [
8200
9170
  var antialias = ['none', 'crisp', 'strong', 'smooth', 'sharp'];
8201
9171
  var justification = ['left', 'right', 'center'];
8202
9172
  function upperFirst(value) {
8203
- return value.substr(0, 1).toUpperCase() + value.substr(1);
9173
+ return value.substring(0, 1).toUpperCase() + value.substring(1);
8204
9174
  }
8205
9175
  function decodeColor(color) {
8206
9176
  var c = color.Values;
8207
- if (color.Type === 0) { // grayscale
8208
- return { r: c[1] * 255, g: c[1] * 255, b: c[1] * 255 }; // , c[0] * 255];
8209
- }
8210
- else { // rgb
8211
- return { r: c[1] * 255, g: c[2] * 255, b: c[3] * 255, a: c[0] }; // , c[0] * 255];
9177
+ switch (color.Type) {
9178
+ case 0: return { k: c[1] * 255 }; // grayscale (alpha?)
9179
+ case 1: return c[0] === 1 ?
9180
+ { r: c[1] * 255, g: c[2] * 255, b: c[3] * 255 } : // rgb
9181
+ { r: c[1] * 255, g: c[2] * 255, b: c[3] * 255, a: c[0] * 255 }; // rgba
9182
+ case 2: return { c: c[1] * 255, m: c[2] * 255, y: c[3] * 255, k: c[4] * 255 }; // cmyk (alpha?)
9183
+ default: throw new Error('Unknown color type in text layer');
8212
9184
  }
8213
9185
  }
8214
9186
  function encodeColor(color) {
8215
- if (color && 'r' in color) {
8216
- return ['a' in color ? color.a : 1, color.r / 255, color.g / 255, color.b / 255];
9187
+ if (!color) {
9188
+ return { Type: 1, Values: [0, 0, 0, 0] };
9189
+ }
9190
+ else if ('r' in color) {
9191
+ return { Type: 1, Values: ['a' in color ? color.a / 255 : 1, color.r / 255, color.g / 255, color.b / 255] };
9192
+ }
9193
+ else if ('c' in color) {
9194
+ return { Type: 2, Values: [1, color.c / 255, color.m / 255, color.y / 255, color.k / 255] };
9195
+ }
9196
+ else if ('k' in color) {
9197
+ return { Type: 0, Values: [1, color.k / 255] };
8217
9198
  }
8218
9199
  else {
8219
- return [0, 0, 0, 0];
9200
+ throw new Error('Invalid color type in text layer');
8220
9201
  }
8221
9202
  }
8222
9203
  function arraysEqual(a, b) {
@@ -8289,7 +9270,7 @@ function encodeObject(obj, keys, fonts) {
8289
9270
  result[Key] = findOrAddFont(fonts, obj[key]);
8290
9271
  }
8291
9272
  else if (key === 'fillColor' || key === 'strokeColor') {
8292
- result[Key] = { Type: 1, Values: encodeColor(obj[key]) };
9273
+ result[Key] = encodeColor(obj[key]);
8293
9274
  }
8294
9275
  else {
8295
9276
  result[Key] = obj[key];
@@ -8625,8 +9606,8 @@ function encodeEngineData(data) {
8625
9606
  ShowGrid: !!gridInfo.show,
8626
9607
  GridSize: (_j = gridInfo.size) !== null && _j !== void 0 ? _j : 18,
8627
9608
  GridLeading: (_k = gridInfo.leading) !== null && _k !== void 0 ? _k : 22,
8628
- GridColor: { Type: 1, Values: encodeColor(gridInfo.color) },
8629
- GridLeadingFillColor: { Type: 1, Values: encodeColor(gridInfo.color) },
9609
+ GridColor: encodeColor(gridInfo.color),
9610
+ GridLeadingFillColor: encodeColor(gridInfo.color),
8630
9611
  AlignLineHeightToGridFlags: !!gridInfo.alignLineHeightToGridFlags,
8631
9612
  },
8632
9613
  AntiAlias: antialias.indexOf((_l = data.antiAlias) !== null && _l !== void 0 ? _l : 'sharp'),