ag-psd 16.0.0 → 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.
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; }) },
@@ -1170,58 +1175,345 @@ 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 parseFilterFXFilter(Fltr) {
1178
- if ('puppetShapeList' in Fltr) {
1179
- return {
1180
- rigidType: Fltr.rigidType,
1181
- bounds: [
1182
- { x: Fltr.PuX0, y: Fltr.PuY0, },
1183
- { x: Fltr.PuX1, y: Fltr.PuY1, },
1184
- { x: Fltr.PuX2, y: Fltr.PuY2, },
1185
- { x: Fltr.PuX3, y: Fltr.PuY3, },
1186
- ],
1187
- puppetShapeList: Fltr.puppetShapeList.map(function (p) { return ({
1188
- rigidType: p.rigidType,
1189
- // TODO: VrsM
1190
- // TODO: VrsN
1191
- originalVertexArray: uint8ToPoints(p.originalVertexArray),
1192
- deformedVertexArray: uint8ToPoints(p.deformedVertexArray),
1193
- indexArray: Array.from(uint8ToUint32(p.indexArray)),
1194
- pinOffsets: arrayToPoints(p.pinOffsets),
1195
- posFinalPins: arrayToPoints(p.posFinalPins),
1196
- pinVertexIndices: p.pinVertexIndices,
1197
- selectedPin: p.selectedPin,
1198
- pinPosition: arrayToPoints(p.PinP),
1199
- pinRotation: p.PnRt,
1200
- pinOverlay: p.PnOv,
1201
- pinDepth: p.PnDp,
1202
- meshQuality: p.meshQuality,
1203
- meshExpansion: p.meshExpansion,
1204
- meshRigidity: p.meshRigidity,
1205
- imageResolution: p.imageResolution,
1206
- meshBoundaryPath: {
1207
- pathComponents: p.meshBoundaryPath.pathComponents.map(function (c) { return ({
1208
- shapeOperation: c.shapeOperation.split('.')[1],
1209
- paths: c.SbpL.map(function (t) { return ({
1210
- closed: t.Clsp,
1211
- points: t['Pts '].map(function (pt) { return ({
1212
- anchor: hrznVrtcToPoint(pt.Anch),
1213
- forward: hrznVrtcToPoint(pt['Fwd ']),
1214
- backward: hrznVrtcToPoint(pt['Bwd ']),
1215
- smooth: pt.Smoo,
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: {
1421
+ rigidType: f.Fltr.rigidType,
1422
+ bounds: [
1423
+ { x: f.Fltr.PuX0, y: f.Fltr.PuY0, },
1424
+ { x: f.Fltr.PuX1, y: f.Fltr.PuY1, },
1425
+ { x: f.Fltr.PuX2, y: f.Fltr.PuY2, },
1426
+ { x: f.Fltr.PuX3, y: f.Fltr.PuY3, },
1427
+ ],
1428
+ puppetShapeList: f.Fltr.puppetShapeList.map(function (p) { return ({
1429
+ rigidType: p.rigidType,
1430
+ // TODO: VrsM
1431
+ // TODO: VrsN
1432
+ originalVertexArray: uint8ToPoints(p.originalVertexArray),
1433
+ deformedVertexArray: uint8ToPoints(p.deformedVertexArray),
1434
+ indexArray: Array.from(uint8ToUint32(p.indexArray)),
1435
+ pinOffsets: arrayToPoints(p.pinOffsets),
1436
+ posFinalPins: arrayToPoints(p.posFinalPins),
1437
+ pinVertexIndices: p.pinVertexIndices,
1438
+ selectedPin: p.selectedPin,
1439
+ pinPosition: arrayToPoints(p.PinP),
1440
+ pinRotation: p.PnRt,
1441
+ pinOverlay: p.PnOv,
1442
+ pinDepth: p.PnDp,
1443
+ meshQuality: p.meshQuality,
1444
+ meshExpansion: p.meshExpansion,
1445
+ meshRigidity: p.meshRigidity,
1446
+ imageResolution: p.imageResolution,
1447
+ meshBoundaryPath: {
1448
+ pathComponents: p.meshBoundaryPath.pathComponents.map(function (c) { return ({
1449
+ shapeOperation: c.shapeOperation.split('.')[1],
1450
+ paths: c.SbpL.map(function (t) { return ({
1451
+ closed: t.Clsp,
1452
+ points: t['Pts '].map(function (pt) { return ({
1453
+ anchor: hrznVrtcToPoint(pt.Anch),
1454
+ forward: hrznVrtcToPoint(pt['Fwd ']),
1455
+ backward: hrznVrtcToPoint(pt['Bwd ']),
1456
+ smooth: pt.Smoo,
1457
+ }); }),
1216
1458
  }); }),
1217
1459
  }); }),
1218
- }); }),
1219
- },
1220
- }); }),
1221
- };
1222
- }
1223
- else {
1224
- return {};
1460
+ },
1461
+ }); }),
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));
1225
1517
  }
1226
1518
  }
1227
1519
  function parseFilterFX(desc) {
@@ -1231,96 +1523,446 @@ function parseFilterFX(desc) {
1231
1523
  maskEnabled: desc.filterMaskEnable,
1232
1524
  maskLinked: desc.filterMaskLinked,
1233
1525
  maskExtendWithWhite: desc.filterMaskExtendWithWhite,
1234
- list: desc.filterFXList.map(function (f) { return ({
1235
- id: f.filterID,
1236
- name: f['Nm '],
1237
- opacity: (0, descriptor_1.parsePercent)(f.blendOptions.Opct),
1238
- blendMode: descriptor_1.BlnM.decode(f.blendOptions['Md ']),
1239
- enabled: f.enab,
1240
- hasOptions: f.hasoptions,
1241
- foregroundColor: (0, descriptor_1.parseColor)(f.FrgC),
1242
- backgroundColor: (0, descriptor_1.parseColor)(f.BckC),
1243
- filter: parseFilterFXFilter(f.Fltr),
1244
- }); }),
1526
+ list: desc.filterFXList.map(parseFilterFXItem),
1245
1527
  };
1246
1528
  }
1247
- function serializeFltr(filter) {
1248
- if ('puppetShapeList' in filter) {
1249
- return {
1250
- 'null': ['Ordn.Trgt'],
1251
- rigidType: filter.rigidType,
1252
- puppetShapeList: filter.puppetShapeList.map(function (p) { return ({
1253
- rigidType: p.rigidType,
1254
- VrsM: 1,
1255
- VrsN: 0,
1256
- originalVertexArray: toUint8(new Float32Array(pointsToArray(p.originalVertexArray))),
1257
- deformedVertexArray: toUint8(new Float32Array(pointsToArray(p.deformedVertexArray))),
1258
- indexArray: toUint8(new Uint32Array(p.indexArray)),
1259
- pinOffsets: pointsToArray(p.pinOffsets),
1260
- posFinalPins: pointsToArray(p.posFinalPins),
1261
- selectedPin: p.selectedPin,
1262
- pinVertexIndices: p.pinVertexIndices,
1263
- PinP: pointsToArray(p.pinPosition),
1264
- PnRt: p.pinRotation,
1265
- PnOv: p.pinOverlay,
1266
- PnDp: p.pinDepth,
1267
- meshQuality: p.meshQuality,
1268
- meshExpansion: p.meshExpansion,
1269
- meshRigidity: p.meshRigidity,
1270
- imageResolution: p.imageResolution,
1271
- meshBoundaryPath: {
1272
- pathComponents: (p.meshBoundaryPath.pathComponents || []).map(function (c) { return ({
1273
- shapeOperation: "shapeOperation.".concat(c.shapeOperation),
1274
- SbpL: (c.paths || []).map(function (path) { return ({
1275
- Clsp: path.closed,
1276
- 'Pts ': (path.points || []).map(function (pt) { return ({
1277
- Anch: pointToHrznVrtc(pt.anchor),
1278
- 'Fwd ': pointToHrznVrtc(pt.forward),
1279
- 'Bwd ': pointToHrznVrtc(pt.backward),
1280
- Smoo: pt.smooth,
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',
1880
+ 'null': ['Ordn.Trgt'],
1881
+ rigidType: f.filter.rigidType,
1882
+ puppetShapeList: f.filter.puppetShapeList.map(function (p) { return ({
1883
+ _name: '',
1884
+ _classID: 'puppetShape',
1885
+ rigidType: p.rigidType,
1886
+ VrsM: 1,
1887
+ VrsN: 0,
1888
+ originalVertexArray: toUint8(new Float32Array(pointsToArray(p.originalVertexArray))),
1889
+ deformedVertexArray: toUint8(new Float32Array(pointsToArray(p.deformedVertexArray))),
1890
+ indexArray: toUint8(new Uint32Array(p.indexArray)),
1891
+ pinOffsets: pointsToArray(p.pinOffsets),
1892
+ posFinalPins: pointsToArray(p.posFinalPins),
1893
+ pinVertexIndices: p.pinVertexIndices,
1894
+ PinP: pointsToArray(p.pinPosition),
1895
+ PnRt: p.pinRotation,
1896
+ PnOv: p.pinOverlay,
1897
+ PnDp: p.pinDepth,
1898
+ meshQuality: p.meshQuality,
1899
+ meshExpansion: p.meshExpansion,
1900
+ meshRigidity: p.meshRigidity,
1901
+ imageResolution: p.imageResolution,
1902
+ meshBoundaryPath: {
1903
+ _name: '',
1904
+ _classID: 'pathClass',
1905
+ pathComponents: p.meshBoundaryPath.pathComponents.map(function (c) { return ({
1906
+ _name: '',
1907
+ _classID: 'PaCm',
1908
+ shapeOperation: "shapeOperation.".concat(c.shapeOperation),
1909
+ SbpL: c.paths.map(function (path) { return ({
1910
+ _name: '',
1911
+ _classID: 'Sbpl',
1912
+ Clsp: path.closed,
1913
+ 'Pts ': path.points.map(function (pt) { return ({
1914
+ _name: '',
1915
+ _classID: 'Pthp',
1916
+ Anch: pointToHrznVrtc(pt.anchor),
1917
+ 'Fwd ': pointToHrznVrtc(pt.forward),
1918
+ 'Bwd ': pointToHrznVrtc(pt.backward),
1919
+ Smoo: pt.smooth,
1920
+ }); }),
1281
1921
  }); }),
1282
1922
  }); }),
1283
- }); }),
1284
- },
1285
- }); }),
1286
- PuX0: filter.bounds[0].x,
1287
- PuX1: filter.bounds[1].x,
1288
- PuX2: filter.bounds[2].x,
1289
- PuX3: filter.bounds[3].x,
1290
- PuY0: filter.bounds[0].y,
1291
- PuY1: filter.bounds[1].y,
1292
- PuY2: filter.bounds[2].y,
1293
- PuY3: filter.bounds[3].y,
1294
- };
1295
- }
1296
- else {
1297
- return {
1298
- LqMe: new Uint8Array(),
1299
- };
1923
+ },
1924
+ selectedPin: p.selectedPin,
1925
+ }); }),
1926
+ PuX0: f.filter.bounds[0].x,
1927
+ PuX1: f.filter.bounds[1].x,
1928
+ PuX2: f.filter.bounds[2].x,
1929
+ PuX3: f.filter.bounds[3].x,
1930
+ PuY0: f.filter.bounds[0].y,
1931
+ PuY1: f.filter.bounds[1].y,
1932
+ PuY2: f.filter.bounds[2].y,
1933
+ PuY3: f.filter.bounds[3].y,
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));
1300
1963
  }
1301
1964
  }
1302
- function serializeFilterFX(filter) {
1303
- return {
1304
- enab: filter.enabled,
1305
- validAtPosition: filter.validAtPosition,
1306
- filterMaskEnable: filter.maskEnabled,
1307
- filterMaskLinked: filter.maskLinked,
1308
- filterMaskExtendWithWhite: filter.maskExtendWithWhite,
1309
- filterFXList: (filter.list || []).map(function (f) { return ({
1310
- 'Nm ': f.name,
1311
- blendOptions: {
1312
- Opct: (0, descriptor_1.unitsPercent)(f.opacity),
1313
- 'Md ': descriptor_1.BlnM.encode(f.blendMode),
1314
- },
1315
- enab: f.enabled,
1316
- hasoptions: f.hasOptions,
1317
- FrgC: (0, descriptor_1.serializeColor)(f.foregroundColor),
1318
- BckC: (0, descriptor_1.serializeColor)(f.backgroundColor),
1319
- Fltr: serializeFltr(f.filter),
1320
- filterID: f.id,
1321
- }); }),
1322
- };
1323
- }
1965
+ // let t: any;
1324
1966
  addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
1325
1967
  if ((0, psdReader_1.readSignature)(reader) !== 'soLD')
1326
1968
  throw new Error("Invalid SoLd type");
@@ -1332,15 +1974,17 @@ addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
1332
1974
  // console.log('SoLd.warp', require('util').inspect(desc.warp, false, 99, true));
1333
1975
  // console.log('SoLd.quiltWarp', require('util').inspect(desc.quiltWarp, false, 99, true));
1334
1976
  // desc.filterFX!.filterFXList[0].Fltr.puppetShapeList[0].meshBoundaryPath.pathComponents[0].SbpL[0]['Pts '] = [];
1335
- // 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;
1336
1980
  target.placedLayer = {
1337
1981
  id: desc.Idnt,
1338
1982
  placed: desc.placed,
1339
1983
  type: placedLayerTypes[desc.Type],
1340
1984
  pageNumber: desc.PgNm,
1341
1985
  totalPages: desc.totalPages,
1342
- frameStep: desc.frameStep,
1343
- duration: desc.duration,
1986
+ frameStep: (0, descriptor_1.frac)(desc.frameStep),
1987
+ duration: (0, descriptor_1.frac)(desc.duration),
1344
1988
  frameCount: desc.frameCount,
1345
1989
  transform: desc.Trnf,
1346
1990
  width: desc['Sz '].Wdth,
@@ -1355,22 +1999,48 @@ addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
1355
1999
  target.placedLayer.crop = desc.Crop;
1356
2000
  if (desc.comp)
1357
2001
  target.placedLayer.comp = desc.comp;
1358
- if (desc.compInfo)
1359
- 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
+ }
1360
2008
  if (desc.filterFX)
1361
2009
  target.placedLayer.filter = parseFilterFX(desc.filterFX);
2010
+ // console.log('filter', require('util').inspect(target.placedLayer.filter, false, 99, true));
1362
2011
  (0, psdReader_1.skipBytes)(reader, left()); // HACK
1363
2012
  }, function (writer, target) {
1364
2013
  var _a, _b;
1365
2014
  (0, psdWriter_1.writeSignature)(writer, 'soLD');
1366
2015
  (0, psdWriter_1.writeInt32)(writer, 4); // version
1367
2016
  var placed = target.placedLayer;
1368
- 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 ',
1369
2022
  Wdth: placed.width || 0,
1370
2023
  Hght: placed.height || 0, // TODO: find size ?
1371
2024
  }, Rslt: placed.resolution ? (0, descriptor_1.unitsValue)(placed.resolution, 'resolution') : { units: 'Density', value: 72 } });
1372
- if (placed.filter)
1373
- 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
+ // }
1374
2044
  if (placed.warp && isQuiltWarp(placed.warp)) {
1375
2045
  var quiltWarp = encodeWarp(placed.warp);
1376
2046
  desc.quiltWarp = quiltWarp;
@@ -1456,7 +2126,7 @@ addHandler('Anno', function (target) { return target.annotations !== undefined;
1456
2126
  var popupLocation = readRect(reader);
1457
2127
  var color = (0, psdReader_1.readColor)(reader);
1458
2128
  var author = (0, psdReader_1.readPascalString)(reader, 2);
1459
- var name_1 = (0, psdReader_1.readPascalString)(reader, 2);
2129
+ var name_2 = (0, psdReader_1.readPascalString)(reader, 2);
1460
2130
  var date = (0, psdReader_1.readPascalString)(reader, 2);
1461
2131
  /*const contentLength =*/ (0, psdReader_1.readUint32)(reader);
1462
2132
  /*const dataType =*/ (0, psdReader_1.readSignature)(reader);
@@ -1485,7 +2155,7 @@ addHandler('Anno', function (target) { return target.annotations !== undefined;
1485
2155
  popupLocation: popupLocation,
1486
2156
  color: color,
1487
2157
  author: author,
1488
- name: name_1,
2158
+ name: name_2,
1489
2159
  date: date,
1490
2160
  data: data,
1491
2161
  });
@@ -1544,20 +2214,26 @@ addHandler('lnk2', function (target) { return !!target.linkedFiles && target.lin
1544
2214
  var type = (0, psdReader_1.readSignature)(reader);
1545
2215
  var version = (0, psdReader_1.readInt32)(reader);
1546
2216
  var id = (0, psdReader_1.readPascalString)(reader, 1);
1547
- var name_2 = (0, psdReader_1.readUnicodeString)(reader);
2217
+ var name_3 = (0, psdReader_1.readUnicodeString)(reader);
1548
2218
  var fileType = (0, psdReader_1.readSignature)(reader).trim(); // ' ' if empty
1549
2219
  var fileCreator = (0, psdReader_1.readSignature)(reader).trim(); // ' ' or '\0\0\0\0' if empty
1550
2220
  var dataSize = readLength64(reader);
1551
2221
  var hasFileOpenDescriptor = (0, psdReader_1.readUint8)(reader);
1552
2222
  var fileOpenDescriptor = hasFileOpenDescriptor ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
1553
2223
  var linkedFileDescriptor = type === 'liFE' ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
1554
- var file = { id: id, name: name_2, data: undefined };
2224
+ var file = { id: id, name: name_3, data: undefined };
1555
2225
  if (fileType)
1556
2226
  file.type = fileType;
1557
2227
  if (fileCreator)
1558
2228
  file.creator = fileCreator;
1559
- if (fileOpenDescriptor)
1560
- file.descriptor = fileOpenDescriptor;
2229
+ if (fileOpenDescriptor) {
2230
+ file.descriptor = {
2231
+ compInfo: {
2232
+ compID: fileOpenDescriptor.compInfo.compID,
2233
+ originalCompID: fileOpenDescriptor.compInfo.originalCompID,
2234
+ }
2235
+ };
2236
+ }
1561
2237
  if (type === 'liFE' && version > 3) {
1562
2238
  var year = (0, psdReader_1.readInt32)(reader);
1563
2239
  var month = (0, psdReader_1.readUint8)(reader);
@@ -1615,7 +2291,10 @@ addHandler('lnk2', function (target) { return !!target.linkedFiles && target.lin
1615
2291
  writeLength64(writer, file.data ? file.data.byteLength : 0);
1616
2292
  if (file.descriptor && file.descriptor.compInfo) {
1617
2293
  var desc = {
1618
- compInfo: file.descriptor.compInfo,
2294
+ compInfo: {
2295
+ compID: file.descriptor.compInfo.compID,
2296
+ originalCompID: file.descriptor.compInfo.originalCompID,
2297
+ }
1619
2298
  };
1620
2299
  (0, psdWriter_1.writeUint8)(writer, 1);
1621
2300
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
@@ -2355,6 +3034,94 @@ addHandler('Txt2', hasKey('engineData'), function (reader, target, left) {
2355
3034
  var buffer = (0, base64_js_1.toByteArray)(target.engineData);
2356
3035
  (0, psdWriter_1.writeBytes)(writer, buffer);
2357
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');
2358
3125
  addHandler('FMsk', hasKey('filterMask'), function (reader, target) {
2359
3126
  target.filterMask = {
2360
3127
  colorSpace: (0, psdReader_1.readColor)(reader),
@@ -2420,14 +3187,17 @@ addHandler('lfx2', function (target) { return target.effects !== undefined && !h
2420
3187
  addHandler('cinf', hasKey('compositorUsed'), function (reader, target, left) {
2421
3188
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
2422
3189
  // console.log(require('util').inspect(desc, false, 99, true));
3190
+ function enumValue(desc) {
3191
+ return desc.split('.')[1];
3192
+ }
2423
3193
  target.compositorUsed = {
2424
3194
  description: desc.description,
2425
3195
  reason: desc.reason,
2426
- engine: desc.Engn.split('.')[1],
2427
- enableCompCore: desc.enableCompCore.split('.')[1],
2428
- enableCompCoreGPU: desc.enableCompCoreGPU.split('.')[1],
2429
- compCoreSupport: desc.compCoreSupport.split('.')[1],
2430
- 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),
2431
3201
  };
2432
3202
  (0, psdReader_1.skipBytes)(reader, left());
2433
3203
  }, function (writer, target) {
@@ -2482,87 +3252,6 @@ addHandler('tsly', hasKey('transparencyShapesLayer'), function (reader, target)
2482
3252
  (0, psdWriter_1.writeUint8)(writer, target.transparencyShapesLayer ? 1 : 0);
2483
3253
  (0, psdWriter_1.writeZeros)(writer, 3);
2484
3254
  });
2485
- /*addHandler(
2486
- 'FEid',
2487
- hasKey('filterEffects'),
2488
- (reader, _target) => {
2489
- const version = readInt32(reader);
2490
- if (version < 1 || version > 3) throw new Error(`Invalid filterEffects version ${version}`);
2491
-
2492
- if (readUint32(reader)) throw new Error('filterEffects: 64 bit length is not supported');
2493
- const length = readUint32(reader);
2494
- const end = reader.offset + length;
2495
-
2496
- while (reader.offset < end) {
2497
- console.log('bytes to go', end - reader.offset, 'at', reader.offset.toString(16));
2498
- //
2499
- const id = readPascalString(reader, 1);
2500
- const effectVersion = readInt32(reader);
2501
- if (effectVersion !== 1) throw new Error(`Invalid filterEffect version ${effectVersion}`);
2502
- if (readUint32(reader)) throw new Error('filterEffect: 64 bit length is not supported');
2503
- const effectLength = readUint32(reader);
2504
- const endOfEffect = reader.offset + effectLength;
2505
- const top = readInt32(reader);
2506
- const left = readInt32(reader);
2507
- const bottom = readInt32(reader);
2508
- const right = readInt32(reader);
2509
- const depth = readInt32(reader);
2510
- const maxChannels = readInt32(reader);
2511
- const channels: any[] = [];
2512
-
2513
- for (let i = 0; i < (maxChannels + 2); i++) {
2514
- const exists = readInt32(reader);
2515
- if (exists) {
2516
- if (readUint32(reader)) throw new Error('filterEffect: 64 bit length is not supported');
2517
- const channelLength = readUint32(reader);
2518
- const compressionMode = readUint16(reader);
2519
- const data = readBytes(reader, channelLength - 2);
2520
- channels.push({ channelLength, compressionMode, data: data?.length + ' bytes' });
2521
- // if (c < 3 || c == 25) e_ = _F.Cn(!0, rL, m, b.rect.F, b.rect.V, X, rp);
2522
- // if (c == 0) _c.S = e_;
2523
- // if (c == 1) _c.v = e_;
2524
- // if (c == 2) _c.e = e_;
2525
- // if (c == 25) _c.w = e_;
2526
- } else {
2527
- channels.push(undefined);
2528
- }
2529
- }
2530
-
2531
- console.log('left at the end', endOfEffect - reader.offset);
2532
- if (endOfEffect > reader.offset) {
2533
- if (readUint8(reader)) {
2534
- const compressionMode = readUint16(reader);
2535
- const data = endOfEffect > reader.offset ? readBytes(reader, endOfEffect - reader.offset) : undefined;
2536
- console.log('extra data', { compressionMode, data: data?.length + ' bytes' });
2537
- } else {
2538
- console.log('no extra');
2539
- }
2540
- }
2541
-
2542
- console.log('effect', {
2543
- id,
2544
- effectVersion,
2545
- effectLength,
2546
- top,
2547
- left,
2548
- bottom,
2549
- right,
2550
- depth,
2551
- maxChannels,
2552
- channels,
2553
- });
2554
-
2555
- console.log('bytes left after effect', endOfEffect - reader.offset);
2556
- // if (length % 4) skipBytes(reader, 4 - length % 4);
2557
- }
2558
-
2559
- console.log({ version, length });
2560
- },
2561
- (_writer, _target) => {
2562
- },
2563
- );
2564
-
2565
- addHandlerAlias('FXid', 'FEid');*/
2566
3255
 
2567
3256
  },{"./descriptor":4,"./effectsHelpers":5,"./engineData":6,"./helpers":7,"./psdReader":11,"./psdWriter":12,"./text":13,"base64-js":15}],3:[function(require,module,exports){
2568
3257
  "use strict";
@@ -2627,7 +3316,8 @@ var __assign = (this && this.__assign) || function () {
2627
3316
  return __assign.apply(this, arguments);
2628
3317
  };
2629
3318
  Object.defineProperty(exports, "__esModule", { value: true });
2630
- 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;
2631
3321
  var helpers_1 = require("./helpers");
2632
3322
  var psdReader_1 = require("./psdReader");
2633
3323
  var psdWriter_1 = require("./psdWriter");
@@ -2729,11 +3419,15 @@ var fieldToExtType = {
2729
3419
  Anch: makeType('', 'Pnt '),
2730
3420
  'Fwd ': makeType('', 'Pnt '),
2731
3421
  'Bwd ': makeType('', 'Pnt '),
3422
+ FlrC: makeType('', 'Pnt '),
2732
3423
  meshBoundaryPath: makeType('', 'pathClass'),
2733
3424
  filterFX: makeType('', 'filterFXStyle'),
2734
3425
  Fltr: makeType('', 'rigidTransform'),
2735
3426
  FrgC: makeType('', 'RGBC'),
2736
3427
  BckC: makeType('', 'RGBC'),
3428
+ sdwM: makeType('Parameters', 'adaptCorrectTones'),
3429
+ hglM: makeType('Parameters', 'adaptCorrectTones'),
3430
+ customShape: makeType('', 'customShape'),
2737
3431
  };
2738
3432
  var fieldToArrayExtType = {
2739
3433
  'Crv ': makeType('', 'CrPt'),
@@ -2762,15 +3456,20 @@ var fieldToArrayExtType = {
2762
3456
  pathComponents: makeType('', 'PaCm'),
2763
3457
  filterFXList: makeType('', 'filterFX'),
2764
3458
  puppetShapeList: makeType('', 'puppetShape'),
3459
+ channelDenoise: makeType('', 'channelDenoiseParams'),
3460
+ ShrP: makeType('', 'Pnt '),
2765
3461
  };
2766
3462
  var typeToField = {
2767
3463
  'TEXT': [
2768
3464
  'Txt ', 'printerName', 'Nm ', 'Idnt', 'blackAndWhitePresetFileName', 'LUT3DFileName',
2769
3465
  'presetFileName', 'curvesPresetFileName', 'mixerPresetFileName', 'placed', 'description', 'reason',
2770
3466
  'artboardPresetName', 'json', 'clipID', 'relPath', 'fullPath', 'mediaDescriptor', 'Msge',
2771
- 'altTag', 'url', 'cellText',
3467
+ 'altTag', 'url', 'cellText', 'preset', 'KnNm', 'FPth',
3468
+ ],
3469
+ 'tdta': [
3470
+ 'EngineData', 'LUT3DFileData', 'indexArray', 'originalVertexArray', 'deformedVertexArray',
3471
+ 'LqMe',
2772
3472
  ],
2773
- 'tdta': ['EngineData', 'LUT3DFileData', 'indexArray', 'originalVertexArray', 'deformedVertexArray'],
2774
3473
  'long': [
2775
3474
  'TextIndex', 'RndS', 'Mdpn', 'Smth', 'Lctn', 'strokeStyleVersion', 'LaID', 'Vrsn', 'Cnt ',
2776
3475
  'Brgh', 'Cntr', 'means', 'vibrance', 'Strt', 'bwPresetKind', 'presetKind', 'comp', 'compID', 'originalCompID',
@@ -2781,16 +3480,19 @@ var typeToField = {
2781
3480
  'numBefore', 'numAfter', 'Spcn', 'minOpacity', 'maxOpacity', 'BlnM', 'sheetID', 'gblA', 'globalAltitude',
2782
3481
  'descVersion', 'frameReaderType', 'LyrI', 'zoomOrigin', 'fontSize', 'Rds ', 'sliceID',
2783
3482
  'topOutset', 'leftOutset', 'bottomOutset', 'rightOutset', 'filterID', 'meshQuality',
2784
- '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',
2785
3486
  ],
2786
3487
  'enum': [
2787
- 'textGridding', 'Ornt', 'warpStyle', 'warpRotate', 'Inte', 'Bltn', 'ClrS',
2788
- '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',
2789
3490
  'strokeStyleLineCapType', 'strokeStyleLineJoinType', 'strokeStyleLineAlignment',
2790
3491
  'strokeStyleBlendMode', 'PntT', 'Styl', 'lookupType', 'LUTFormat', 'dataOrder',
2791
3492
  'tableOrder', 'enableCompCore', 'enableCompCoreGPU', 'compCoreSupport', 'compCoreGPUSupport', 'Engn',
2792
3493
  'enableCompCoreThreads', 'gs99', 'FrDs', 'trackID', 'animInterpStyle', 'horzAlign',
2793
- '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',
2794
3496
  ],
2795
3497
  'bool': [
2796
3498
  'PstS', 'printSixteenBit', 'masterFXSwitch', 'enab', 'uglg', 'antialiasGloss',
@@ -2802,7 +3504,8 @@ var typeToField = {
2802
3504
  'present', 'showInDialog', 'overprint', 'sheetDisclosed', 'lightsDisclosed', 'meshesDisclosed',
2803
3505
  'materialsDisclosed', 'hasMotion', 'muted', 'Effc', 'selected', 'autoScope', 'fillCanvas',
2804
3506
  'cellTextIsHTML', 'Smoo', 'Clsp', 'validAtPosition', 'rigidType', 'hasoptions', 'filterMaskEnable',
2805
- 'filterMaskLinked', 'filterMaskExtendWithWhite',
3507
+ 'filterMaskLinked', 'filterMaskExtendWithWhite', 'removeJPEGArtifact', 'Mnch', 'ExtF', 'ExtM',
3508
+ 'moreAccurate', 'GpuY', 'LIWy',
2806
3509
  ],
2807
3510
  'doub': [
2808
3511
  'warpValue', 'warpPerspective', 'warpPerspectiveOther', 'Intr', 'Wdth', 'Hght',
@@ -2812,10 +3515,10 @@ var typeToField = {
2812
3515
  'PuX0', 'PuX1', 'PuX2', 'PuX3', 'PuY0', 'PuY1', 'PuY2', 'PuY3'
2813
3516
  ],
2814
3517
  'UntF': [
2815
- 'Scl ', 'sdwO', 'hglO', 'lagl', 'Lald', 'srgR', 'blur', 'Sftn', 'Opct', 'Dstn', 'Angl',
3518
+ 'sdwO', 'hglO', 'lagl', 'Lald', 'srgR', 'blur', 'Sftn', 'Opct', 'Dstn', 'Angl',
2816
3519
  'Ckmt', 'Nose', 'Inpr', 'ShdN', 'strokeStyleLineWidth', 'strokeStyleLineDashOffset',
2817
3520
  'strokeStyleOpacity', 'H ', 'Top ', 'Left', 'Btom', 'Rght', 'Rslt',
2818
- 'topRight', 'topLeft', 'bottomLeft', 'bottomRight',
3521
+ 'topRight', 'topLeft', 'bottomLeft', 'bottomRight', 'ClNs', 'Shrp',
2819
3522
  ],
2820
3523
  'VlLs': [
2821
3524
  'Crv ', 'Clrs', 'Mnm ', 'Mxm ', 'Trns', 'pathList', 'strokeStyleLineDashSet', 'FrLs', 'slices',
@@ -2823,10 +3526,12 @@ var typeToField = {
2823
3526
  'solidFillMulti', 'frameFXMulti', 'innerShadowMulti', 'dropShadowMulti', 'FrIn', 'FSts', 'FsFr',
2824
3527
  'sheetTimelineOptions', 'audioClipList', 'trackList', 'globalTrackList', 'keyList', 'audioClipList',
2825
3528
  'warpValues', 'selectedPin', 'Pts ', 'SbpL', 'pathComponents', 'pinOffsets', 'posFinalPins',
2826
- 'pinVertexIndices', 'PinP', 'PnRt', 'PnOv', 'PnDp', 'filterFXList', 'puppetShapeList',
3529
+ 'pinVertexIndices', 'PinP', 'PnRt', 'PnOv', 'PnDp', 'filterFXList', 'puppetShapeList', 'ShrP',
3530
+ 'channelDenoise', 'Mtrx',
2827
3531
  ],
2828
3532
  'ObAr': ['meshPoints', 'quiltSliceX', 'quiltSliceY'],
2829
- 'obj ': ['null'],
3533
+ 'obj ': ['null', 'Chnl'],
3534
+ 'Pth ': ['DspF'],
2830
3535
  };
2831
3536
  var channels = [
2832
3537
  'Rd ', 'Grn ', 'Bl ', 'Yllw', 'Ylw ', 'Cyn ', 'Mgnt', 'Blck', 'Gry ', 'Lmnc', 'A ', 'B ',
@@ -2865,6 +3570,9 @@ var fieldToArrayType = {
2865
3570
  PnDp: 'doub',
2866
3571
  filterFXList: 'Objc',
2867
3572
  puppetShapeList: 'Objc',
3573
+ ShrP: 'Objc',
3574
+ channelDenoise: 'Objc',
3575
+ Mtrx: 'long',
2868
3576
  };
2869
3577
  var fieldToType = {};
2870
3578
  for (var _i = 0, _a = Object.keys(typeToField); _i < _a.length; _i++) {
@@ -2940,11 +3648,12 @@ function writeAsciiStringOrClassId(writer, value) {
2940
3648
  }
2941
3649
  }
2942
3650
  function readDescriptorStructure(reader) {
2943
- var object = {};
2944
- // object.__struct =
3651
+ // const struct =
2945
3652
  readClassStructure(reader);
3653
+ // const object: any = { _name: struct.name, _classID: struct.classID };
3654
+ var object = {};
3655
+ // console.log('>> ', struct);
2946
3656
  var itemsCount = (0, psdReader_1.readUint32)(reader);
2947
- // console.log('//', object.__struct);
2948
3657
  for (var i = 0; i < itemsCount; i++) {
2949
3658
  var key = readAsciiStringOrClassId(reader);
2950
3659
  var type = (0, psdReader_1.readSignature)(reader);
@@ -2963,21 +3672,60 @@ function writeDescriptorStructure(writer, name, classId, value, root) {
2963
3672
  (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, name);
2964
3673
  writeAsciiStringOrClassId(writer, classId);
2965
3674
  var keys = Object.keys(value);
2966
- (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);
2967
3681
  for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
2968
3682
  var key = keys_1[_i];
3683
+ if (key === '_name' || key === '_classID')
3684
+ continue;
2969
3685
  var type = getTypeByKey(key, value[key], root, value);
2970
3686
  var extType = fieldToExtType[key];
2971
3687
  if (key === 'origin') {
2972
3688
  type = root === 'slices' ? 'enum' : 'Objc';
2973
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
+ }
2974
3714
  else if (key === 'bounds' && root === 'slices') {
2975
3715
  type = 'Objc';
2976
3716
  extType = makeType('', 'Rct1');
2977
3717
  }
2978
- else if (key === 'Scl ' && 'Hrzn' in value[key]) {
2979
- type = 'Objc';
2980
- 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
+ }
2981
3729
  }
2982
3730
  else if (key === 'audioClipGroupList' && keys.length === 1) {
2983
3731
  type = 'VlLs';
@@ -2985,7 +3733,13 @@ function writeDescriptorStructure(writer, name, classId, value, root) {
2985
3733
  else if ((key === 'Strt' || key === 'Brgh') && 'H ' in value) {
2986
3734
  type = 'doub';
2987
3735
  }
2988
- 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') {
2989
3743
  type = 'Objc';
2990
3744
  extType = nullType;
2991
3745
  }
@@ -3105,11 +3859,11 @@ function readOSType(reader, type) {
3105
3859
  return items;
3106
3860
  }
3107
3861
  case 'Pth ': { // File path
3108
- /*const length =*/ (0, psdReader_1.readInt32)(reader);
3862
+ /*const length =*/ (0, psdReader_1.readInt32)(reader); // total size of all fields below
3109
3863
  var sig = (0, psdReader_1.readSignature)(reader);
3110
- /*const pathSize =*/ (0, psdReader_1.readInt32LE)(reader);
3864
+ /*const pathSize =*/ (0, psdReader_1.readInt32LE)(reader); // the same as length
3111
3865
  var charsCount = (0, psdReader_1.readInt32LE)(reader);
3112
- var path = (0, psdReader_1.readUnicodeStringWithLength)(reader, charsCount);
3866
+ var path = (0, psdReader_1.readUnicodeStringWithLengthLE)(reader, charsCount);
3113
3867
  return { sig: sig, path: path };
3114
3868
  }
3115
3869
  default:
@@ -3127,12 +3881,19 @@ function writeOSType(writer, type, value, key, extType, root) {
3127
3881
  writeReferenceStructure(writer, key, value);
3128
3882
  break;
3129
3883
  case 'Objc': // Descriptor
3130
- 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));
3131
3887
  if (!extType)
3132
3888
  throw new Error("Missing ext type for: '".concat(key, "' (").concat(JSON.stringify(value), ")"));
3133
- 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);
3134
3892
  break;
3893
+ }
3135
3894
  case 'VlLs': // List
3895
+ if (!Array.isArray(value))
3896
+ throw new Error("Invalid list value: ".concat(JSON.stringify(value), ", key: ").concat(key));
3136
3897
  (0, psdWriter_1.writeInt32)(writer, value.length);
3137
3898
  for (var i = 0; i < value.length; i++) {
3138
3899
  var type_3 = fieldToArrayType[key];
@@ -3143,6 +3904,8 @@ function writeOSType(writer, type, value, key, extType, root) {
3143
3904
  }
3144
3905
  break;
3145
3906
  case 'doub': // Double
3907
+ if (typeof value !== 'number')
3908
+ throw new Error("Invalid number value: ".concat(JSON.stringify(value), ", key: ").concat(key));
3146
3909
  (0, psdWriter_1.writeFloat64)(writer, value);
3147
3910
  break;
3148
3911
  case 'UntF': // Unit double
@@ -3161,17 +3924,23 @@ function writeOSType(writer, type, value, key, extType, root) {
3161
3924
  (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, value);
3162
3925
  break;
3163
3926
  case 'enum': { // Enumerated
3927
+ if (typeof value !== 'string')
3928
+ throw new Error("Invalid enum value: ".concat(JSON.stringify(value), ", key: ").concat(key));
3164
3929
  var _a = value.split('.'), _type = _a[0], val = _a[1];
3165
3930
  writeAsciiStringOrClassId(writer, _type);
3166
3931
  writeAsciiStringOrClassId(writer, val);
3167
3932
  break;
3168
3933
  }
3169
3934
  case 'long': // Integer
3935
+ if (typeof value !== 'number')
3936
+ throw new Error("Invalid integer value: ".concat(JSON.stringify(value), ", key: ").concat(key));
3170
3937
  (0, psdWriter_1.writeInt32)(writer, value);
3171
3938
  break;
3172
3939
  // case 'comp': // Large Integer
3173
3940
  // writeLargeInteger(reader);
3174
3941
  case 'bool': // Boolean
3942
+ if (typeof value !== 'boolean')
3943
+ throw new Error("Invalid boolean value: ".concat(JSON.stringify(value), ", key: ").concat(key));
3175
3944
  (0, psdWriter_1.writeUint8)(writer, value ? 1 : 0);
3176
3945
  break;
3177
3946
  // case 'type': // Class
@@ -3202,8 +3971,15 @@ function writeOSType(writer, type, value, key, extType, root) {
3202
3971
  }
3203
3972
  break;
3204
3973
  }
3205
- // case 'Pth ': // File path
3206
- // 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
+ }
3207
3983
  default:
3208
3984
  throw new Error("Not implemented descriptor OSType: ".concat(type));
3209
3985
  }
@@ -3294,7 +4070,6 @@ function writeReferenceStructure(writer, _key, items) {
3294
4070
  function readClassStructure(reader) {
3295
4071
  var name = (0, psdReader_1.readUnicodeString)(reader);
3296
4072
  var classID = readAsciiStringOrClassId(reader);
3297
- // console.log({ name, classID });
3298
4073
  return { name: name, classID: classID };
3299
4074
  }
3300
4075
  function writeClassStructure(writer, name, classID) {
@@ -3474,7 +4249,8 @@ function parseKeyList(keyList, logMissingFeatures) {
3474
4249
  var keys = [];
3475
4250
  for (var j = 0; j < keyList.length; j++) {
3476
4251
  var key = keyList[j];
3477
- 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 };
3478
4254
  var interpolation = exports.animInterpStyleEnum.decode(key.animInterpStyle);
3479
4255
  switch (animKey.Type) {
3480
4256
  case 'keyType.Opct':
@@ -3723,6 +4499,9 @@ function parseEffectObject(obj, reportErrors) {
3723
4499
  case 'antialiasGloss':
3724
4500
  result[key] = val;
3725
4501
  break;
4502
+ case '_name':
4503
+ case '_classID':
4504
+ break;
3726
4505
  default:
3727
4506
  reportErrors && console.log("Invalid effect key: '".concat(key, "', value:"), val);
3728
4507
  }
@@ -4075,25 +4854,25 @@ function parseColor(color) {
4075
4854
  exports.parseColor = parseColor;
4076
4855
  function serializeColor(color) {
4077
4856
  if (!color) {
4078
- return { 'Rd ': 0, 'Grn ': 0, 'Bl ': 0 };
4857
+ return { _name: '', _classID: 'RGBC', 'Rd ': 0, 'Grn ': 0, 'Bl ': 0 };
4079
4858
  }
4080
4859
  else if ('r' in color) {
4081
- 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 };
4082
4861
  }
4083
4862
  else if ('fr' in color) {
4084
- return { redFloat: color.fr, greenFloat: color.fg, blueFloat: color.fb };
4863
+ return { _name: '', _classID: 'XXXX', redFloat: color.fr, greenFloat: color.fg, blueFloat: color.fb };
4085
4864
  }
4086
4865
  else if ('h' in color) {
4087
- 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 };
4088
4867
  }
4089
4868
  else if ('c' in color) {
4090
- 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 };
4091
4870
  }
4092
4871
  else if ('l' in color) {
4093
- 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 };
4094
4873
  }
4095
4874
  else if ('k' in color) {
4096
- return { 'Gry ': color.k };
4875
+ return { _name: '', _classID: 'GRYC', 'Gry ': color.k };
4097
4876
  }
4098
4877
  else {
4099
4878
  throw new Error('Invalid color value');
@@ -4157,6 +4936,10 @@ function unitsPercent(value) {
4157
4936
  return { units: 'Percent', value: Math.round((value || 0) * 100) };
4158
4937
  }
4159
4938
  exports.unitsPercent = unitsPercent;
4939
+ function unitsPercentF(value) {
4940
+ return { units: 'Percent', value: (value || 0) * 100 };
4941
+ }
4942
+ exports.unitsPercentF = unitsPercentF;
4160
4943
  function unitsValue(x, key) {
4161
4944
  if (x == null)
4162
4945
  return { units: 'Pixels', value: 0 };
@@ -4172,6 +4955,11 @@ function unitsValue(x, key) {
4172
4955
  return { units: units, value: value };
4173
4956
  }
4174
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;
4175
4963
  exports.textGridding = (0, helpers_1.createEnum)('textGridding', 'none', {
4176
4964
  none: 'None',
4177
4965
  round: 'Rnd ',
@@ -4293,6 +5081,7 @@ exports.ClrS = (0, helpers_1.createEnum)('ClrS', 'rgb', {
4293
5081
  rgb: 'RGBC',
4294
5082
  hsb: 'HSBl',
4295
5083
  lab: 'LbCl',
5084
+ hsl: 'HSLC',
4296
5085
  });
4297
5086
  exports.FStl = (0, helpers_1.createEnum)('FStl', 'outside', {
4298
5087
  outside: 'OutF',
@@ -4339,6 +5128,142 @@ exports.strokeStyleLineAlignment = (0, helpers_1.createEnum)('strokeStyleLineAli
4339
5128
  center: 'strokeStyleAlignCenter',
4340
5129
  outside: 'strokeStyleAlignOutside',
4341
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
+ });
4342
5267
 
4343
5268
  },{"./helpers":7,"./psdReader":11,"./psdWriter":12}],5:[function(require,module,exports){
4344
5269
  "use strict";
@@ -5734,15 +6659,14 @@ function (// Timeline Information
5734
6659
  target) { return target.timelineInformation !== undefined; }, function (reader, target, _, options) {
5735
6660
  var _a, _b;
5736
6661
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
5737
- // console.log('1075', require('util').inspect(desc, false, 99, true));
5738
6662
  target.timelineInformation = {
5739
6663
  enabled: desc.enab,
5740
- frameStep: desc.frameStep,
6664
+ frameStep: (0, descriptor_1.frac)(desc.frameStep),
5741
6665
  frameRate: desc.frameRate,
5742
- time: desc.time,
5743
- duration: desc.duration,
5744
- workInTime: desc.workInTime,
5745
- 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),
5746
6670
  repeats: desc.LCnt,
5747
6671
  hasMotion: desc.hasMotion,
5748
6672
  globalTracks: (0, descriptor_1.parseTrackList)(desc.globalTrackList, !!options.logMissingFeatures),
@@ -5755,10 +6679,10 @@ target) { return target.timelineInformation !== undefined; }, function (reader,
5755
6679
  var clipID = _a.clipID, timeScope = _a.timeScope, muted = _a.muted, audioLevel = _a.audioLevel, frameReader = _a.frameReader;
5756
6680
  return ({
5757
6681
  id: clipID,
5758
- start: timeScope.Strt,
5759
- duration: timeScope.duration,
5760
- inTime: timeScope.inTime,
5761
- 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),
5762
6686
  muted: muted,
5763
6687
  audioLevel: audioLevel,
5764
6688
  frameReader: {
@@ -5819,14 +6743,12 @@ target) { return target.timelineInformation !== undefined; }, function (reader,
5819
6743
  },
5820
6744
  hasMotion: timeline.hasMotion,
5821
6745
  };
5822
- // console.log('WRITE:1075', require('util').inspect(desc, false, 99, true));
5823
6746
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc, 'anim');
5824
6747
  });
5825
6748
  addHandler(1076, // Sheet Disclosure
5826
6749
  function (// Sheet Disclosure
5827
6750
  target) { return target.sheetDisclosure !== undefined; }, function (reader, target) {
5828
6751
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
5829
- // console.log('1076', require('util').inspect(desc, false, 99, true));
5830
6752
  target.sheetDisclosure = {};
5831
6753
  if (desc.sheetTimelineOptions) {
5832
6754
  target.sheetDisclosure.sheetTimelineOptions = desc.sheetTimelineOptions.map(function (o) { return ({
@@ -5944,7 +6866,6 @@ target) { return target.slices ? target.slices.length : 0; }, function (reader,
5944
6866
  backgroundColorType: backgroundColorType,
5945
6867
  backgroundColor: { r: r, g: g, b: b, a: a },
5946
6868
  });
5947
- // console.log(require('util').inspect(slices[slices.length - 1], false, 99, true));
5948
6869
  }
5949
6870
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
5950
6871
  desc.slices.forEach(function (d) {
@@ -5956,12 +6877,9 @@ target) { return target.slices ? target.slices.length : 0; }, function (reader,
5956
6877
  slice.rightOutset = d.rightOutset;
5957
6878
  }
5958
6879
  });
5959
- // console.log(require('util').inspect(desc, false, 99, true));
5960
- // console.log(require('util').inspect(target.slices, false, 99, true));
5961
6880
  }
5962
6881
  else if (version == 7 || version == 8) {
5963
6882
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
5964
- // console.log(require('util').inspect(desc, false, 99, true));
5965
6883
  if (!target.slices)
5966
6884
  target.slices = [];
5967
6885
  target.slices.push({
@@ -6176,7 +7094,6 @@ addHandler(7001, function (target) { return target.imageReadyDataSets !== undefi
6176
7094
  });
6177
7095
  addHandler(1088, function (target) { return target.pathSelectionState !== undefined; }, function (reader, target, _left) {
6178
7096
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
6179
- // console.log(require('util').inspect(desc, false, 99, true));
6180
7097
  target.pathSelectionState = desc['null'];
6181
7098
  }, function (writer, target) {
6182
7099
  var desc = { 'null': target.pathSelectionState };
@@ -6422,7 +7339,7 @@ var __assign = (this && this.__assign) || function () {
6422
7339
  return __assign.apply(this, arguments);
6423
7340
  };
6424
7341
  Object.defineProperty(exports, "__esModule", { value: true });
6425
- 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;
6426
7343
  var pako_1 = require("pako");
6427
7344
  var helpers_1 = require("./helpers");
6428
7345
  var additionalInfo_1 = require("./additionalInfo");
@@ -6467,6 +7384,11 @@ function readUint16(reader) {
6467
7384
  return reader.view.getUint16(reader.offset - 2, false);
6468
7385
  }
6469
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;
6470
7392
  function readInt32(reader) {
6471
7393
  reader.offset += 4;
6472
7394
  return reader.view.getInt32(reader.offset - 4, false);
@@ -6550,6 +7472,17 @@ function readUnicodeStringWithLength(reader, length) {
6550
7472
  return text;
6551
7473
  }
6552
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;
6553
7486
  function readAsciiString(reader, length) {
6554
7487
  var text = '';
6555
7488
  while (length--) {
@@ -6757,14 +7690,14 @@ function readLayerRecord(reader, psd, options) {
6757
7690
  var channelCount = readUint16(reader);
6758
7691
  var channels = [];
6759
7692
  for (var i = 0; i < channelCount; i++) {
6760
- var channelID = readInt16(reader);
6761
- var channelLength = readUint32(reader);
7693
+ var id = readInt16(reader);
7694
+ var length_1 = readUint32(reader);
6762
7695
  if (options.large) {
6763
- if (channelLength !== 0)
7696
+ if (length_1 !== 0)
6764
7697
  throw new Error('Sizes larger than 4GB are not supported');
6765
- channelLength = readUint32(reader);
7698
+ length_1 = readUint32(reader);
6766
7699
  }
6767
- channels.push({ id: channelID, length: channelLength });
7700
+ channels.push({ id: id, length: length_1 });
6768
7701
  }
6769
7702
  checkSignature(reader, '8BIM');
6770
7703
  var blendMode = readSignature(reader);
@@ -6776,11 +7709,12 @@ function readLayerRecord(reader, psd, options) {
6776
7709
  var flags = readUint8(reader);
6777
7710
  layer.transparencyProtected = (flags & 0x01) !== 0;
6778
7711
  layer.hidden = (flags & 0x02) !== 0;
7712
+ if (flags & 0x20)
7713
+ layer.effectsOpen = true;
6779
7714
  // 0x04 - obsolete
6780
7715
  // 0x08 - 1 for Photoshop 5.0 and later, tells if bit 4 has useful information
6781
7716
  // 0x10 - pixel data irrelevant to appearance of document
6782
- // 0x20 - ???
6783
- // if (flags & 0x20) (layer as any)._2 = true; // TEMP !!!!
7717
+ // 0x20 - effects/filters panel is expanded
6784
7718
  skipBytes(reader, 1);
6785
7719
  readSection(reader, 1, function (left) {
6786
7720
  var mask = readLayerMaskData(reader, options);
@@ -7184,9 +8118,9 @@ function readDataRLE(reader, pixelData, _width, height, step, offsets, large) {
7184
8118
  }
7185
8119
  else {
7186
8120
  for (var y = 0, p = offset | 0; y < height; y++, li++) {
7187
- var length_1 = lengths[li];
7188
- var buffer = readBytes(reader, length_1);
7189
- 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++) {
7190
8124
  var header = buffer[i];
7191
8125
  if (header > 128) {
7192
8126
  var value = buffer[++i];
@@ -7330,7 +8264,7 @@ function readPattern(reader) {
7330
8264
  var has = readUint32(reader);
7331
8265
  if (!has)
7332
8266
  continue;
7333
- var length_2 = readUint32(reader);
8267
+ var length_3 = readUint32(reader);
7334
8268
  var pixelDepth = readUint32(reader);
7335
8269
  var ctop = readUint32(reader);
7336
8270
  var cleft = readUint32(reader);
@@ -7338,7 +8272,7 @@ function readPattern(reader) {
7338
8272
  var cright = readUint32(reader);
7339
8273
  var pixelDepth2 = readUint16(reader);
7340
8274
  var compressionMode = readUint8(reader); // 0 - raw, 1 - zip
7341
- var dataLength = length_2 - (4 + 16 + 2 + 1);
8275
+ var dataLength = length_3 - (4 + 16 + 2 + 1);
7342
8276
  var cdata = readBytes(reader, dataLength);
7343
8277
  if (pixelDepth !== 8 || pixelDepth2 !== 8) {
7344
8278
  throw new Error('16bit pixel depth not supported for patterns');
@@ -7409,7 +8343,7 @@ var __assign = (this && this.__assign) || function () {
7409
8343
  return __assign.apply(this, arguments);
7410
8344
  };
7411
8345
  Object.defineProperty(exports, "__esModule", { value: true });
7412
- 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;
7413
8347
  var helpers_1 = require("./helpers");
7414
8348
  var additionalInfo_1 = require("./additionalInfo");
7415
8349
  var imageResources_1 = require("./imageResources");
@@ -7444,11 +8378,21 @@ function writeUint16(writer, value) {
7444
8378
  writer.view.setUint16(offset, value, false);
7445
8379
  }
7446
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;
7447
8386
  function writeInt32(writer, value) {
7448
8387
  var offset = addSize(writer, 4);
7449
8388
  writer.view.setInt32(offset, value, false);
7450
8389
  }
7451
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;
7452
8396
  function writeUint32(writer, value) {
7453
8397
  var offset = addSize(writer, 4);
7454
8398
  writer.view.setUint32(offset, value, false);
@@ -7509,12 +8453,22 @@ function writePascalString(writer, text, padTo) {
7509
8453
  }
7510
8454
  }
7511
8455
  exports.writePascalString = writePascalString;
7512
- function writeUnicodeString(writer, text) {
7513
- writeUint32(writer, text.length);
8456
+ function writeUnicodeStringWithoutLength(writer, text) {
7514
8457
  for (var i = 0; i < text.length; i++) {
7515
8458
  writeUint16(writer, text.charCodeAt(i));
7516
8459
  }
7517
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
+ }
7518
8472
  exports.writeUnicodeString = writeUnicodeString;
7519
8473
  function writeUnicodeStringWithPadding(writer, text) {
7520
8474
  writeUint32(writer, text.length + 1);
@@ -7685,10 +8639,8 @@ function writeLayerInfo(tempBuffer, writer, psd, globalAlpha, options) {
7685
8639
  if (layer.vectorMask || (layer.sectionDivider && layer.sectionDivider.type !== 0 /* SectionDividerType.Other */)) {
7686
8640
  flags |= 0x10; // pixel data irrelevant to appearance of document
7687
8641
  }
7688
- if (layer.effects && (0, additionalInfo_1.hasMultiEffects)(layer.effects)) { // TODO: this is not correct
7689
- flags |= 0x20; // just guessing this one, might be completely incorrect
7690
- }
7691
- // if ('_2' in layer) flags |= 0x20; // TEMP!!!
8642
+ if (layer.effectsOpen)
8643
+ flags |= 0x20;
7692
8644
  writeUint8(writer, flags);
7693
8645
  writeUint8(writer, 0); // filler
7694
8646
  writeSection(writer, 1, function () {