ag-psd 24.0.0 → 26.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/.v8-cache/v22.13.1-x64-00250a7c/4511bacf +0 -0
  2. package/.v8-cache/v22.13.1-x64-00250a7c/57d3380b +0 -0
  3. package/.v8-cache/v22.13.1-x64-00250a7c/6cbfc0ec +0 -0
  4. package/.v8-cache/v22.13.1-x64-00250a7c/7100ee08 +0 -0
  5. package/.v8-cache/v22.13.1-x64-00250a7c/75e41e43 +0 -0
  6. package/.v8-cache/v22.13.1-x64-00250a7c/8d0bf0b5 +0 -0
  7. package/.v8-cache/v22.13.1-x64-00250a7c/acc36e66 +0 -0
  8. package/.v8-cache/v22.13.1-x64-00250a7c/b3c2fab7 +0 -0
  9. package/.v8-cache/v22.13.1-x64-00250a7c/c314aece +0 -0
  10. package/.v8-cache/v22.13.1-x64-00250a7c/cfc49f4f +0 -0
  11. package/.v8-cache/v22.13.1-x64-00250a7c/e03e2acd +0 -0
  12. package/CHANGELOG.md +7 -0
  13. package/{TODO → TODO.md} +46 -0
  14. package/accept.js +18 -1
  15. package/dist/additionalInfo.js +62 -63
  16. package/dist/additionalInfo.js.map +1 -1
  17. package/dist/bundle.js +246 -186
  18. package/dist/descriptor.d.ts +4 -3
  19. package/dist/descriptor.js +9 -5
  20. package/dist/descriptor.js.map +1 -1
  21. package/dist/helpers.d.ts +1 -0
  22. package/dist/helpers.js.map +1 -1
  23. package/dist/imageResources.js +39 -5
  24. package/dist/imageResources.js.map +1 -1
  25. package/dist/psd.d.ts +12 -1
  26. package/dist/psd.js.map +1 -1
  27. package/dist/psdReader.js +39 -36
  28. package/dist/psdReader.js.map +1 -1
  29. package/dist/psdWriter.js +96 -76
  30. package/dist/psdWriter.js.map +1 -1
  31. package/dist-es/additionalInfo.js +62 -63
  32. package/dist-es/additionalInfo.js.map +1 -1
  33. package/dist-es/descriptor.d.ts +4 -3
  34. package/dist-es/descriptor.js +9 -5
  35. package/dist-es/descriptor.js.map +1 -1
  36. package/dist-es/helpers.d.ts +1 -0
  37. package/dist-es/helpers.js.map +1 -1
  38. package/dist-es/imageResources.js +41 -7
  39. package/dist-es/imageResources.js.map +1 -1
  40. package/dist-es/psd.d.ts +12 -1
  41. package/dist-es/psd.js.map +1 -1
  42. package/dist-es/psdReader.js +39 -36
  43. package/dist-es/psdReader.js.map +1 -1
  44. package/dist-es/psdWriter.js +96 -76
  45. package/dist-es/psdWriter.js.map +1 -1
  46. package/package.json +1 -1
  47. package/src/additionalInfo.ts +66 -66
  48. package/src/descriptor.ts +12 -8
  49. package/src/helpers.ts +1 -0
  50. package/src/imageResources.ts +46 -20
  51. package/src/psd.ts +9 -1
  52. package/src/psdReader.ts +43 -40
  53. package/src/psdWriter.ts +92 -78
package/dist/bundle.js CHANGED
@@ -579,6 +579,13 @@ addHandler('vmsk', hasKey('vectorMask'), function (reader, target, left, _a) {
579
579
  });
580
580
  // TODO: need to write vmsk if has outline ?
581
581
  addHandlerAlias('vsms', 'vmsk');
582
+ // addHandlerAlias('vmsk', 'vsms');
583
+ addHandler('vowv', // something with vectors?
584
+ hasKey('vowv'), function (reader, target) {
585
+ target.vowv = (0, psdReader_1.readUint32)(reader); // always 2 ????
586
+ }, function (writer, target) {
587
+ (0, psdWriter_1.writeUint32)(writer, target.vowv);
588
+ });
582
589
  addHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left) {
583
590
  if ((0, psdReader_1.readInt32)(reader) !== 1)
584
591
  throw new Error("Invalid vogk version");
@@ -633,58 +640,55 @@ addHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left)
633
640
  var desc = { keyDescriptorList: [] };
634
641
  for (var i = 0; i < orig.keyDescriptorList.length; i++) {
635
642
  var item = orig.keyDescriptorList[i];
636
- if (item.keyShapeInvalidated) {
637
- desc.keyDescriptorList.push({ keyShapeInvalidated: true, keyOriginIndex: i });
643
+ desc.keyDescriptorList.push({}); // we're adding keyOriginIndex at the end
644
+ var out = desc.keyDescriptorList[desc.keyDescriptorList.length - 1];
645
+ if (item.keyOriginType != null)
646
+ out.keyOriginType = item.keyOriginType;
647
+ if (item.keyOriginResolution != null)
648
+ out.keyOriginResolution = item.keyOriginResolution;
649
+ var radii = item.keyOriginRRectRadii;
650
+ if (radii) {
651
+ out.keyOriginRRectRadii = {
652
+ unitValueQuadVersion: 1,
653
+ topRight: (0, descriptor_1.unitsValue)(radii.topRight, 'topRight'),
654
+ topLeft: (0, descriptor_1.unitsValue)(radii.topLeft, 'topLeft'),
655
+ bottomLeft: (0, descriptor_1.unitsValue)(radii.bottomLeft, 'bottomLeft'),
656
+ bottomRight: (0, descriptor_1.unitsValue)(radii.bottomRight, 'bottomRight'),
657
+ };
638
658
  }
639
- else {
640
- desc.keyDescriptorList.push({}); // we're adding keyOriginIndex at the end
641
- var out = desc.keyDescriptorList[desc.keyDescriptorList.length - 1];
642
- if (item.keyOriginType != null)
643
- out.keyOriginType = item.keyOriginType;
644
- if (item.keyOriginResolution != null)
645
- out.keyOriginResolution = item.keyOriginResolution;
646
- var radii = item.keyOriginRRectRadii;
647
- if (radii) {
648
- out.keyOriginRRectRadii = {
649
- unitValueQuadVersion: 1,
650
- topRight: (0, descriptor_1.unitsValue)(radii.topRight, 'topRight'),
651
- topLeft: (0, descriptor_1.unitsValue)(radii.topLeft, 'topLeft'),
652
- bottomLeft: (0, descriptor_1.unitsValue)(radii.bottomLeft, 'bottomLeft'),
653
- bottomRight: (0, descriptor_1.unitsValue)(radii.bottomRight, 'bottomRight'),
654
- };
655
- }
656
- var box = item.keyOriginShapeBoundingBox;
657
- if (box) {
658
- out.keyOriginShapeBBox = {
659
- unitValueQuadVersion: 1,
660
- 'Top ': (0, descriptor_1.unitsValue)(box.top, 'top'),
661
- Left: (0, descriptor_1.unitsValue)(box.left, 'left'),
662
- Btom: (0, descriptor_1.unitsValue)(box.bottom, 'bottom'),
663
- Rght: (0, descriptor_1.unitsValue)(box.right, 'right'),
664
- };
665
- }
666
- var corners = item.keyOriginBoxCorners;
667
- if (corners && corners.length === 4) {
668
- out.keyOriginBoxCorners = {
669
- rectangleCornerA: { Hrzn: corners[0].x, Vrtc: corners[0].y },
670
- rectangleCornerB: { Hrzn: corners[1].x, Vrtc: corners[1].y },
671
- rectangleCornerC: { Hrzn: corners[2].x, Vrtc: corners[2].y },
672
- rectangleCornerD: { Hrzn: corners[3].x, Vrtc: corners[3].y },
673
- };
674
- }
675
- var transform = item.transform;
676
- if (transform && transform.length === 6) {
677
- out.Trnf = {
678
- xx: transform[0],
679
- xy: transform[1],
680
- yx: transform[2],
681
- yy: transform[3],
682
- tx: transform[4],
683
- ty: transform[5],
684
- };
685
- }
686
- out.keyOriginIndex = i;
659
+ var box = item.keyOriginShapeBoundingBox;
660
+ if (box) {
661
+ out.keyOriginShapeBBox = {
662
+ unitValueQuadVersion: 1,
663
+ 'Top ': (0, descriptor_1.unitsValue)(box.top, 'top'),
664
+ Left: (0, descriptor_1.unitsValue)(box.left, 'left'),
665
+ Btom: (0, descriptor_1.unitsValue)(box.bottom, 'bottom'),
666
+ Rght: (0, descriptor_1.unitsValue)(box.right, 'right'),
667
+ };
668
+ }
669
+ var corners = item.keyOriginBoxCorners;
670
+ if (corners && corners.length === 4) {
671
+ out.keyOriginBoxCorners = {
672
+ rectangleCornerA: { Hrzn: corners[0].x, Vrtc: corners[0].y },
673
+ rectangleCornerB: { Hrzn: corners[1].x, Vrtc: corners[1].y },
674
+ rectangleCornerC: { Hrzn: corners[2].x, Vrtc: corners[2].y },
675
+ rectangleCornerD: { Hrzn: corners[3].x, Vrtc: corners[3].y },
676
+ };
687
677
  }
678
+ var transform = item.transform;
679
+ if (transform && transform.length === 6) {
680
+ out.Trnf = {
681
+ xx: transform[0],
682
+ xy: transform[1],
683
+ yx: transform[2],
684
+ yy: transform[3],
685
+ tx: transform[4],
686
+ ty: transform[5],
687
+ };
688
+ }
689
+ if (item.keyShapeInvalidated != null)
690
+ out.keyShapeInvalidated = item.keyShapeInvalidated;
691
+ out.keyOriginIndex = i;
688
692
  }
689
693
  (0, psdWriter_1.writeInt32)(writer, 1); // version
690
694
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
@@ -1156,7 +1160,13 @@ function isQuiltWarp(warp) {
1156
1160
  }
1157
1161
  function encodeWarp(warp) {
1158
1162
  var bounds = warp.bounds;
1159
- var desc = __assign(__assign({ warpStyle: descriptor_1.warpStyle.encode(warp.style) }, (warp.values ? { warpValues: warp.values } : { warpValue: warp.value || 0 })), { warpPerspective: warp.perspective || 0, warpPerspectiveOther: warp.perspectiveOther || 0, warpRotate: descriptor_1.Ornt.encode(warp.rotate), bounds: {
1163
+ var desc = __assign(__assign({ warpStyle: descriptor_1.warpStyle.encode(warp.style) }, (warp.values ? { warpValues: warp.values } : { warpValue: warp.value || 0 })), { warpPerspective: warp.perspective || 0, warpPerspectiveOther: warp.perspectiveOther || 0, warpRotate: descriptor_1.Ornt.encode(warp.rotate), bounds: /*1 ? { // testing
1164
+ _classID: 'classFloatRect',
1165
+ 'Top ': bounds && bounds.top && bounds.top.value || 0,
1166
+ Left: bounds && bounds.left && bounds.left.value || 0,
1167
+ Btom: bounds && bounds.bottom && bounds.bottom.value || 0,
1168
+ Rght: bounds && bounds.right && bounds.right.value || 0,
1169
+ } :*/ {
1160
1170
  'Top ': (0, descriptor_1.unitsValue)(bounds && bounds.top || { units: 'Pixels', value: 0 }, 'bounds.top'),
1161
1171
  Left: (0, descriptor_1.unitsValue)(bounds && bounds.left || { units: 'Pixels', value: 0 }, 'bounds.left'),
1162
1172
  Btom: (0, descriptor_1.unitsValue)(bounds && bounds.bottom || { units: 'Pixels', value: 0 }, 'bounds.bottom'),
@@ -1721,6 +1731,7 @@ function serializeFilterFXItem(f) {
1721
1731
  'Rds ': uvRadius(f.filter),
1722
1732
  }, filterID: 697 });
1723
1733
  case 'gaussian blur': return __assign(__assign({}, base), { Fltr: {
1734
+ // _name: '高斯模糊', // Testing
1724
1735
  _name: 'Gaussian Blur',
1725
1736
  _classID: 'GsnB',
1726
1737
  'Rds ': uvRadius(f.filter),
@@ -2333,18 +2344,6 @@ addHandler('LMsk', hasKey('userMask'), function (reader, target) {
2333
2344
  (0, psdWriter_1.writeUint8)(writer, 128);
2334
2345
  (0, psdWriter_1.writeZeros)(writer, 1);
2335
2346
  });
2336
- if (helpers_1.MOCK_HANDLERS) {
2337
- addHandler('vowv', // appears with Lr16 section ?
2338
- function (// appears with Lr16 section ?
2339
- _) { return false; }, function (reader, target, left) {
2340
- var value = (0, psdReader_1.readUint32)(reader); // always 2 ????
2341
- reader;
2342
- target;
2343
- console.log('vowv', { value: value }, left());
2344
- }, function (_writer, _target) {
2345
- // TODO: write
2346
- });
2347
- }
2348
2347
  if (helpers_1.MOCK_HANDLERS) {
2349
2348
  addHandler('Patt', function (target) { return target._Patt !== undefined; }, function (reader, target, left) {
2350
2349
  // console.log('additional info: Patt');
@@ -3761,12 +3760,13 @@ function makeType(name, classID) {
3761
3760
  return { name: name, classID: classID };
3762
3761
  }
3763
3762
  var nullType = makeType('', 'null');
3763
+ var USE_CHINESE = false; // Testing
3764
3764
  var fieldToExtType = {
3765
3765
  strokeStyleContent: makeType('', 'solidColorLayer'),
3766
- // printProofSetup: makeType('校样设置', 'proofSetup'), // TESTING
3767
- printProofSetup: makeType('Proof Setup', 'proofSetup'),
3766
+ printProofSetup: makeType(USE_CHINESE ? '校样设置' : 'Proof Setup', 'proofSetup'),
3767
+ Grad: makeType(USE_CHINESE ? '渐变' : 'Gradient', 'Grdn'),
3768
+ Trnf: makeType(USE_CHINESE ? '变换' : 'Transform', 'Trnf'),
3768
3769
  patternFill: makeType('', 'patternFill'),
3769
- Grad: makeType('Gradient', 'Grdn'),
3770
3770
  ebbl: makeType('', 'ebbl'),
3771
3771
  SoFi: makeType('', 'SoFi'),
3772
3772
  GrFl: makeType('', 'GrFl'),
@@ -3808,7 +3808,6 @@ var fieldToExtType = {
3808
3808
  rectangleCornerC: makeType('', 'Pnt '),
3809
3809
  rectangleCornerD: makeType('', 'Pnt '),
3810
3810
  compInfo: nullType,
3811
- Trnf: makeType('Transform', 'Trnf'),
3812
3811
  quiltWarp: makeType('', 'quiltWarp'),
3813
3812
  generatorSettings: nullType,
3814
3813
  crema: nullType,
@@ -3911,7 +3910,7 @@ var typeToField = {
3911
3910
  'tableOrder', 'enableCompCore', 'enableCompCoreGPU', 'compCoreSupport', 'compCoreGPUSupport', 'Engn',
3912
3911
  'enableCompCoreThreads', 'gs99', 'FrDs', 'trackID', 'animInterpStyle', 'horzAlign',
3913
3912
  'vertAlign', 'bgColorType', 'shapeOperation', 'UndA', 'Wvtp', 'Drct', 'WndM', 'Edg ', 'FlCl', 'IntE',
3914
- 'IntC', 'Cnvr', 'Fl ', 'Dstr', 'MztT', 'Lns ', 'ExtT', 'DspM', 'ExtR', 'ZZTy', 'SphM', 'SmBQ', 'placedLayerOCIOConversion',
3913
+ 'IntC', 'Cnvr', 'Fl ', 'Dstr', 'MztT', 'Lns ', 'ExtT', 'DspM', 'ExtR', 'ZZTy', 'SphM', 'SmBQ', 'placedLayerOCIOConversion', 'gradientsInterpolationMethod',
3915
3914
  ],
3916
3915
  'bool': [
3917
3916
  'PstS', 'printSixteenBit', 'masterFXSwitch', 'enab', 'uglg', 'antialiasGloss',
@@ -5199,6 +5198,8 @@ function parseGradientContent(descriptor) {
5199
5198
  result.style = exports.GrdT.decode(descriptor.Type);
5200
5199
  if (descriptor.Dthr !== undefined)
5201
5200
  result.dither = descriptor.Dthr;
5201
+ if (descriptor.gradientsInterpolationMethod !== undefined)
5202
+ result.interpolationMethod = exports.gradientInterpolationMethodType.decode(descriptor.gradientsInterpolationMethod);
5202
5203
  if (descriptor.Rvrs !== undefined)
5203
5204
  result.reverse = descriptor.Rvrs;
5204
5205
  if (descriptor.Angl !== undefined)
@@ -5245,6 +5246,8 @@ function serializeGradientContent(content) {
5245
5246
  var result = {};
5246
5247
  if (content.dither !== undefined)
5247
5248
  result.Dthr = content.dither;
5249
+ if (content.interpolationMethod !== undefined)
5250
+ result.gradientsInterpolationMethod = exports.gradientInterpolationMethodType.encode(content.interpolationMethod);
5248
5251
  if (content.reverse !== undefined)
5249
5252
  result.Rvrs = content.reverse;
5250
5253
  if (content.angle !== undefined)
@@ -6790,6 +6793,33 @@ function writeUtf8String(writer, value) {
6790
6793
  var buffer = (0, utf8_1.encodeString)(value);
6791
6794
  (0, psdWriter_1.writeBytes)(writer, buffer);
6792
6795
  }
6796
+ function readEncodedString(reader) {
6797
+ var length = (0, psdReader_1.readUint8)(reader);
6798
+ var buffer = (0, psdReader_1.readBytes)(reader, length);
6799
+ var notAscii = false;
6800
+ for (var i = 0; i < buffer.byteLength; i++) {
6801
+ if (buffer[i] & 0x80) {
6802
+ notAscii = true;
6803
+ break;
6804
+ }
6805
+ }
6806
+ if (notAscii) {
6807
+ var decoder = new TextDecoder('gbk');
6808
+ return decoder.decode(buffer);
6809
+ }
6810
+ else {
6811
+ return (0, utf8_1.decodeString)(buffer);
6812
+ }
6813
+ }
6814
+ function writeEncodedString(writer, value) {
6815
+ var ascii = '';
6816
+ for (var i = 0, code = value.codePointAt(i++); code !== undefined; code = value.codePointAt(i++)) {
6817
+ ascii += code > 0x7f ? '?' : String.fromCodePoint(code);
6818
+ }
6819
+ var buffer = (0, utf8_1.encodeString)(ascii);
6820
+ (0, psdWriter_1.writeUint8)(writer, buffer.byteLength);
6821
+ (0, psdWriter_1.writeBytes)(writer, buffer);
6822
+ }
6793
6823
  helpers_1.MOCK_HANDLERS && addHandler(1028, // IPTC-NAA record
6794
6824
  function (// IPTC-NAA record
6795
6825
  target) { return target._ir1028 !== undefined; }, function (reader, target, left) {
@@ -6937,15 +6967,22 @@ addHandler(1062, function (target) { return target.printScale !== undefined; },
6937
6967
  (0, psdWriter_1.writeFloat32)(writer, scale || 0);
6938
6968
  });
6939
6969
  addHandler(1006, function (target) { return target.alphaChannelNames !== undefined; }, function (reader, target, left) {
6940
- target.alphaChannelNames = [];
6941
- while (left() > 0) {
6942
- var value = (0, psdReader_1.readPascalString)(reader, 1);
6943
- target.alphaChannelNames.push(value);
6970
+ if (!target.alphaChannelNames) { // skip if the unicode versions are already read
6971
+ target.alphaChannelNames = [];
6972
+ while (left() > 0) {
6973
+ var value = readEncodedString(reader);
6974
+ // const value = readPascalString(reader, 1);
6975
+ target.alphaChannelNames.push(value);
6976
+ }
6977
+ }
6978
+ else {
6979
+ (0, psdReader_1.skipBytes)(reader, left());
6944
6980
  }
6945
6981
  }, function (writer, target) {
6946
6982
  for (var _i = 0, _a = target.alphaChannelNames; _i < _a.length; _i++) {
6947
6983
  var name_1 = _a[_i];
6948
- (0, psdWriter_1.writePascalString)(writer, name_1, 1);
6984
+ writeEncodedString(writer, name_1);
6985
+ // writePascalString(writer, name, 1);
6949
6986
  }
6950
6987
  });
6951
6988
  addHandler(1045, function (target) { return target.alphaChannelNames !== undefined; }, function (reader, target, left) {
@@ -8265,10 +8302,10 @@ function readLayerRecord(reader, psd) {
8265
8302
  // 0x20 - effects/filters panel is expanded
8266
8303
  skipBytes(reader, 1);
8267
8304
  readSection(reader, 1, function (left) {
8268
- var mask = readLayerMaskData(reader);
8269
- if (mask)
8270
- layer.mask = mask;
8271
- /*const blendingRanges =*/ readLayerBlendingRanges(reader);
8305
+ readLayerMaskData(reader, layer);
8306
+ var blendingRanges = readLayerBlendingRanges(reader);
8307
+ if (blendingRanges)
8308
+ layer.blendingRanges = blendingRanges;
8272
8309
  layer.name = readPascalString(reader, 1); // should be padded to 4, but is not sometimes
8273
8310
  // HACK: fix for sometimes layer.name string not being padded correctly, just skip until we get valid signature
8274
8311
  while (left() > 4 && !validSignatureAt(reader, reader.offset))
@@ -8279,11 +8316,12 @@ function readLayerRecord(reader, psd) {
8279
8316
  });
8280
8317
  return { layer: layer, channels: channels };
8281
8318
  }
8282
- function readLayerMaskData(reader) {
8319
+ function readLayerMaskData(reader, layer) {
8283
8320
  return readSection(reader, 1, function (left) {
8284
8321
  if (!left())
8285
8322
  return undefined;
8286
8323
  var mask = {};
8324
+ layer.mask = mask;
8287
8325
  mask.top = readInt32(reader);
8288
8326
  mask.left = readInt32(reader);
8289
8327
  mask.bottom = readInt32(reader);
@@ -8293,6 +8331,19 @@ function readLayerMaskData(reader) {
8293
8331
  mask.positionRelativeToLayer = (flags & 1 /* LayerMaskFlags.PositionRelativeToLayer */) !== 0;
8294
8332
  mask.disabled = (flags & 2 /* LayerMaskFlags.LayerMaskDisabled */) !== 0;
8295
8333
  mask.fromVectorData = (flags & 8 /* LayerMaskFlags.LayerMaskFromRenderingOtherData */) !== 0;
8334
+ if (left() >= 18) {
8335
+ var realMask = {};
8336
+ layer.realMask = realMask;
8337
+ var realFlags = readUint8(reader);
8338
+ realMask.positionRelativeToLayer = (realFlags & 1 /* LayerMaskFlags.PositionRelativeToLayer */) !== 0;
8339
+ realMask.disabled = (realFlags & 2 /* LayerMaskFlags.LayerMaskDisabled */) !== 0;
8340
+ realMask.fromVectorData = (realFlags & 8 /* LayerMaskFlags.LayerMaskFromRenderingOtherData */) !== 0;
8341
+ realMask.defaultColor = readUint8(reader); // Real user mask background. 0 or 255.
8342
+ realMask.top = readInt32(reader);
8343
+ realMask.left = readInt32(reader);
8344
+ realMask.bottom = readInt32(reader);
8345
+ realMask.right = readInt32(reader);
8346
+ }
8296
8347
  if (flags & 16 /* LayerMaskFlags.MaskHasParametersAppliedToIt */) {
8297
8348
  var params = readUint8(reader);
8298
8349
  if (params & 1 /* MaskParams.UserMaskDensity */)
@@ -8304,33 +8355,20 @@ function readLayerMaskData(reader) {
8304
8355
  if (params & 8 /* MaskParams.VectorMaskFeather */)
8305
8356
  mask.vectorMaskFeather = readFloat64(reader);
8306
8357
  }
8307
- if (left() > 2) {
8308
- // TODO: handle these values, this is RealUserMask
8309
- /*const realFlags = readUint8(reader);
8310
- const realUserMaskBackground = readUint8(reader);
8311
- const top2 = readInt32(reader);
8312
- const left2 = readInt32(reader);
8313
- const bottom2 = readInt32(reader);
8314
- const right2 = readInt32(reader);
8315
-
8316
- // TEMP
8317
- (mask as any)._real = { realFlags, realUserMaskBackground, top2, left2, bottom2, right2 };*/
8318
- if (reader.logMissingFeatures) {
8319
- reader.log('Unhandled extra real user mask params');
8320
- }
8321
- }
8322
8358
  skipBytes(reader, left());
8323
- return mask;
8324
8359
  });
8325
8360
  }
8361
+ function readBlendingRange(reader) {
8362
+ return [readUint8(reader), readUint8(reader), readUint8(reader), readUint8(reader)];
8363
+ }
8326
8364
  function readLayerBlendingRanges(reader) {
8327
8365
  return readSection(reader, 1, function (left) {
8328
- var compositeGrayBlendSource = readUint32(reader);
8329
- var compositeGraphBlendDestinationRange = readUint32(reader);
8366
+ var compositeGrayBlendSource = readBlendingRange(reader);
8367
+ var compositeGraphBlendDestinationRange = readBlendingRange(reader);
8330
8368
  var ranges = [];
8331
8369
  while (left() > 0) {
8332
- var sourceRange = readUint32(reader);
8333
- var destRange = readUint32(reader);
8370
+ var sourceRange = readBlendingRange(reader);
8371
+ var destRange = readBlendingRange(reader);
8334
8372
  ranges.push({ sourceRange: sourceRange, destRange: destRange });
8335
8373
  }
8336
8374
  return { compositeGrayBlendSource: compositeGrayBlendSource, compositeGraphBlendDestinationRange: compositeGraphBlendDestinationRange, ranges: ranges };
@@ -8379,20 +8417,28 @@ function readLayerChannelImageData(reader, psd, layer, channels) {
8379
8417
  }
8380
8418
  if (compression > 3)
8381
8419
  throw new Error("Invalid compression: ".concat(compression));
8382
- if (channel.id === -2 /* ChannelID.UserMask */) {
8383
- var mask = layer.mask;
8420
+ if (channel.id === -2 /* ChannelID.UserMask */ || channel.id === -3 /* ChannelID.RealUserMask */) {
8421
+ var mask = channel.id === -2 /* ChannelID.UserMask */ ? layer.mask : layer.realMask;
8384
8422
  if (!mask)
8385
- throw new Error("Missing layer mask data");
8423
+ throw new Error("Missing layer ".concat(channel.id === -2 /* ChannelID.UserMask */ ? 'mask' : 'real mask', " data"));
8386
8424
  var maskWidth = (mask.right || 0) - (mask.left || 0);
8387
8425
  var maskHeight = (mask.bottom || 0) - (mask.top || 0);
8426
+ if (maskWidth < 0 || maskHeight < 0 || maskWidth > 30000 || maskHeight > 30000)
8427
+ throw new Error('Invalid mask size');
8388
8428
  if (maskWidth && maskHeight) {
8389
8429
  var maskData = createImageDataBitDepth(maskWidth, maskHeight, (_b = psd.bitsPerChannel) !== null && _b !== void 0 ? _b : 8);
8390
8430
  (0, helpers_1.resetImageData)(maskData);
8391
8431
  var start_1 = reader.offset;
8392
8432
  readData(reader, channel.length, maskData, compression, maskWidth, maskHeight, (_c = psd.bitsPerChannel) !== null && _c !== void 0 ? _c : 8, 0, reader.large, 4);
8393
8433
  if (helpers_1.RAW_IMAGE_DATA) {
8394
- layer.maskDataRawCompression = compression;
8395
- layer.maskDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start_1, reader.offset - start_1);
8434
+ if (channel.id === -2 /* ChannelID.UserMask */) {
8435
+ layer.maskDataRawCompression = compression;
8436
+ layer.maskDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start_1, reader.offset - start_1);
8437
+ }
8438
+ else {
8439
+ layer.realMaskDataRawCompression = compression;
8440
+ layer.realMaskDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start_1, reader.offset - start_1);
8441
+ }
8396
8442
  }
8397
8443
  setupGrayscale(maskData);
8398
8444
  if (reader.useImageData) {
@@ -8403,12 +8449,6 @@ function readLayerChannelImageData(reader, psd, layer, channels) {
8403
8449
  }
8404
8450
  }
8405
8451
  }
8406
- else if (channel.id === -3 /* ChannelID.RealUserMask */) {
8407
- if (reader.logMissingFeatures) {
8408
- reader.log("RealUserMask not supported");
8409
- }
8410
- reader.offset = start + channel.length;
8411
- }
8412
8452
  else {
8413
8453
  var offset = (0, helpers_1.offsetForChannel)(channel.id, cmyk);
8414
8454
  var targetData = imageData;
@@ -9392,7 +9432,7 @@ function writeLayerInfo(writer, psd, globalAlpha, options) {
9392
9432
  flags |= 0x01;
9393
9433
  if (layer.hidden)
9394
9434
  flags |= 0x02;
9395
- if (layer.vectorMask || (layer.sectionDivider && layer.sectionDivider.type !== 0 /* SectionDividerType.Other */)) {
9435
+ if (layer.vectorMask || (layer.sectionDivider && layer.sectionDivider.type !== 0 /* SectionDividerType.Other */) || layer.adjustment) {
9396
9436
  flags |= 0x10; // pixel data irrelevant to appearance of document
9397
9437
  }
9398
9438
  if (layer.effectsOpen)
@@ -9401,7 +9441,7 @@ function writeLayerInfo(writer, psd, globalAlpha, options) {
9401
9441
  writeUint8(writer, 0); // filler
9402
9442
  writeSection(writer, 1, function () {
9403
9443
  writeLayerMaskData(writer, layer, layerData);
9404
- writeLayerBlendingRanges(writer, psd);
9444
+ writeLayerBlendingRanges(writer, layer);
9405
9445
  writePascalString(writer, (layer.name || '').substring(0, 255), 4);
9406
9446
  writeAdditionalLayerInfo(writer, layer, psd, options);
9407
9447
  });
@@ -9425,36 +9465,52 @@ function writeLayerInfo(writer, psd, globalAlpha, options) {
9425
9465
  }, true, options.psb);
9426
9466
  }
9427
9467
  function writeLayerMaskData(writer, _a, layerData) {
9428
- var mask = _a.mask;
9468
+ var mask = _a.mask, realMask = _a.realMask;
9429
9469
  writeSection(writer, 1, function () {
9430
- if (!mask)
9470
+ if (!mask && !realMask)
9431
9471
  return;
9472
+ var params = 0, flags = 0, realFlags = 0;
9473
+ if (mask) {
9474
+ if (mask.userMaskDensity !== undefined)
9475
+ params |= 1 /* MaskParams.UserMaskDensity */;
9476
+ if (mask.userMaskFeather !== undefined)
9477
+ params |= 2 /* MaskParams.UserMaskFeather */;
9478
+ if (mask.vectorMaskDensity !== undefined)
9479
+ params |= 4 /* MaskParams.VectorMaskDensity */;
9480
+ if (mask.vectorMaskFeather !== undefined)
9481
+ params |= 8 /* MaskParams.VectorMaskFeather */;
9482
+ if (mask.disabled)
9483
+ flags |= 2 /* LayerMaskFlags.LayerMaskDisabled */;
9484
+ if (mask.positionRelativeToLayer)
9485
+ flags |= 1 /* LayerMaskFlags.PositionRelativeToLayer */;
9486
+ if (mask.fromVectorData)
9487
+ flags |= 8 /* LayerMaskFlags.LayerMaskFromRenderingOtherData */;
9488
+ if (params)
9489
+ flags |= 16 /* LayerMaskFlags.MaskHasParametersAppliedToIt */;
9490
+ }
9432
9491
  var m = layerData.mask || {};
9433
9492
  writeInt32(writer, m.top || 0);
9434
9493
  writeInt32(writer, m.left || 0);
9435
9494
  writeInt32(writer, m.bottom || 0);
9436
9495
  writeInt32(writer, m.right || 0);
9437
- writeUint8(writer, mask.defaultColor || 0);
9438
- var params = 0;
9439
- if (mask.userMaskDensity !== undefined)
9440
- params |= 1 /* MaskParams.UserMaskDensity */;
9441
- if (mask.userMaskFeather !== undefined)
9442
- params |= 2 /* MaskParams.UserMaskFeather */;
9443
- if (mask.vectorMaskDensity !== undefined)
9444
- params |= 4 /* MaskParams.VectorMaskDensity */;
9445
- if (mask.vectorMaskFeather !== undefined)
9446
- params |= 8 /* MaskParams.VectorMaskFeather */;
9447
- var flags = 0;
9448
- if (mask.disabled)
9449
- flags |= 2 /* LayerMaskFlags.LayerMaskDisabled */;
9450
- if (mask.positionRelativeToLayer)
9451
- flags |= 1 /* LayerMaskFlags.PositionRelativeToLayer */;
9452
- if (mask.fromVectorData)
9453
- flags |= 8 /* LayerMaskFlags.LayerMaskFromRenderingOtherData */;
9454
- if (params)
9455
- flags |= 16 /* LayerMaskFlags.MaskHasParametersAppliedToIt */;
9496
+ writeUint8(writer, mask && mask.defaultColor || 0);
9456
9497
  writeUint8(writer, flags);
9457
- if (params) {
9498
+ if (realMask) {
9499
+ if (realMask.disabled)
9500
+ realFlags |= 2 /* LayerMaskFlags.LayerMaskDisabled */;
9501
+ if (realMask.positionRelativeToLayer)
9502
+ realFlags |= 1 /* LayerMaskFlags.PositionRelativeToLayer */;
9503
+ if (realMask.fromVectorData)
9504
+ realFlags |= 8 /* LayerMaskFlags.LayerMaskFromRenderingOtherData */;
9505
+ var r = layerData.realMask || {};
9506
+ writeUint8(writer, realFlags);
9507
+ writeUint8(writer, realMask.defaultColor || 0);
9508
+ writeInt32(writer, r.top || 0);
9509
+ writeInt32(writer, r.left || 0);
9510
+ writeInt32(writer, r.bottom || 0);
9511
+ writeInt32(writer, r.right || 0);
9512
+ }
9513
+ if (params && mask) {
9458
9514
  writeUint8(writer, params);
9459
9515
  if (mask.userMaskDensity !== undefined)
9460
9516
  writeUint8(writer, Math.round(mask.userMaskDensity * 0xff));
@@ -9465,19 +9521,26 @@ function writeLayerMaskData(writer, _a, layerData) {
9465
9521
  if (mask.vectorMaskFeather !== undefined)
9466
9522
  writeFloat64(writer, mask.vectorMaskFeather);
9467
9523
  }
9468
- // TODO: handle rest of the fields
9469
9524
  writeZeros(writer, 2);
9470
9525
  });
9471
9526
  }
9472
- function writeLayerBlendingRanges(writer, psd) {
9527
+ function writerBlendingRange(writer, range) {
9528
+ writeUint8(writer, range[0]);
9529
+ writeUint8(writer, range[1]);
9530
+ writeUint8(writer, range[2]);
9531
+ writeUint8(writer, range[3]);
9532
+ }
9533
+ function writeLayerBlendingRanges(writer, layer) {
9473
9534
  writeSection(writer, 1, function () {
9474
- writeUint32(writer, 65535);
9475
- writeUint32(writer, 65535);
9476
- var channels = psd.channels || 0; // TODO: use always 4 instead ?
9477
- // channels = 4; // TESTING
9478
- for (var i = 0; i < channels; i++) {
9479
- writeUint32(writer, 65535);
9480
- writeUint32(writer, 65535);
9535
+ var ranges = layer.blendingRanges;
9536
+ if (ranges) {
9537
+ writerBlendingRange(writer, ranges.compositeGrayBlendSource);
9538
+ writerBlendingRange(writer, ranges.compositeGraphBlendDestinationRange);
9539
+ for (var _i = 0, _a = ranges.ranges; _i < _a.length; _i++) {
9540
+ var r = _a[_i];
9541
+ writerBlendingRange(writer, r.sourceRange);
9542
+ writerBlendingRange(writer, r.destRange);
9543
+ }
9481
9544
  }
9482
9545
  });
9483
9546
  }
@@ -9523,8 +9586,8 @@ function writeAdditionalLayerInfo(writer, target, psd, options) {
9523
9586
  function addChildren(layers, children) {
9524
9587
  if (!children)
9525
9588
  return;
9526
- // const layerIds = [];
9527
- // const timestamps = []
9589
+ // const layerIds: number[] = [2];
9590
+ // const timestamps: number[] = [1740120767.0230637];
9528
9591
  for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {
9529
9592
  var c = children_1[_i];
9530
9593
  if (c.children && c.canvas)
@@ -9537,6 +9600,7 @@ function addChildren(layers, children) {
9537
9600
  sectionDivider: {
9538
9601
  type: 3 /* SectionDividerType.BoundingSectionDivider */,
9539
9602
  },
9603
+ // blendingRanges: children[0].blendingRanges,
9540
9604
  // nameSource: 'lset',
9541
9605
  // id: layerIds.shift(),
9542
9606
  // protected: {
@@ -9544,12 +9608,9 @@ function addChildren(layers, children) {
9544
9608
  // composite: false,
9545
9609
  // position: false,
9546
9610
  // },
9547
- // layerColor: 'none',
9611
+ // layerColor: 'red',
9548
9612
  // timestamp: timestamps.shift(),
9549
- // referencePoint: {
9550
- // x: 0,
9551
- // y: 0,
9552
- // },
9613
+ // referencePoint: { x: 0, y: 0 },
9553
9614
  });
9554
9615
  addChildren(layers, c.children);
9555
9616
  layers.push(__assign(__assign({}, c), { blendMode: c.blendMode === 'pass through' ? 'normal' : c.blendMode, sectionDivider: {
@@ -9608,47 +9669,46 @@ function createThumbnail(psd) {
9608
9669
  }
9609
9670
  return canvas;
9610
9671
  }
9611
- function getChannels(tempBuffer, layer, background, options) {
9612
- var layerData = getLayerChannels(tempBuffer, layer, background, options);
9613
- var mask = layer.mask;
9614
- if (mask) {
9615
- var top_2 = mask.top | 0;
9616
- var left = mask.left | 0;
9617
- var right = mask.right | 0;
9618
- var bottom = mask.bottom | 0;
9619
- var _a = getLayerDimentions(mask), width = _a.width, height = _a.height;
9620
- var imageData = mask.imageData;
9621
- if (!imageData && mask.canvas && width && height) {
9622
- imageData = mask.canvas.getContext('2d').getImageData(0, 0, width, height);
9623
- }
9624
- if (width && height && imageData) {
9625
- right = left + width;
9626
- bottom = top_2 + height;
9627
- if (imageData.width !== width || imageData.height !== height) {
9628
- throw new Error('Invalid imageData dimentions');
9629
- }
9630
- var buffer = void 0;
9631
- var compression = void 0;
9632
- if (helpers_1.RAW_IMAGE_DATA && layer.maskDataRaw) {
9633
- // console.log('written raw layer image data');
9634
- buffer = layer.maskDataRaw;
9635
- compression = layer.maskDataRawCompression;
9636
- }
9637
- else if (options.compress) {
9638
- buffer = (0, helpers_1.writeDataZipWithoutPrediction)(imageData, [0]);
9639
- compression = 2 /* Compression.ZipWithoutPrediction */;
9640
- }
9641
- else {
9642
- buffer = (0, helpers_1.writeDataRLE)(tempBuffer, imageData, [0], !!options.psb);
9643
- compression = 1 /* Compression.RleCompressed */;
9644
- }
9645
- layerData.mask = { top: top_2, left: left, right: right, bottom: bottom };
9646
- layerData.channels.push({ channelId: -2 /* ChannelID.UserMask */, compression: compression, buffer: buffer, length: 2 + buffer.length });
9672
+ function getMaskChannels(tempBuffer, layerData, layer, mask, options, realMask) {
9673
+ var top = mask.top | 0;
9674
+ var left = mask.left | 0;
9675
+ var right = mask.right | 0;
9676
+ var bottom = mask.bottom | 0;
9677
+ var _a = getLayerDimentions(mask), width = _a.width, height = _a.height;
9678
+ var imageData = mask.imageData;
9679
+ if (!imageData && mask.canvas && width && height) {
9680
+ imageData = mask.canvas.getContext('2d').getImageData(0, 0, width, height);
9681
+ }
9682
+ if (width && height && imageData) {
9683
+ right = left + width;
9684
+ bottom = top + height;
9685
+ if (imageData.width !== width || imageData.height !== height) {
9686
+ throw new Error('Invalid imageData dimentions');
9687
+ }
9688
+ var buffer = void 0;
9689
+ var compression = void 0;
9690
+ if (helpers_1.RAW_IMAGE_DATA && layer[realMask ? 'realMaskDataRaw' : 'maskDataRaw']) {
9691
+ buffer = layer[realMask ? 'realMaskDataRaw' : 'maskDataRaw'];
9692
+ compression = layer[realMask ? 'realMaskDataRawCompression' : 'maskDataRawCompression'];
9693
+ }
9694
+ else if (options.compress) {
9695
+ buffer = (0, helpers_1.writeDataZipWithoutPrediction)(imageData, [0]);
9696
+ compression = 2 /* Compression.ZipWithoutPrediction */;
9647
9697
  }
9648
9698
  else {
9649
- layerData.mask = { top: 0, left: 0, right: 0, bottom: 0 };
9699
+ buffer = (0, helpers_1.writeDataRLE)(tempBuffer, imageData, [0], !!options.psb);
9700
+ compression = 1 /* Compression.RleCompressed */;
9650
9701
  }
9702
+ layerData.channels.push({ channelId: realMask ? -3 /* ChannelID.RealUserMask */ : -2 /* ChannelID.UserMask */, compression: compression, buffer: buffer, length: 2 + buffer.length });
9651
9703
  }
9704
+ layerData[realMask ? 'realMask' : 'mask'] = { top: top, left: left, right: right, bottom: bottom };
9705
+ }
9706
+ function getChannels(tempBuffer, layer, background, options) {
9707
+ var layerData = getLayerChannels(tempBuffer, layer, background, options);
9708
+ if (layer.mask)
9709
+ getMaskChannels(tempBuffer, layerData, layer, layer.mask, options, false);
9710
+ if (layer.realMask)
9711
+ getMaskChannels(tempBuffer, layerData, layer, layer.realMask, options, true);
9652
9712
  return layerData;
9653
9713
  }
9654
9714
  function getLayerDimentions(_a) {