ag-psd 21.0.1 → 22.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
@@ -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) {
@@ -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,22 @@ 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) {
7976
7987
  var layerCount = readInt16(reader);
7977
7988
  if (layerCount < 0) {
7978
- options.globalAlpha = true;
7989
+ reader.globalAlpha = true;
7979
7990
  layerCount = -layerCount;
7980
7991
  }
7981
7992
  var layers = [];
7982
7993
  var layerChannels = [];
7983
7994
  for (var i = 0; i < layerCount; i++) {
7984
- var _a = readLayerRecord(reader, psd, options), layer = _a.layer, channels = _a.channels;
7995
+ var _a = readLayerRecord(reader, psd), layer = _a.layer, channels = _a.channels;
7985
7996
  layers.push(layer);
7986
7997
  layerChannels.push(channels);
7987
7998
  }
7988
- if (!options.skipLayerImageData) {
7999
+ if (!reader.skipLayerImageData) {
7989
8000
  for (var i = 0; i < layerCount; i++) {
7990
- readLayerChannelImageData(reader, psd, layers[i], layerChannels[i], options);
8001
+ readLayerChannelImageData(reader, psd, layers[i], layerChannels[i]);
7991
8002
  }
7992
8003
  }
7993
8004
  if (!psd.children)
@@ -8015,7 +8026,7 @@ function readLayerInfo(reader, psd, options) {
8015
8026
  }
8016
8027
  }
8017
8028
  exports.readLayerInfo = readLayerInfo;
8018
- function readLayerRecord(reader, psd, options) {
8029
+ function readLayerRecord(reader, psd) {
8019
8030
  var layer = {};
8020
8031
  layer.top = readInt32(reader);
8021
8032
  layer.left = readInt32(reader);
@@ -8026,7 +8037,7 @@ function readLayerRecord(reader, psd, options) {
8026
8037
  for (var i = 0; i < channelCount; i++) {
8027
8038
  var id = readInt16(reader);
8028
8039
  var length_1 = readUint32(reader);
8029
- if (options.large) {
8040
+ if (reader.large) {
8030
8041
  if (length_1 !== 0)
8031
8042
  throw new Error('Sizes larger than 4GB are not supported');
8032
8043
  length_1 = readUint32(reader);
@@ -8051,18 +8062,20 @@ function readLayerRecord(reader, psd, options) {
8051
8062
  // 0x20 - effects/filters panel is expanded
8052
8063
  skipBytes(reader, 1);
8053
8064
  readSection(reader, 1, function (left) {
8054
- var mask = readLayerMaskData(reader, options);
8065
+ var mask = readLayerMaskData(reader);
8055
8066
  if (mask)
8056
8067
  layer.mask = mask;
8057
8068
  /*const blendingRanges =*/ readLayerBlendingRanges(reader);
8058
- layer.name = readPascalString(reader, 4);
8059
- while (left() > 0) {
8060
- readAdditionalLayerInfo(reader, layer, psd, options);
8061
- }
8069
+ layer.name = readPascalString(reader, 1); // should be padded to 4, but is not sometimes
8070
+ // HACK: fix for sometimes layer.name string not being padded correctly, just skip until we get valid signature
8071
+ while (left() > 4 && !validSignatureAt(reader, reader.offset))
8072
+ reader.offset++;
8073
+ while (left() > 4)
8074
+ readAdditionalLayerInfo(reader, layer, psd);
8062
8075
  });
8063
8076
  return { layer: layer, channels: channels };
8064
8077
  }
8065
- function readLayerMaskData(reader, options) {
8078
+ function readLayerMaskData(reader) {
8066
8079
  return readSection(reader, 1, function (left) {
8067
8080
  if (!left())
8068
8081
  return undefined;
@@ -8098,8 +8111,8 @@ function readLayerMaskData(reader, options) {
8098
8111
 
8099
8112
  // TEMP
8100
8113
  (mask as any)._real = { realFlags, realUserMaskBackground, top2, left2, bottom2, right2 };*/
8101
- if (options.logMissingFeatures) {
8102
- console.log('Unhandled extra real user mask params');
8114
+ if (reader.logMissingFeatures) {
8115
+ reader.log('Unhandled extra real user mask params');
8103
8116
  }
8104
8117
  }
8105
8118
  skipBytes(reader, left());
@@ -8119,7 +8132,7 @@ function readLayerBlendingRanges(reader) {
8119
8132
  return { compositeGrayBlendSource: compositeGrayBlendSource, compositeGraphBlendDestinationRange: compositeGraphBlendDestinationRange, ranges: ranges };
8120
8133
  });
8121
8134
  }
8122
- function readLayerChannelImageData(reader, psd, layer, channels, options) {
8135
+ function readLayerChannelImageData(reader, psd, layer, channels) {
8123
8136
  var _a, _b, _c, _d;
8124
8137
  var layerWidth = (layer.right || 0) - (layer.left || 0);
8125
8138
  var layerHeight = (layer.bottom || 0) - (layer.top || 0);
@@ -8170,12 +8183,12 @@ function readLayerChannelImageData(reader, psd, layer, channels, options) {
8170
8183
  var maskData = createImageDataBitDepth(maskWidth, maskHeight, (_b = psd.bitsPerChannel) !== null && _b !== void 0 ? _b : 8);
8171
8184
  (0, helpers_1.resetImageData)(maskData);
8172
8185
  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);
8186
+ readData(reader, channel.length, maskData, compression, maskWidth, maskHeight, (_c = psd.bitsPerChannel) !== null && _c !== void 0 ? _c : 8, 0, reader.large, 4);
8174
8187
  if (helpers_1.RAW_IMAGE_DATA) {
8175
8188
  layer.maskDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start_1, reader.offset - start_1);
8176
8189
  }
8177
8190
  setupGrayscale(maskData);
8178
- if (options.useImageData) {
8191
+ if (reader.useImageData) {
8179
8192
  mask.imageData = maskData;
8180
8193
  }
8181
8194
  else {
@@ -8184,8 +8197,8 @@ function readLayerChannelImageData(reader, psd, layer, channels, options) {
8184
8197
  }
8185
8198
  }
8186
8199
  else if (channel.id === -3 /* ChannelID.RealUserMask */) {
8187
- if (options.logMissingFeatures) {
8188
- console.log("RealUserMask not supported");
8200
+ if (reader.logMissingFeatures) {
8201
+ reader.log("RealUserMask not supported");
8189
8202
  }
8190
8203
  reader.offset = start + channel.length;
8191
8204
  }
@@ -8194,11 +8207,11 @@ function readLayerChannelImageData(reader, psd, layer, channels, options) {
8194
8207
  var targetData = imageData;
8195
8208
  if (offset < 0) {
8196
8209
  targetData = undefined;
8197
- if (options.throwForMissingFeatures) {
8210
+ if (reader.throwForMissingFeatures) {
8198
8211
  throw new Error("Channel not supported: ".concat(channel.id));
8199
8212
  }
8200
8213
  }
8201
- readData(reader, channel.length, targetData, compression, layerWidth, layerHeight, (_d = psd.bitsPerChannel) !== null && _d !== void 0 ? _d : 8, offset, options.large, cmyk ? 5 : 4);
8214
+ readData(reader, channel.length, targetData, compression, layerWidth, layerHeight, (_d = psd.bitsPerChannel) !== null && _d !== void 0 ? _d : 8, offset, reader.large, cmyk ? 5 : 4);
8202
8215
  if (helpers_1.RAW_IMAGE_DATA) {
8203
8216
  layer.imageDataRaw[channel.id] = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start + 2, channel.length - 2);
8204
8217
  }
@@ -8214,7 +8227,7 @@ function readLayerChannelImageData(reader, psd, layer, channels, options) {
8214
8227
  imageData = (0, helpers_1.createImageData)(cmykData.width, cmykData.height);
8215
8228
  cmykToRgb(cmykData, imageData, false);
8216
8229
  }
8217
- if (options.useImageData) {
8230
+ if (reader.useImageData) {
8218
8231
  layer.imageData = imageData;
8219
8232
  }
8220
8233
  else {
@@ -8255,30 +8268,30 @@ function readGlobalLayerMaskInfo(reader) {
8255
8268
  });
8256
8269
  }
8257
8270
  exports.readGlobalLayerMaskInfo = readGlobalLayerMaskInfo;
8258
- function readAdditionalLayerInfo(reader, target, psd, options) {
8271
+ function readAdditionalLayerInfo(reader, target, psd) {
8259
8272
  var sig = readSignature(reader);
8260
8273
  if (sig !== '8BIM' && sig !== '8B64')
8261
8274
  throw new Error("Invalid signature: '".concat(sig, "' at 0x").concat((reader.offset - 4).toString(16)));
8262
8275
  var key = readSignature(reader);
8263
8276
  // `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);
8277
+ var u64 = sig === '8B64' || (reader.large && helpers_1.largeAdditionalInfoKeys.indexOf(key) !== -1);
8265
8278
  readSection(reader, 2, function (left) {
8266
8279
  var handler = additionalInfo_1.infoHandlersMap[key];
8267
8280
  if (handler) {
8268
8281
  try {
8269
- handler.read(reader, target, left, psd, options);
8282
+ handler.read(reader, target, left, psd);
8270
8283
  }
8271
8284
  catch (e) {
8272
- if (options.throwForMissingFeatures)
8285
+ if (reader.throwForMissingFeatures)
8273
8286
  throw e;
8274
8287
  }
8275
8288
  }
8276
8289
  else {
8277
- options.logMissingFeatures && console.log("Unhandled additional info: ".concat(key));
8290
+ reader.logMissingFeatures && reader.log("Unhandled additional info: ".concat(key));
8278
8291
  skipBytes(reader, left());
8279
8292
  }
8280
8293
  if (left()) {
8281
- options.logMissingFeatures && console.log("Unread ".concat(left(), " bytes left for additional info: ").concat(key));
8294
+ reader.logMissingFeatures && reader.log("Unread ".concat(left(), " bytes left for additional info: ").concat(key));
8282
8295
  skipBytes(reader, left());
8283
8296
  }
8284
8297
  }, false, u64);
@@ -8298,7 +8311,7 @@ function createImageDataBitDepth(width, height, bitDepth) {
8298
8311
  throw new Error("Invalid bitDepth (".concat(bitDepth, ")"));
8299
8312
  }
8300
8313
  }
8301
- function readImageData(reader, psd, options) {
8314
+ function readImageData(reader, psd) {
8302
8315
  var _a, _b;
8303
8316
  var compression = readUint16(reader);
8304
8317
  var bitsPerChannel = (_a = psd.bitsPerChannel) !== null && _a !== void 0 ? _a : 8;
@@ -8318,7 +8331,7 @@ function readImageData(reader, psd, options) {
8318
8331
  }
8319
8332
  else if (compression === 1 /* Compression.RleCompressed */) {
8320
8333
  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);
8334
+ readDataRLE(reader, { data: bytes, width: psd.width, height: psd.height }, psd.width, psd.height, 8, 1, [0], reader.large);
8322
8335
  }
8323
8336
  else {
8324
8337
  throw new Error("Bitmap compression not supported: ".concat(compression));
@@ -8335,7 +8348,7 @@ function readImageData(reader, psd, options) {
8335
8348
  channels.push(i);
8336
8349
  }
8337
8350
  }
8338
- else if (options.globalAlpha) {
8351
+ else if (reader.globalAlpha) {
8339
8352
  channels.push(3);
8340
8353
  }
8341
8354
  if (compression === 0 /* Compression.RawData */) {
@@ -8345,7 +8358,7 @@ function readImageData(reader, psd, options) {
8345
8358
  }
8346
8359
  else if (compression === 1 /* Compression.RleCompressed */) {
8347
8360
  var start = reader.offset;
8348
- readDataRLE(reader, imageData, psd.width, psd.height, bitsPerChannel, 4, channels, options.large);
8361
+ readDataRLE(reader, imageData, psd.width, psd.height, bitsPerChannel, 4, channels, reader.large);
8349
8362
  if (helpers_1.RAW_IMAGE_DATA)
8350
8363
  psd.imageDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start, reader.offset - start);
8351
8364
  }
@@ -8360,7 +8373,7 @@ function readImageData(reader, psd, options) {
8360
8373
  if (psd.channels !== 4)
8361
8374
  throw new Error("Invalid channel count");
8362
8375
  var channels = [0, 1, 2, 3];
8363
- if (options.globalAlpha)
8376
+ if (reader.globalAlpha)
8364
8377
  channels.push(4);
8365
8378
  if (compression === 0 /* Compression.RawData */) {
8366
8379
  throw new Error("Not implemented");
@@ -8376,7 +8389,7 @@ function readImageData(reader, psd, options) {
8376
8389
  data: new Uint8Array(imageData.width * imageData.height * 5),
8377
8390
  };
8378
8391
  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);
8392
+ readDataRLE(reader, cmykImageData, psd.width, psd.height, (_b = psd.bitsPerChannel) !== null && _b !== void 0 ? _b : 8, 5, channels, reader.large);
8380
8393
  cmykToRgb(cmykImageData, imageData, true);
8381
8394
  if (helpers_1.RAW_IMAGE_DATA)
8382
8395
  psd.imageDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start, reader.offset - start);
@@ -8386,7 +8399,7 @@ function readImageData(reader, psd, options) {
8386
8399
  default: throw new Error("Color mode not supported: ".concat(psd.colorMode));
8387
8400
  }
8388
8401
  // remove weird white matte
8389
- if (options.globalAlpha) {
8402
+ if (reader.globalAlpha) {
8390
8403
  if (psd.bitsPerChannel !== 8)
8391
8404
  throw new Error('bitsPerChannel Not supproted');
8392
8405
  var p = imageData.data;
@@ -8403,7 +8416,7 @@ function readImageData(reader, psd, options) {
8403
8416
  }
8404
8417
  }
8405
8418
  }
8406
- if (options.useImageData) {
8419
+ if (reader.useImageData) {
8407
8420
  psd.imageData = imageData;
8408
8421
  }
8409
8422
  else {
@@ -8769,7 +8782,7 @@ function readPattern(reader) {
8769
8782
  // console.log(data);
8770
8783
  // throw new Error('Zip compression not supported for pattern');
8771
8784
  // throw new Error('Unsupported pattern compression');
8772
- console.error('Unsupported pattern compression');
8785
+ reader.log('Unsupported pattern compression');
8773
8786
  name += ' (failed to decode)';
8774
8787
  }
8775
8788
  else {
@@ -1802,6 +1802,7 @@ exports.gradientInterpolationMethodType = (0, helpers_1.createEnum)('gradientInt
1802
1802
  perceptual: 'Perc',
1803
1803
  linear: 'Lnr',
1804
1804
  classic: 'Gcls',
1805
+ smooth: 'Smoo',
1805
1806
  });
1806
1807
  exports.ClrS = (0, helpers_1.createEnum)('ClrS', 'rgb', {
1807
1808
  rgb: 'RGBC',