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.
- package/.v8-cache/v22.13.1-x64-00250a7c/4511bacf +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/57d3380b +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/6cbfc0ec +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/7100ee08 +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/75e41e43 +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/8d0bf0b5 +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/acc36e66 +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/b3c2fab7 +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/c314aece +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/cfc49f4f +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/e03e2acd +0 -0
- package/CHANGELOG.md +7 -0
- package/{TODO → TODO.md} +46 -0
- package/accept.js +18 -1
- package/dist/additionalInfo.js +62 -63
- package/dist/additionalInfo.js.map +1 -1
- package/dist/bundle.js +246 -186
- package/dist/descriptor.d.ts +4 -3
- package/dist/descriptor.js +9 -5
- package/dist/descriptor.js.map +1 -1
- package/dist/helpers.d.ts +1 -0
- package/dist/helpers.js.map +1 -1
- package/dist/imageResources.js +39 -5
- package/dist/imageResources.js.map +1 -1
- package/dist/psd.d.ts +12 -1
- package/dist/psd.js.map +1 -1
- package/dist/psdReader.js +39 -36
- package/dist/psdReader.js.map +1 -1
- package/dist/psdWriter.js +96 -76
- package/dist/psdWriter.js.map +1 -1
- package/dist-es/additionalInfo.js +62 -63
- package/dist-es/additionalInfo.js.map +1 -1
- package/dist-es/descriptor.d.ts +4 -3
- package/dist-es/descriptor.js +9 -5
- package/dist-es/descriptor.js.map +1 -1
- package/dist-es/helpers.d.ts +1 -0
- package/dist-es/helpers.js.map +1 -1
- package/dist-es/imageResources.js +41 -7
- package/dist-es/imageResources.js.map +1 -1
- package/dist-es/psd.d.ts +12 -1
- package/dist-es/psd.js.map +1 -1
- package/dist-es/psdReader.js +39 -36
- package/dist-es/psdReader.js.map +1 -1
- package/dist-es/psdWriter.js +96 -76
- package/dist-es/psdWriter.js.map +1 -1
- package/package.json +1 -1
- package/src/additionalInfo.ts +66 -66
- package/src/descriptor.ts +12 -8
- package/src/helpers.ts +1 -0
- package/src/imageResources.ts +46 -20
- package/src/psd.ts +9 -1
- package/src/psdReader.ts +43 -40
- 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
|
-
|
|
637
|
-
|
|
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
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
|
|
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
|
-
|
|
3767
|
-
|
|
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
|
-
|
|
6942
|
-
|
|
6943
|
-
|
|
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
|
-
(
|
|
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
|
-
|
|
8269
|
-
|
|
8270
|
-
|
|
8271
|
-
|
|
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 =
|
|
8329
|
-
var compositeGraphBlendDestinationRange =
|
|
8366
|
+
var compositeGrayBlendSource = readBlendingRange(reader);
|
|
8367
|
+
var compositeGraphBlendDestinationRange = readBlendingRange(reader);
|
|
8330
8368
|
var ranges = [];
|
|
8331
8369
|
while (left() > 0) {
|
|
8332
|
-
var sourceRange =
|
|
8333
|
-
var destRange =
|
|
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
|
-
|
|
8395
|
-
|
|
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,
|
|
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 (
|
|
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
|
|
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
|
-
|
|
9475
|
-
|
|
9476
|
-
|
|
9477
|
-
|
|
9478
|
-
|
|
9479
|
-
|
|
9480
|
-
|
|
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: '
|
|
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
|
|
9612
|
-
var
|
|
9613
|
-
var
|
|
9614
|
-
|
|
9615
|
-
|
|
9616
|
-
|
|
9617
|
-
|
|
9618
|
-
|
|
9619
|
-
|
|
9620
|
-
|
|
9621
|
-
|
|
9622
|
-
|
|
9623
|
-
|
|
9624
|
-
if (width
|
|
9625
|
-
|
|
9626
|
-
|
|
9627
|
-
|
|
9628
|
-
|
|
9629
|
-
|
|
9630
|
-
|
|
9631
|
-
|
|
9632
|
-
|
|
9633
|
-
|
|
9634
|
-
|
|
9635
|
-
|
|
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
|
-
|
|
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) {
|