ag-psd 25.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 (45) hide show
  1. package/.v8-cache/v22.13.1-x64-00250a7c/4511bacf +0 -0
  2. package/.v8-cache/v22.13.1-x64-00250a7c/acc36e66 +0 -0
  3. package/.v8-cache/v22.13.1-x64-00250a7c/b3c2fab7 +0 -0
  4. package/.v8-cache/v22.13.1-x64-00250a7c/c314aece +0 -0
  5. package/.v8-cache/v22.13.1-x64-00250a7c/cfc49f4f +0 -0
  6. package/.v8-cache/v22.13.1-x64-00250a7c/e03e2acd +0 -0
  7. package/CHANGELOG.md +3 -0
  8. package/{TODO → TODO.md} +46 -0
  9. package/dist/additionalInfo.js +55 -51
  10. package/dist/additionalInfo.js.map +1 -1
  11. package/dist/bundle.js +207 -159
  12. package/dist/descriptor.js +4 -4
  13. package/dist/descriptor.js.map +1 -1
  14. package/dist/helpers.d.ts +1 -0
  15. package/dist/helpers.js.map +1 -1
  16. package/dist/imageResources.js +39 -5
  17. package/dist/imageResources.js.map +1 -1
  18. package/dist/psd.d.ts +1 -0
  19. package/dist/psd.js.map +1 -1
  20. package/dist/psdReader.js +29 -31
  21. package/dist/psdReader.js.map +1 -1
  22. package/dist/psdWriter.js +79 -67
  23. package/dist/psdWriter.js.map +1 -1
  24. package/dist-es/additionalInfo.js +55 -51
  25. package/dist-es/additionalInfo.js.map +1 -1
  26. package/dist-es/descriptor.js +4 -4
  27. package/dist-es/descriptor.js.map +1 -1
  28. package/dist-es/helpers.d.ts +1 -0
  29. package/dist-es/helpers.js.map +1 -1
  30. package/dist-es/imageResources.js +41 -7
  31. package/dist-es/imageResources.js.map +1 -1
  32. package/dist-es/psd.d.ts +1 -0
  33. package/dist-es/psd.js.map +1 -1
  34. package/dist-es/psdReader.js +29 -31
  35. package/dist-es/psdReader.js.map +1 -1
  36. package/dist-es/psdWriter.js +79 -67
  37. package/dist-es/psdWriter.js.map +1 -1
  38. package/package.json +1 -1
  39. package/src/additionalInfo.ts +55 -51
  40. package/src/descriptor.ts +5 -4
  41. package/src/helpers.ts +1 -0
  42. package/src/imageResources.ts +46 -20
  43. package/src/psd.ts +1 -0
  44. package/src/psdReader.ts +32 -34
  45. package/src/psdWriter.ts +75 -69
package/dist/bundle.js CHANGED
@@ -640,58 +640,55 @@ addHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left)
640
640
  var desc = { keyDescriptorList: [] };
641
641
  for (var i = 0; i < orig.keyDescriptorList.length; i++) {
642
642
  var item = orig.keyDescriptorList[i];
643
- if (item.keyShapeInvalidated) {
644
- 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
+ };
645
658
  }
646
- else {
647
- desc.keyDescriptorList.push({}); // we're adding keyOriginIndex at the end
648
- var out = desc.keyDescriptorList[desc.keyDescriptorList.length - 1];
649
- if (item.keyOriginType != null)
650
- out.keyOriginType = item.keyOriginType;
651
- if (item.keyOriginResolution != null)
652
- out.keyOriginResolution = item.keyOriginResolution;
653
- var radii = item.keyOriginRRectRadii;
654
- if (radii) {
655
- out.keyOriginRRectRadii = {
656
- unitValueQuadVersion: 1,
657
- topRight: (0, descriptor_1.unitsValue)(radii.topRight, 'topRight'),
658
- topLeft: (0, descriptor_1.unitsValue)(radii.topLeft, 'topLeft'),
659
- bottomLeft: (0, descriptor_1.unitsValue)(radii.bottomLeft, 'bottomLeft'),
660
- bottomRight: (0, descriptor_1.unitsValue)(radii.bottomRight, 'bottomRight'),
661
- };
662
- }
663
- var box = item.keyOriginShapeBoundingBox;
664
- if (box) {
665
- out.keyOriginShapeBBox = {
666
- unitValueQuadVersion: 1,
667
- 'Top ': (0, descriptor_1.unitsValue)(box.top, 'top'),
668
- Left: (0, descriptor_1.unitsValue)(box.left, 'left'),
669
- Btom: (0, descriptor_1.unitsValue)(box.bottom, 'bottom'),
670
- Rght: (0, descriptor_1.unitsValue)(box.right, 'right'),
671
- };
672
- }
673
- var corners = item.keyOriginBoxCorners;
674
- if (corners && corners.length === 4) {
675
- out.keyOriginBoxCorners = {
676
- rectangleCornerA: { Hrzn: corners[0].x, Vrtc: corners[0].y },
677
- rectangleCornerB: { Hrzn: corners[1].x, Vrtc: corners[1].y },
678
- rectangleCornerC: { Hrzn: corners[2].x, Vrtc: corners[2].y },
679
- rectangleCornerD: { Hrzn: corners[3].x, Vrtc: corners[3].y },
680
- };
681
- }
682
- var transform = item.transform;
683
- if (transform && transform.length === 6) {
684
- out.Trnf = {
685
- xx: transform[0],
686
- xy: transform[1],
687
- yx: transform[2],
688
- yy: transform[3],
689
- tx: transform[4],
690
- ty: transform[5],
691
- };
692
- }
693
- 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
+ };
694
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;
695
692
  }
696
693
  (0, psdWriter_1.writeInt32)(writer, 1); // version
697
694
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
@@ -1163,7 +1160,13 @@ function isQuiltWarp(warp) {
1163
1160
  }
1164
1161
  function encodeWarp(warp) {
1165
1162
  var bounds = warp.bounds;
1166
- 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
+ } :*/ {
1167
1170
  'Top ': (0, descriptor_1.unitsValue)(bounds && bounds.top || { units: 'Pixels', value: 0 }, 'bounds.top'),
1168
1171
  Left: (0, descriptor_1.unitsValue)(bounds && bounds.left || { units: 'Pixels', value: 0 }, 'bounds.left'),
1169
1172
  Btom: (0, descriptor_1.unitsValue)(bounds && bounds.bottom || { units: 'Pixels', value: 0 }, 'bounds.bottom'),
@@ -1728,6 +1731,7 @@ function serializeFilterFXItem(f) {
1728
1731
  'Rds ': uvRadius(f.filter),
1729
1732
  }, filterID: 697 });
1730
1733
  case 'gaussian blur': return __assign(__assign({}, base), { Fltr: {
1734
+ // _name: '高斯模糊', // Testing
1731
1735
  _name: 'Gaussian Blur',
1732
1736
  _classID: 'GsnB',
1733
1737
  'Rds ': uvRadius(f.filter),
@@ -3756,12 +3760,13 @@ function makeType(name, classID) {
3756
3760
  return { name: name, classID: classID };
3757
3761
  }
3758
3762
  var nullType = makeType('', 'null');
3763
+ var USE_CHINESE = false; // Testing
3759
3764
  var fieldToExtType = {
3760
3765
  strokeStyleContent: makeType('', 'solidColorLayer'),
3761
- // printProofSetup: makeType('校样设置', 'proofSetup'), // TESTING
3762
- 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'),
3763
3769
  patternFill: makeType('', 'patternFill'),
3764
- Grad: makeType('Gradient', 'Grdn'),
3765
3770
  ebbl: makeType('', 'ebbl'),
3766
3771
  SoFi: makeType('', 'SoFi'),
3767
3772
  GrFl: makeType('', 'GrFl'),
@@ -3803,7 +3808,6 @@ var fieldToExtType = {
3803
3808
  rectangleCornerC: makeType('', 'Pnt '),
3804
3809
  rectangleCornerD: makeType('', 'Pnt '),
3805
3810
  compInfo: nullType,
3806
- Trnf: makeType('Transform', 'Trnf'),
3807
3811
  quiltWarp: makeType('', 'quiltWarp'),
3808
3812
  generatorSettings: nullType,
3809
3813
  crema: nullType,
@@ -6789,6 +6793,33 @@ function writeUtf8String(writer, value) {
6789
6793
  var buffer = (0, utf8_1.encodeString)(value);
6790
6794
  (0, psdWriter_1.writeBytes)(writer, buffer);
6791
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
+ }
6792
6823
  helpers_1.MOCK_HANDLERS && addHandler(1028, // IPTC-NAA record
6793
6824
  function (// IPTC-NAA record
6794
6825
  target) { return target._ir1028 !== undefined; }, function (reader, target, left) {
@@ -6936,15 +6967,22 @@ addHandler(1062, function (target) { return target.printScale !== undefined; },
6936
6967
  (0, psdWriter_1.writeFloat32)(writer, scale || 0);
6937
6968
  });
6938
6969
  addHandler(1006, function (target) { return target.alphaChannelNames !== undefined; }, function (reader, target, left) {
6939
- target.alphaChannelNames = [];
6940
- while (left() > 0) {
6941
- var value = (0, psdReader_1.readPascalString)(reader, 1);
6942
- 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());
6943
6980
  }
6944
6981
  }, function (writer, target) {
6945
6982
  for (var _i = 0, _a = target.alphaChannelNames; _i < _a.length; _i++) {
6946
6983
  var name_1 = _a[_i];
6947
- (0, psdWriter_1.writePascalString)(writer, name_1, 1);
6984
+ writeEncodedString(writer, name_1);
6985
+ // writePascalString(writer, name, 1);
6948
6986
  }
6949
6987
  });
6950
6988
  addHandler(1045, function (target) { return target.alphaChannelNames !== undefined; }, function (reader, target, left) {
@@ -8264,9 +8302,7 @@ function readLayerRecord(reader, psd) {
8264
8302
  // 0x20 - effects/filters panel is expanded
8265
8303
  skipBytes(reader, 1);
8266
8304
  readSection(reader, 1, function (left) {
8267
- var mask = readLayerMaskData(reader);
8268
- if (mask)
8269
- layer.mask = mask;
8305
+ readLayerMaskData(reader, layer);
8270
8306
  var blendingRanges = readLayerBlendingRanges(reader);
8271
8307
  if (blendingRanges)
8272
8308
  layer.blendingRanges = blendingRanges;
@@ -8280,11 +8316,12 @@ function readLayerRecord(reader, psd) {
8280
8316
  });
8281
8317
  return { layer: layer, channels: channels };
8282
8318
  }
8283
- function readLayerMaskData(reader) {
8319
+ function readLayerMaskData(reader, layer) {
8284
8320
  return readSection(reader, 1, function (left) {
8285
8321
  if (!left())
8286
8322
  return undefined;
8287
8323
  var mask = {};
8324
+ layer.mask = mask;
8288
8325
  mask.top = readInt32(reader);
8289
8326
  mask.left = readInt32(reader);
8290
8327
  mask.bottom = readInt32(reader);
@@ -8294,6 +8331,19 @@ function readLayerMaskData(reader) {
8294
8331
  mask.positionRelativeToLayer = (flags & 1 /* LayerMaskFlags.PositionRelativeToLayer */) !== 0;
8295
8332
  mask.disabled = (flags & 2 /* LayerMaskFlags.LayerMaskDisabled */) !== 0;
8296
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
+ }
8297
8347
  if (flags & 16 /* LayerMaskFlags.MaskHasParametersAppliedToIt */) {
8298
8348
  var params = readUint8(reader);
8299
8349
  if (params & 1 /* MaskParams.UserMaskDensity */)
@@ -8305,23 +8355,7 @@ function readLayerMaskData(reader) {
8305
8355
  if (params & 8 /* MaskParams.VectorMaskFeather */)
8306
8356
  mask.vectorMaskFeather = readFloat64(reader);
8307
8357
  }
8308
- if (left() > 2) {
8309
- // TODO: handle these values, this is RealUserMask
8310
- /*const realFlags = readUint8(reader);
8311
- const realUserMaskBackground = readUint8(reader);
8312
- const top2 = readInt32(reader);
8313
- const left2 = readInt32(reader);
8314
- const bottom2 = readInt32(reader);
8315
- const right2 = readInt32(reader);
8316
-
8317
- // TEMP
8318
- (mask as any)._real = { realFlags, realUserMaskBackground, top2, left2, bottom2, right2 };*/
8319
- if (reader.logMissingFeatures) {
8320
- reader.log('Unhandled extra real user mask params');
8321
- }
8322
- }
8323
8358
  skipBytes(reader, left());
8324
- return mask;
8325
8359
  });
8326
8360
  }
8327
8361
  function readBlendingRange(reader) {
@@ -8383,20 +8417,28 @@ function readLayerChannelImageData(reader, psd, layer, channels) {
8383
8417
  }
8384
8418
  if (compression > 3)
8385
8419
  throw new Error("Invalid compression: ".concat(compression));
8386
- if (channel.id === -2 /* ChannelID.UserMask */) {
8387
- 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;
8388
8422
  if (!mask)
8389
- throw new Error("Missing layer mask data");
8423
+ throw new Error("Missing layer ".concat(channel.id === -2 /* ChannelID.UserMask */ ? 'mask' : 'real mask', " data"));
8390
8424
  var maskWidth = (mask.right || 0) - (mask.left || 0);
8391
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');
8392
8428
  if (maskWidth && maskHeight) {
8393
8429
  var maskData = createImageDataBitDepth(maskWidth, maskHeight, (_b = psd.bitsPerChannel) !== null && _b !== void 0 ? _b : 8);
8394
8430
  (0, helpers_1.resetImageData)(maskData);
8395
8431
  var start_1 = reader.offset;
8396
8432
  readData(reader, channel.length, maskData, compression, maskWidth, maskHeight, (_c = psd.bitsPerChannel) !== null && _c !== void 0 ? _c : 8, 0, reader.large, 4);
8397
8433
  if (helpers_1.RAW_IMAGE_DATA) {
8398
- layer.maskDataRawCompression = compression;
8399
- 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
+ }
8400
8442
  }
8401
8443
  setupGrayscale(maskData);
8402
8444
  if (reader.useImageData) {
@@ -8407,12 +8449,6 @@ function readLayerChannelImageData(reader, psd, layer, channels) {
8407
8449
  }
8408
8450
  }
8409
8451
  }
8410
- else if (channel.id === -3 /* ChannelID.RealUserMask */) {
8411
- if (reader.logMissingFeatures) {
8412
- reader.log("RealUserMask not supported");
8413
- }
8414
- reader.offset = start + channel.length;
8415
- }
8416
8452
  else {
8417
8453
  var offset = (0, helpers_1.offsetForChannel)(channel.id, cmyk);
8418
8454
  var targetData = imageData;
@@ -9396,7 +9432,7 @@ function writeLayerInfo(writer, psd, globalAlpha, options) {
9396
9432
  flags |= 0x01;
9397
9433
  if (layer.hidden)
9398
9434
  flags |= 0x02;
9399
- 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) {
9400
9436
  flags |= 0x10; // pixel data irrelevant to appearance of document
9401
9437
  }
9402
9438
  if (layer.effectsOpen)
@@ -9429,36 +9465,52 @@ function writeLayerInfo(writer, psd, globalAlpha, options) {
9429
9465
  }, true, options.psb);
9430
9466
  }
9431
9467
  function writeLayerMaskData(writer, _a, layerData) {
9432
- var mask = _a.mask;
9468
+ var mask = _a.mask, realMask = _a.realMask;
9433
9469
  writeSection(writer, 1, function () {
9434
- if (!mask)
9470
+ if (!mask && !realMask)
9435
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
+ }
9436
9491
  var m = layerData.mask || {};
9437
9492
  writeInt32(writer, m.top || 0);
9438
9493
  writeInt32(writer, m.left || 0);
9439
9494
  writeInt32(writer, m.bottom || 0);
9440
9495
  writeInt32(writer, m.right || 0);
9441
- writeUint8(writer, mask.defaultColor || 0);
9442
- var params = 0;
9443
- if (mask.userMaskDensity !== undefined)
9444
- params |= 1 /* MaskParams.UserMaskDensity */;
9445
- if (mask.userMaskFeather !== undefined)
9446
- params |= 2 /* MaskParams.UserMaskFeather */;
9447
- if (mask.vectorMaskDensity !== undefined)
9448
- params |= 4 /* MaskParams.VectorMaskDensity */;
9449
- if (mask.vectorMaskFeather !== undefined)
9450
- params |= 8 /* MaskParams.VectorMaskFeather */;
9451
- var flags = 0;
9452
- if (mask.disabled)
9453
- flags |= 2 /* LayerMaskFlags.LayerMaskDisabled */;
9454
- if (mask.positionRelativeToLayer)
9455
- flags |= 1 /* LayerMaskFlags.PositionRelativeToLayer */;
9456
- if (mask.fromVectorData)
9457
- flags |= 8 /* LayerMaskFlags.LayerMaskFromRenderingOtherData */;
9458
- if (params)
9459
- flags |= 16 /* LayerMaskFlags.MaskHasParametersAppliedToIt */;
9496
+ writeUint8(writer, mask && mask.defaultColor || 0);
9460
9497
  writeUint8(writer, flags);
9461
- 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) {
9462
9514
  writeUint8(writer, params);
9463
9515
  if (mask.userMaskDensity !== undefined)
9464
9516
  writeUint8(writer, Math.round(mask.userMaskDensity * 0xff));
@@ -9469,7 +9521,6 @@ function writeLayerMaskData(writer, _a, layerData) {
9469
9521
  if (mask.vectorMaskFeather !== undefined)
9470
9522
  writeFloat64(writer, mask.vectorMaskFeather);
9471
9523
  }
9472
- // TODO: handle rest of the fields
9473
9524
  writeZeros(writer, 2);
9474
9525
  });
9475
9526
  }
@@ -9535,8 +9586,8 @@ function writeAdditionalLayerInfo(writer, target, psd, options) {
9535
9586
  function addChildren(layers, children) {
9536
9587
  if (!children)
9537
9588
  return;
9538
- // const layerIds = [];
9539
- // const timestamps = []
9589
+ // const layerIds: number[] = [2];
9590
+ // const timestamps: number[] = [1740120767.0230637];
9540
9591
  for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {
9541
9592
  var c = children_1[_i];
9542
9593
  if (c.children && c.canvas)
@@ -9549,6 +9600,7 @@ function addChildren(layers, children) {
9549
9600
  sectionDivider: {
9550
9601
  type: 3 /* SectionDividerType.BoundingSectionDivider */,
9551
9602
  },
9603
+ // blendingRanges: children[0].blendingRanges,
9552
9604
  // nameSource: 'lset',
9553
9605
  // id: layerIds.shift(),
9554
9606
  // protected: {
@@ -9556,12 +9608,9 @@ function addChildren(layers, children) {
9556
9608
  // composite: false,
9557
9609
  // position: false,
9558
9610
  // },
9559
- // layerColor: 'none',
9611
+ // layerColor: 'red',
9560
9612
  // timestamp: timestamps.shift(),
9561
- // referencePoint: {
9562
- // x: 0,
9563
- // y: 0,
9564
- // },
9613
+ // referencePoint: { x: 0, y: 0 },
9565
9614
  });
9566
9615
  addChildren(layers, c.children);
9567
9616
  layers.push(__assign(__assign({}, c), { blendMode: c.blendMode === 'pass through' ? 'normal' : c.blendMode, sectionDivider: {
@@ -9620,47 +9669,46 @@ function createThumbnail(psd) {
9620
9669
  }
9621
9670
  return canvas;
9622
9671
  }
9623
- function getChannels(tempBuffer, layer, background, options) {
9624
- var layerData = getLayerChannels(tempBuffer, layer, background, options);
9625
- var mask = layer.mask;
9626
- if (mask) {
9627
- var top_2 = mask.top | 0;
9628
- var left = mask.left | 0;
9629
- var right = mask.right | 0;
9630
- var bottom = mask.bottom | 0;
9631
- var _a = getLayerDimentions(mask), width = _a.width, height = _a.height;
9632
- var imageData = mask.imageData;
9633
- if (!imageData && mask.canvas && width && height) {
9634
- imageData = mask.canvas.getContext('2d').getImageData(0, 0, width, height);
9635
- }
9636
- if (width && height && imageData) {
9637
- right = left + width;
9638
- bottom = top_2 + height;
9639
- if (imageData.width !== width || imageData.height !== height) {
9640
- throw new Error('Invalid imageData dimentions');
9641
- }
9642
- var buffer = void 0;
9643
- var compression = void 0;
9644
- if (helpers_1.RAW_IMAGE_DATA && layer.maskDataRaw) {
9645
- // console.log('written raw layer image data');
9646
- buffer = layer.maskDataRaw;
9647
- compression = layer.maskDataRawCompression;
9648
- }
9649
- else if (options.compress) {
9650
- buffer = (0, helpers_1.writeDataZipWithoutPrediction)(imageData, [0]);
9651
- compression = 2 /* Compression.ZipWithoutPrediction */;
9652
- }
9653
- else {
9654
- buffer = (0, helpers_1.writeDataRLE)(tempBuffer, imageData, [0], !!options.psb);
9655
- compression = 1 /* Compression.RleCompressed */;
9656
- }
9657
- layerData.mask = { top: top_2, left: left, right: right, bottom: bottom };
9658
- 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 */;
9659
9697
  }
9660
9698
  else {
9661
- 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 */;
9662
9701
  }
9702
+ layerData.channels.push({ channelId: realMask ? -3 /* ChannelID.RealUserMask */ : -2 /* ChannelID.UserMask */, compression: compression, buffer: buffer, length: 2 + buffer.length });
9663
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);
9664
9712
  return layerData;
9665
9713
  }
9666
9714
  function getLayerDimentions(_a) {
@@ -44,12 +44,13 @@ function makeType(name, classID) {
44
44
  return { name: name, classID: classID };
45
45
  }
46
46
  var nullType = makeType('', 'null');
47
+ var USE_CHINESE = false; // Testing
47
48
  var fieldToExtType = {
48
49
  strokeStyleContent: makeType('', 'solidColorLayer'),
49
- // printProofSetup: makeType('校样设置', 'proofSetup'), // TESTING
50
- printProofSetup: makeType('Proof Setup', 'proofSetup'),
50
+ printProofSetup: makeType(USE_CHINESE ? '校样设置' : 'Proof Setup', 'proofSetup'),
51
+ Grad: makeType(USE_CHINESE ? '渐变' : 'Gradient', 'Grdn'),
52
+ Trnf: makeType(USE_CHINESE ? '变换' : 'Transform', 'Trnf'),
51
53
  patternFill: makeType('', 'patternFill'),
52
- Grad: makeType('Gradient', 'Grdn'),
53
54
  ebbl: makeType('', 'ebbl'),
54
55
  SoFi: makeType('', 'SoFi'),
55
56
  GrFl: makeType('', 'GrFl'),
@@ -91,7 +92,6 @@ var fieldToExtType = {
91
92
  rectangleCornerC: makeType('', 'Pnt '),
92
93
  rectangleCornerD: makeType('', 'Pnt '),
93
94
  compInfo: nullType,
94
- Trnf: makeType('Transform', 'Trnf'),
95
95
  quiltWarp: makeType('', 'quiltWarp'),
96
96
  generatorSettings: nullType,
97
97
  crema: nullType,