ag-psd 21.0.2 → 22.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bundle.js CHANGED
@@ -689,14 +689,14 @@ addHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left)
689
689
  (0, psdWriter_1.writeInt32)(writer, 1); // version
690
690
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
691
691
  });
692
- addHandler('lmfx', function (target) { return target.effects !== undefined && hasMultiEffects(target.effects); }, function (reader, target, left, _, options) {
692
+ addHandler('lmfx', function (target) { return target.effects !== undefined && hasMultiEffects(target.effects); }, function (reader, target, left) {
693
693
  var version = (0, psdReader_1.readUint32)(reader);
694
694
  if (version !== 0)
695
695
  throw new Error('Invalid lmfx version');
696
696
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
697
697
  // console.log(require('util').inspect(info, false, 99, true));
698
698
  // discard if read in 'lrFX' or 'lfx2' section
699
- target.effects = (0, descriptor_1.parseEffects)(desc, !!options.logMissingFeatures);
699
+ target.effects = (0, descriptor_1.parseEffects)(desc, !!reader.logMissingFeatures);
700
700
  (0, psdReader_1.skipBytes)(reader, left());
701
701
  }, function (writer, target, _, options) {
702
702
  var desc = (0, descriptor_1.serializeEffects)(target.effects, !!options.logMissingFeatures, true);
@@ -711,7 +711,20 @@ addHandler('lrFX', hasKey('effects'), function (reader, target, left) {
711
711
  (0, effectsHelpers_1.writeEffects)(writer, target.effects);
712
712
  });
713
713
  addHandler('luni', hasKey('name'), function (reader, target, left) {
714
- target.name = (0, psdReader_1.readUnicodeString)(reader);
714
+ if (left() > 4) {
715
+ var length_1 = (0, psdReader_1.readUint32)(reader);
716
+ if (left() >= (length_1 * 2)) {
717
+ target.name = (0, psdReader_1.readUnicodeStringWithLength)(reader, length_1);
718
+ }
719
+ else {
720
+ if (reader.logDevFeatures)
721
+ reader.log('name in luni section is too long');
722
+ }
723
+ }
724
+ else {
725
+ if (reader.logDevFeatures)
726
+ reader.log('empty luni section');
727
+ }
715
728
  (0, psdReader_1.skipBytes)(reader, left());
716
729
  }, function (writer, target) {
717
730
  (0, psdWriter_1.writeUnicodeString)(writer, target.name);
@@ -802,7 +815,7 @@ addHandler('lclr', hasKey('layerColor'), function (reader, target) {
802
815
  (0, psdWriter_1.writeZeros)(writer, 6);
803
816
  });
804
817
  addHandler('shmd', function (target) { return target.timestamp !== undefined || target.animationFrames !== undefined ||
805
- target.animationFrameFlags !== undefined || target.timeline !== undefined || target.comps !== undefined; }, function (reader, target, left, _, options) {
818
+ target.animationFrameFlags !== undefined || target.timeline !== undefined || target.comps !== undefined; }, function (reader, target, left) {
806
819
  var count = (0, psdReader_1.readUint32)(reader);
807
820
  var _loop_1 = function (i) {
808
821
  (0, psdReader_1.checkSignature)(reader, '8BIM');
@@ -830,7 +843,7 @@ addHandler('shmd', function (target) { return target.timestamp !== undefined ||
830
843
  if (f.FXRf)
831
844
  frame.referencePoint = (0, descriptor_1.horzVrtcToXY)(f.FXRf);
832
845
  if (f.Lefx)
833
- frame.effects = (0, descriptor_1.parseEffects)(f.Lefx, !!options.logMissingFeatures);
846
+ frame.effects = (0, descriptor_1.parseEffects)(f.Lefx, !!reader.logMissingFeatures);
834
847
  if (f.blendOptions && f.blendOptions.Opct)
835
848
  frame.opacity = (0, descriptor_1.parsePercent)(f.blendOptions.Opct);
836
849
  target.animationFrames.push(frame);
@@ -861,7 +874,7 @@ addHandler('shmd', function (target) { return target.timestamp !== undefined ||
861
874
  audioLevel: desc.audioLevel,
862
875
  };
863
876
  if (desc.trackList) {
864
- timeline.tracks = (0, descriptor_1.parseTrackList)(desc.trackList, !!options.logMissingFeatures);
877
+ timeline.tracks = (0, descriptor_1.parseTrackList)(desc.trackList, !!reader.logMissingFeatures);
865
878
  }
866
879
  target.timeline = timeline;
867
880
  // console.log('tmln:result', target.name, target.id, require('util').inspect(timeline, false, 99, true));
@@ -887,7 +900,7 @@ addHandler('shmd', function (target) { return target.timestamp !== undefined ||
887
900
  }
888
901
  }
889
902
  else {
890
- options.logMissingFeatures && console.log('Unhandled "shmd" section key', key);
903
+ reader.logMissingFeatures && reader.log('Unhandled "shmd" section key', key);
891
904
  }
892
905
  (0, psdReader_1.skipBytes)(reader, left());
893
906
  });
@@ -2101,7 +2114,7 @@ function getWarpFromPlacedLayer(placed) {
2101
2114
  },
2102
2115
  };
2103
2116
  }
2104
- addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left, _, options) {
2117
+ addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
2105
2118
  if ((0, psdReader_1.readSignature)(reader) !== 'soLD')
2106
2119
  throw new Error("Invalid SoLd type");
2107
2120
  var version = (0, psdReader_1.readInt32)(reader);
@@ -2144,7 +2157,7 @@ addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left, _, opt
2144
2157
  };
2145
2158
  }
2146
2159
  if (desc.filterFX)
2147
- target.placedLayer.filter = parseFilterFX(desc.filterFX, options);
2160
+ target.placedLayer.filter = parseFilterFX(desc.filterFX, reader);
2148
2161
  // console.log('filter', require('util').inspect(target.placedLayer.filter, false, 99, true));
2149
2162
  (0, psdReader_1.skipBytes)(reader, left()); // HACK
2150
2163
  }, function (writer, target) {
@@ -2215,12 +2228,12 @@ addHandler('fxrp', hasKey('referencePoint'), function (reader, target) {
2215
2228
  (0, psdWriter_1.writeFloat64)(writer, target.referencePoint.x);
2216
2229
  (0, psdWriter_1.writeFloat64)(writer, target.referencePoint.y);
2217
2230
  });
2218
- addHandler('Lr16', function () { return false; }, function (reader, _target, _left, psd, options) {
2219
- (0, psdReader_1.readLayerInfo)(reader, psd, options);
2231
+ addHandler('Lr16', function () { return false; }, function (reader, _target, _left, psd) {
2232
+ (0, psdReader_1.readLayerInfo)(reader, psd);
2220
2233
  }, function (_writer, _target) {
2221
2234
  });
2222
- addHandler('Lr32', function () { return false; }, function (reader, _target, _left, psd, options) {
2223
- (0, psdReader_1.readLayerInfo)(reader, psd, options);
2235
+ addHandler('Lr32', function () { return false; }, function (reader, _target, _left, psd) {
2236
+ (0, psdReader_1.readLayerInfo)(reader, psd);
2224
2237
  }, function (_writer, _target) {
2225
2238
  });
2226
2239
  addHandler('LMsk', hasKey('userMask'), function (reader, target) {
@@ -2418,7 +2431,7 @@ addHandler('Anno', function (target) { return target.annotations !== undefined;
2418
2431
  writer.view.setUint32(dataOffset - 4, writer.offset - dataOffset, false);
2419
2432
  }
2420
2433
  });
2421
- addHandler('lnk2', function (target) { return !!target.linkedFiles && target.linkedFiles.length > 0; }, function (reader, target, left, _, options) {
2434
+ addHandler('lnk2', function (target) { return !!target.linkedFiles && target.linkedFiles.length > 0; }, function (reader, target, left) {
2422
2435
  var psd = target;
2423
2436
  psd.linkedFiles = psd.linkedFiles || [];
2424
2437
  while (left() > 8) {
@@ -2474,7 +2487,7 @@ addHandler('lnk2', function (target) { return !!target.linkedFiles && target.lin
2474
2487
  file.assetLockedState = (0, psdReader_1.readUint8)(reader);
2475
2488
  if (type === 'liFE' && version === 2)
2476
2489
  file.data = (0, psdReader_1.readBytes)(reader, fileSize);
2477
- if (options.skipLinkedFilesData)
2490
+ if (reader.skipLinkedFilesData)
2478
2491
  file.data = undefined;
2479
2492
  psd.linkedFiles.push(file);
2480
2493
  linkedFileDescriptor;
@@ -3390,7 +3403,7 @@ function hasMultiEffects(effects) {
3390
3403
  return Object.keys(effects).map(function (key) { return effects[key]; }).some(function (v) { return Array.isArray(v) && v.length > 1; });
3391
3404
  }
3392
3405
  exports.hasMultiEffects = hasMultiEffects;
3393
- addHandler('lfx2', function (target) { return target.effects !== undefined && !hasMultiEffects(target.effects); }, function (reader, target, left, _, options) {
3406
+ addHandler('lfx2', function (target) { return target.effects !== undefined && !hasMultiEffects(target.effects); }, function (reader, target, left) {
3394
3407
  var version = (0, psdReader_1.readUint32)(reader);
3395
3408
  if (version !== 0)
3396
3409
  throw new Error("Invalid lfx2 version");
@@ -3398,7 +3411,7 @@ addHandler('lfx2', function (target) { return target.effects !== undefined && !h
3398
3411
  // console.log('READ', require('util').inspect(desc, false, 99, true));
3399
3412
  // TODO: don't discard if we got it from lmfx
3400
3413
  // discard if read in 'lrFX' section
3401
- target.effects = (0, descriptor_1.parseEffects)(desc, !!options.logMissingFeatures);
3414
+ target.effects = (0, descriptor_1.parseEffects)(desc, !!reader.logMissingFeatures);
3402
3415
  (0, psdReader_1.skipBytes)(reader, left());
3403
3416
  }, function (writer, target, _, options) {
3404
3417
  var desc = (0, descriptor_1.serializeEffects)(target.effects, !!options.logMissingFeatures, true);
@@ -5337,6 +5350,7 @@ exports.gradientInterpolationMethodType = (0, helpers_1.createEnum)('gradientInt
5337
5350
  perceptual: 'Perc',
5338
5351
  linear: 'Lnr',
5339
5352
  classic: 'Gcls',
5353
+ smooth: 'Smoo',
5340
5354
  });
5341
5355
  exports.ClrS = (0, helpers_1.createEnum)('ClrS', 'rgb', {
5342
5356
  rgb: 'RGBC',
@@ -7000,7 +7014,7 @@ target) { return target.onionSkins !== undefined; }, function (reader, target) {
7000
7014
  });
7001
7015
  addHandler(1075, // Timeline Information
7002
7016
  function (// Timeline Information
7003
- target) { return target.timelineInformation !== undefined; }, function (reader, target, _, options) {
7017
+ target) { return target.timelineInformation !== undefined; }, function (reader, target) {
7004
7018
  var _a, _b;
7005
7019
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
7006
7020
  target.timelineInformation = {
@@ -7013,7 +7027,7 @@ target) { return target.timelineInformation !== undefined; }, function (reader,
7013
7027
  workOutTime: (0, descriptor_1.frac)(desc.workOutTime),
7014
7028
  repeats: desc.LCnt,
7015
7029
  hasMotion: desc.hasMotion,
7016
- globalTracks: (0, descriptor_1.parseTrackList)(desc.globalTrackList, !!options.logMissingFeatures),
7030
+ globalTracks: (0, descriptor_1.parseTrackList)(desc.globalTrackList, !!reader.logMissingFeatures),
7017
7031
  };
7018
7032
  if ((_b = (_a = desc.audioClipGroupList) === null || _a === void 0 ? void 0 : _a.audioClipGroupList) === null || _b === void 0 ? void 0 : _b.length) {
7019
7033
  target.timelineInformation.audioClipGroups = desc.audioClipGroupList.audioClipGroupList.map(function (g) { return ({
@@ -7120,12 +7134,12 @@ target) { return target.sheetDisclosure !== undefined; }, function (reader, targ
7120
7134
  });
7121
7135
  addHandler(1054, // URL List
7122
7136
  function (// URL List
7123
- target) { return target.urlsList !== undefined; }, function (reader, target, _, options) {
7137
+ target) { return target.urlsList !== undefined; }, function (reader, target) {
7124
7138
  var count = (0, psdReader_1.readUint32)(reader);
7125
7139
  target.urlsList = [];
7126
7140
  for (var i = 0; i < count; i++) {
7127
7141
  var long = (0, psdReader_1.readSignature)(reader);
7128
- if (long !== 'slic' && options.throwForMissingFeatures)
7142
+ if (long !== 'slic' && reader.throwForMissingFeatures)
7129
7143
  throw new Error('Unknown long');
7130
7144
  var id = (0, psdReader_1.readUint32)(reader);
7131
7145
  var url = (0, psdReader_1.readUnicodeString)(reader);
@@ -7319,7 +7333,7 @@ target) { return target._ir1039 !== undefined; }, function (reader, target, left
7319
7333
  (0, psdWriter_1.writeBytes)(writer, target._ir1039);
7320
7334
  });
7321
7335
  addHandler(1044, function (target) { return target.idsSeedNumber !== undefined; }, function (reader, target) { return target.idsSeedNumber = (0, psdReader_1.readUint32)(reader); }, function (writer, target) { return (0, psdWriter_1.writeUint32)(writer, target.idsSeedNumber); });
7322
- addHandler(1036, function (target) { return target.thumbnail !== undefined || target.thumbnailRaw !== undefined; }, function (reader, target, left, options) {
7336
+ addHandler(1036, function (target) { return target.thumbnail !== undefined || target.thumbnailRaw !== undefined; }, function (reader, target, left) {
7323
7337
  var format = (0, psdReader_1.readUint32)(reader); // 1 = kJpegRGB, 0 = kRawRGB
7324
7338
  var width = (0, psdReader_1.readUint32)(reader);
7325
7339
  var height = (0, psdReader_1.readUint32)(reader);
@@ -7329,13 +7343,13 @@ addHandler(1036, function (target) { return target.thumbnail !== undefined || ta
7329
7343
  var bitsPerPixel = (0, psdReader_1.readUint16)(reader); // 24
7330
7344
  var planes = (0, psdReader_1.readUint16)(reader); // 1
7331
7345
  if (format !== 1 || bitsPerPixel !== 24 || planes !== 1) {
7332
- options.logMissingFeatures && console.log("Invalid thumbnail data (format: ".concat(format, ", bitsPerPixel: ").concat(bitsPerPixel, ", planes: ").concat(planes, ")"));
7346
+ reader.logMissingFeatures && reader.log("Invalid thumbnail data (format: ".concat(format, ", bitsPerPixel: ").concat(bitsPerPixel, ", planes: ").concat(planes, ")"));
7333
7347
  (0, psdReader_1.skipBytes)(reader, left());
7334
7348
  return;
7335
7349
  }
7336
7350
  var size = left();
7337
7351
  var data = (0, psdReader_1.readBytes)(reader, size);
7338
- if (options.useRawThumbnail) {
7352
+ if (reader.useRawThumbnail) {
7339
7353
  target.thumbnailRaw = { width: width, height: height, data: data };
7340
7354
  }
7341
7355
  else if (data.byteLength) {
@@ -7345,22 +7359,22 @@ addHandler(1036, function (target) { return target.thumbnail !== undefined || ta
7345
7359
  var _a;
7346
7360
  var width = 0;
7347
7361
  var height = 0;
7348
- var data;
7362
+ var data = new Uint8Array(0);
7349
7363
  if (target.thumbnailRaw) {
7350
7364
  width = target.thumbnailRaw.width;
7351
7365
  height = target.thumbnailRaw.height;
7352
7366
  data = target.thumbnailRaw.data;
7353
7367
  }
7354
7368
  else {
7355
- var dataUrl = (_a = target.thumbnail.toDataURL('image/jpeg', 1)) === null || _a === void 0 ? void 0 : _a.substring('data:image/jpeg;base64,'.length);
7356
- if (dataUrl) {
7357
- width = target.thumbnail.width;
7358
- height = target.thumbnail.height;
7359
- data = (0, base64_js_1.toByteArray)(dataUrl);
7360
- }
7361
- else {
7362
- data = new Uint8Array(0);
7369
+ try {
7370
+ var dataUrl = (_a = target.thumbnail.toDataURL('image/jpeg', 1)) === null || _a === void 0 ? void 0 : _a.substring('data:image/jpeg;base64,'.length);
7371
+ if (dataUrl) {
7372
+ data = (0, base64_js_1.toByteArray)(dataUrl); // this sometimes fails for some reason, maybe some browser bugs
7373
+ width = target.thumbnail.width;
7374
+ height = target.thumbnail.height;
7375
+ }
7363
7376
  }
7377
+ catch (_b) { }
7364
7378
  }
7365
7379
  var bitsPerPixel = 24;
7366
7380
  var widthBytes = Math.floor((width * bitsPerPixel + 31) / 32) * 4;
@@ -7434,8 +7448,7 @@ var FrmD = (0, helpers_1.createEnum)('FrmD', '', {
7434
7448
  });
7435
7449
  addHandler(4000, // Plug-In resource(s)
7436
7450
  function (// Plug-In resource(s)
7437
- target) { return target.animations !== undefined; }, function (reader, target, left, _a) {
7438
- var logMissingFeatures = _a.logMissingFeatures, logDevFeatures = _a.logDevFeatures;
7451
+ target) { return target.animations !== undefined; }, function (reader, target, left) {
7439
7452
  var key = (0, psdReader_1.readSignature)(reader);
7440
7453
  if (key === 'mani') {
7441
7454
  (0, psdReader_1.checkSignature)(reader, 'IRFR');
@@ -7466,10 +7479,10 @@ target) { return target.animations !== undefined; }, function (reader, target, l
7466
7479
  }
7467
7480
  else if (key_1 === 'Roll') {
7468
7481
  var bytes = (0, psdReader_1.readBytes)(reader, left());
7469
- logDevFeatures && console.log('#4000 Roll', bytes);
7482
+ reader.logDevFeatures && reader.log('#4000 Roll', bytes);
7470
7483
  }
7471
7484
  else {
7472
- logMissingFeatures && console.log('Unhandled subsection in #4000', key_1);
7485
+ reader.logMissingFeatures && reader.log('Unhandled subsection in #4000', key_1);
7473
7486
  }
7474
7487
  });
7475
7488
  };
@@ -7480,10 +7493,10 @@ target) { return target.animations !== undefined; }, function (reader, target, l
7480
7493
  }
7481
7494
  else if (key === 'mopt') {
7482
7495
  var bytes = (0, psdReader_1.readBytes)(reader, left());
7483
- logDevFeatures && console.log('#4000 mopt', bytes);
7496
+ reader.logDevFeatures && reader.log('#4000 mopt', bytes);
7484
7497
  }
7485
7498
  else {
7486
- logMissingFeatures && console.log('Unhandled key in #4000:', key);
7499
+ reader.logMissingFeatures && reader.log('Unhandled key in #4000:', key);
7487
7500
  }
7488
7501
  }, function (writer, target) {
7489
7502
  if (target.animations) {
@@ -7532,8 +7545,7 @@ target) { return target.animations !== undefined; }, function (reader, target, l
7532
7545
  // TODO: Unfinished
7533
7546
  helpers_1.MOCK_HANDLERS && addHandler(4001, // Plug-In resource(s)
7534
7547
  function (// Plug-In resource(s)
7535
- target) { return target._ir4001 !== undefined; }, function (reader, target, left, _a) {
7536
- var logMissingFeatures = _a.logMissingFeatures, logDevFeatures = _a.logDevFeatures;
7548
+ target) { return target._ir4001 !== undefined; }, function (reader, target, left) {
7537
7549
  if (helpers_1.MOCK_HANDLERS) {
7538
7550
  LOG_MOCK_HANDLERS && console.log('image resource 4001', left());
7539
7551
  target._ir4001 = (0, psdReader_1.readBytes)(reader, left());
@@ -7546,14 +7558,14 @@ target) { return target._ir4001 !== undefined; }, function (reader, target, left
7546
7558
  throw new Error('Invalid mfri version');
7547
7559
  var length_1 = (0, psdReader_1.readUint32)(reader);
7548
7560
  var bytes = (0, psdReader_1.readBytes)(reader, length_1);
7549
- logDevFeatures && console.log('mfri', bytes);
7561
+ reader.logDevFeatures && reader.log('mfri', bytes);
7550
7562
  }
7551
7563
  else if (key === 'mset') {
7552
7564
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
7553
- logDevFeatures && console.log('mset', desc);
7565
+ reader.logDevFeatures && reader.log('mset', desc);
7554
7566
  }
7555
7567
  else {
7556
- logMissingFeatures && console.log('Unhandled key in #4001', key);
7568
+ reader.logMissingFeatures && reader.log('Unhandled key in #4001', key);
7557
7569
  }
7558
7570
  }, function (writer, target) {
7559
7571
  (0, psdWriter_1.writeBytes)(writer, target._ir4001);
@@ -7656,19 +7668,8 @@ var LayerCompCapturedInfo;
7656
7668
 
7657
7669
  },{}],11:[function(require,module,exports){
7658
7670
  "use strict";
7659
- var __assign = (this && this.__assign) || function () {
7660
- __assign = Object.assign || function(t) {
7661
- for (var s, i = 1, n = arguments.length; i < n; i++) {
7662
- s = arguments[i];
7663
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7664
- t[p] = s[p];
7665
- }
7666
- return t;
7667
- };
7668
- return __assign.apply(this, arguments);
7669
- };
7670
7671
  Object.defineProperty(exports, "__esModule", { value: true });
7671
- exports.readPattern = exports.readColor = exports.readSection = exports.readDataRLE = exports.readDataZip = exports.readAdditionalLayerInfo = exports.readGlobalLayerMaskInfo = exports.readLayerInfo = 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;
7672
+ exports.readPattern = exports.readColor = exports.readSection = exports.readDataRLE = exports.readDataZip = exports.readAdditionalLayerInfo = exports.readGlobalLayerMaskInfo = exports.readLayerInfo = exports.readPsd = exports.checkSignature = exports.skipBytes = exports.readAsciiString = exports.readUnicodeStringWithLengthLE = exports.readUnicodeStringWithLength = exports.readUnicodeString = exports.readPascalString = exports.validSignatureAt = 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;
7672
7673
  var pako_1 = require("pako");
7673
7674
  var helpers_1 = require("./helpers");
7674
7675
  var additionalInfo_1 = require("./additionalInfo");
@@ -7684,14 +7685,14 @@ function setupGrayscale(data) {
7684
7685
  }
7685
7686
  function createReader(buffer, offset, length) {
7686
7687
  var view = new DataView(buffer, offset, length);
7687
- return { view: view, offset: 0, strict: false, debug: false };
7688
+ return { view: view, offset: 0, strict: false, debug: false, large: false, globalAlpha: false, log: console.log };
7688
7689
  }
7689
7690
  exports.createReader = createReader;
7690
7691
  function warnOrThrow(reader, message) {
7691
7692
  if (reader.strict)
7692
7693
  throw new Error(message);
7693
7694
  if (reader.debug)
7694
- console.warn(message);
7695
+ reader.log(message);
7695
7696
  }
7696
7697
  exports.warnOrThrow = warnOrThrow;
7697
7698
  function readUint8(reader) {
@@ -7776,6 +7777,14 @@ function readSignature(reader) {
7776
7777
  return readShortString(reader, 4);
7777
7778
  }
7778
7779
  exports.readSignature = readSignature;
7780
+ function validSignatureAt(reader, offset) {
7781
+ var sig = String.fromCharCode(reader.view.getUint8(offset))
7782
+ + String.fromCharCode(reader.view.getUint8(offset + 1))
7783
+ + String.fromCharCode(reader.view.getUint8(offset + 2))
7784
+ + String.fromCharCode(reader.view.getUint8(offset + 3));
7785
+ return sig == '8BIM' || sig == '8B64';
7786
+ }
7787
+ exports.validSignatureAt = validSignatureAt;
7779
7788
  function readPascalString(reader, padTo) {
7780
7789
  var length = readUint8(reader);
7781
7790
  var text = length ? readShortString(reader, length) : '';
@@ -7867,7 +7876,9 @@ function readPsd(reader, readOptions) {
7867
7876
  if (exports.supportedColorModes.indexOf(colorMode) === -1)
7868
7877
  throw new Error("Color mode not supported: ".concat((_a = colorModes[colorMode]) !== null && _a !== void 0 ? _a : colorMode));
7869
7878
  var psd = { width: width, height: height, channels: channels, bitsPerChannel: bitsPerChannel, colorMode: colorMode };
7870
- var options = __assign(__assign({}, readOptions), { large: version === 2, globalAlpha: false });
7879
+ Object.assign(reader, readOptions);
7880
+ reader.large = version === 2;
7881
+ reader.globalAlpha = false;
7871
7882
  var fixOffsets = [0, 1, -1, 2, -2, 3, -3, 4, -4];
7872
7883
  // color mode data
7873
7884
  readSection(reader, 1, function (left) {
@@ -7905,16 +7916,16 @@ function readPsd(reader, readOptions) {
7905
7916
  readPascalString(reader, 2); // name
7906
7917
  readSection(reader, 2, function (left) {
7907
7918
  var handler = imageResources_1.resourceHandlersMap[id];
7908
- var skip = id === 1036 && !!options.skipThumbnail;
7919
+ var skip = id === 1036 && !!reader.skipThumbnail;
7909
7920
  if (!psd.imageResources) {
7910
7921
  psd.imageResources = {};
7911
7922
  }
7912
7923
  if (handler && !skip) {
7913
7924
  try {
7914
- handler.read(reader, psd.imageResources, left, options);
7925
+ handler.read(reader, psd.imageResources, left);
7915
7926
  }
7916
7927
  catch (e) {
7917
- if (options.throwForMissingFeatures)
7928
+ if (reader.throwForMissingFeatures)
7918
7929
  throw e;
7919
7930
  skipBytes(reader, left());
7920
7931
  }
@@ -7932,9 +7943,9 @@ function readPsd(reader, readOptions) {
7932
7943
  // layer and mask info
7933
7944
  readSection(reader, 1, function (left) {
7934
7945
  readSection(reader, 2, function (left) {
7935
- readLayerInfo(reader, psd, options);
7946
+ readLayerInfo(reader, psd);
7936
7947
  skipBytes(reader, left());
7937
- }, undefined, options.large);
7948
+ }, undefined, reader.large);
7938
7949
  // SAI does not include this section
7939
7950
  if (left() > 0) {
7940
7951
  var globalLayerMaskInfo = readGlobalLayerMaskInfo(reader);
@@ -7953,18 +7964,18 @@ function readPsd(reader, readOptions) {
7953
7964
  skipBytes(reader, 1);
7954
7965
  }
7955
7966
  if (left() >= 12) {
7956
- readAdditionalLayerInfo(reader, psd, psd, options);
7967
+ readAdditionalLayerInfo(reader, psd, psd);
7957
7968
  }
7958
7969
  else {
7959
7970
  // opt.logMissingFeatures && console.log('skipping leftover bytes', left());
7960
7971
  skipBytes(reader, left());
7961
7972
  }
7962
7973
  }
7963
- }, undefined, options.large);
7974
+ }, undefined, reader.large);
7964
7975
  var hasChildren = psd.children && psd.children.length;
7965
- var skipComposite = options.skipCompositeImageData && (options.skipLayerImageData || hasChildren);
7976
+ var skipComposite = reader.skipCompositeImageData && (reader.skipLayerImageData || hasChildren);
7966
7977
  if (!skipComposite) {
7967
- readImageData(reader, psd, options);
7978
+ readImageData(reader, psd);
7968
7979
  }
7969
7980
  // TODO: show converted color mode instead of original PSD file color mode
7970
7981
  // but add option to preserve file color mode (need to return image data instead of canvas in that case)
@@ -7972,22 +7983,23 @@ function readPsd(reader, readOptions) {
7972
7983
  return psd;
7973
7984
  }
7974
7985
  exports.readPsd = readPsd;
7975
- function readLayerInfo(reader, psd, options) {
7986
+ function readLayerInfo(reader, psd) {
7987
+ var _a, _b;
7976
7988
  var layerCount = readInt16(reader);
7977
7989
  if (layerCount < 0) {
7978
- options.globalAlpha = true;
7990
+ reader.globalAlpha = true;
7979
7991
  layerCount = -layerCount;
7980
7992
  }
7981
7993
  var layers = [];
7982
7994
  var layerChannels = [];
7983
7995
  for (var i = 0; i < layerCount; i++) {
7984
- var _a = readLayerRecord(reader, psd, options), layer = _a.layer, channels = _a.channels;
7996
+ var _c = readLayerRecord(reader, psd), layer = _c.layer, channels = _c.channels;
7985
7997
  layers.push(layer);
7986
7998
  layerChannels.push(channels);
7987
7999
  }
7988
- if (!options.skipLayerImageData) {
8000
+ if (!reader.skipLayerImageData) {
7989
8001
  for (var i = 0; i < layerCount; i++) {
7990
- readLayerChannelImageData(reader, psd, layers[i], layerChannels[i], options);
8002
+ readLayerChannelImageData(reader, psd, layers[i], layerChannels[i]);
7991
8003
  }
7992
8004
  }
7993
8005
  if (!psd.children)
@@ -7999,6 +8011,9 @@ function readLayerInfo(reader, psd, options) {
7999
8011
  if (type === 1 /* SectionDividerType.OpenFolder */ || type === 2 /* SectionDividerType.ClosedFolder */) {
8000
8012
  l.opened = type === 1 /* SectionDividerType.OpenFolder */;
8001
8013
  l.children = [];
8014
+ if ((_a = l.sectionDivider) === null || _a === void 0 ? void 0 : _a.key) {
8015
+ l.blendMode = (_b = helpers_1.toBlendMode[l.sectionDivider.key]) !== null && _b !== void 0 ? _b : l.blendMode;
8016
+ }
8002
8017
  stack[stack.length - 1].children.unshift(l);
8003
8018
  stack.push(l);
8004
8019
  }
@@ -8015,7 +8030,7 @@ function readLayerInfo(reader, psd, options) {
8015
8030
  }
8016
8031
  }
8017
8032
  exports.readLayerInfo = readLayerInfo;
8018
- function readLayerRecord(reader, psd, options) {
8033
+ function readLayerRecord(reader, psd) {
8019
8034
  var layer = {};
8020
8035
  layer.top = readInt32(reader);
8021
8036
  layer.left = readInt32(reader);
@@ -8026,7 +8041,7 @@ function readLayerRecord(reader, psd, options) {
8026
8041
  for (var i = 0; i < channelCount; i++) {
8027
8042
  var id = readInt16(reader);
8028
8043
  var length_1 = readUint32(reader);
8029
- if (options.large) {
8044
+ if (reader.large) {
8030
8045
  if (length_1 !== 0)
8031
8046
  throw new Error('Sizes larger than 4GB are not supported');
8032
8047
  length_1 = readUint32(reader);
@@ -8051,18 +8066,20 @@ function readLayerRecord(reader, psd, options) {
8051
8066
  // 0x20 - effects/filters panel is expanded
8052
8067
  skipBytes(reader, 1);
8053
8068
  readSection(reader, 1, function (left) {
8054
- var mask = readLayerMaskData(reader, options);
8069
+ var mask = readLayerMaskData(reader);
8055
8070
  if (mask)
8056
8071
  layer.mask = mask;
8057
8072
  /*const blendingRanges =*/ readLayerBlendingRanges(reader);
8058
- layer.name = readPascalString(reader, 4);
8059
- while (left() > 0) {
8060
- readAdditionalLayerInfo(reader, layer, psd, options);
8061
- }
8073
+ layer.name = readPascalString(reader, 1); // should be padded to 4, but is not sometimes
8074
+ // HACK: fix for sometimes layer.name string not being padded correctly, just skip until we get valid signature
8075
+ while (left() > 4 && !validSignatureAt(reader, reader.offset))
8076
+ reader.offset++;
8077
+ while (left() > 4)
8078
+ readAdditionalLayerInfo(reader, layer, psd);
8062
8079
  });
8063
8080
  return { layer: layer, channels: channels };
8064
8081
  }
8065
- function readLayerMaskData(reader, options) {
8082
+ function readLayerMaskData(reader) {
8066
8083
  return readSection(reader, 1, function (left) {
8067
8084
  if (!left())
8068
8085
  return undefined;
@@ -8098,8 +8115,8 @@ function readLayerMaskData(reader, options) {
8098
8115
 
8099
8116
  // TEMP
8100
8117
  (mask as any)._real = { realFlags, realUserMaskBackground, top2, left2, bottom2, right2 };*/
8101
- if (options.logMissingFeatures) {
8102
- console.log('Unhandled extra real user mask params');
8118
+ if (reader.logMissingFeatures) {
8119
+ reader.log('Unhandled extra real user mask params');
8103
8120
  }
8104
8121
  }
8105
8122
  skipBytes(reader, left());
@@ -8119,7 +8136,7 @@ function readLayerBlendingRanges(reader) {
8119
8136
  return { compositeGrayBlendSource: compositeGrayBlendSource, compositeGraphBlendDestinationRange: compositeGraphBlendDestinationRange, ranges: ranges };
8120
8137
  });
8121
8138
  }
8122
- function readLayerChannelImageData(reader, psd, layer, channels, options) {
8139
+ function readLayerChannelImageData(reader, psd, layer, channels) {
8123
8140
  var _a, _b, _c, _d;
8124
8141
  var layerWidth = (layer.right || 0) - (layer.left || 0);
8125
8142
  var layerHeight = (layer.bottom || 0) - (layer.top || 0);
@@ -8170,12 +8187,12 @@ function readLayerChannelImageData(reader, psd, layer, channels, options) {
8170
8187
  var maskData = createImageDataBitDepth(maskWidth, maskHeight, (_b = psd.bitsPerChannel) !== null && _b !== void 0 ? _b : 8);
8171
8188
  (0, helpers_1.resetImageData)(maskData);
8172
8189
  var start_1 = reader.offset;
8173
- readData(reader, channel.length, maskData, compression, maskWidth, maskHeight, (_c = psd.bitsPerChannel) !== null && _c !== void 0 ? _c : 8, 0, options.large, 4);
8190
+ readData(reader, channel.length, maskData, compression, maskWidth, maskHeight, (_c = psd.bitsPerChannel) !== null && _c !== void 0 ? _c : 8, 0, reader.large, 4);
8174
8191
  if (helpers_1.RAW_IMAGE_DATA) {
8175
8192
  layer.maskDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start_1, reader.offset - start_1);
8176
8193
  }
8177
8194
  setupGrayscale(maskData);
8178
- if (options.useImageData) {
8195
+ if (reader.useImageData) {
8179
8196
  mask.imageData = maskData;
8180
8197
  }
8181
8198
  else {
@@ -8184,8 +8201,8 @@ function readLayerChannelImageData(reader, psd, layer, channels, options) {
8184
8201
  }
8185
8202
  }
8186
8203
  else if (channel.id === -3 /* ChannelID.RealUserMask */) {
8187
- if (options.logMissingFeatures) {
8188
- console.log("RealUserMask not supported");
8204
+ if (reader.logMissingFeatures) {
8205
+ reader.log("RealUserMask not supported");
8189
8206
  }
8190
8207
  reader.offset = start + channel.length;
8191
8208
  }
@@ -8194,11 +8211,11 @@ function readLayerChannelImageData(reader, psd, layer, channels, options) {
8194
8211
  var targetData = imageData;
8195
8212
  if (offset < 0) {
8196
8213
  targetData = undefined;
8197
- if (options.throwForMissingFeatures) {
8214
+ if (reader.throwForMissingFeatures) {
8198
8215
  throw new Error("Channel not supported: ".concat(channel.id));
8199
8216
  }
8200
8217
  }
8201
- readData(reader, channel.length, targetData, compression, layerWidth, layerHeight, (_d = psd.bitsPerChannel) !== null && _d !== void 0 ? _d : 8, offset, options.large, cmyk ? 5 : 4);
8218
+ readData(reader, channel.length, targetData, compression, layerWidth, layerHeight, (_d = psd.bitsPerChannel) !== null && _d !== void 0 ? _d : 8, offset, reader.large, cmyk ? 5 : 4);
8202
8219
  if (helpers_1.RAW_IMAGE_DATA) {
8203
8220
  layer.imageDataRaw[channel.id] = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start + 2, channel.length - 2);
8204
8221
  }
@@ -8214,7 +8231,7 @@ function readLayerChannelImageData(reader, psd, layer, channels, options) {
8214
8231
  imageData = (0, helpers_1.createImageData)(cmykData.width, cmykData.height);
8215
8232
  cmykToRgb(cmykData, imageData, false);
8216
8233
  }
8217
- if (options.useImageData) {
8234
+ if (reader.useImageData) {
8218
8235
  layer.imageData = imageData;
8219
8236
  }
8220
8237
  else {
@@ -8255,30 +8272,30 @@ function readGlobalLayerMaskInfo(reader) {
8255
8272
  });
8256
8273
  }
8257
8274
  exports.readGlobalLayerMaskInfo = readGlobalLayerMaskInfo;
8258
- function readAdditionalLayerInfo(reader, target, psd, options) {
8275
+ function readAdditionalLayerInfo(reader, target, psd) {
8259
8276
  var sig = readSignature(reader);
8260
8277
  if (sig !== '8BIM' && sig !== '8B64')
8261
8278
  throw new Error("Invalid signature: '".concat(sig, "' at 0x").concat((reader.offset - 4).toString(16)));
8262
8279
  var key = readSignature(reader);
8263
8280
  // `largeAdditionalInfoKeys` fallback, because some keys don't have 8B64 signature even when they are 64bit
8264
- var u64 = sig === '8B64' || (options.large && helpers_1.largeAdditionalInfoKeys.indexOf(key) !== -1);
8281
+ var u64 = sig === '8B64' || (reader.large && helpers_1.largeAdditionalInfoKeys.indexOf(key) !== -1);
8265
8282
  readSection(reader, 2, function (left) {
8266
8283
  var handler = additionalInfo_1.infoHandlersMap[key];
8267
8284
  if (handler) {
8268
8285
  try {
8269
- handler.read(reader, target, left, psd, options);
8286
+ handler.read(reader, target, left, psd);
8270
8287
  }
8271
8288
  catch (e) {
8272
- if (options.throwForMissingFeatures)
8289
+ if (reader.throwForMissingFeatures)
8273
8290
  throw e;
8274
8291
  }
8275
8292
  }
8276
8293
  else {
8277
- options.logMissingFeatures && console.log("Unhandled additional info: ".concat(key));
8294
+ reader.logMissingFeatures && reader.log("Unhandled additional info: ".concat(key));
8278
8295
  skipBytes(reader, left());
8279
8296
  }
8280
8297
  if (left()) {
8281
- options.logMissingFeatures && console.log("Unread ".concat(left(), " bytes left for additional info: ").concat(key));
8298
+ reader.logMissingFeatures && reader.log("Unread ".concat(left(), " bytes left for additional info: ").concat(key));
8282
8299
  skipBytes(reader, left());
8283
8300
  }
8284
8301
  }, false, u64);
@@ -8298,7 +8315,7 @@ function createImageDataBitDepth(width, height, bitDepth) {
8298
8315
  throw new Error("Invalid bitDepth (".concat(bitDepth, ")"));
8299
8316
  }
8300
8317
  }
8301
- function readImageData(reader, psd, options) {
8318
+ function readImageData(reader, psd) {
8302
8319
  var _a, _b;
8303
8320
  var compression = readUint16(reader);
8304
8321
  var bitsPerChannel = (_a = psd.bitsPerChannel) !== null && _a !== void 0 ? _a : 8;
@@ -8318,7 +8335,7 @@ function readImageData(reader, psd, options) {
8318
8335
  }
8319
8336
  else if (compression === 1 /* Compression.RleCompressed */) {
8320
8337
  bytes = new Uint8Array(psd.width * psd.height);
8321
- readDataRLE(reader, { data: bytes, width: psd.width, height: psd.height }, psd.width, psd.height, 8, 1, [0], options.large);
8338
+ readDataRLE(reader, { data: bytes, width: psd.width, height: psd.height }, psd.width, psd.height, 8, 1, [0], reader.large);
8322
8339
  }
8323
8340
  else {
8324
8341
  throw new Error("Bitmap compression not supported: ".concat(compression));
@@ -8335,7 +8352,7 @@ function readImageData(reader, psd, options) {
8335
8352
  channels.push(i);
8336
8353
  }
8337
8354
  }
8338
- else if (options.globalAlpha) {
8355
+ else if (reader.globalAlpha) {
8339
8356
  channels.push(3);
8340
8357
  }
8341
8358
  if (compression === 0 /* Compression.RawData */) {
@@ -8345,7 +8362,7 @@ function readImageData(reader, psd, options) {
8345
8362
  }
8346
8363
  else if (compression === 1 /* Compression.RleCompressed */) {
8347
8364
  var start = reader.offset;
8348
- readDataRLE(reader, imageData, psd.width, psd.height, bitsPerChannel, 4, channels, options.large);
8365
+ readDataRLE(reader, imageData, psd.width, psd.height, bitsPerChannel, 4, channels, reader.large);
8349
8366
  if (helpers_1.RAW_IMAGE_DATA)
8350
8367
  psd.imageDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start, reader.offset - start);
8351
8368
  }
@@ -8360,7 +8377,7 @@ function readImageData(reader, psd, options) {
8360
8377
  if (psd.channels !== 4)
8361
8378
  throw new Error("Invalid channel count");
8362
8379
  var channels = [0, 1, 2, 3];
8363
- if (options.globalAlpha)
8380
+ if (reader.globalAlpha)
8364
8381
  channels.push(4);
8365
8382
  if (compression === 0 /* Compression.RawData */) {
8366
8383
  throw new Error("Not implemented");
@@ -8376,7 +8393,7 @@ function readImageData(reader, psd, options) {
8376
8393
  data: new Uint8Array(imageData.width * imageData.height * 5),
8377
8394
  };
8378
8395
  var start = reader.offset;
8379
- readDataRLE(reader, cmykImageData, psd.width, psd.height, (_b = psd.bitsPerChannel) !== null && _b !== void 0 ? _b : 8, 5, channels, options.large);
8396
+ readDataRLE(reader, cmykImageData, psd.width, psd.height, (_b = psd.bitsPerChannel) !== null && _b !== void 0 ? _b : 8, 5, channels, reader.large);
8380
8397
  cmykToRgb(cmykImageData, imageData, true);
8381
8398
  if (helpers_1.RAW_IMAGE_DATA)
8382
8399
  psd.imageDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start, reader.offset - start);
@@ -8386,7 +8403,7 @@ function readImageData(reader, psd, options) {
8386
8403
  default: throw new Error("Color mode not supported: ".concat(psd.colorMode));
8387
8404
  }
8388
8405
  // remove weird white matte
8389
- if (options.globalAlpha) {
8406
+ if (reader.globalAlpha) {
8390
8407
  if (psd.bitsPerChannel !== 8)
8391
8408
  throw new Error('bitsPerChannel Not supproted');
8392
8409
  var p = imageData.data;
@@ -8403,7 +8420,7 @@ function readImageData(reader, psd, options) {
8403
8420
  }
8404
8421
  }
8405
8422
  }
8406
- if (options.useImageData) {
8423
+ if (reader.useImageData) {
8407
8424
  psd.imageData = imageData;
8408
8425
  }
8409
8426
  else {
@@ -8769,7 +8786,7 @@ function readPattern(reader) {
8769
8786
  // console.log(data);
8770
8787
  // throw new Error('Zip compression not supported for pattern');
8771
8788
  // throw new Error('Unsupported pattern compression');
8772
- console.error('Unsupported pattern compression');
8789
+ reader.log('Unsupported pattern compression');
8773
8790
  name += ' (failed to decode)';
8774
8791
  }
8775
8792
  else {
@@ -9263,11 +9280,11 @@ function addChildren(layers, children) {
9263
9280
  // referencePoint: { x: 0, y: 0 },
9264
9281
  });
9265
9282
  addChildren(layers, c.children);
9266
- layers.push(__assign({ sectionDivider: {
9283
+ layers.push(__assign(__assign({}, c), { blendMode: c.blendMode === 'pass through' ? 'normal' : c.blendMode, sectionDivider: {
9267
9284
  type: c.opened === false ? 2 /* SectionDividerType.ClosedFolder */ : 1 /* SectionDividerType.OpenFolder */,
9268
9285
  key: helpers_1.fromBlendMode[c.blendMode] || 'pass',
9269
9286
  subType: 0,
9270
- } }, c));
9287
+ } }));
9271
9288
  }
9272
9289
  else {
9273
9290
  layers.push(__assign({}, c));