ag-psd 19.0.1 → 20.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README_PSD.md +6 -0
  3. package/TODO +5 -0
  4. package/dist/abr.js +4 -4
  5. package/dist/abr.js.map +1 -1
  6. package/dist/additionalInfo.d.ts +3 -3
  7. package/dist/additionalInfo.js +99 -10
  8. package/dist/additionalInfo.js.map +1 -1
  9. package/dist/bundle.js +405 -142
  10. package/dist/descriptor.js +21 -16
  11. package/dist/descriptor.js.map +1 -1
  12. package/dist/helpers.d.ts +2 -7
  13. package/dist/helpers.js +33 -10
  14. package/dist/helpers.js.map +1 -1
  15. package/dist/imageResources.js +37 -0
  16. package/dist/imageResources.js.map +1 -1
  17. package/dist/psd.d.ts +46 -3
  18. package/dist/psd.js +8 -1
  19. package/dist/psd.js.map +1 -1
  20. package/dist/psdReader.d.ts +11 -5
  21. package/dist/psdReader.js +179 -97
  22. package/dist/psdReader.js.map +1 -1
  23. package/dist/psdWriter.js +24 -4
  24. package/dist/psdWriter.js.map +1 -1
  25. package/dist-es/abr.js +4 -4
  26. package/dist-es/abr.js.map +1 -1
  27. package/dist-es/additionalInfo.d.ts +3 -3
  28. package/dist-es/additionalInfo.js +102 -13
  29. package/dist-es/additionalInfo.js.map +1 -1
  30. package/dist-es/descriptor.js +21 -16
  31. package/dist-es/descriptor.js.map +1 -1
  32. package/dist-es/helpers.d.ts +2 -7
  33. package/dist-es/helpers.js +31 -9
  34. package/dist-es/helpers.js.map +1 -1
  35. package/dist-es/imageResources.js +37 -0
  36. package/dist-es/imageResources.js.map +1 -1
  37. package/dist-es/psd.d.ts +46 -3
  38. package/dist-es/psd.js +7 -0
  39. package/dist-es/psd.js.map +1 -1
  40. package/dist-es/psdReader.d.ts +11 -5
  41. package/dist-es/psdReader.js +178 -99
  42. package/dist-es/psdReader.js.map +1 -1
  43. package/dist-es/psdWriter.js +25 -5
  44. package/dist-es/psdWriter.js.map +1 -1
  45. package/package.json +1 -1
  46. package/src/abr.ts +4 -4
  47. package/src/additionalInfo.ts +142 -49
  48. package/src/descriptor.ts +14 -9
  49. package/src/helpers.ts +35 -18
  50. package/src/imageResources.ts +53 -0
  51. package/src/psd.ts +41 -5
  52. package/src/psdReader.ts +170 -126
  53. package/src/psdWriter.ts +33 -14
package/dist/bundle.js CHANGED
@@ -75,21 +75,21 @@ function readAbr(buffer, options) {
75
75
  var w = (0, psdReader_1.readInt32)(reader) - x;
76
76
  if (w <= 0 || h <= 0)
77
77
  throw new Error('Invalid bounds');
78
- var depth = (0, psdReader_1.readInt16)(reader);
78
+ var bithDepth = (0, psdReader_1.readInt16)(reader);
79
79
  var compression = (0, psdReader_1.readUint8)(reader); // 0 - raw, 1 - RLE
80
80
  var alpha = new Uint8Array(w * h);
81
- if (depth === 8) {
81
+ if (bithDepth === 8) {
82
82
  if (compression === 0) {
83
83
  alpha.set((0, psdReader_1.readBytes)(reader, alpha.byteLength));
84
84
  }
85
85
  else if (compression === 1) {
86
- (0, psdReader_1.readDataRLE)(reader, { width: w, height: h, data: alpha }, w, h, 1, [0], false);
86
+ (0, psdReader_1.readDataRLE)(reader, { width: w, height: h, data: alpha }, w, h, bithDepth, 1, [0], false);
87
87
  }
88
88
  else {
89
89
  throw new Error('Invalid compression');
90
90
  }
91
91
  }
92
- else if (depth === 16) {
92
+ else if (bithDepth === 16) {
93
93
  if (compression === 0) {
94
94
  for (var i = 0; i < alpha.byteLength; i++) {
95
95
  alpha[i] = (0, psdReader_1.readUint16)(reader) >> 8; // convert to 8bit values
@@ -353,9 +353,11 @@ addHandler('TySh', hasKey('text'), function (reader, target, leftBytes) {
353
353
  if ((0, psdReader_1.readInt16)(reader) !== 50)
354
354
  throw new Error("Invalid TySh text version");
355
355
  var text = (0, descriptor_1.readVersionAndDescriptor)(reader);
356
+ // console.log(require('util').inspect(text, false, 99, false), 'utf8');
356
357
  if ((0, psdReader_1.readInt16)(reader) !== 1)
357
358
  throw new Error("Invalid TySh warp version");
358
359
  var warp = (0, descriptor_1.readVersionAndDescriptor)(reader);
360
+ // console.log(require('util').inspect(warp, false, 99, false), 'utf8');
359
361
  target.text = {
360
362
  transform: transform,
361
363
  left: (0, psdReader_1.readFloat32)(reader),
@@ -382,6 +384,7 @@ addHandler('TySh', hasKey('text'), function (reader, target, leftBytes) {
382
384
  if (text.EngineData) {
383
385
  var engineData = (0, engineData_1.parseEngineData)(text.EngineData);
384
386
  var textData = (0, text_1.decodeEngineData)(engineData);
387
+ // console.log(require('util').inspect(engineData, false, 99, false), 'utf8');
385
388
  // require('fs').writeFileSync(`layer-${target.name}.txt`, require('util').inspect(engineData, false, 99, false), 'utf8');
386
389
  // const before = parseEngineData(text.EngineData);
387
390
  // const after = encodeEngineData(engineData);
@@ -799,7 +802,7 @@ addHandler('lclr', hasKey('layerColor'), function (reader, target) {
799
802
  (0, psdWriter_1.writeZeros)(writer, 6);
800
803
  });
801
804
  addHandler('shmd', function (target) { return target.timestamp !== undefined || target.animationFrames !== undefined ||
802
- target.animationFrameFlags !== undefined || target.timeline !== undefined; }, function (reader, target, left, _, options) {
805
+ target.animationFrameFlags !== undefined || target.timeline !== undefined || target.comps !== undefined; }, function (reader, target, left, _, options) {
803
806
  var count = (0, psdReader_1.readUint32)(reader);
804
807
  var _loop_1 = function (i) {
805
808
  (0, psdReader_1.checkSignature)(reader, '8BIM');
@@ -863,8 +866,28 @@ addHandler('shmd', function (target) { return target.timestamp !== undefined ||
863
866
  target.timeline = timeline;
864
867
  // console.log('tmln:result', target.name, target.id, require('util').inspect(timeline, false, 99, true));
865
868
  }
869
+ else if (key === 'cmls') {
870
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
871
+ // console.log('cmls', require('util').inspect(desc, false, 99, true));
872
+ target.comps = {
873
+ settings: [],
874
+ };
875
+ if (desc.origFXRefPoint)
876
+ target.comps.originalEffectsReferencePoint = { x: desc.origFXRefPoint.Hrzn, y: desc.origFXRefPoint.Vrtc };
877
+ for (var _i = 0, _a = desc.layerSettings; _i < _a.length; _i++) {
878
+ var item = _a[_i];
879
+ target.comps.settings.push({ compList: item.compList });
880
+ var t = target.comps.settings[target.comps.settings.length - 1];
881
+ if ('enab' in item)
882
+ t.enabled = item.enab;
883
+ if (item.Ofst)
884
+ t.offset = { x: item.Ofst.Hrzn, y: item.Ofst.Vrtc };
885
+ if (item.FXRefPoint)
886
+ t.effectsReferencePoint = { x: item.FXRefPoint.Hrzn, y: item.FXRefPoint.Vrtc };
887
+ }
888
+ }
866
889
  else {
867
- options.logDevFeatures && console.log('Unhandled "shmd" section key', key);
890
+ options.logMissingFeatures && console.log('Unhandled "shmd" section key', key);
868
891
  }
869
892
  (0, psdReader_1.skipBytes)(reader, left());
870
893
  });
@@ -874,7 +897,7 @@ addHandler('shmd', function (target) { return target.timestamp !== undefined ||
874
897
  }
875
898
  (0, psdReader_1.skipBytes)(reader, left());
876
899
  }, function (writer, target, _, options) {
877
- var animationFrames = target.animationFrames, animationFrameFlags = target.animationFrameFlags, timestamp = target.timestamp, timeline = target.timeline;
900
+ var animationFrames = target.animationFrames, animationFrameFlags = target.animationFrameFlags, timestamp = target.timestamp, timeline = target.timeline, comps = target.comps;
878
901
  var count = 0;
879
902
  if (animationFrames)
880
903
  count++;
@@ -884,6 +907,8 @@ addHandler('shmd', function (target) { return target.timestamp !== undefined ||
884
907
  count++;
885
908
  if (timestamp !== undefined)
886
909
  count++;
910
+ if (comps)
911
+ count++;
887
912
  (0, psdWriter_1.writeUint32)(writer, count);
888
913
  if (animationFrames) {
889
914
  (0, psdWriter_1.writeSignature)(writer, '8BIM');
@@ -949,7 +974,7 @@ addHandler('shmd', function (target) { return target.timestamp !== undefined ||
949
974
  if (timeline.tracks) {
950
975
  desc.trackList = (0, descriptor_1.serializeTrackList)(timeline.tracks);
951
976
  }
952
- var id = options.layerToId.get(target) || target.id || 0;
977
+ var id = options.layerToId.get(target) || target.id;
953
978
  if (!id)
954
979
  throw new Error('You need to provide layer.id value whan writing document with animations');
955
980
  desc.LyrI = id;
@@ -969,6 +994,37 @@ addHandler('shmd', function (target) { return target.timestamp !== undefined ||
969
994
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'metadata', desc);
970
995
  }, true);
971
996
  }
997
+ if (comps) {
998
+ (0, psdWriter_1.writeSignature)(writer, '8BIM');
999
+ (0, psdWriter_1.writeSignature)(writer, 'cmls');
1000
+ (0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
1001
+ (0, psdWriter_1.writeZeros)(writer, 3);
1002
+ (0, psdWriter_1.writeSection)(writer, 2, function () {
1003
+ var id = options.layerToId.get(target) || target.id;
1004
+ if (!id)
1005
+ throw new Error('You need to provide layer.id value whan writing document with layer comps');
1006
+ var desc = {};
1007
+ if (comps.originalEffectsReferencePoint) {
1008
+ desc.origFXRefPoint = { Hrzn: comps.originalEffectsReferencePoint.x, Vrtc: comps.originalEffectsReferencePoint.y };
1009
+ }
1010
+ desc.LyrI = id;
1011
+ desc.layerSettings = [];
1012
+ for (var _i = 0, _a = comps.settings; _i < _a.length; _i++) {
1013
+ var item = _a[_i];
1014
+ var t = {};
1015
+ if (item.enabled !== undefined)
1016
+ t.enab = item.enabled;
1017
+ if (item.offset)
1018
+ t.Ofst = { Hrzn: item.offset.x, Vrtc: item.offset.y };
1019
+ if (item.effectsReferencePoint)
1020
+ t.FXRefPoint = { Hrzn: item.effectsReferencePoint.x, Vrtc: item.effectsReferencePoint.y };
1021
+ t.compList = item.compList;
1022
+ desc.layerSettings.push(t);
1023
+ }
1024
+ // console.log('cmls', require('util').inspect(desc, false, 99, true));
1025
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1026
+ }, true);
1027
+ }
972
1028
  });
973
1029
  addHandler('vstk', hasKey('vectorStroke'), function (reader, target, left) {
974
1030
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
@@ -2145,6 +2201,38 @@ addHandler('fxrp', hasKey('referencePoint'), function (reader, target) {
2145
2201
  (0, psdWriter_1.writeFloat64)(writer, target.referencePoint.x);
2146
2202
  (0, psdWriter_1.writeFloat64)(writer, target.referencePoint.y);
2147
2203
  });
2204
+ addHandler('Lr16', function () { return false; }, function (reader, _target, _left, psd, options) {
2205
+ (0, psdReader_1.readLayerInfo)(reader, psd, options);
2206
+ }, function (_writer, _target) {
2207
+ });
2208
+ addHandler('LMsk', hasKey('userMask'), function (reader, target) {
2209
+ target.userMask = {
2210
+ colorSpace: (0, psdReader_1.readColor)(reader),
2211
+ opacity: (0, psdReader_1.readUint16)(reader) / 0xff,
2212
+ };
2213
+ var flag = (0, psdReader_1.readUint8)(reader);
2214
+ if (flag !== 128)
2215
+ throw new Error('Invalid flag value');
2216
+ (0, psdReader_1.skipBytes)(reader, 1);
2217
+ }, function (writer, target) {
2218
+ var userMask = target.userMask;
2219
+ (0, psdWriter_1.writeColor)(writer, userMask.colorSpace);
2220
+ (0, psdWriter_1.writeUint16)(writer, (0, helpers_1.clamp)(userMask.opacity, 0, 1) * 0xff);
2221
+ (0, psdWriter_1.writeUint8)(writer, 128);
2222
+ (0, psdWriter_1.writeZeros)(writer, 1);
2223
+ });
2224
+ if (helpers_1.MOCK_HANDLERS) {
2225
+ addHandler('vowv', // appears with Lr16 section ?
2226
+ function (// appears with Lr16 section ?
2227
+ _) { return false; }, function (reader, target, left) {
2228
+ var value = (0, psdReader_1.readUint32)(reader); // 2 ????
2229
+ reader;
2230
+ target;
2231
+ console.log('vowv', { value: value }, left());
2232
+ }, function (_writer, _target) {
2233
+ // TODO: write
2234
+ });
2235
+ }
2148
2236
  if (helpers_1.MOCK_HANDLERS) {
2149
2237
  addHandler('Patt', function (target) { return target._Patt !== undefined; }, function (reader, target, left) {
2150
2238
  // console.log('additional info: Patt');
@@ -2437,15 +2525,16 @@ addHandlerAlias('lnkD', 'lnk2');
2437
2525
  addHandlerAlias('lnk3', 'lnk2');
2438
2526
  addHandlerAlias('lnkE', 'lnk2');
2439
2527
  addHandler('pths', hasKey('pathList'), function (reader, target) {
2440
- var descriptor = (0, descriptor_1.readVersionAndDescriptor)(reader);
2441
- target.pathList = []; // TODO: read paths (find example with non-empty list)
2442
- descriptor;
2443
- // console.log('pths', descriptor); // TODO: remove this
2528
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader, true);
2529
+ // console.log(require('util').inspect(desc, false, 99, true));
2530
+ // if (options.throwForMissingFeatures && desc?.pathList?.length) throw new Error('non-empty pathList in `pths`');
2531
+ desc;
2532
+ target.pathList = []; // TODO: read paths
2444
2533
  }, function (writer, _target) {
2445
- var descriptor = {
2534
+ var desc = {
2446
2535
  pathList: [], // TODO: write paths
2447
2536
  };
2448
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'pathsDataClass', descriptor);
2537
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'pathsDataClass', desc);
2449
2538
  });
2450
2539
  addHandler('lyvr', hasKey('version'), function (reader, target) { return target.version = (0, psdReader_1.readUint32)(reader); }, function (writer, target) { return (0, psdWriter_1.writeUint32)(writer, target.version); });
2451
2540
  function adjustmentType(type) {
@@ -3550,6 +3639,8 @@ var fieldToExtType = {
3550
3639
  sdwM: makeType('Parameters', 'adaptCorrectTones'),
3551
3640
  hglM: makeType('Parameters', 'adaptCorrectTones'),
3552
3641
  customShape: makeType('', 'customShape'),
3642
+ origFXRefPoint: nullType,
3643
+ FXRefPoint: nullType,
3553
3644
  };
3554
3645
  var fieldToArrayExtType = {
3555
3646
  'Crv ': makeType('', 'CrPt'),
@@ -3580,13 +3671,15 @@ var fieldToArrayExtType = {
3580
3671
  puppetShapeList: makeType('', 'puppetShape'),
3581
3672
  channelDenoise: makeType('', 'channelDenoiseParams'),
3582
3673
  ShrP: makeType('', 'Pnt '),
3674
+ layerSettings: nullType,
3675
+ list: nullType,
3583
3676
  };
3584
3677
  var typeToField = {
3585
3678
  'TEXT': [
3586
3679
  'Txt ', 'printerName', 'Nm ', 'Idnt', 'blackAndWhitePresetFileName', 'LUT3DFileName',
3587
3680
  'presetFileName', 'curvesPresetFileName', 'mixerPresetFileName', 'placed', 'description', 'reason',
3588
3681
  'artboardPresetName', 'json', 'clipID', 'relPath', 'fullPath', 'mediaDescriptor', 'Msge',
3589
- 'altTag', 'url', 'cellText', 'preset', 'KnNm', 'FPth',
3682
+ 'altTag', 'url', 'cellText', 'preset', 'KnNm', 'FPth', 'comment',
3590
3683
  ],
3591
3684
  'tdta': [
3592
3685
  'EngineData', 'LUT3DFileData', 'indexArray', 'originalVertexArray', 'deformedVertexArray',
@@ -3604,7 +3697,7 @@ var typeToField = {
3604
3697
  'topOutset', 'leftOutset', 'bottomOutset', 'rightOutset', 'filterID', 'meshQuality',
3605
3698
  'meshExpansion', 'meshRigidity', 'VrsM', 'VrsN', 'NmbG', 'WLMn', 'WLMx', 'AmMn', 'AmMx', 'SclH', 'SclV',
3606
3699
  'Lvl ', 'TlNm', 'TlOf', 'FlRs', 'Thsh', 'ShrS', 'ShrE', 'FlRs', 'Vrnc', 'Strg', 'ExtS', 'ExtD',
3607
- 'HrzS', 'VrtS', 'NmbR', 'EdgF', 'Ang1', 'Ang2', 'Ang3', 'Ang4',
3700
+ 'HrzS', 'VrtS', 'NmbR', 'EdgF', 'Ang1', 'Ang2', 'Ang3', 'Ang4', 'lastAppliedComp', 'capturedInfo',
3608
3701
  ],
3609
3702
  'enum': [
3610
3703
  'textGridding', 'Ornt', 'warpStyle', 'warpRotate', 'Inte', 'Bltn', 'ClrS', 'BlrQ',
@@ -3649,7 +3742,7 @@ var typeToField = {
3649
3742
  'sheetTimelineOptions', 'audioClipList', 'trackList', 'globalTrackList', 'keyList', 'audioClipList',
3650
3743
  'warpValues', 'selectedPin', 'Pts ', 'SbpL', 'pathComponents', 'pinOffsets', 'posFinalPins',
3651
3744
  'pinVertexIndices', 'PinP', 'PnRt', 'PnOv', 'PnDp', 'filterFXList', 'puppetShapeList', 'ShrP',
3652
- 'channelDenoise', 'Mtrx',
3745
+ 'channelDenoise', 'Mtrx', 'layerSettings', 'list', 'compList',
3653
3746
  ],
3654
3747
  'ObAr': ['meshPoints', 'quiltSliceX', 'quiltSliceY'],
3655
3748
  'obj ': ['null', 'Chnl'],
@@ -3695,6 +3788,7 @@ var fieldToArrayType = {
3695
3788
  ShrP: 'Objc',
3696
3789
  channelDenoise: 'Objc',
3697
3790
  Mtrx: 'long',
3791
+ compList: 'long',
3698
3792
  };
3699
3793
  var fieldToType = {};
3700
3794
  for (var _i = 0, _a = Object.keys(typeToField); _i < _a.length; _i++) {
@@ -3756,7 +3850,7 @@ function readAsciiStringOrClassId(reader) {
3756
3850
  }
3757
3851
  exports.readAsciiStringOrClassId = readAsciiStringOrClassId;
3758
3852
  function writeAsciiStringOrClassId(writer, value) {
3759
- if (value.length === 4 && value !== 'warp' && value !== 'time' && value !== 'hold') {
3853
+ if (value.length === 4 && value !== 'warp' && value !== 'time' && value !== 'hold' && value !== 'list') {
3760
3854
  // write classId
3761
3855
  (0, psdWriter_1.writeInt32)(writer, 0);
3762
3856
  (0, psdWriter_1.writeSignature)(writer, value);
@@ -3913,9 +4007,9 @@ function readOSType(reader, type, includeClass) {
3913
4007
  var length_1 = (0, psdReader_1.readInt32)(reader);
3914
4008
  var items = [];
3915
4009
  for (var i = 0; i < length_1; i++) {
3916
- var type_1 = (0, psdReader_1.readSignature)(reader);
3917
- // console.log(' >', type);
3918
- items.push(readOSType(reader, type_1, includeClass));
4010
+ var itemType = (0, psdReader_1.readSignature)(reader);
4011
+ // console.log(' >', itemType);
4012
+ items.push(readOSType(reader, itemType, includeClass));
3919
4013
  }
3920
4014
  return items;
3921
4015
  }
@@ -3938,9 +4032,9 @@ function readOSType(reader, type, includeClass) {
3938
4032
  case 'TEXT': // String
3939
4033
  return (0, psdReader_1.readUnicodeString)(reader);
3940
4034
  case 'enum': { // Enumerated
3941
- var type_2 = readAsciiStringOrClassId(reader);
4035
+ var enumType = readAsciiStringOrClassId(reader);
3942
4036
  var value = readAsciiStringOrClassId(reader);
3943
- return "".concat(type_2, ".").concat(value);
4037
+ return "".concat(enumType, ".").concat(value);
3944
4038
  }
3945
4039
  case 'long': // Integer
3946
4040
  return (0, psdReader_1.readInt32)(reader);
@@ -4019,10 +4113,10 @@ function writeOSType(writer, type, value, key, extType, root) {
4019
4113
  throw new Error("Invalid list value: ".concat(JSON.stringify(value), ", key: ").concat(key));
4020
4114
  (0, psdWriter_1.writeInt32)(writer, value.length);
4021
4115
  for (var i = 0; i < value.length; i++) {
4022
- var type_3 = fieldToArrayType[key];
4023
- (0, psdWriter_1.writeSignature)(writer, type_3 || 'long');
4024
- writeOSType(writer, type_3 || 'long', value[i], "".concat(key, "[]"), fieldToArrayExtType[key], root);
4025
- if (logErrors && !type_3)
4116
+ var type_1 = fieldToArrayType[key];
4117
+ (0, psdWriter_1.writeSignature)(writer, type_1 || 'long');
4118
+ writeOSType(writer, type_1 || 'long', value[i], "".concat(key, "[]"), fieldToArrayExtType[key], root);
4119
+ if (logErrors && !type_1)
4026
4120
  console.log("Missing descriptor array type for: '".concat(key, "' in"), value);
4027
4121
  }
4028
4122
  break;
@@ -4078,10 +4172,10 @@ function writeOSType(writer, type, value, key, extType, root) {
4078
4172
  case 'ObAr': { // Object array
4079
4173
  (0, psdWriter_1.writeInt32)(writer, 16); // version
4080
4174
  (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, ''); // name
4081
- var type_4 = ObArTypes[key];
4082
- if (!type_4)
4175
+ var type_2 = ObArTypes[key];
4176
+ if (!type_2)
4083
4177
  throw new Error("Not implemented ObArType for: ".concat(key));
4084
- writeAsciiStringOrClassId(writer, type_4);
4178
+ writeAsciiStringOrClassId(writer, type_2);
4085
4179
  (0, psdWriter_1.writeInt32)(writer, value.length);
4086
4180
  for (var i = 0; i < value.length; i++) {
4087
4181
  writeAsciiStringOrClassId(writer, value[i].type); // Hrzn | Vrtc
@@ -6063,7 +6157,7 @@ exports.serializeEngineData = serializeEngineData;
6063
6157
  },{}],7:[function(require,module,exports){
6064
6158
  "use strict";
6065
6159
  Object.defineProperty(exports, "__esModule", { value: true });
6066
- exports.initializeCanvas = exports.createImageData = exports.createCanvasFromData = exports.createCanvas = exports.writeDataZipWithoutPrediction = exports.writeDataRLE = exports.writeDataRaw = exports.decodeBitmap = exports.resetImageData = exports.hasAlpha = exports.clamp = exports.offsetForChannel = exports.Compression = exports.ChannelID = exports.MaskParams = exports.LayerMaskFlags = exports.ColorSpace = exports.createEnum = exports.revMap = exports.largeAdditionalInfoKeys = exports.layerColors = exports.toBlendMode = exports.fromBlendMode = exports.RAW_IMAGE_DATA = exports.MOCK_HANDLERS = void 0;
6160
+ exports.initializeCanvas = exports.createImageData = exports.createCanvasFromData = exports.createCanvas = exports.writeDataZipWithoutPrediction = exports.writeDataRLE = exports.writeDataRaw = exports.decodeBitmap = exports.imageDataToCanvas = exports.resetImageData = exports.hasAlpha = exports.clamp = exports.offsetForChannel = exports.Compression = exports.ChannelID = exports.MaskParams = exports.LayerMaskFlags = exports.ColorSpace = exports.createEnum = exports.revMap = exports.largeAdditionalInfoKeys = exports.layerColors = exports.toBlendMode = exports.fromBlendMode = exports.RAW_IMAGE_DATA = exports.MOCK_HANDLERS = void 0;
6067
6161
  var base64_js_1 = require("base64-js");
6068
6162
  var pako_1 = require("pako");
6069
6163
  exports.MOCK_HANDLERS = false;
@@ -6198,24 +6292,47 @@ function hasAlpha(data) {
6198
6292
  exports.hasAlpha = hasAlpha;
6199
6293
  function resetImageData(_a) {
6200
6294
  var data = _a.data;
6201
- var buffer = new Uint32Array(data.buffer);
6202
- var size = buffer.length | 0;
6203
- for (var p = 0; p < size; p = (p + 1) | 0) {
6204
- buffer[p] = 0xff000000;
6295
+ var alpha = (data instanceof Uint32Array) ? (0xffffffff >>> 0) : ((data instanceof Uint16Array) ? 0xffff : 0xff);
6296
+ for (var p = 0, size = data.length | 0; p < size; p = (p + 4) | 0) {
6297
+ data[p + 0] = 0;
6298
+ data[p + 1] = 0;
6299
+ data[p + 2] = 0;
6300
+ data[p + 3] = alpha;
6205
6301
  }
6206
6302
  }
6207
6303
  exports.resetImageData = resetImageData;
6304
+ function imageDataToCanvas(pixelData) {
6305
+ var canvas = (0, exports.createCanvas)(pixelData.width, pixelData.height);
6306
+ var imageData;
6307
+ if (pixelData.data instanceof Uint8ClampedArray) {
6308
+ imageData = pixelData;
6309
+ }
6310
+ else {
6311
+ imageData = (0, exports.createImageData)(pixelData.width, pixelData.height);
6312
+ var src = pixelData.data;
6313
+ var dst = imageData.data;
6314
+ var shift = (src instanceof Uint32Array) ? 24 : ((src instanceof Uint16Array) ? 8 : 0);
6315
+ for (var i = 0, size = src.length; i < size; i++) {
6316
+ dst[i] = src[i] >>> shift;
6317
+ }
6318
+ }
6319
+ canvas.getContext('2d').putImageData(imageData, 0, 0);
6320
+ return canvas;
6321
+ }
6322
+ exports.imageDataToCanvas = imageDataToCanvas;
6208
6323
  function decodeBitmap(input, output, width, height) {
6324
+ if (input instanceof Uint32Array || input instanceof Uint16Array)
6325
+ throw new Error('Invalid bit depth');
6209
6326
  for (var y = 0, p = 0, o = 0; y < height; y++) {
6210
6327
  for (var x = 0; x < width;) {
6211
6328
  var b = input[o++];
6212
- for (var i = 0; i < 8 && x < width; i++, x++) {
6329
+ for (var i = 0; i < 8 && x < width; i++, x++, p += 4) {
6213
6330
  var v = b & 0x80 ? 0 : 255;
6214
6331
  b = b << 1;
6215
- output[p++] = v;
6216
- output[p++] = v;
6217
- output[p++] = v;
6218
- output[p++] = 255;
6332
+ output[p + 0] = v;
6333
+ output[p + 1] = v;
6334
+ output[p + 2] = v;
6335
+ output[p + 3] = 255;
6219
6336
  }
6220
6337
  }
6221
6338
  }
@@ -6767,6 +6884,43 @@ addHandler(1032, function (target) { return target.gridAndGuidesInformation !==
6767
6884
  (0, psdWriter_1.writeUint8)(writer, g.direction === 'horizontal' ? 1 : 0);
6768
6885
  }
6769
6886
  });
6887
+ addHandler(1065, // Layer Comps
6888
+ function (// Layer Comps
6889
+ target) { return target.layerComps !== undefined; }, function (reader, target) {
6890
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader, true);
6891
+ // console.log('CompList', require('util').inspect(desc, false, 99, true));
6892
+ target.layerComps = { list: [] };
6893
+ for (var _i = 0, _a = desc.list; _i < _a.length; _i++) {
6894
+ var item = _a[_i];
6895
+ target.layerComps.list.push({
6896
+ id: item.compID,
6897
+ name: item['Nm '],
6898
+ capturedInfo: item.capturedInfo,
6899
+ });
6900
+ if ('comment' in item)
6901
+ target.layerComps.list[target.layerComps.list.length - 1].comment = item.comment;
6902
+ }
6903
+ if ('lastAppliedComp' in desc)
6904
+ target.layerComps.lastApplied = desc.lastAppliedComp;
6905
+ }, function (writer, target) {
6906
+ var layerComps = target.layerComps;
6907
+ var desc = { list: [] };
6908
+ for (var _i = 0, _a = layerComps.list; _i < _a.length; _i++) {
6909
+ var item = _a[_i];
6910
+ var t = {};
6911
+ t._classID = 'Comp';
6912
+ t['Nm '] = item.name;
6913
+ if ('comment' in item)
6914
+ t.comment = item.comment;
6915
+ t.compID = item.id;
6916
+ t.capturedInfo = item.capturedInfo;
6917
+ desc.list.push(t);
6918
+ }
6919
+ if ('lastApplied' in layerComps)
6920
+ desc.lastAppliedComp = layerComps.lastApplied;
6921
+ // console.log('CompList', require('util').inspect(desc, false, 99, true));
6922
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'CompList', desc);
6923
+ });
6770
6924
  helpers_1.MOCK_HANDLERS && addHandler(1092, // ???
6771
6925
  function (// ???
6772
6926
  target) { return target._ir1092 !== undefined; }, function (reader, target, left) {
@@ -7461,7 +7615,7 @@ exports.writePsdBuffer = writePsdBuffer;
7461
7615
  },{"./abr":1,"./csh":3,"./helpers":7,"./psd":10,"./psdReader":11,"./psdWriter":12,"base64-js":15,"buffer":16}],10:[function(require,module,exports){
7462
7616
  "use strict";
7463
7617
  Object.defineProperty(exports, "__esModule", { value: true });
7464
- exports.SectionDividerType = exports.ColorMode = void 0;
7618
+ exports.LayerCompCapturedInfo = exports.SectionDividerType = exports.ColorMode = void 0;
7465
7619
  var ColorMode;
7466
7620
  (function (ColorMode) {
7467
7621
  ColorMode[ColorMode["Bitmap"] = 0] = "Bitmap";
@@ -7480,6 +7634,13 @@ var SectionDividerType;
7480
7634
  SectionDividerType[SectionDividerType["ClosedFolder"] = 2] = "ClosedFolder";
7481
7635
  SectionDividerType[SectionDividerType["BoundingSectionDivider"] = 3] = "BoundingSectionDivider";
7482
7636
  })(SectionDividerType = exports.SectionDividerType || (exports.SectionDividerType = {}));
7637
+ var LayerCompCapturedInfo;
7638
+ (function (LayerCompCapturedInfo) {
7639
+ LayerCompCapturedInfo[LayerCompCapturedInfo["None"] = 0] = "None";
7640
+ LayerCompCapturedInfo[LayerCompCapturedInfo["Visibility"] = 1] = "Visibility";
7641
+ LayerCompCapturedInfo[LayerCompCapturedInfo["Position"] = 2] = "Position";
7642
+ LayerCompCapturedInfo[LayerCompCapturedInfo["Appearance"] = 4] = "Appearance";
7643
+ })(LayerCompCapturedInfo = exports.LayerCompCapturedInfo || (exports.LayerCompCapturedInfo = {}));
7483
7644
 
7484
7645
  },{}],11:[function(require,module,exports){
7485
7646
  "use strict";
@@ -7495,7 +7656,7 @@ var __assign = (this && this.__assign) || function () {
7495
7656
  return __assign.apply(this, arguments);
7496
7657
  };
7497
7658
  Object.defineProperty(exports, "__esModule", { value: true });
7498
- 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;
7659
+ 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;
7499
7660
  var pako_1 = require("pako");
7500
7661
  var helpers_1 = require("./helpers");
7501
7662
  var additionalInfo_1 = require("./additionalInfo");
@@ -7670,9 +7831,9 @@ function readShortString(reader, length) {
7670
7831
  function isValidSignature(sig) {
7671
7832
  return sig === '8BIM' || sig === 'MeSa' || sig === 'AgHg' || sig === 'PHUT' || sig === 'DCSR';
7672
7833
  }
7673
- function readPsd(reader, options) {
7834
+ function readPsd(reader, readOptions) {
7674
7835
  var _a;
7675
- if (options === void 0) { options = {}; }
7836
+ if (readOptions === void 0) { readOptions = {}; }
7676
7837
  // header
7677
7838
  checkSignature(reader, '8BPS');
7678
7839
  var version = readUint16(reader);
@@ -7686,19 +7847,19 @@ function readPsd(reader, options) {
7686
7847
  var colorMode = readUint16(reader);
7687
7848
  var maxSize = version === 1 ? 30000 : 300000;
7688
7849
  if (width > maxSize || height > maxSize)
7689
- throw new Error("Invalid size");
7850
+ throw new Error("Invalid size: ".concat(width, "x").concat(height));
7690
7851
  if (channels > 16)
7691
- throw new Error("Invalid channel count");
7692
- if (bitsPerChannel > 32)
7693
- throw new Error("Invalid bitsPerChannel count");
7852
+ throw new Error("Invalid channel count: ".concat(channels));
7853
+ if (![1, 8, 16, 32].includes(bitsPerChannel))
7854
+ throw new Error("Invalid bitsPerChannel: ".concat(bitsPerChannel));
7694
7855
  if (exports.supportedColorModes.indexOf(colorMode) === -1)
7695
7856
  throw new Error("Color mode not supported: ".concat((_a = colorModes[colorMode]) !== null && _a !== void 0 ? _a : colorMode));
7696
7857
  var psd = { width: width, height: height, channels: channels, bitsPerChannel: bitsPerChannel, colorMode: colorMode };
7697
- var opt = __assign(__assign({}, options), { large: version === 2 });
7858
+ var options = __assign(__assign({}, readOptions), { large: version === 2, globalAlpha: false });
7698
7859
  var fixOffsets = [0, 1, -1, 2, -2, 3, -3, 4, -4];
7699
7860
  // color mode data
7700
7861
  readSection(reader, 1, function (left) {
7701
- if (opt.throwForMissingFeatures)
7862
+ if (options.throwForMissingFeatures)
7702
7863
  throw new Error('Color mode data not supported');
7703
7864
  skipBytes(reader, left());
7704
7865
  });
@@ -7725,22 +7886,22 @@ function readPsd(reader, options) {
7725
7886
  readPascalString(reader, 2); // name
7726
7887
  readSection(reader, 2, function (left) {
7727
7888
  var handler = imageResources_1.resourceHandlersMap[id];
7728
- var skip = id === 1036 && !!opt.skipThumbnail;
7889
+ var skip = id === 1036 && !!options.skipThumbnail;
7729
7890
  if (!psd.imageResources) {
7730
7891
  psd.imageResources = {};
7731
7892
  }
7732
7893
  if (handler && !skip) {
7733
7894
  try {
7734
- handler.read(reader, psd.imageResources, left, opt);
7895
+ handler.read(reader, psd.imageResources, left, options);
7735
7896
  }
7736
7897
  catch (e) {
7737
- if (opt.throwForMissingFeatures)
7898
+ if (options.throwForMissingFeatures)
7738
7899
  throw e;
7739
7900
  skipBytes(reader, left());
7740
7901
  }
7741
7902
  }
7742
7903
  else {
7743
- // options.logMissingFeatures && console.log(`Unhandled image resource: ${id}`);
7904
+ // options.logMissingFeatures && console.log(`Unhandled image resource: ${id} (${left()})`);
7744
7905
  skipBytes(reader, left());
7745
7906
  }
7746
7907
  });
@@ -7750,9 +7911,11 @@ function readPsd(reader, options) {
7750
7911
  }
7751
7912
  });
7752
7913
  // layer and mask info
7753
- var globalAlpha = false;
7754
7914
  readSection(reader, 1, function (left) {
7755
- globalAlpha = readLayerInfo(reader, psd, opt);
7915
+ readSection(reader, 2, function (left) {
7916
+ readLayerInfo(reader, psd, options);
7917
+ skipBytes(reader, left());
7918
+ }, undefined, options.large);
7756
7919
  // SAI does not include this section
7757
7920
  if (left() > 0) {
7758
7921
  var globalLayerMaskInfo = readGlobalLayerMaskInfo(reader);
@@ -7771,18 +7934,18 @@ function readPsd(reader, options) {
7771
7934
  skipBytes(reader, 1);
7772
7935
  }
7773
7936
  if (left() >= 12) {
7774
- readAdditionalLayerInfo(reader, psd, psd, opt);
7937
+ readAdditionalLayerInfo(reader, psd, psd, options);
7775
7938
  }
7776
7939
  else {
7777
7940
  // opt.logMissingFeatures && console.log('skipping leftover bytes', left());
7778
7941
  skipBytes(reader, left());
7779
7942
  }
7780
7943
  }
7781
- }, undefined, opt.large);
7944
+ }, undefined, options.large);
7782
7945
  var hasChildren = psd.children && psd.children.length;
7783
- var skipComposite = opt.skipCompositeImageData && (opt.skipLayerImageData || hasChildren);
7946
+ var skipComposite = options.skipCompositeImageData && (options.skipLayerImageData || hasChildren);
7784
7947
  if (!skipComposite) {
7785
- readImageData(reader, psd, globalAlpha, opt);
7948
+ readImageData(reader, psd, options);
7786
7949
  }
7787
7950
  // TODO: show converted color mode instead of original PSD file color mode
7788
7951
  // but add option to preserve file color mode (need to return image data instead of canvas in that case)
@@ -7791,52 +7954,48 @@ function readPsd(reader, options) {
7791
7954
  }
7792
7955
  exports.readPsd = readPsd;
7793
7956
  function readLayerInfo(reader, psd, options) {
7794
- var globalAlpha = false;
7795
- readSection(reader, 2, function (left) {
7796
- var layerCount = readInt16(reader);
7797
- if (layerCount < 0) {
7798
- globalAlpha = true;
7799
- layerCount = -layerCount;
7800
- }
7801
- var layers = [];
7802
- var layerChannels = [];
7957
+ var layerCount = readInt16(reader);
7958
+ if (layerCount < 0) {
7959
+ options.globalAlpha = true;
7960
+ layerCount = -layerCount;
7961
+ }
7962
+ var layers = [];
7963
+ var layerChannels = [];
7964
+ for (var i = 0; i < layerCount; i++) {
7965
+ var _a = readLayerRecord(reader, psd, options), layer = _a.layer, channels = _a.channels;
7966
+ layers.push(layer);
7967
+ layerChannels.push(channels);
7968
+ }
7969
+ if (!options.skipLayerImageData) {
7803
7970
  for (var i = 0; i < layerCount; i++) {
7804
- var _a = readLayerRecord(reader, psd, options), layer = _a.layer, channels = _a.channels;
7805
- layers.push(layer);
7806
- layerChannels.push(channels);
7971
+ readLayerChannelImageData(reader, psd, layers[i], layerChannels[i], options);
7807
7972
  }
7808
- if (!options.skipLayerImageData) {
7809
- for (var i = 0; i < layerCount; i++) {
7810
- readLayerChannelImageData(reader, psd, layers[i], layerChannels[i], options);
7811
- }
7973
+ }
7974
+ if (!psd.children)
7975
+ psd.children = [];
7976
+ var stack = [psd];
7977
+ for (var i = layers.length - 1; i >= 0; i--) {
7978
+ var l = layers[i];
7979
+ var type = l.sectionDivider ? l.sectionDivider.type : 0 /* SectionDividerType.Other */;
7980
+ if (type === 1 /* SectionDividerType.OpenFolder */ || type === 2 /* SectionDividerType.ClosedFolder */) {
7981
+ l.opened = type === 1 /* SectionDividerType.OpenFolder */;
7982
+ l.children = [];
7983
+ stack[stack.length - 1].children.unshift(l);
7984
+ stack.push(l);
7812
7985
  }
7813
- skipBytes(reader, left());
7814
- if (!psd.children)
7815
- psd.children = [];
7816
- var stack = [psd];
7817
- for (var i = layers.length - 1; i >= 0; i--) {
7818
- var l = layers[i];
7819
- var type = l.sectionDivider ? l.sectionDivider.type : 0 /* SectionDividerType.Other */;
7820
- if (type === 1 /* SectionDividerType.OpenFolder */ || type === 2 /* SectionDividerType.ClosedFolder */) {
7821
- l.opened = type === 1 /* SectionDividerType.OpenFolder */;
7822
- l.children = [];
7823
- stack[stack.length - 1].children.unshift(l);
7824
- stack.push(l);
7825
- }
7826
- else if (type === 3 /* SectionDividerType.BoundingSectionDivider */) {
7827
- stack.pop();
7828
- // this was workaround because I didn't know what `lsdk` section was, now it's probably not needed anymore
7829
- // } else if (l.name === '</Layer group>' && !l.sectionDivider && !l.top && !l.left && !l.bottom && !l.right) {
7830
- // // sometimes layer group terminator doesn't have sectionDivider, so we just guess here (PS bug ?)
7831
- // stack.pop();
7832
- }
7833
- else {
7834
- stack[stack.length - 1].children.unshift(l);
7835
- }
7986
+ else if (type === 3 /* SectionDividerType.BoundingSectionDivider */) {
7987
+ stack.pop();
7988
+ // this was workaround because I didn't know what `lsdk` section was, now it's probably not needed anymore
7989
+ // } else if (l.name === '</Layer group>' && !l.sectionDivider && !l.top && !l.left && !l.bottom && !l.right) {
7990
+ // // sometimes layer group terminator doesn't have sectionDivider, so we just guess here (PS bug ?)
7991
+ // stack.pop();
7836
7992
  }
7837
- }, undefined, options.large);
7838
- return globalAlpha;
7993
+ else {
7994
+ stack[stack.length - 1].children.unshift(l);
7995
+ }
7996
+ }
7839
7997
  }
7998
+ exports.readLayerInfo = readLayerInfo;
7840
7999
  function readLayerRecord(reader, psd, options) {
7841
8000
  var layer = {};
7842
8001
  layer.top = readInt32(reader);
@@ -7937,18 +8096,21 @@ function readLayerBlendingRanges(reader) {
7937
8096
  });
7938
8097
  }
7939
8098
  function readLayerChannelImageData(reader, psd, layer, channels, options) {
8099
+ var _a, _b, _c, _d;
7940
8100
  var layerWidth = (layer.right || 0) - (layer.left || 0);
7941
8101
  var layerHeight = (layer.bottom || 0) - (layer.top || 0);
7942
8102
  var cmyk = psd.colorMode === 4 /* ColorMode.CMYK */;
7943
8103
  var imageData;
7944
8104
  if (layerWidth && layerHeight) {
7945
8105
  if (cmyk) {
8106
+ if (psd.bitsPerChannel !== 8)
8107
+ throw new Error('bitsPerChannel Not supproted');
7946
8108
  imageData = { width: layerWidth, height: layerHeight, data: new Uint8ClampedArray(layerWidth * layerHeight * 5) };
7947
8109
  for (var p = 4; p < imageData.data.byteLength; p += 5)
7948
8110
  imageData.data[p] = 255;
7949
8111
  }
7950
8112
  else {
7951
- imageData = (0, helpers_1.createImageData)(layerWidth, layerHeight);
8113
+ imageData = createImageDataBitDepth(layerWidth, layerHeight, (_a = psd.bitsPerChannel) !== null && _a !== void 0 ? _a : 8);
7952
8114
  (0, helpers_1.resetImageData)(imageData);
7953
8115
  }
7954
8116
  }
@@ -7981,10 +8143,10 @@ function readLayerChannelImageData(reader, psd, layer, channels, options) {
7981
8143
  var maskWidth = (mask.right || 0) - (mask.left || 0);
7982
8144
  var maskHeight = (mask.bottom || 0) - (mask.top || 0);
7983
8145
  if (maskWidth && maskHeight) {
7984
- var maskData = (0, helpers_1.createImageData)(maskWidth, maskHeight);
8146
+ var maskData = createImageDataBitDepth(maskWidth, maskHeight, (_b = psd.bitsPerChannel) !== null && _b !== void 0 ? _b : 8);
7985
8147
  (0, helpers_1.resetImageData)(maskData);
7986
8148
  var start_1 = reader.offset;
7987
- readData(reader, channel.length, maskData, compression, maskWidth, maskHeight, 0, options.large, 4);
8149
+ readData(reader, channel.length, maskData, compression, maskWidth, maskHeight, (_c = psd.bitsPerChannel) !== null && _c !== void 0 ? _c : 8, 0, options.large, 4);
7988
8150
  if (helpers_1.RAW_IMAGE_DATA) {
7989
8151
  layer.maskDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start_1, reader.offset - start_1);
7990
8152
  }
@@ -7993,8 +8155,7 @@ function readLayerChannelImageData(reader, psd, layer, channels, options) {
7993
8155
  mask.imageData = maskData;
7994
8156
  }
7995
8157
  else {
7996
- mask.canvas = (0, helpers_1.createCanvas)(maskWidth, maskHeight);
7997
- mask.canvas.getContext('2d').putImageData(maskData, 0, 0);
8158
+ mask.canvas = (0, helpers_1.imageDataToCanvas)(maskData);
7998
8159
  }
7999
8160
  }
8000
8161
  }
@@ -8007,7 +8168,7 @@ function readLayerChannelImageData(reader, psd, layer, channels, options) {
8007
8168
  throw new Error("Channel not supported: ".concat(channel.id));
8008
8169
  }
8009
8170
  }
8010
- readData(reader, channel.length, targetData, compression, layerWidth, layerHeight, offset, options.large, cmyk ? 5 : 4);
8171
+ readData(reader, channel.length, targetData, compression, layerWidth, layerHeight, (_d = psd.bitsPerChannel) !== null && _d !== void 0 ? _d : 8, offset, options.large, cmyk ? 5 : 4);
8011
8172
  if (helpers_1.RAW_IMAGE_DATA) {
8012
8173
  layer.imageDataRaw[channel.id] = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start + 2, channel.length - 2);
8013
8174
  }
@@ -8027,23 +8188,22 @@ function readLayerChannelImageData(reader, psd, layer, channels, options) {
8027
8188
  layer.imageData = imageData;
8028
8189
  }
8029
8190
  else {
8030
- layer.canvas = (0, helpers_1.createCanvas)(layerWidth, layerHeight);
8031
- layer.canvas.getContext('2d').putImageData(imageData, 0, 0);
8191
+ layer.canvas = (0, helpers_1.imageDataToCanvas)(imageData);
8032
8192
  }
8033
8193
  }
8034
8194
  }
8035
- function readData(reader, length, data, compression, width, height, offset, large, step) {
8195
+ function readData(reader, length, data, compression, width, height, bitDepth, offset, large, step) {
8036
8196
  if (compression === 0 /* Compression.RawData */) {
8037
- readDataRaw(reader, data, width, height, step, offset);
8197
+ readDataRaw(reader, data, width, height, bitDepth, step, offset);
8038
8198
  }
8039
8199
  else if (compression === 1 /* Compression.RleCompressed */) {
8040
- readDataRLE(reader, data, width, height, step, [offset], large);
8200
+ readDataRLE(reader, data, width, height, bitDepth, step, [offset], large);
8041
8201
  }
8042
8202
  else if (compression === 2 /* Compression.ZipWithoutPrediction */) {
8043
- readDataZipWithoutPrediction(reader, length, data, width, height, step, offset);
8203
+ readDataZip(reader, length, data, width, height, bitDepth, step, offset, false);
8044
8204
  }
8045
8205
  else if (compression === 3 /* Compression.ZipWithPrediction */) {
8046
- throw new Error("Compression type not supported: ".concat(compression));
8206
+ readDataZip(reader, length, data, width, height, bitDepth, step, offset, true);
8047
8207
  }
8048
8208
  else {
8049
8209
  throw new Error("Invalid Compression type: ".concat(compression));
@@ -8064,6 +8224,7 @@ function readGlobalLayerMaskInfo(reader) {
8064
8224
  return { overlayColorSpace: overlayColorSpace, colorSpace1: colorSpace1, colorSpace2: colorSpace2, colorSpace3: colorSpace3, colorSpace4: colorSpace4, opacity: opacity, kind: kind };
8065
8225
  });
8066
8226
  }
8227
+ exports.readGlobalLayerMaskInfo = readGlobalLayerMaskInfo;
8067
8228
  function readAdditionalLayerInfo(reader, target, psd, options) {
8068
8229
  var sig = readSignature(reader);
8069
8230
  if (sig !== '8BIM' && sig !== '8B64')
@@ -8092,13 +8253,30 @@ function readAdditionalLayerInfo(reader, target, psd, options) {
8092
8253
  }
8093
8254
  }, false, u64);
8094
8255
  }
8095
- function readImageData(reader, psd, globalAlpha, options) {
8256
+ exports.readAdditionalLayerInfo = readAdditionalLayerInfo;
8257
+ function createImageDataBitDepth(width, height, bitDepth) {
8258
+ if (bitDepth === 1 || bitDepth === 8) {
8259
+ return (0, helpers_1.createImageData)(width, height);
8260
+ }
8261
+ else if (bitDepth === 16) {
8262
+ return { width: width, height: height, data: new Uint16Array(width * height * 4) };
8263
+ }
8264
+ else if (bitDepth === 32) {
8265
+ return { width: width, height: height, data: new Uint32Array(width * height * 4) };
8266
+ }
8267
+ else {
8268
+ throw new Error("Invalid bitDepth (".concat(bitDepth, ")"));
8269
+ }
8270
+ }
8271
+ function readImageData(reader, psd, options) {
8272
+ var _a, _b;
8096
8273
  var compression = readUint16(reader);
8274
+ var bitsPerChannel = (_a = psd.bitsPerChannel) !== null && _a !== void 0 ? _a : 8;
8097
8275
  if (exports.supportedColorModes.indexOf(psd.colorMode) === -1)
8098
8276
  throw new Error("Color mode not supported: ".concat(psd.colorMode));
8099
8277
  if (compression !== 0 /* Compression.RawData */ && compression !== 1 /* Compression.RleCompressed */)
8100
8278
  throw new Error("Compression type not supported: ".concat(compression));
8101
- var imageData = (0, helpers_1.createImageData)(psd.width, psd.height);
8279
+ var imageData = createImageDataBitDepth(psd.width, psd.height, bitsPerChannel);
8102
8280
  (0, helpers_1.resetImageData)(imageData);
8103
8281
  switch (psd.colorMode) {
8104
8282
  case 0 /* ColorMode.Bitmap */: {
@@ -8108,7 +8286,7 @@ function readImageData(reader, psd, globalAlpha, options) {
8108
8286
  }
8109
8287
  else if (compression === 1 /* Compression.RleCompressed */) {
8110
8288
  bytes = new Uint8Array(psd.width * psd.height);
8111
- readDataRLE(reader, { data: bytes, width: psd.width, height: psd.height }, psd.width, psd.height, 1, [0], options.large);
8289
+ readDataRLE(reader, { data: bytes, width: psd.width, height: psd.height }, psd.width, psd.height, bitsPerChannel, 1, [0], options.large);
8112
8290
  }
8113
8291
  else {
8114
8292
  throw new Error("Bitmap compression not supported: ".concat(compression));
@@ -8125,17 +8303,17 @@ function readImageData(reader, psd, globalAlpha, options) {
8125
8303
  channels.push(i);
8126
8304
  }
8127
8305
  }
8128
- else if (globalAlpha) {
8306
+ else if (options.globalAlpha) {
8129
8307
  channels.push(3);
8130
8308
  }
8131
8309
  if (compression === 0 /* Compression.RawData */) {
8132
8310
  for (var i = 0; i < channels.length; i++) {
8133
- readDataRaw(reader, imageData, psd.width, psd.height, 4, channels[i]);
8311
+ readDataRaw(reader, imageData, psd.width, psd.height, bitsPerChannel, 4, channels[i]);
8134
8312
  }
8135
8313
  }
8136
8314
  else if (compression === 1 /* Compression.RleCompressed */) {
8137
8315
  var start = reader.offset;
8138
- readDataRLE(reader, imageData, psd.width, psd.height, 4, channels, options.large);
8316
+ readDataRLE(reader, imageData, psd.width, psd.height, bitsPerChannel, 4, channels, options.large);
8139
8317
  if (helpers_1.RAW_IMAGE_DATA)
8140
8318
  psd.imageDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start, reader.offset - start);
8141
8319
  }
@@ -8145,10 +8323,12 @@ function readImageData(reader, psd, globalAlpha, options) {
8145
8323
  break;
8146
8324
  }
8147
8325
  case 4 /* ColorMode.CMYK */: {
8326
+ if (psd.bitsPerChannel !== 8)
8327
+ throw new Error('bitsPerChannel Not supproted');
8148
8328
  if (psd.channels !== 4)
8149
8329
  throw new Error("Invalid channel count");
8150
8330
  var channels = [0, 1, 2, 3];
8151
- if (globalAlpha)
8331
+ if (options.globalAlpha)
8152
8332
  channels.push(4);
8153
8333
  if (compression === 0 /* Compression.RawData */) {
8154
8334
  throw new Error("Not implemented");
@@ -8164,7 +8344,7 @@ function readImageData(reader, psd, globalAlpha, options) {
8164
8344
  data: new Uint8Array(imageData.width * imageData.height * 5),
8165
8345
  };
8166
8346
  var start = reader.offset;
8167
- readDataRLE(reader, cmykImageData, psd.width, psd.height, 5, channels, options.large);
8347
+ readDataRLE(reader, cmykImageData, psd.width, psd.height, (_b = psd.bitsPerChannel) !== null && _b !== void 0 ? _b : 8, 5, channels, options.large);
8168
8348
  cmykToRgb(cmykImageData, imageData, true);
8169
8349
  if (helpers_1.RAW_IMAGE_DATA)
8170
8350
  psd.imageDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start, reader.offset - start);
@@ -8174,7 +8354,9 @@ function readImageData(reader, psd, globalAlpha, options) {
8174
8354
  default: throw new Error("Color mode not supported: ".concat(psd.colorMode));
8175
8355
  }
8176
8356
  // remove weird white matte
8177
- if (globalAlpha) {
8357
+ if (options.globalAlpha) {
8358
+ if (psd.bitsPerChannel !== 8)
8359
+ throw new Error('bitsPerChannel Not supproted');
8178
8360
  var p = imageData.data;
8179
8361
  var size = imageData.width * imageData.height * 4;
8180
8362
  for (var i = 0; i < size; i += 4) {
@@ -8193,8 +8375,7 @@ function readImageData(reader, psd, globalAlpha, options) {
8193
8375
  psd.imageData = imageData;
8194
8376
  }
8195
8377
  else {
8196
- psd.canvas = (0, helpers_1.createCanvas)(psd.width, psd.height);
8197
- psd.canvas.getContext('2d').putImageData(imageData, 0, 0);
8378
+ psd.canvas = (0, helpers_1.imageDataToCanvas)(imageData);
8198
8379
  }
8199
8380
  }
8200
8381
  function cmykToRgb(cmyk, rgb, reverseAlpha) {
@@ -8222,29 +8403,89 @@ function cmykToRgb(cmyk, rgb, reverseAlpha) {
8222
8403
  // dstData[dst + 3] = reverseAlpha ? 255 - srcData[src + 4] : srcData[src + 4];
8223
8404
  // }
8224
8405
  }
8225
- function readDataRaw(reader, pixelData, width, height, step, offset) {
8226
- var size = width * height;
8227
- var buffer = readBytes(reader, size);
8406
+ function verifyCompatible(a, b) {
8407
+ if ((a.byteLength / a.length) !== (b.byteLength / b.length)) {
8408
+ throw new Error('Invalid array types');
8409
+ }
8410
+ }
8411
+ function bytesToArray(bytes, bitDepth) {
8412
+ if (bitDepth === 8) {
8413
+ return bytes;
8414
+ }
8415
+ else if (bitDepth === 16) {
8416
+ if (bytes.byteOffset % 2) {
8417
+ var result = new Uint16Array(bytes.byteLength / 2);
8418
+ new Uint8Array(result.buffer, result.byteOffset, result.byteLength).set(bytes);
8419
+ return result;
8420
+ }
8421
+ else {
8422
+ return new Uint16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 2);
8423
+ }
8424
+ }
8425
+ else if (bitDepth === 32) {
8426
+ if (bytes.byteOffset % 4) {
8427
+ var result = new Uint32Array(bytes.byteLength / 4);
8428
+ new Uint8Array(result.buffer, result.byteOffset, result.byteLength).set(bytes);
8429
+ return result;
8430
+ }
8431
+ else {
8432
+ return new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);
8433
+ }
8434
+ }
8435
+ else {
8436
+ throw new Error("Invalid bitDepth (".concat(bitDepth, ")"));
8437
+ }
8438
+ }
8439
+ function copyChannelToPixelData(pixelData, channel, offset, step) {
8440
+ verifyCompatible(pixelData.data, channel);
8441
+ var size = pixelData.width * pixelData.height;
8442
+ var data = pixelData.data;
8443
+ for (var i = 0, p = offset | 0; i < size; i++, p = (p + step) | 0) {
8444
+ data[p] = channel[i];
8445
+ }
8446
+ }
8447
+ function readDataRaw(reader, pixelData, width, height, bitDepth, step, offset) {
8448
+ var buffer = readBytes(reader, width * height * Math.floor(bitDepth / 8));
8449
+ var array = bytesToArray(buffer, bitDepth);
8228
8450
  if (pixelData && offset < step) {
8229
- var data = pixelData.data;
8230
- for (var i = 0, p = offset | 0; i < size; i++, p = (p + step) | 0) {
8231
- data[p] = buffer[i];
8451
+ copyChannelToPixelData(pixelData, array, offset, step);
8452
+ }
8453
+ }
8454
+ function decodePredicted(data, width, height, mod) {
8455
+ for (var y = 0; y < height; y++) {
8456
+ var offset = y * width;
8457
+ for (var x = 1, o = offset + 1; x < width; x++, o++) {
8458
+ data[o] = (data[o - 1] + data[o]) % mod;
8232
8459
  }
8233
8460
  }
8234
8461
  }
8235
- function readDataZipWithoutPrediction(reader, length, pixelData, width, height, step, offset) {
8462
+ function readDataZip(reader, length, pixelData, width, height, bitDepth, step, offset, prediction) {
8236
8463
  var compressed = readBytes(reader, length);
8237
8464
  var decompressed = (0, pako_1.inflate)(compressed);
8238
- var size = width * height;
8239
8465
  if (pixelData && offset < step) {
8240
- var data = pixelData.data;
8241
- for (var i = 0, p = offset | 0; i < size; i++, p = (p + step) | 0) {
8242
- data[p] = decompressed[i];
8466
+ var array = bytesToArray(decompressed, bitDepth);
8467
+ if (bitDepth === 8) {
8468
+ if (prediction)
8469
+ decodePredicted(decompressed, width, height, 0x100);
8470
+ copyChannelToPixelData(pixelData, decompressed, offset, step);
8471
+ }
8472
+ else if (bitDepth === 16) {
8473
+ if (prediction)
8474
+ decodePredicted(array, width, height, 0x10000);
8475
+ copyChannelToPixelData(pixelData, array, offset, step);
8476
+ }
8477
+ else if (bitDepth === 32) {
8478
+ if (prediction)
8479
+ decodePredicted(decompressed, width, height, 0x100);
8480
+ copyChannelToPixelData(pixelData, array, offset, step);
8481
+ }
8482
+ else {
8483
+ throw new Error('Invalid bitDepth');
8243
8484
  }
8244
8485
  }
8245
8486
  }
8246
- exports.readDataZipWithoutPrediction = readDataZipWithoutPrediction;
8247
- function readDataRLE(reader, pixelData, _width, height, step, offsets, large) {
8487
+ exports.readDataZip = readDataZip;
8488
+ function readDataRLE(reader, pixelData, _width, height, bitDepth, step, offsets, large) {
8248
8489
  var data = pixelData && pixelData.data;
8249
8490
  var lengths;
8250
8491
  if (large) {
@@ -8263,6 +8504,8 @@ function readDataRLE(reader, pixelData, _width, height, step, offsets, large) {
8263
8504
  }
8264
8505
  }
8265
8506
  }
8507
+ if (bitDepth !== 1 && bitDepth !== 8)
8508
+ throw new Error("Invalid bit depth (".concat(bitDepth, ")"));
8266
8509
  var extraLimit = (step - 1) | 0; // 3 for rgb, 4 for cmyk
8267
8510
  for (var c = 0, li = 0; c < offsets.length; c++) {
8268
8511
  var offset = offsets[c] | 0;
@@ -8672,12 +8915,31 @@ function writeSection(writer, round, func, writeTotalLength, large) {
8672
8915
  writer.view.setUint32(offset, length, false);
8673
8916
  }
8674
8917
  exports.writeSection = writeSection;
8918
+ function verifyBitCount(target) {
8919
+ var _a;
8920
+ (_a = target.children) === null || _a === void 0 ? void 0 : _a.forEach(verifyBitCount);
8921
+ var data = target.imageData;
8922
+ if (data && (data.data instanceof Uint32Array || data.data instanceof Uint16Array)) {
8923
+ throw new Error('imageData has incorrect bitDepth');
8924
+ }
8925
+ if ('mask' in target && target.mask) {
8926
+ var data_1 = target.mask.imageData;
8927
+ if (data_1 && (data_1.data instanceof Uint32Array || data_1.data instanceof Uint16Array)) {
8928
+ throw new Error('mask imageData has incorrect bitDepth');
8929
+ }
8930
+ }
8931
+ }
8675
8932
  function writePsd(writer, psd, options) {
8933
+ var _a;
8676
8934
  if (options === void 0) { options = {}; }
8677
8935
  if (!(+psd.width > 0 && +psd.height > 0))
8678
8936
  throw new Error('Invalid document size');
8679
8937
  if ((psd.width > 30000 || psd.height > 30000) && !options.psb)
8680
8938
  throw new Error('Document size is too large (max is 30000x30000, use PSB format instead)');
8939
+ var bitsPerChannel = (_a = psd.bitsPerChannel) !== null && _a !== void 0 ? _a : 8;
8940
+ if (bitsPerChannel !== 8)
8941
+ throw new Error('bitsPerChannel other than 8 are not supported for writing');
8942
+ verifyBitCount(psd);
8681
8943
  var imageResources = psd.imageResources || {};
8682
8944
  var opt = __assign(__assign({}, options), { layerIds: new Set(), layerToId: new Map() });
8683
8945
  if (opt.generateThumbnail) {
@@ -8699,7 +8961,7 @@ function writePsd(writer, psd, options) {
8699
8961
  writeUint16(writer, globalAlpha ? 4 : 3); // channels
8700
8962
  writeUint32(writer, psd.height);
8701
8963
  writeUint32(writer, psd.width);
8702
- writeUint16(writer, 8); // bits per channel
8964
+ writeUint16(writer, bitsPerChannel); // bits per channel
8703
8965
  writeUint16(writer, 3 /* ColorMode.RGB */); // we only support saving RGB right now
8704
8966
  // color mode data
8705
8967
  writeSection(writer, 1, function () {
@@ -8996,9 +9258,7 @@ function createThumbnail(psd) {
8996
9258
  var context = canvas.getContext('2d');
8997
9259
  context.scale(scale, scale);
8998
9260
  if (psd.imageData) {
8999
- var temp = (0, helpers_1.createCanvas)(psd.imageData.width, psd.imageData.height);
9000
- temp.getContext('2d').putImageData(psd.imageData, 0, 0);
9001
- context.drawImage(temp, 0, 0);
9261
+ context.drawImage((0, helpers_1.imageDataToCanvas)(psd.imageData), 0, 0);
9002
9262
  }
9003
9263
  else if (psd.canvas) {
9004
9264
  context.drawImage(psd.canvas, 0, 0);
@@ -9053,6 +9313,9 @@ function getLayerDimentions(_a) {
9053
9313
  return imageData || canvas || { width: 0, height: 0 };
9054
9314
  }
9055
9315
  function cropImageData(data, left, top, width, height) {
9316
+ if (data.data instanceof Uint32Array || data.data instanceof Uint16Array) {
9317
+ throw new Error('imageData has incorrect bit depth');
9318
+ }
9056
9319
  var croppedData = (0, helpers_1.createImageData)(width, height);
9057
9320
  var srcData = data.data;
9058
9321
  var dstData = croppedData.data;