ag-psd 30.1.1 → 30.2.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/v24.13.1-x64-cf738c9d/017325ac +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/043c7b90 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/05135617 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/059f8558 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/0706ecb8 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/0db754a7 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/1130885f +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/15f0e479 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/20477c23 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/20dfa422 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/2a19133e +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/2b069ee0 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/2de09439 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/2e44f5f0 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/2fb229a9 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/3144b401 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/37481985 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/4511bacf +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/49d22b79 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/4f5702bd +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/514cc428 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/57d3380b +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/6024ce3f +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/61735b23 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/63dbdb75 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/6cbfc0ec +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/6f08372c +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/7100ee08 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/71df9cb3 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/75e41e43 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/7ea06cea +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/8568576b +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/87372817 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/87cf2209 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/932f0770 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/a79a40bb +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/a7e80865 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/acc36e66 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/b3c2fab7 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/b69ed3a3 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/bdff1628 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/c0b789d2 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/c314aece +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/cfc49f4f +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/cff9434a +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/d02dd6f7 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/dc86f000 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/de74e659 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/e03e2acd +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/e158d332 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/e6735171 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/e6745c2b +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/e6b99945 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/eeeebdfe +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/fbca6276 +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/fc97d72d +0 -0
- package/.v8-cache/v24.13.1-x64-cf738c9d/fd0a2987 +0 -0
- package/CHANGELOG.md +3 -0
- package/README.md +1 -1
- package/README_PSD.md +1 -1
- package/dist/abr.js +43 -56
- package/dist/abr.js.map +1 -1
- package/dist/additionalInfo.js +770 -808
- package/dist/additionalInfo.js.map +1 -1
- package/dist/ase.js +21 -21
- package/dist/ase.js.map +1 -1
- package/dist/bundle.js +2592 -2778
- package/dist/csh.js +18 -29
- package/dist/csh.js.map +1 -1
- package/dist/descriptor.js +234 -269
- package/dist/descriptor.js.map +1 -1
- package/dist/effectsHelpers.js +91 -112
- package/dist/effectsHelpers.js.map +1 -1
- package/dist/engineData.js +45 -51
- package/dist/engineData.js.map +1 -1
- package/dist/engineData2.js +8 -9
- package/dist/engineData2.js.map +1 -1
- package/dist/helpers.js +75 -81
- package/dist/helpers.js.map +1 -1
- package/dist/imageResources.js +342 -381
- package/dist/imageResources.js.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/initializeCanvas.js +2 -2
- package/dist/initializeCanvas.js.map +1 -1
- package/dist/jpeg.js +279 -279
- package/dist/jpeg.js.map +1 -1
- package/dist/psdReader.js +336 -347
- package/dist/psdReader.js.map +1 -1
- package/dist/psdWriter.d.ts +2 -1
- package/dist/psdWriter.js +225 -206
- package/dist/psdWriter.js.map +1 -1
- package/dist/text.js +98 -122
- package/dist/text.js.map +1 -1
- package/dist/utf8.js +22 -22
- package/dist/utf8.js.map +1 -1
- package/dist-es/abr.js +41 -54
- package/dist-es/abr.js.map +1 -1
- package/dist-es/additionalInfo.js +765 -803
- package/dist-es/additionalInfo.js.map +1 -1
- package/dist-es/ase.js +20 -20
- package/dist-es/ase.js.map +1 -1
- package/dist-es/csh.js +16 -27
- package/dist-es/csh.js.map +1 -1
- package/dist-es/descriptor.js +284 -319
- package/dist-es/descriptor.js.map +1 -1
- package/dist-es/effectsHelpers.js +88 -109
- package/dist-es/effectsHelpers.js.map +1 -1
- package/dist-es/engineData.js +45 -51
- package/dist-es/engineData.js.map +1 -1
- package/dist-es/engineData2.js +8 -9
- package/dist-es/engineData2.js.map +1 -1
- package/dist-es/helpers.js +79 -85
- package/dist-es/helpers.js.map +1 -1
- package/dist-es/imageResources.js +338 -377
- package/dist-es/imageResources.js.map +1 -1
- package/dist-es/index.js +4 -4
- package/dist-es/index.js.map +1 -1
- package/dist-es/jpeg.js +279 -279
- package/dist-es/jpeg.js.map +1 -1
- package/dist-es/psdReader.js +333 -344
- package/dist-es/psdReader.js.map +1 -1
- package/dist-es/psdWriter.d.ts +2 -1
- package/dist-es/psdWriter.js +220 -202
- package/dist-es/psdWriter.js.map +1 -1
- package/dist-es/text.js +98 -122
- package/dist-es/text.js.map +1 -1
- package/dist-es/utf8.js +22 -22
- package/dist-es/utf8.js.map +1 -1
- package/package.json +1 -1
- package/publish.js +24 -0
- package/src/additionalInfo.ts +15 -11
- package/src/psdWriter.ts +76 -1
- package/tsconfig.json +4 -3
package/dist/additionalInfo.js
CHANGED
|
@@ -1,31 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
3
|
exports.hasMultiEffects = exports.readVectorMask = exports.booleanOperations = exports.readBezierKnot = exports.infoHandlersMap = exports.infoHandlers = void 0;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
4
|
+
const base64_js_1 = require("base64-js");
|
|
5
|
+
const effectsHelpers_1 = require("./effectsHelpers");
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
const psdReader_1 = require("./psdReader");
|
|
8
|
+
const psdWriter_1 = require("./psdWriter");
|
|
9
|
+
const descriptor_1 = require("./descriptor");
|
|
10
|
+
const engineData_1 = require("./engineData");
|
|
11
|
+
const text_1 = require("./text");
|
|
12
|
+
const engineData2_1 = require("./engineData2");
|
|
13
|
+
const fromAtoZ = 'abcdefghijklmnopqrstuvwxyz';
|
|
25
14
|
exports.infoHandlers = [];
|
|
26
15
|
exports.infoHandlersMap = {};
|
|
27
16
|
function addHandler(key, has, read, write) {
|
|
28
|
-
|
|
17
|
+
const handler = { key, has, read, write };
|
|
29
18
|
exports.infoHandlers.push(handler);
|
|
30
19
|
exports.infoHandlersMap[handler.key] = handler;
|
|
31
20
|
}
|
|
@@ -33,33 +22,33 @@ function addHandlerAlias(key, target) {
|
|
|
33
22
|
exports.infoHandlersMap[key] = exports.infoHandlersMap[target];
|
|
34
23
|
}
|
|
35
24
|
function hasKey(key) {
|
|
36
|
-
return
|
|
25
|
+
return (target) => target[key] !== undefined;
|
|
37
26
|
}
|
|
38
27
|
function readLength64(reader) {
|
|
39
28
|
if ((0, psdReader_1.readUint32)(reader))
|
|
40
|
-
throw new Error(
|
|
29
|
+
throw new Error(`Resource size above 4 GB limit at ${reader.offset.toString(16)}`);
|
|
41
30
|
return (0, psdReader_1.readUint32)(reader);
|
|
42
31
|
}
|
|
43
32
|
function writeLength64(writer, length) {
|
|
44
33
|
(0, psdWriter_1.writeUint32)(writer, 0);
|
|
45
34
|
(0, psdWriter_1.writeUint32)(writer, length);
|
|
46
35
|
}
|
|
47
|
-
addHandler('TySh', hasKey('text'),
|
|
36
|
+
addHandler('TySh', hasKey('text'), (reader, target, leftBytes) => {
|
|
48
37
|
if ((0, psdReader_1.readInt16)(reader) !== 1)
|
|
49
|
-
throw new Error(
|
|
50
|
-
|
|
51
|
-
for (
|
|
38
|
+
throw new Error(`Invalid TySh version`);
|
|
39
|
+
const transform = [];
|
|
40
|
+
for (let i = 0; i < 6; i++)
|
|
52
41
|
transform.push((0, psdReader_1.readFloat64)(reader));
|
|
53
42
|
if ((0, psdReader_1.readInt16)(reader) !== 50)
|
|
54
|
-
throw new Error(
|
|
55
|
-
|
|
43
|
+
throw new Error(`Invalid TySh text version`);
|
|
44
|
+
const text = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
56
45
|
// console.log(require('util').inspect(text, false, 99, false), 'utf8');
|
|
57
46
|
if ((0, psdReader_1.readInt16)(reader) !== 1)
|
|
58
|
-
throw new Error(
|
|
59
|
-
|
|
47
|
+
throw new Error(`Invalid TySh warp version`);
|
|
48
|
+
const warp = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
60
49
|
// console.log(require('util').inspect(warp, false, 99, false), 'utf8');
|
|
61
50
|
target.text = {
|
|
62
|
-
transform
|
|
51
|
+
transform,
|
|
63
52
|
left: (0, psdReader_1.readFloat32)(reader),
|
|
64
53
|
top: (0, psdReader_1.readFloat32)(reader),
|
|
65
54
|
right: (0, psdReader_1.readFloat32)(reader),
|
|
@@ -82,8 +71,8 @@ addHandler('TySh', hasKey('text'), function (reader, target, leftBytes) {
|
|
|
82
71
|
if (text.boundingBox)
|
|
83
72
|
target.text.boundingBox = (0, descriptor_1.descBoundsToBounds)(text.boundingBox);
|
|
84
73
|
if (text.EngineData) {
|
|
85
|
-
|
|
86
|
-
|
|
74
|
+
const engineData = (0, engineData_1.parseEngineData)(text.EngineData);
|
|
75
|
+
const textData = (0, text_1.decodeEngineData)(engineData);
|
|
87
76
|
// console.log(require('util').inspect(engineData, false, 99, false), 'utf8');
|
|
88
77
|
// require('fs').writeFileSync(`layer-${target.name}.txt`, require('util').inspect(engineData, false, 99, false), 'utf8');
|
|
89
78
|
// const before = parseEngineData(text.EngineData);
|
|
@@ -91,17 +80,17 @@ addHandler('TySh', hasKey('text'), function (reader, target, leftBytes) {
|
|
|
91
80
|
// require('fs').writeFileSync('before.txt', require('util').inspect(before, false, 99, false), 'utf8');
|
|
92
81
|
// require('fs').writeFileSync('after.txt', require('util').inspect(after, false, 99, false), 'utf8');
|
|
93
82
|
// console.log(require('util').inspect(parseEngineData(text.EngineData), false, 99, true));
|
|
94
|
-
target.text =
|
|
83
|
+
target.text = Object.assign(Object.assign({}, target.text), textData);
|
|
95
84
|
// console.log(require('util').inspect(target.text, false, 99, true));
|
|
96
85
|
}
|
|
97
86
|
(0, psdReader_1.skipBytes)(reader, leftBytes());
|
|
98
|
-
},
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
87
|
+
}, (writer, target) => {
|
|
88
|
+
const text = target.text;
|
|
89
|
+
const warp = text.warp || {};
|
|
90
|
+
const transform = text.transform || [1, 0, 0, 1, 0, 0];
|
|
91
|
+
const textDescriptor = Object.assign(Object.assign(Object.assign({ 'Txt ': (text.text || '').replace(/\r?\n/g, '\r'), textGridding: descriptor_1.textGridding.encode(text.gridding), Ornt: descriptor_1.Ornt.encode(text.orientation), AntA: descriptor_1.Annt.encode(text.antiAlias) }, (text.bounds ? { bounds: (0, descriptor_1.boundsToDescBounds)(text.bounds) } : {})), (text.boundingBox ? { boundingBox: (0, descriptor_1.boundsToDescBounds)(text.boundingBox) } : {})), { TextIndex: text.index || 0, EngineData: (0, engineData_1.serializeEngineData)((0, text_1.encodeEngineData)(text)) });
|
|
103
92
|
(0, psdWriter_1.writeInt16)(writer, 1); // version
|
|
104
|
-
for (
|
|
93
|
+
for (let i = 0; i < 6; i++) {
|
|
105
94
|
(0, psdWriter_1.writeFloat64)(writer, transform[i]);
|
|
106
95
|
}
|
|
107
96
|
(0, psdWriter_1.writeInt16)(writer, 50); // text version
|
|
@@ -115,48 +104,48 @@ addHandler('TySh', hasKey('text'), function (reader, target, leftBytes) {
|
|
|
115
104
|
// writeZeros(writer, 2);
|
|
116
105
|
});
|
|
117
106
|
// vector fills
|
|
118
|
-
addHandler('SoCo',
|
|
119
|
-
target.vectorFill.type === 'color'
|
|
120
|
-
|
|
107
|
+
addHandler('SoCo', target => target.vectorFill !== undefined && target.vectorStroke === undefined &&
|
|
108
|
+
target.vectorFill.type === 'color', (reader, target) => {
|
|
109
|
+
const descriptor = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
121
110
|
target.vectorFill = (0, descriptor_1.parseVectorContent)(descriptor);
|
|
122
|
-
},
|
|
123
|
-
|
|
111
|
+
}, (writer, target) => {
|
|
112
|
+
const { descriptor } = (0, descriptor_1.serializeVectorContent)(target.vectorFill);
|
|
124
113
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', descriptor);
|
|
125
114
|
});
|
|
126
|
-
addHandler('GdFl',
|
|
127
|
-
(target.vectorFill.type === 'solid' || target.vectorFill.type === 'noise')
|
|
128
|
-
|
|
115
|
+
addHandler('GdFl', target => target.vectorFill !== undefined && target.vectorStroke === undefined &&
|
|
116
|
+
(target.vectorFill.type === 'solid' || target.vectorFill.type === 'noise'), (reader, target, left) => {
|
|
117
|
+
const descriptor = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
129
118
|
target.vectorFill = (0, descriptor_1.parseVectorContent)(descriptor);
|
|
130
119
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
131
|
-
},
|
|
132
|
-
|
|
120
|
+
}, (writer, target) => {
|
|
121
|
+
const { descriptor } = (0, descriptor_1.serializeVectorContent)(target.vectorFill);
|
|
133
122
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', descriptor);
|
|
134
123
|
});
|
|
135
|
-
addHandler('PtFl',
|
|
136
|
-
target.vectorFill.type === 'pattern'
|
|
137
|
-
|
|
124
|
+
addHandler('PtFl', target => target.vectorFill !== undefined && target.vectorStroke === undefined &&
|
|
125
|
+
target.vectorFill.type === 'pattern', (reader, target) => {
|
|
126
|
+
const descriptor = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
138
127
|
target.vectorFill = (0, descriptor_1.parseVectorContent)(descriptor);
|
|
139
|
-
},
|
|
140
|
-
|
|
128
|
+
}, (writer, target) => {
|
|
129
|
+
const { descriptor } = (0, descriptor_1.serializeVectorContent)(target.vectorFill);
|
|
141
130
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', descriptor);
|
|
142
131
|
});
|
|
143
|
-
addHandler('vscg',
|
|
132
|
+
addHandler('vscg', target => target.vectorFill !== undefined && target.vectorStroke !== undefined, (reader, target, left) => {
|
|
144
133
|
(0, psdReader_1.readSignature)(reader); // key
|
|
145
|
-
|
|
134
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
146
135
|
target.vectorFill = (0, descriptor_1.parseVectorContent)(desc);
|
|
147
136
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
148
|
-
},
|
|
149
|
-
|
|
137
|
+
}, (writer, target) => {
|
|
138
|
+
const { descriptor, key } = (0, descriptor_1.serializeVectorContent)(target.vectorFill);
|
|
150
139
|
(0, psdWriter_1.writeSignature)(writer, key);
|
|
151
140
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', descriptor);
|
|
152
141
|
});
|
|
153
142
|
function readBezierKnot(reader, width, height) {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
143
|
+
const y0 = (0, psdReader_1.readFixedPointPath32)(reader) * height;
|
|
144
|
+
const x0 = (0, psdReader_1.readFixedPointPath32)(reader) * width;
|
|
145
|
+
const y1 = (0, psdReader_1.readFixedPointPath32)(reader) * height;
|
|
146
|
+
const x1 = (0, psdReader_1.readFixedPointPath32)(reader) * width;
|
|
147
|
+
const y2 = (0, psdReader_1.readFixedPointPath32)(reader) * height;
|
|
148
|
+
const x2 = (0, psdReader_1.readFixedPointPath32)(reader) * width;
|
|
160
149
|
return [x0, y0, x1, y1, x2, y2];
|
|
161
150
|
}
|
|
162
151
|
exports.readBezierKnot = readBezierKnot;
|
|
@@ -170,17 +159,17 @@ function writeBezierKnot(writer, points, width, height) {
|
|
|
170
159
|
}
|
|
171
160
|
exports.booleanOperations = ['exclude', 'combine', 'subtract', 'intersect'];
|
|
172
161
|
function readVectorMask(reader, vectorMask, width, height, size) {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
162
|
+
const end = reader.offset + size;
|
|
163
|
+
const paths = vectorMask.paths;
|
|
164
|
+
let path = undefined;
|
|
176
165
|
while ((end - reader.offset) >= 26) {
|
|
177
|
-
|
|
166
|
+
const selector = (0, psdReader_1.readUint16)(reader);
|
|
178
167
|
switch (selector) {
|
|
179
168
|
case 0: // Closed subpath length record
|
|
180
169
|
case 3: { // Open subpath length record
|
|
181
170
|
(0, psdReader_1.readUint16)(reader); // count
|
|
182
|
-
|
|
183
|
-
|
|
171
|
+
const boolOp = (0, psdReader_1.readInt16)(reader);
|
|
172
|
+
const flags = (0, psdReader_1.readUint16)(reader); // bit 1 always 1 ?
|
|
184
173
|
(0, psdReader_1.skipBytes)(reader, 18);
|
|
185
174
|
path = {
|
|
186
175
|
open: selector === 3,
|
|
@@ -203,13 +192,13 @@ function readVectorMask(reader, vectorMask, width, height, size) {
|
|
|
203
192
|
break;
|
|
204
193
|
case 7: { // Clipboard record
|
|
205
194
|
// TODO: check if these need to be multiplied by document size
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
195
|
+
const top = (0, psdReader_1.readFixedPointPath32)(reader);
|
|
196
|
+
const left = (0, psdReader_1.readFixedPointPath32)(reader);
|
|
197
|
+
const bottom = (0, psdReader_1.readFixedPointPath32)(reader);
|
|
198
|
+
const right = (0, psdReader_1.readFixedPointPath32)(reader);
|
|
199
|
+
const resolution = (0, psdReader_1.readFixedPointPath32)(reader);
|
|
211
200
|
(0, psdReader_1.skipBytes)(reader, 4);
|
|
212
|
-
vectorMask.clipboard = { top
|
|
201
|
+
vectorMask.clipboard = { top, left, bottom, right, resolution };
|
|
213
202
|
break;
|
|
214
203
|
}
|
|
215
204
|
case 8: // Initial fill rule record
|
|
@@ -222,23 +211,21 @@ function readVectorMask(reader, vectorMask, width, height, size) {
|
|
|
222
211
|
return paths;
|
|
223
212
|
}
|
|
224
213
|
exports.readVectorMask = readVectorMask;
|
|
225
|
-
addHandler('vmsk', hasKey('vectorMask'),
|
|
226
|
-
var width = _a.width, height = _a.height;
|
|
214
|
+
addHandler('vmsk', hasKey('vectorMask'), (reader, target, left, { width, height }) => {
|
|
227
215
|
if ((0, psdReader_1.readUint32)(reader) !== 3)
|
|
228
216
|
throw new Error('Invalid vmsk version');
|
|
229
217
|
target.vectorMask = { paths: [] };
|
|
230
|
-
|
|
231
|
-
|
|
218
|
+
const vectorMask = target.vectorMask;
|
|
219
|
+
const flags = (0, psdReader_1.readUint32)(reader);
|
|
232
220
|
vectorMask.invert = (flags & 1) !== 0;
|
|
233
221
|
vectorMask.notLink = (flags & 2) !== 0;
|
|
234
222
|
vectorMask.disable = (flags & 4) !== 0;
|
|
235
223
|
readVectorMask(reader, vectorMask, width, height, left());
|
|
236
224
|
// drawBezierPaths(vectorMask.paths, width, height, 'out.png');
|
|
237
225
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
238
|
-
},
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
var flags = (vectorMask.invert ? 1 : 0) |
|
|
226
|
+
}, (writer, target, { width, height }) => {
|
|
227
|
+
const vectorMask = target.vectorMask;
|
|
228
|
+
const flags = (vectorMask.invert ? 1 : 0) |
|
|
242
229
|
(vectorMask.notLink ? 2 : 0) |
|
|
243
230
|
(vectorMask.disable ? 4 : 0);
|
|
244
231
|
(0, psdWriter_1.writeUint32)(writer, 3); // version
|
|
@@ -246,7 +233,7 @@ addHandler('vmsk', hasKey('vectorMask'), function (reader, target, left, _a) {
|
|
|
246
233
|
// initial entry
|
|
247
234
|
(0, psdWriter_1.writeUint16)(writer, 6);
|
|
248
235
|
(0, psdWriter_1.writeZeros)(writer, 24);
|
|
249
|
-
|
|
236
|
+
const clipboard = vectorMask.clipboard;
|
|
250
237
|
if (clipboard) {
|
|
251
238
|
(0, psdWriter_1.writeUint16)(writer, 7);
|
|
252
239
|
(0, psdWriter_1.writeFixedPointPath32)(writer, clipboard.top);
|
|
@@ -259,17 +246,15 @@ addHandler('vmsk', hasKey('vectorMask'), function (reader, target, left, _a) {
|
|
|
259
246
|
(0, psdWriter_1.writeUint16)(writer, 8);
|
|
260
247
|
(0, psdWriter_1.writeUint16)(writer, vectorMask.fillStartsWithAllPixels ? 1 : 0);
|
|
261
248
|
(0, psdWriter_1.writeZeros)(writer, 22);
|
|
262
|
-
for (
|
|
263
|
-
var path = _b[_i];
|
|
249
|
+
for (const path of vectorMask.paths) {
|
|
264
250
|
(0, psdWriter_1.writeUint16)(writer, path.open ? 3 : 0);
|
|
265
251
|
(0, psdWriter_1.writeUint16)(writer, path.knots.length);
|
|
266
252
|
(0, psdWriter_1.writeUint16)(writer, path.operation ? exports.booleanOperations.indexOf(path.operation) : -1); // -1 for undefined
|
|
267
253
|
(0, psdWriter_1.writeUint16)(writer, path.fillRule === 'non-zero' ? 2 : 1);
|
|
268
254
|
(0, psdWriter_1.writeZeros)(writer, 18); // TODO: these are sometimes non-zero
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
for (
|
|
272
|
-
var _e = _d[_c], linked = _e.linked, points = _e.points;
|
|
255
|
+
const linkedKnot = path.open ? 4 : 1;
|
|
256
|
+
const unlinkedKnot = path.open ? 5 : 2;
|
|
257
|
+
for (const { linked, points } of path.knots) {
|
|
273
258
|
(0, psdWriter_1.writeUint16)(writer, linked ? linkedKnot : unlinkedKnot);
|
|
274
259
|
writeBezierKnot(writer, points, width, height);
|
|
275
260
|
}
|
|
@@ -279,20 +264,19 @@ addHandler('vmsk', hasKey('vectorMask'), function (reader, target, left, _a) {
|
|
|
279
264
|
addHandlerAlias('vsms', 'vmsk');
|
|
280
265
|
// addHandlerAlias('vmsk', 'vsms');
|
|
281
266
|
addHandler('vowv', // something with vectors?
|
|
282
|
-
hasKey('vowv'),
|
|
267
|
+
hasKey('vowv'), (reader, target) => {
|
|
283
268
|
target.vowv = (0, psdReader_1.readUint32)(reader); // always 2 ????
|
|
284
|
-
},
|
|
269
|
+
}, (writer, target) => {
|
|
285
270
|
(0, psdWriter_1.writeUint32)(writer, target.vowv);
|
|
286
271
|
});
|
|
287
|
-
addHandler('vogk', hasKey('vectorOrigination'),
|
|
272
|
+
addHandler('vogk', hasKey('vectorOrigination'), (reader, target, left) => {
|
|
288
273
|
if ((0, psdReader_1.readInt32)(reader) !== 1)
|
|
289
|
-
throw new Error(
|
|
290
|
-
|
|
274
|
+
throw new Error(`Invalid vogk version`);
|
|
275
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
291
276
|
// console.log(require('util').inspect(desc, false, 99, true));
|
|
292
277
|
target.vectorOrigination = { keyDescriptorList: [] };
|
|
293
|
-
for (
|
|
294
|
-
|
|
295
|
-
var item = {};
|
|
278
|
+
for (const i of desc.keyDescriptorList) {
|
|
279
|
+
const item = {};
|
|
296
280
|
if (i.keyShapeInvalidated != null)
|
|
297
281
|
item.keyShapeInvalidated = i.keyShapeInvalidated;
|
|
298
282
|
if (i.keyOriginType != null)
|
|
@@ -307,7 +291,7 @@ addHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left)
|
|
|
307
291
|
right: (0, descriptor_1.parseUnitsOrNumber)(i.keyOriginShapeBBox.Rght),
|
|
308
292
|
};
|
|
309
293
|
}
|
|
310
|
-
|
|
294
|
+
const rectRadii = i.keyOriginRRectRadii;
|
|
311
295
|
if (rectRadii) {
|
|
312
296
|
item.keyOriginRRectRadii = {
|
|
313
297
|
topRight: (0, descriptor_1.parseUnits)(rectRadii.topRight),
|
|
@@ -316,7 +300,7 @@ addHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left)
|
|
|
316
300
|
bottomRight: (0, descriptor_1.parseUnits)(rectRadii.bottomRight),
|
|
317
301
|
};
|
|
318
302
|
}
|
|
319
|
-
|
|
303
|
+
const corners = i.keyOriginBoxCorners;
|
|
320
304
|
if (corners) {
|
|
321
305
|
item.keyOriginBoxCorners = [
|
|
322
306
|
{ x: corners.rectangleCornerA.Hrzn, y: corners.rectangleCornerA.Vrtc },
|
|
@@ -325,26 +309,26 @@ addHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left)
|
|
|
325
309
|
{ x: corners.rectangleCornerD.Hrzn, y: corners.rectangleCornerD.Vrtc },
|
|
326
310
|
];
|
|
327
311
|
}
|
|
328
|
-
|
|
312
|
+
const trnf = i.Trnf;
|
|
329
313
|
if (trnf) {
|
|
330
314
|
item.transform = [trnf.xx, trnf.xy, trnf.yx, trnf.yy, trnf.tx, trnf.ty];
|
|
331
315
|
}
|
|
332
316
|
target.vectorOrigination.keyDescriptorList.push(item);
|
|
333
317
|
}
|
|
334
318
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
335
|
-
},
|
|
319
|
+
}, (writer, target) => {
|
|
336
320
|
target;
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
for (
|
|
340
|
-
|
|
321
|
+
const orig = target.vectorOrigination;
|
|
322
|
+
const desc = { keyDescriptorList: [] };
|
|
323
|
+
for (let i = 0; i < orig.keyDescriptorList.length; i++) {
|
|
324
|
+
const item = orig.keyDescriptorList[i];
|
|
341
325
|
desc.keyDescriptorList.push({}); // we're adding keyOriginIndex at the end
|
|
342
|
-
|
|
326
|
+
const out = desc.keyDescriptorList[desc.keyDescriptorList.length - 1];
|
|
343
327
|
if (item.keyOriginType != null)
|
|
344
328
|
out.keyOriginType = item.keyOriginType;
|
|
345
329
|
if (item.keyOriginResolution != null)
|
|
346
330
|
out.keyOriginResolution = item.keyOriginResolution;
|
|
347
|
-
|
|
331
|
+
const radii = item.keyOriginRRectRadii;
|
|
348
332
|
if (radii) {
|
|
349
333
|
out.keyOriginRRectRadii = {
|
|
350
334
|
unitValueQuadVersion: 1,
|
|
@@ -354,7 +338,7 @@ addHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left)
|
|
|
354
338
|
bottomRight: (0, descriptor_1.unitsValue)(radii.bottomRight, 'bottomRight'),
|
|
355
339
|
};
|
|
356
340
|
}
|
|
357
|
-
|
|
341
|
+
const box = item.keyOriginShapeBoundingBox;
|
|
358
342
|
if (box) {
|
|
359
343
|
out.keyOriginShapeBBox = {
|
|
360
344
|
unitValueQuadVersion: 1,
|
|
@@ -364,7 +348,7 @@ addHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left)
|
|
|
364
348
|
Rght: (0, descriptor_1.unitsValue)(box.right, 'right'),
|
|
365
349
|
};
|
|
366
350
|
}
|
|
367
|
-
|
|
351
|
+
const corners = item.keyOriginBoxCorners;
|
|
368
352
|
if (corners && corners.length === 4) {
|
|
369
353
|
out.keyOriginBoxCorners = {
|
|
370
354
|
rectangleCornerA: { Hrzn: corners[0].x, Vrtc: corners[0].y },
|
|
@@ -373,7 +357,7 @@ addHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left)
|
|
|
373
357
|
rectangleCornerD: { Hrzn: corners[3].x, Vrtc: corners[3].y },
|
|
374
358
|
};
|
|
375
359
|
}
|
|
376
|
-
|
|
360
|
+
const transform = item.transform;
|
|
377
361
|
if (transform && transform.length === 6) {
|
|
378
362
|
out.Trnf = {
|
|
379
363
|
xx: transform[0],
|
|
@@ -391,33 +375,33 @@ addHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left)
|
|
|
391
375
|
(0, psdWriter_1.writeInt32)(writer, 1); // version
|
|
392
376
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
|
|
393
377
|
});
|
|
394
|
-
addHandler('lmfx',
|
|
395
|
-
|
|
378
|
+
addHandler('lmfx', target => target.effects !== undefined && hasMultiEffects(target.effects), (reader, target, left) => {
|
|
379
|
+
const version = (0, psdReader_1.readUint32)(reader);
|
|
396
380
|
if (version !== 0)
|
|
397
381
|
throw new Error('Invalid lmfx version');
|
|
398
|
-
|
|
382
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
399
383
|
// console.log('READ', require('util').inspect(desc, false, 99, true));
|
|
400
384
|
// discard if read in 'lrFX' or 'lfx2' section
|
|
401
385
|
target.effects = (0, descriptor_1.parseEffects)(desc, !!reader.logMissingFeatures);
|
|
402
386
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
403
|
-
},
|
|
404
|
-
|
|
387
|
+
}, (writer, target, _, options) => {
|
|
388
|
+
const desc = (0, descriptor_1.serializeEffects)(target.effects, !!options.logMissingFeatures, true);
|
|
405
389
|
// console.log('WRITE', require('util').inspect(desc, false, 99, true));
|
|
406
390
|
(0, psdWriter_1.writeUint32)(writer, 0); // version
|
|
407
391
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
|
|
408
392
|
});
|
|
409
|
-
addHandler('lrFX', hasKey('effects'),
|
|
393
|
+
addHandler('lrFX', hasKey('effects'), (reader, target, left) => {
|
|
410
394
|
if (!target.effects)
|
|
411
395
|
target.effects = (0, effectsHelpers_1.readEffects)(reader);
|
|
412
396
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
413
|
-
},
|
|
397
|
+
}, (writer, target) => {
|
|
414
398
|
(0, effectsHelpers_1.writeEffects)(writer, target.effects);
|
|
415
399
|
});
|
|
416
|
-
addHandler('luni', hasKey('name'),
|
|
400
|
+
addHandler('luni', hasKey('name'), (reader, target, left) => {
|
|
417
401
|
if (left() > 4) {
|
|
418
|
-
|
|
419
|
-
if (left() >= (
|
|
420
|
-
target.name = (0, psdReader_1.readUnicodeStringWithLength)(reader,
|
|
402
|
+
const length = (0, psdReader_1.readUint32)(reader);
|
|
403
|
+
if (left() >= (length * 2)) {
|
|
404
|
+
target.name = (0, psdReader_1.readUnicodeStringWithLength)(reader, length);
|
|
421
405
|
}
|
|
422
406
|
else {
|
|
423
407
|
if (reader.logDevFeatures)
|
|
@@ -429,22 +413,22 @@ addHandler('luni', hasKey('name'), function (reader, target, left) {
|
|
|
429
413
|
reader.log('empty luni section');
|
|
430
414
|
}
|
|
431
415
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
432
|
-
},
|
|
416
|
+
}, (writer, target) => {
|
|
433
417
|
(0, psdWriter_1.writeUnicodeString)(writer, target.name);
|
|
434
418
|
// writeUint16(writer, 0); // padding (but not extending string length)
|
|
435
419
|
});
|
|
436
|
-
addHandler('lnsr', hasKey('nameSource'),
|
|
437
|
-
addHandler('lyid', hasKey('id'),
|
|
420
|
+
addHandler('lnsr', hasKey('nameSource'), (reader, target) => target.nameSource = (0, psdReader_1.readSignature)(reader), (writer, target) => (0, psdWriter_1.writeSignature)(writer, target.nameSource));
|
|
421
|
+
addHandler('lyid', hasKey('id'), (reader, target) => {
|
|
438
422
|
target.id = (0, psdReader_1.readUint32)(reader);
|
|
439
|
-
},
|
|
440
|
-
|
|
423
|
+
}, (writer, target, _psd, options) => {
|
|
424
|
+
let id = target.id;
|
|
441
425
|
while (options.layerIds.has(id))
|
|
442
426
|
id += 100; // make sure we don't have duplicate layer ids
|
|
443
427
|
(0, psdWriter_1.writeUint32)(writer, id);
|
|
444
428
|
options.layerIds.add(id);
|
|
445
429
|
options.layerToId.set(target, id);
|
|
446
430
|
});
|
|
447
|
-
addHandler('lsct', hasKey('sectionDivider'),
|
|
431
|
+
addHandler('lsct', hasKey('sectionDivider'), (reader, target, left) => {
|
|
448
432
|
target.sectionDivider = { type: (0, psdReader_1.readUint32)(reader) };
|
|
449
433
|
if (left()) {
|
|
450
434
|
(0, psdReader_1.checkSignature)(reader, '8BIM');
|
|
@@ -453,7 +437,7 @@ addHandler('lsct', hasKey('sectionDivider'), function (reader, target, left) {
|
|
|
453
437
|
if (left()) {
|
|
454
438
|
target.sectionDivider.subType = (0, psdReader_1.readUint32)(reader);
|
|
455
439
|
}
|
|
456
|
-
},
|
|
440
|
+
}, (writer, target) => {
|
|
457
441
|
(0, psdWriter_1.writeUint32)(writer, target.sectionDivider.type);
|
|
458
442
|
if (target.sectionDivider.key) {
|
|
459
443
|
(0, psdWriter_1.writeSignature)(writer, '8BIM');
|
|
@@ -466,36 +450,36 @@ addHandler('lsct', hasKey('sectionDivider'), function (reader, target, left) {
|
|
|
466
450
|
// it seems lsdk is used when there's a layer is nested more than 6 levels, but I don't know why?
|
|
467
451
|
// maybe some limitation of old version of PS?
|
|
468
452
|
addHandlerAlias('lsdk', 'lsct');
|
|
469
|
-
addHandler('clbl', hasKey('blendClippendElements'),
|
|
453
|
+
addHandler('clbl', hasKey('blendClippendElements'), (reader, target) => {
|
|
470
454
|
target.blendClippendElements = !!(0, psdReader_1.readUint8)(reader);
|
|
471
455
|
(0, psdReader_1.skipBytes)(reader, 3);
|
|
472
|
-
},
|
|
456
|
+
}, (writer, target) => {
|
|
473
457
|
(0, psdWriter_1.writeUint8)(writer, target.blendClippendElements ? 1 : 0);
|
|
474
458
|
(0, psdWriter_1.writeZeros)(writer, 3);
|
|
475
459
|
});
|
|
476
|
-
addHandler('infx', hasKey('blendInteriorElements'),
|
|
460
|
+
addHandler('infx', hasKey('blendInteriorElements'), (reader, target) => {
|
|
477
461
|
target.blendInteriorElements = !!(0, psdReader_1.readUint8)(reader);
|
|
478
462
|
(0, psdReader_1.skipBytes)(reader, 3);
|
|
479
|
-
},
|
|
463
|
+
}, (writer, target) => {
|
|
480
464
|
(0, psdWriter_1.writeUint8)(writer, target.blendInteriorElements ? 1 : 0);
|
|
481
465
|
(0, psdWriter_1.writeZeros)(writer, 3);
|
|
482
466
|
});
|
|
483
|
-
addHandler('knko', hasKey('knockout'),
|
|
467
|
+
addHandler('knko', hasKey('knockout'), (reader, target) => {
|
|
484
468
|
target.knockout = !!(0, psdReader_1.readUint8)(reader);
|
|
485
469
|
(0, psdReader_1.skipBytes)(reader, 3);
|
|
486
|
-
},
|
|
470
|
+
}, (writer, target) => {
|
|
487
471
|
(0, psdWriter_1.writeUint8)(writer, target.knockout ? 1 : 0);
|
|
488
472
|
(0, psdWriter_1.writeZeros)(writer, 3);
|
|
489
473
|
});
|
|
490
|
-
addHandler('lmgm', hasKey('layerMaskAsGlobalMask'),
|
|
474
|
+
addHandler('lmgm', hasKey('layerMaskAsGlobalMask'), (reader, target) => {
|
|
491
475
|
target.layerMaskAsGlobalMask = !!(0, psdReader_1.readUint8)(reader);
|
|
492
476
|
(0, psdReader_1.skipBytes)(reader, 3);
|
|
493
|
-
},
|
|
477
|
+
}, (writer, target) => {
|
|
494
478
|
(0, psdWriter_1.writeUint8)(writer, target.layerMaskAsGlobalMask ? 1 : 0);
|
|
495
479
|
(0, psdWriter_1.writeZeros)(writer, 3);
|
|
496
480
|
});
|
|
497
|
-
addHandler('lspf', hasKey('protected'),
|
|
498
|
-
|
|
481
|
+
addHandler('lspf', hasKey('protected'), (reader, target) => {
|
|
482
|
+
const flags = (0, psdReader_1.readUint32)(reader);
|
|
499
483
|
target.protected = {
|
|
500
484
|
transparency: (flags & 0x01) !== 0,
|
|
501
485
|
composite: (flags & 0x02) !== 0,
|
|
@@ -503,45 +487,45 @@ addHandler('lspf', hasKey('protected'), function (reader, target) {
|
|
|
503
487
|
};
|
|
504
488
|
if (flags & 0x08)
|
|
505
489
|
target.protected.artboards = true;
|
|
506
|
-
},
|
|
507
|
-
|
|
490
|
+
}, (writer, target) => {
|
|
491
|
+
const flags = (target.protected.transparency ? 0x01 : 0) |
|
|
508
492
|
(target.protected.composite ? 0x02 : 0) |
|
|
509
493
|
(target.protected.position ? 0x04 : 0) |
|
|
510
494
|
(target.protected.artboards ? 0x08 : 0);
|
|
511
495
|
(0, psdWriter_1.writeUint32)(writer, flags);
|
|
512
496
|
});
|
|
513
|
-
addHandler('lclr', hasKey('layerColor'),
|
|
514
|
-
|
|
497
|
+
addHandler('lclr', hasKey('layerColor'), (reader, target) => {
|
|
498
|
+
const color = (0, psdReader_1.readUint16)(reader);
|
|
515
499
|
(0, psdReader_1.skipBytes)(reader, 6);
|
|
516
500
|
target.layerColor = helpers_1.layerColors[color];
|
|
517
|
-
},
|
|
518
|
-
|
|
501
|
+
}, (writer, target) => {
|
|
502
|
+
const index = helpers_1.layerColors.indexOf(target.layerColor);
|
|
519
503
|
(0, psdWriter_1.writeUint16)(writer, index === -1 ? 0 : index);
|
|
520
504
|
(0, psdWriter_1.writeZeros)(writer, 6);
|
|
521
505
|
});
|
|
522
506
|
addHandler('shmd', // Metadata setting
|
|
523
|
-
|
|
524
|
-
target
|
|
525
|
-
|
|
526
|
-
|
|
507
|
+
// Metadata setting
|
|
508
|
+
target => target.timestamp !== undefined || target.animationFrames !== undefined || target.animationFrameFlags !== undefined || target.timeline !== undefined || target.comps !== undefined, (reader, target, left) => {
|
|
509
|
+
const count = (0, psdReader_1.readUint32)(reader);
|
|
510
|
+
for (let i = 0; i < count; i++) {
|
|
527
511
|
(0, psdReader_1.checkSignature)(reader, '8BIM');
|
|
528
|
-
|
|
512
|
+
const key = (0, psdReader_1.readSignature)(reader);
|
|
529
513
|
(0, psdReader_1.readUint8)(reader); // copy
|
|
530
514
|
(0, psdReader_1.skipBytes)(reader, 3);
|
|
531
|
-
(0, psdReader_1.readSection)(reader, 1,
|
|
515
|
+
(0, psdReader_1.readSection)(reader, 1, left => {
|
|
532
516
|
if (key === 'cust') {
|
|
533
|
-
|
|
517
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
534
518
|
// console.log('cust', target.name, require('util').inspect(desc, false, 99, true));
|
|
535
519
|
if (desc.layerTime !== undefined)
|
|
536
520
|
target.timestamp = desc.layerTime;
|
|
537
521
|
}
|
|
538
522
|
else if (key === 'mlst') {
|
|
539
|
-
|
|
523
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
540
524
|
// console.log('mlst', target.name, require('util').inspect(desc, false, 99, true));
|
|
541
525
|
target.animationFrames = [];
|
|
542
|
-
for (
|
|
543
|
-
|
|
544
|
-
|
|
526
|
+
for (let i = 0; i < desc.LaSt.length; i++) {
|
|
527
|
+
const f = desc.LaSt[i];
|
|
528
|
+
const frame = { frames: f.FrLs };
|
|
545
529
|
if (f.enab !== undefined)
|
|
546
530
|
frame.enable = f.enab;
|
|
547
531
|
if (f.Ofst)
|
|
@@ -558,8 +542,8 @@ target) { return target.timestamp !== undefined || target.animationFrames !== un
|
|
|
558
542
|
else if (key === 'mdyn') {
|
|
559
543
|
// frame flags
|
|
560
544
|
(0, psdReader_1.readUint16)(reader); // unknown
|
|
561
|
-
|
|
562
|
-
|
|
545
|
+
const propagate = (0, psdReader_1.readUint8)(reader);
|
|
546
|
+
const flags = (0, psdReader_1.readUint8)(reader);
|
|
563
547
|
target.animationFrameFlags = {
|
|
564
548
|
propagateFrameOne: !propagate,
|
|
565
549
|
unifyLayerPosition: (flags & 1) !== 0,
|
|
@@ -568,10 +552,10 @@ target) { return target.timestamp !== undefined || target.animationFrames !== un
|
|
|
568
552
|
};
|
|
569
553
|
}
|
|
570
554
|
else if (key === 'tmln') {
|
|
571
|
-
|
|
572
|
-
|
|
555
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
556
|
+
const timeScope = desc.timeScope;
|
|
573
557
|
// console.log('tmln', target.name, target.id, require('util').inspect(desc, false, 99, true));
|
|
574
|
-
|
|
558
|
+
const timeline = {
|
|
575
559
|
start: (0, descriptor_1.frac)(timeScope.Strt),
|
|
576
560
|
duration: (0, descriptor_1.frac)(timeScope.duration),
|
|
577
561
|
inTime: (0, descriptor_1.frac)(timeScope.inTime),
|
|
@@ -586,17 +570,16 @@ target) { return target.timestamp !== undefined || target.animationFrames !== un
|
|
|
586
570
|
// console.log('tmln:result', target.name, target.id, require('util').inspect(timeline, false, 99, true));
|
|
587
571
|
}
|
|
588
572
|
else if (key === 'cmls') {
|
|
589
|
-
|
|
573
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
590
574
|
// console.log('cmls', require('util').inspect(desc, false, 99, true));
|
|
591
575
|
target.comps = {
|
|
592
576
|
settings: [],
|
|
593
577
|
};
|
|
594
578
|
if (desc.origFXRefPoint)
|
|
595
579
|
target.comps.originalEffectsReferencePoint = { x: desc.origFXRefPoint.Hrzn, y: desc.origFXRefPoint.Vrtc };
|
|
596
|
-
for (
|
|
597
|
-
var item = _a[_i];
|
|
580
|
+
for (const item of desc.layerSettings) {
|
|
598
581
|
target.comps.settings.push({ compList: item.compList });
|
|
599
|
-
|
|
582
|
+
const t = target.comps.settings[target.comps.settings.length - 1];
|
|
600
583
|
if ('enab' in item)
|
|
601
584
|
t.enabled = item.enab;
|
|
602
585
|
if (item.Ofst)
|
|
@@ -606,7 +589,7 @@ target) { return target.timestamp !== undefined || target.animationFrames !== un
|
|
|
606
589
|
}
|
|
607
590
|
}
|
|
608
591
|
else if (key === 'extn') {
|
|
609
|
-
|
|
592
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
610
593
|
// console.log(require('util').inspect(desc, false, 99, true));
|
|
611
594
|
desc; // TODO: save this
|
|
612
595
|
reader.logMissingFeatures && reader.log('Unhandled "shmd" section key', key);
|
|
@@ -616,14 +599,11 @@ target) { return target.timestamp !== undefined || target.animationFrames !== un
|
|
|
616
599
|
}
|
|
617
600
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
618
601
|
});
|
|
619
|
-
};
|
|
620
|
-
for (var i = 0; i < count; i++) {
|
|
621
|
-
_loop_1(i);
|
|
622
602
|
}
|
|
623
603
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
624
|
-
},
|
|
625
|
-
|
|
626
|
-
|
|
604
|
+
}, (writer, target, _, options) => {
|
|
605
|
+
const { animationFrames, animationFrameFlags, timestamp, timeline, comps } = target;
|
|
606
|
+
let count = 0;
|
|
627
607
|
if (animationFrames)
|
|
628
608
|
count++;
|
|
629
609
|
if (animationFrameFlags)
|
|
@@ -640,15 +620,15 @@ target) { return target.timestamp !== undefined || target.animationFrames !== un
|
|
|
640
620
|
(0, psdWriter_1.writeSignature)(writer, 'mlst');
|
|
641
621
|
(0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
|
|
642
622
|
(0, psdWriter_1.writeZeros)(writer, 3);
|
|
643
|
-
(0, psdWriter_1.writeSection)(writer, 2,
|
|
623
|
+
(0, psdWriter_1.writeSection)(writer, 2, () => {
|
|
644
624
|
var _a;
|
|
645
|
-
|
|
625
|
+
const desc = {
|
|
646
626
|
LaID: (_a = target.id) !== null && _a !== void 0 ? _a : 0,
|
|
647
627
|
LaSt: [],
|
|
648
628
|
};
|
|
649
|
-
for (
|
|
650
|
-
|
|
651
|
-
|
|
629
|
+
for (let i = 0; i < animationFrames.length; i++) {
|
|
630
|
+
const f = animationFrames[i];
|
|
631
|
+
const frame = {};
|
|
652
632
|
if (f.enable !== undefined)
|
|
653
633
|
frame.enab = f.enable;
|
|
654
634
|
frame.FrLs = f.frames;
|
|
@@ -670,7 +650,7 @@ target) { return target.timestamp !== undefined || target.animationFrames !== un
|
|
|
670
650
|
(0, psdWriter_1.writeSignature)(writer, 'mdyn');
|
|
671
651
|
(0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
|
|
672
652
|
(0, psdWriter_1.writeZeros)(writer, 3);
|
|
673
|
-
(0, psdWriter_1.writeSection)(writer, 2,
|
|
653
|
+
(0, psdWriter_1.writeSection)(writer, 2, () => {
|
|
674
654
|
(0, psdWriter_1.writeUint16)(writer, 0); // unknown
|
|
675
655
|
(0, psdWriter_1.writeUint8)(writer, animationFrameFlags.propagateFrameOne ? 0x0 : 0xf);
|
|
676
656
|
(0, psdWriter_1.writeUint8)(writer, (animationFrameFlags.unifyLayerPosition ? 1 : 0) |
|
|
@@ -683,8 +663,8 @@ target) { return target.timestamp !== undefined || target.animationFrames !== un
|
|
|
683
663
|
(0, psdWriter_1.writeSignature)(writer, 'tmln');
|
|
684
664
|
(0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
|
|
685
665
|
(0, psdWriter_1.writeZeros)(writer, 3);
|
|
686
|
-
(0, psdWriter_1.writeSection)(writer, 2,
|
|
687
|
-
|
|
666
|
+
(0, psdWriter_1.writeSection)(writer, 2, () => {
|
|
667
|
+
const desc = {
|
|
688
668
|
Vrsn: 1,
|
|
689
669
|
timeScope: {
|
|
690
670
|
Vrsn: 1,
|
|
@@ -699,7 +679,7 @@ target) { return target.timestamp !== undefined || target.animationFrames !== un
|
|
|
699
679
|
if (timeline.tracks) {
|
|
700
680
|
desc.trackList = (0, descriptor_1.serializeTrackList)(timeline.tracks);
|
|
701
681
|
}
|
|
702
|
-
|
|
682
|
+
const id = options.layerToId.get(target) || target.id;
|
|
703
683
|
if (!id)
|
|
704
684
|
throw new Error('You need to provide layer.id value whan writing document with animations');
|
|
705
685
|
desc.LyrI = id;
|
|
@@ -712,8 +692,8 @@ target) { return target.timestamp !== undefined || target.animationFrames !== un
|
|
|
712
692
|
(0, psdWriter_1.writeSignature)(writer, 'cust');
|
|
713
693
|
(0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
|
|
714
694
|
(0, psdWriter_1.writeZeros)(writer, 3);
|
|
715
|
-
(0, psdWriter_1.writeSection)(writer, 2,
|
|
716
|
-
|
|
695
|
+
(0, psdWriter_1.writeSection)(writer, 2, () => {
|
|
696
|
+
const desc = {
|
|
717
697
|
layerTime: timestamp,
|
|
718
698
|
};
|
|
719
699
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'metadata', desc);
|
|
@@ -724,19 +704,18 @@ target) { return target.timestamp !== undefined || target.animationFrames !== un
|
|
|
724
704
|
(0, psdWriter_1.writeSignature)(writer, 'cmls');
|
|
725
705
|
(0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
|
|
726
706
|
(0, psdWriter_1.writeZeros)(writer, 3);
|
|
727
|
-
(0, psdWriter_1.writeSection)(writer, 2,
|
|
728
|
-
|
|
707
|
+
(0, psdWriter_1.writeSection)(writer, 2, () => {
|
|
708
|
+
const id = options.layerToId.get(target) || target.id;
|
|
729
709
|
if (!id)
|
|
730
710
|
throw new Error('You need to provide layer.id value whan writing document with layer comps');
|
|
731
|
-
|
|
711
|
+
const desc = {};
|
|
732
712
|
if (comps.originalEffectsReferencePoint) {
|
|
733
713
|
desc.origFXRefPoint = { Hrzn: comps.originalEffectsReferencePoint.x, Vrtc: comps.originalEffectsReferencePoint.y };
|
|
734
714
|
}
|
|
735
715
|
desc.LyrI = id;
|
|
736
716
|
desc.layerSettings = [];
|
|
737
|
-
for (
|
|
738
|
-
|
|
739
|
-
var t = {};
|
|
717
|
+
for (const item of comps.settings) {
|
|
718
|
+
const t = {};
|
|
740
719
|
if (item.enabled !== undefined)
|
|
741
720
|
t.enab = item.enabled;
|
|
742
721
|
if (item.offset)
|
|
@@ -751,8 +730,8 @@ target) { return target.timestamp !== undefined || target.animationFrames !== un
|
|
|
751
730
|
}, true);
|
|
752
731
|
}
|
|
753
732
|
});
|
|
754
|
-
addHandler('PxSc',
|
|
755
|
-
|
|
733
|
+
addHandler('PxSc', () => false, (reader, target) => {
|
|
734
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader, true);
|
|
756
735
|
// console.log('PxSc', require('util').inspect(desc, false, 99, true));
|
|
757
736
|
if (desc.pixelSourceType === 1986285651) {
|
|
758
737
|
target.pixelSource = {
|
|
@@ -777,11 +756,11 @@ addHandler('PxSc', function () { return false; }, function (reader, target) {
|
|
|
777
756
|
};
|
|
778
757
|
}
|
|
779
758
|
else {
|
|
780
|
-
reader.log(
|
|
759
|
+
reader.log(`Unknown pixelSourceType`);
|
|
781
760
|
}
|
|
782
|
-
},
|
|
783
|
-
|
|
784
|
-
|
|
761
|
+
}, (writer, target) => {
|
|
762
|
+
const source = target.pixelSource;
|
|
763
|
+
const desc = {
|
|
785
764
|
_name: '',
|
|
786
765
|
_classID: 'PixelSource',
|
|
787
766
|
pixelSourceType: 1986285651,
|
|
@@ -791,7 +770,7 @@ addHandler('PxSc', function () { return false; }, function (reader, target) {
|
|
|
791
770
|
_name: '',
|
|
792
771
|
_classID: 'footageInterpretation',
|
|
793
772
|
Vrsn: 1,
|
|
794
|
-
interpretAlpha:
|
|
773
|
+
interpretAlpha: `alphaInterpretation.${source.interpretation.interpretAlpha}`,
|
|
795
774
|
profile: source.interpretation.profile,
|
|
796
775
|
},
|
|
797
776
|
frameReader: {
|
|
@@ -815,8 +794,8 @@ addHandler('PxSc', function () { return false; }, function (reader, target) {
|
|
|
815
794
|
};
|
|
816
795
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'PixelSource', desc);
|
|
817
796
|
});
|
|
818
|
-
addHandler('vstk', hasKey('vectorStroke'),
|
|
819
|
-
|
|
797
|
+
addHandler('vstk', hasKey('vectorStroke'), (reader, target, left) => {
|
|
798
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
820
799
|
// console.log(require('util').inspect(desc, false, 99, true));
|
|
821
800
|
target.vectorStroke = {
|
|
822
801
|
strokeEnabled: desc.strokeEnabled,
|
|
@@ -836,10 +815,10 @@ addHandler('vstk', hasKey('vectorStroke'), function (reader, target, left) {
|
|
|
836
815
|
resolution: desc.strokeStyleResolution,
|
|
837
816
|
};
|
|
838
817
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
839
|
-
},
|
|
818
|
+
}, (writer, target) => {
|
|
840
819
|
var _a, _b, _c;
|
|
841
|
-
|
|
842
|
-
|
|
820
|
+
const stroke = target.vectorStroke;
|
|
821
|
+
const desc = {
|
|
843
822
|
strokeStyleVersion: 2,
|
|
844
823
|
strokeEnabled: !!stroke.strokeEnabled,
|
|
845
824
|
fillEnabled: !!stroke.fillEnabled,
|
|
@@ -860,9 +839,9 @@ addHandler('vstk', hasKey('vectorStroke'), function (reader, target, left) {
|
|
|
860
839
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'strokeStyle', desc);
|
|
861
840
|
});
|
|
862
841
|
addHandler('artb', // per-layer arboard info
|
|
863
|
-
hasKey('artboard'),
|
|
864
|
-
|
|
865
|
-
|
|
842
|
+
hasKey('artboard'), (reader, target, left) => {
|
|
843
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
844
|
+
const rect = desc.artboardRect;
|
|
866
845
|
target.artboard = {
|
|
867
846
|
rect: { top: rect['Top '], left: rect.Left, bottom: rect.Btom, right: rect.Rght },
|
|
868
847
|
guideIndices: desc.guideIndeces,
|
|
@@ -871,11 +850,11 @@ hasKey('artboard'), function (reader, target, left) {
|
|
|
871
850
|
backgroundType: desc.artboardBackgroundType,
|
|
872
851
|
};
|
|
873
852
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
874
|
-
},
|
|
853
|
+
}, (writer, target) => {
|
|
875
854
|
var _a;
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
855
|
+
const artboard = target.artboard;
|
|
856
|
+
const rect = artboard.rect;
|
|
857
|
+
const desc = {
|
|
879
858
|
artboardRect: { 'Top ': rect.top, Left: rect.left, Btom: rect.bottom, Rght: rect.right },
|
|
880
859
|
guideIndeces: artboard.guideIndices || [],
|
|
881
860
|
artboardPresetName: artboard.presetName || '',
|
|
@@ -884,11 +863,11 @@ hasKey('artboard'), function (reader, target, left) {
|
|
|
884
863
|
};
|
|
885
864
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'artboard', desc);
|
|
886
865
|
});
|
|
887
|
-
addHandler('sn2P', hasKey('usingAlignedRendering'),
|
|
888
|
-
|
|
866
|
+
addHandler('sn2P', hasKey('usingAlignedRendering'), (reader, target) => target.usingAlignedRendering = !!(0, psdReader_1.readUint32)(reader), (writer, target) => (0, psdWriter_1.writeUint32)(writer, target.usingAlignedRendering ? 1 : 0));
|
|
867
|
+
const placedLayerTypes = ['unknown', 'vector', 'raster', 'image stack'];
|
|
889
868
|
function parseWarp(warp) {
|
|
890
869
|
var _a, _b, _c, _d, _e, _f;
|
|
891
|
-
|
|
870
|
+
const result = Object.assign(Object.assign({ style: descriptor_1.warpStyle.decode(warp.warpStyle) }, (warp.warpValues ? { values: warp.warpValues } : { value: warp.warpValue || 0 })), { perspective: warp.warpPerspective || 0, perspectiveOther: warp.warpPerspectiveOther || 0, rotate: descriptor_1.Ornt.decode(warp.warpRotate), bounds: warp.bounds && {
|
|
892
871
|
top: (0, descriptor_1.parseUnitsOrNumber)(warp.bounds['Top ']),
|
|
893
872
|
left: (0, descriptor_1.parseUnitsOrNumber)(warp.bounds.Left),
|
|
894
873
|
bottom: (0, descriptor_1.parseUnitsOrNumber)(warp.bounds.Btom),
|
|
@@ -898,14 +877,14 @@ function parseWarp(warp) {
|
|
|
898
877
|
result.deformNumRows = warp.deformNumRows;
|
|
899
878
|
result.deformNumCols = warp.deformNumCols;
|
|
900
879
|
}
|
|
901
|
-
|
|
880
|
+
const envelopeWarp = warp.customEnvelopeWarp;
|
|
902
881
|
if (envelopeWarp) {
|
|
903
882
|
result.customEnvelopeWarp = {
|
|
904
883
|
meshPoints: [],
|
|
905
884
|
};
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
for (
|
|
885
|
+
const xs = ((_a = envelopeWarp.meshPoints.find(i => i.type === 'Hrzn')) === null || _a === void 0 ? void 0 : _a.values) || [];
|
|
886
|
+
const ys = ((_b = envelopeWarp.meshPoints.find(i => i.type === 'Vrtc')) === null || _b === void 0 ? void 0 : _b.values) || [];
|
|
887
|
+
for (let i = 0; i < xs.length; i++) {
|
|
909
888
|
result.customEnvelopeWarp.meshPoints.push({ x: xs[i], y: ys[i] });
|
|
910
889
|
}
|
|
911
890
|
if (envelopeWarp.quiltSliceX || envelopeWarp.quiltSliceY) {
|
|
@@ -921,8 +900,8 @@ function isQuiltWarp(warp) {
|
|
|
921
900
|
((_a = warp.customEnvelopeWarp) === null || _a === void 0 ? void 0 : _a.quiltSliceX) || ((_b = warp.customEnvelopeWarp) === null || _b === void 0 ? void 0 : _b.quiltSliceY);
|
|
922
901
|
}
|
|
923
902
|
function encodeWarp(warp) {
|
|
924
|
-
|
|
925
|
-
|
|
903
|
+
const bounds = warp.bounds;
|
|
904
|
+
const desc = Object.assign(Object.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
|
|
926
905
|
_classID: 'classFloatRect',
|
|
927
906
|
'Top ': bounds && bounds.top && bounds.top.value || 0,
|
|
928
907
|
Left: bounds && bounds.left && bounds.left.value || 0,
|
|
@@ -934,17 +913,17 @@ function encodeWarp(warp) {
|
|
|
934
913
|
Btom: (0, descriptor_1.unitsValue)(bounds && bounds.bottom || { units: 'Pixels', value: 0 }, 'bounds.bottom'),
|
|
935
914
|
Rght: (0, descriptor_1.unitsValue)(bounds && bounds.right || { units: 'Pixels', value: 0 }, 'bounds.right'),
|
|
936
915
|
}, uOrder: warp.uOrder || 0, vOrder: warp.vOrder || 0 });
|
|
937
|
-
|
|
916
|
+
const isQuilt = isQuiltWarp(warp);
|
|
938
917
|
if (isQuilt) {
|
|
939
|
-
|
|
918
|
+
const desc2 = desc;
|
|
940
919
|
desc2.deformNumRows = warp.deformNumRows || 0;
|
|
941
920
|
desc2.deformNumCols = warp.deformNumCols || 0;
|
|
942
921
|
}
|
|
943
|
-
|
|
922
|
+
const customEnvelopeWarp = warp.customEnvelopeWarp;
|
|
944
923
|
if (customEnvelopeWarp) {
|
|
945
|
-
|
|
924
|
+
const meshPoints = customEnvelopeWarp.meshPoints || [];
|
|
946
925
|
if (isQuilt) {
|
|
947
|
-
|
|
926
|
+
const desc2 = desc;
|
|
948
927
|
desc2.customEnvelopeWarp = {
|
|
949
928
|
_name: '',
|
|
950
929
|
_classID: 'customEnvelopeWarp',
|
|
@@ -957,8 +936,8 @@ function encodeWarp(warp) {
|
|
|
957
936
|
values: customEnvelopeWarp.quiltSliceY || [],
|
|
958
937
|
}],
|
|
959
938
|
meshPoints: [
|
|
960
|
-
{ type: 'Hrzn', values: meshPoints.map(
|
|
961
|
-
{ type: 'Vrtc', values: meshPoints.map(
|
|
939
|
+
{ type: 'Hrzn', values: meshPoints.map(p => p.x) },
|
|
940
|
+
{ type: 'Vrtc', values: meshPoints.map(p => p.y) },
|
|
962
941
|
],
|
|
963
942
|
};
|
|
964
943
|
}
|
|
@@ -967,46 +946,46 @@ function encodeWarp(warp) {
|
|
|
967
946
|
_name: '',
|
|
968
947
|
_classID: 'customEnvelopeWarp',
|
|
969
948
|
meshPoints: [
|
|
970
|
-
{ type: 'Hrzn', values: meshPoints.map(
|
|
971
|
-
{ type: 'Vrtc', values: meshPoints.map(
|
|
949
|
+
{ type: 'Hrzn', values: meshPoints.map(p => p.x) },
|
|
950
|
+
{ type: 'Vrtc', values: meshPoints.map(p => p.y) },
|
|
972
951
|
],
|
|
973
952
|
};
|
|
974
953
|
}
|
|
975
954
|
}
|
|
976
955
|
return desc;
|
|
977
956
|
}
|
|
978
|
-
addHandler('PlLd', hasKey('placedLayer'),
|
|
957
|
+
addHandler('PlLd', hasKey('placedLayer'), (reader, target, left) => {
|
|
979
958
|
if ((0, psdReader_1.readSignature)(reader) !== 'plcL')
|
|
980
|
-
throw new Error(
|
|
959
|
+
throw new Error(`Invalid PlLd signature`);
|
|
981
960
|
if ((0, psdReader_1.readInt32)(reader) !== 3)
|
|
982
|
-
throw new Error(
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
961
|
+
throw new Error(`Invalid PlLd version`);
|
|
962
|
+
const id = (0, psdReader_1.readPascalString)(reader, 1);
|
|
963
|
+
const pageNumber = (0, psdReader_1.readInt32)(reader);
|
|
964
|
+
const totalPages = (0, psdReader_1.readInt32)(reader); // TODO: check how this works ?
|
|
986
965
|
(0, psdReader_1.readInt32)(reader); // anitAliasPolicy 16
|
|
987
|
-
|
|
966
|
+
const placedLayerType = (0, psdReader_1.readInt32)(reader); // 0 = unknown, 1 = vector, 2 = raster, 3 = image stack
|
|
988
967
|
if (!placedLayerTypes[placedLayerType])
|
|
989
968
|
throw new Error('Invalid PlLd type');
|
|
990
|
-
|
|
991
|
-
for (
|
|
969
|
+
const transform = [];
|
|
970
|
+
for (let i = 0; i < 8; i++)
|
|
992
971
|
transform.push((0, psdReader_1.readFloat64)(reader)); // x, y of 4 corners of the transform
|
|
993
|
-
|
|
972
|
+
const warpVersion = (0, psdReader_1.readInt32)(reader);
|
|
994
973
|
if (warpVersion !== 0)
|
|
995
|
-
throw new Error(
|
|
996
|
-
|
|
974
|
+
throw new Error(`Invalid Warp version ${warpVersion}`);
|
|
975
|
+
const warp = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
997
976
|
target.placedLayer = target.placedLayer || {
|
|
998
|
-
id
|
|
977
|
+
id,
|
|
999
978
|
type: placedLayerTypes[placedLayerType],
|
|
1000
|
-
pageNumber
|
|
1001
|
-
totalPages
|
|
1002
|
-
transform
|
|
979
|
+
pageNumber,
|
|
980
|
+
totalPages,
|
|
981
|
+
transform,
|
|
1003
982
|
warp: parseWarp(warp),
|
|
1004
983
|
};
|
|
1005
984
|
// console.log('PlLd warp', require('util').inspect(warp, false, 99, true));
|
|
1006
985
|
// console.log('PlLd', require('util').inspect(target.placedLayer, false, 99, true));
|
|
1007
986
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
1008
|
-
},
|
|
1009
|
-
|
|
987
|
+
}, (writer, target) => {
|
|
988
|
+
const placed = target.placedLayer;
|
|
1010
989
|
(0, psdWriter_1.writeSignature)(writer, 'plcL');
|
|
1011
990
|
(0, psdWriter_1.writeInt32)(writer, 3); // version
|
|
1012
991
|
if (!placed.id || typeof placed.id !== 'string' || !/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/.test(placed.id)) {
|
|
@@ -1019,12 +998,12 @@ addHandler('PlLd', hasKey('placedLayer'), function (reader, target, left) {
|
|
|
1019
998
|
if (placedLayerTypes.indexOf(placed.type) === -1)
|
|
1020
999
|
throw new Error('Invalid placedLayer type');
|
|
1021
1000
|
(0, psdWriter_1.writeInt32)(writer, placedLayerTypes.indexOf(placed.type));
|
|
1022
|
-
for (
|
|
1001
|
+
for (let i = 0; i < 8; i++)
|
|
1023
1002
|
(0, psdWriter_1.writeFloat64)(writer, placed.transform[i]);
|
|
1024
1003
|
(0, psdWriter_1.writeInt32)(writer, 0); // warp version
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1004
|
+
const warp = getWarpFromPlacedLayer(placed);
|
|
1005
|
+
const isQuilt = isQuiltWarp(warp);
|
|
1006
|
+
const type = isQuilt ? 'quiltWarp' : 'warp';
|
|
1028
1007
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', type, encodeWarp(warp), type);
|
|
1029
1008
|
});
|
|
1030
1009
|
function uint8ToFloat32(array) {
|
|
@@ -1037,15 +1016,15 @@ function toUint8(array) {
|
|
|
1037
1016
|
return new Uint8Array(array.buffer, array.byteOffset, array.byteLength);
|
|
1038
1017
|
}
|
|
1039
1018
|
function arrayToPoints(array) {
|
|
1040
|
-
|
|
1041
|
-
for (
|
|
1019
|
+
const points = [];
|
|
1020
|
+
for (let i = 0; i < array.length; i += 2) {
|
|
1042
1021
|
points.push({ x: array[i], y: array[i + 1] });
|
|
1043
1022
|
}
|
|
1044
1023
|
return points;
|
|
1045
1024
|
}
|
|
1046
1025
|
function pointsToArray(points) {
|
|
1047
|
-
|
|
1048
|
-
for (
|
|
1026
|
+
const array = [];
|
|
1027
|
+
for (let i = 0; i < points.length; i++) {
|
|
1049
1028
|
array.push(points[i].x, points[i].y);
|
|
1050
1029
|
}
|
|
1051
1030
|
return array;
|
|
@@ -1068,7 +1047,7 @@ function pointToHrznVrtc(point) {
|
|
|
1068
1047
|
};
|
|
1069
1048
|
}
|
|
1070
1049
|
function parseFilterFXItem(f, options) {
|
|
1071
|
-
|
|
1050
|
+
const base = {
|
|
1072
1051
|
name: f['Nm '],
|
|
1073
1052
|
opacity: (0, descriptor_1.parsePercent)(f.blendOptions.Opct),
|
|
1074
1053
|
blendMode: descriptor_1.BlnM.decode(f.blendOptions['Md ']),
|
|
@@ -1079,36 +1058,36 @@ function parseFilterFXItem(f, options) {
|
|
|
1079
1058
|
};
|
|
1080
1059
|
if ('Fltr' in f) {
|
|
1081
1060
|
switch (f.Fltr._classID) {
|
|
1082
|
-
case 'boxblur': return
|
|
1061
|
+
case 'boxblur': return Object.assign(Object.assign({}, base), { type: 'box blur', filter: {
|
|
1083
1062
|
radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
|
|
1084
1063
|
} });
|
|
1085
|
-
case 'GsnB': return
|
|
1064
|
+
case 'GsnB': return Object.assign(Object.assign({}, base), { type: 'gaussian blur', filter: {
|
|
1086
1065
|
radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
|
|
1087
1066
|
} });
|
|
1088
|
-
case 'MtnB': return
|
|
1067
|
+
case 'MtnB': return Object.assign(Object.assign({}, base), { type: 'motion blur', filter: {
|
|
1089
1068
|
angle: f.Fltr.Angl,
|
|
1090
1069
|
distance: (0, descriptor_1.parseUnits)(f.Fltr.Dstn),
|
|
1091
1070
|
} });
|
|
1092
|
-
case 'RdlB': return
|
|
1071
|
+
case 'RdlB': return Object.assign(Object.assign({}, base), { type: 'radial blur', filter: {
|
|
1093
1072
|
amount: f.Fltr.Amnt,
|
|
1094
1073
|
method: descriptor_1.BlrM.decode(f.Fltr.BlrM),
|
|
1095
1074
|
quality: descriptor_1.BlrQ.decode(f.Fltr.BlrQ),
|
|
1096
1075
|
} });
|
|
1097
|
-
case 'shapeBlur': return
|
|
1076
|
+
case 'shapeBlur': return Object.assign(Object.assign({}, base), { type: 'shape blur', filter: {
|
|
1098
1077
|
radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
|
|
1099
1078
|
customShape: { name: f.Fltr.customShape['Nm '], id: f.Fltr.customShape.Idnt },
|
|
1100
1079
|
} });
|
|
1101
|
-
case 'SmrB': return
|
|
1080
|
+
case 'SmrB': return Object.assign(Object.assign({}, base), { type: 'smart blur', filter: {
|
|
1102
1081
|
radius: f.Fltr['Rds '],
|
|
1103
1082
|
threshold: f.Fltr.Thsh,
|
|
1104
1083
|
quality: descriptor_1.SmBQ.decode(f.Fltr.SmBQ),
|
|
1105
1084
|
mode: descriptor_1.SmBM.decode(f.Fltr.SmBM),
|
|
1106
1085
|
} });
|
|
1107
|
-
case 'surfaceBlur': return
|
|
1086
|
+
case 'surfaceBlur': return Object.assign(Object.assign({}, base), { type: 'surface blur', filter: {
|
|
1108
1087
|
radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
|
|
1109
1088
|
threshold: f.Fltr.Thsh,
|
|
1110
1089
|
} });
|
|
1111
|
-
case 'Dspl': return
|
|
1090
|
+
case 'Dspl': return Object.assign(Object.assign({}, base), { type: 'displace', filter: {
|
|
1112
1091
|
horizontalScale: f.Fltr.HrzS,
|
|
1113
1092
|
verticalScale: f.Fltr.VrtS,
|
|
1114
1093
|
displacementMap: descriptor_1.DspM.decode(f.Fltr.DspM),
|
|
@@ -1118,30 +1097,30 @@ function parseFilterFXItem(f, options) {
|
|
|
1118
1097
|
path: f.Fltr.DspF.path, // TODO: this is decoded incorrectly ???
|
|
1119
1098
|
},
|
|
1120
1099
|
} });
|
|
1121
|
-
case 'Pnch': return
|
|
1100
|
+
case 'Pnch': return Object.assign(Object.assign({}, base), { type: 'pinch', filter: {
|
|
1122
1101
|
amount: f.Fltr.Amnt,
|
|
1123
1102
|
} });
|
|
1124
|
-
case 'Plr ': return
|
|
1103
|
+
case 'Plr ': return Object.assign(Object.assign({}, base), { type: 'polar coordinates', filter: {
|
|
1125
1104
|
conversion: descriptor_1.Cnvr.decode(f.Fltr.Cnvr),
|
|
1126
1105
|
} });
|
|
1127
|
-
case 'Rple': return
|
|
1106
|
+
case 'Rple': return Object.assign(Object.assign({}, base), { type: 'ripple', filter: {
|
|
1128
1107
|
amount: f.Fltr.Amnt,
|
|
1129
1108
|
size: descriptor_1.RplS.decode(f.Fltr.RplS),
|
|
1130
1109
|
} });
|
|
1131
|
-
case 'Shr ': return
|
|
1132
|
-
shearPoints: f.Fltr.ShrP.map(
|
|
1110
|
+
case 'Shr ': return Object.assign(Object.assign({}, base), { type: 'shear', filter: {
|
|
1111
|
+
shearPoints: f.Fltr.ShrP.map(p => ({ x: p.Hrzn, y: p.Vrtc })),
|
|
1133
1112
|
shearStart: f.Fltr.ShrS,
|
|
1134
1113
|
shearEnd: f.Fltr.ShrE,
|
|
1135
1114
|
undefinedAreas: descriptor_1.UndA.decode(f.Fltr.UndA),
|
|
1136
1115
|
} });
|
|
1137
|
-
case 'Sphr': return
|
|
1116
|
+
case 'Sphr': return Object.assign(Object.assign({}, base), { type: 'spherize', filter: {
|
|
1138
1117
|
amount: f.Fltr.Amnt,
|
|
1139
1118
|
mode: descriptor_1.SphM.decode(f.Fltr.SphM),
|
|
1140
1119
|
} });
|
|
1141
|
-
case 'Twrl': return
|
|
1120
|
+
case 'Twrl': return Object.assign(Object.assign({}, base), { type: 'twirl', filter: {
|
|
1142
1121
|
angle: f.Fltr.Angl,
|
|
1143
1122
|
} });
|
|
1144
|
-
case 'Wave': return
|
|
1123
|
+
case 'Wave': return Object.assign(Object.assign({}, base), { type: 'wave', filter: {
|
|
1145
1124
|
numberOfGenerators: f.Fltr.NmbG,
|
|
1146
1125
|
type: descriptor_1.Wvtp.decode(f.Fltr.Wvtp),
|
|
1147
1126
|
wavelength: { min: f.Fltr.WLMn, max: f.Fltr.WLMx },
|
|
@@ -1150,70 +1129,70 @@ function parseFilterFXItem(f, options) {
|
|
|
1150
1129
|
randomSeed: f.Fltr.RndS,
|
|
1151
1130
|
undefinedAreas: descriptor_1.UndA.decode(f.Fltr.UndA),
|
|
1152
1131
|
} });
|
|
1153
|
-
case 'ZgZg': return
|
|
1132
|
+
case 'ZgZg': return Object.assign(Object.assign({}, base), { type: 'zigzag', filter: {
|
|
1154
1133
|
amount: f.Fltr.Amnt,
|
|
1155
1134
|
ridges: f.Fltr.NmbR,
|
|
1156
1135
|
style: descriptor_1.ZZTy.decode(f.Fltr.ZZTy),
|
|
1157
1136
|
} });
|
|
1158
|
-
case 'AdNs': return
|
|
1137
|
+
case 'AdNs': return Object.assign(Object.assign({}, base), { type: 'add noise', filter: {
|
|
1159
1138
|
amount: (0, descriptor_1.parsePercent)(f.Fltr.Nose),
|
|
1160
1139
|
distribution: descriptor_1.Dstr.decode(f.Fltr.Dstr),
|
|
1161
1140
|
monochromatic: f.Fltr.Mnch,
|
|
1162
1141
|
randomSeed: f.Fltr.FlRs,
|
|
1163
1142
|
} });
|
|
1164
|
-
case 'DstS': return
|
|
1143
|
+
case 'DstS': return Object.assign(Object.assign({}, base), { type: 'dust and scratches', filter: {
|
|
1165
1144
|
radius: f.Fltr['Rds '],
|
|
1166
1145
|
threshold: f.Fltr.Thsh,
|
|
1167
1146
|
} });
|
|
1168
|
-
case 'Mdn ': return
|
|
1147
|
+
case 'Mdn ': return Object.assign(Object.assign({}, base), { type: 'median', filter: {
|
|
1169
1148
|
radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
|
|
1170
1149
|
} });
|
|
1171
|
-
case 'denoise': return
|
|
1150
|
+
case 'denoise': return Object.assign(Object.assign({}, base), { type: 'reduce noise', filter: {
|
|
1172
1151
|
preset: f.Fltr.preset,
|
|
1173
1152
|
removeJpegArtifact: f.Fltr.removeJPEGArtifact,
|
|
1174
1153
|
reduceColorNoise: (0, descriptor_1.parsePercent)(f.Fltr.ClNs),
|
|
1175
1154
|
sharpenDetails: (0, descriptor_1.parsePercent)(f.Fltr.Shrp),
|
|
1176
|
-
channelDenoise: f.Fltr.channelDenoise.map(
|
|
1155
|
+
channelDenoise: f.Fltr.channelDenoise.map(c => (Object.assign({ channels: c.Chnl.map(descriptor_1.Chnl.decode), amount: c.Amnt }, (c.EdgF ? { preserveDetails: c.EdgF } : {})))),
|
|
1177
1156
|
} });
|
|
1178
|
-
case 'ClrH': return
|
|
1157
|
+
case 'ClrH': return Object.assign(Object.assign({}, base), { type: 'color halftone', filter: {
|
|
1179
1158
|
radius: f.Fltr['Rds '],
|
|
1180
1159
|
angle1: f.Fltr.Ang1,
|
|
1181
1160
|
angle2: f.Fltr.Ang2,
|
|
1182
1161
|
angle3: f.Fltr.Ang3,
|
|
1183
1162
|
angle4: f.Fltr.Ang4,
|
|
1184
1163
|
} });
|
|
1185
|
-
case 'Crst': return
|
|
1164
|
+
case 'Crst': return Object.assign(Object.assign({}, base), { type: 'crystallize', filter: {
|
|
1186
1165
|
cellSize: f.Fltr.ClSz,
|
|
1187
1166
|
randomSeed: f.Fltr.FlRs,
|
|
1188
1167
|
} });
|
|
1189
|
-
case 'Mztn': return
|
|
1168
|
+
case 'Mztn': return Object.assign(Object.assign({}, base), { type: 'mezzotint', filter: {
|
|
1190
1169
|
type: descriptor_1.MztT.decode(f.Fltr.MztT),
|
|
1191
1170
|
randomSeed: f.Fltr.FlRs,
|
|
1192
1171
|
} });
|
|
1193
|
-
case 'Msc ': return
|
|
1172
|
+
case 'Msc ': return Object.assign(Object.assign({}, base), { type: 'mosaic', filter: {
|
|
1194
1173
|
cellSize: (0, descriptor_1.parseUnits)(f.Fltr.ClSz),
|
|
1195
1174
|
} });
|
|
1196
|
-
case 'Pntl': return
|
|
1175
|
+
case 'Pntl': return Object.assign(Object.assign({}, base), { type: 'pointillize', filter: {
|
|
1197
1176
|
cellSize: f.Fltr.ClSz,
|
|
1198
1177
|
randomSeed: f.Fltr.FlRs,
|
|
1199
1178
|
} });
|
|
1200
|
-
case 'Clds': return
|
|
1179
|
+
case 'Clds': return Object.assign(Object.assign({}, base), { type: 'clouds', filter: {
|
|
1201
1180
|
randomSeed: f.Fltr.FlRs,
|
|
1202
1181
|
} });
|
|
1203
|
-
case 'DfrC': return
|
|
1182
|
+
case 'DfrC': return Object.assign(Object.assign({}, base), { type: 'difference clouds', filter: {
|
|
1204
1183
|
randomSeed: f.Fltr.FlRs,
|
|
1205
1184
|
} });
|
|
1206
|
-
case 'Fbrs': return
|
|
1185
|
+
case 'Fbrs': return Object.assign(Object.assign({}, base), { type: 'fibers', filter: {
|
|
1207
1186
|
variance: f.Fltr.Vrnc,
|
|
1208
1187
|
strength: f.Fltr.Strg,
|
|
1209
1188
|
randomSeed: f.Fltr.RndS,
|
|
1210
1189
|
} });
|
|
1211
|
-
case 'LnsF': return
|
|
1190
|
+
case 'LnsF': return Object.assign(Object.assign({}, base), { type: 'lens flare', filter: {
|
|
1212
1191
|
brightness: f.Fltr.Brgh,
|
|
1213
1192
|
position: { x: f.Fltr.FlrC.Hrzn, y: f.Fltr.FlrC.Vrtc },
|
|
1214
1193
|
lensType: descriptor_1.Lns.decode(f.Fltr['Lns ']),
|
|
1215
1194
|
} });
|
|
1216
|
-
case 'smartSharpen': return
|
|
1195
|
+
case 'smartSharpen': return Object.assign(Object.assign({}, base), { type: 'smart sharpen', filter: {
|
|
1217
1196
|
amount: (0, descriptor_1.parsePercent)(f.Fltr.Amnt),
|
|
1218
1197
|
radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
|
|
1219
1198
|
threshold: f.Fltr.Thsh,
|
|
@@ -1232,21 +1211,21 @@ function parseFilterFXItem(f, options) {
|
|
|
1232
1211
|
radius: f.Fltr.hglM['Rds '],
|
|
1233
1212
|
},
|
|
1234
1213
|
} });
|
|
1235
|
-
case 'UnsM': return
|
|
1214
|
+
case 'UnsM': return Object.assign(Object.assign({}, base), { type: 'unsharp mask', filter: {
|
|
1236
1215
|
amount: (0, descriptor_1.parsePercent)(f.Fltr.Amnt),
|
|
1237
1216
|
radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
|
|
1238
1217
|
threshold: f.Fltr.Thsh,
|
|
1239
1218
|
} });
|
|
1240
|
-
case 'Dfs ': return
|
|
1219
|
+
case 'Dfs ': return Object.assign(Object.assign({}, base), { type: 'diffuse', filter: {
|
|
1241
1220
|
mode: descriptor_1.DfsM.decode(f.Fltr['Md ']),
|
|
1242
1221
|
randomSeed: f.Fltr.FlRs,
|
|
1243
1222
|
} });
|
|
1244
|
-
case 'Embs': return
|
|
1223
|
+
case 'Embs': return Object.assign(Object.assign({}, base), { type: 'emboss', filter: {
|
|
1245
1224
|
angle: f.Fltr.Angl,
|
|
1246
1225
|
height: f.Fltr.Hght,
|
|
1247
1226
|
amount: f.Fltr.Amnt,
|
|
1248
1227
|
} });
|
|
1249
|
-
case 'Extr': return
|
|
1228
|
+
case 'Extr': return Object.assign(Object.assign({}, base), { type: 'extrude', filter: {
|
|
1250
1229
|
type: descriptor_1.ExtT.decode(f.Fltr.ExtT),
|
|
1251
1230
|
size: f.Fltr.ExtS,
|
|
1252
1231
|
depth: f.Fltr.ExtD,
|
|
@@ -1255,44 +1234,44 @@ function parseFilterFXItem(f, options) {
|
|
|
1255
1234
|
solidFrontFaces: f.Fltr.ExtF,
|
|
1256
1235
|
maskIncompleteBlocks: f.Fltr.ExtM,
|
|
1257
1236
|
} });
|
|
1258
|
-
case 'Tls ': return
|
|
1237
|
+
case 'Tls ': return Object.assign(Object.assign({}, base), { type: 'tiles', filter: {
|
|
1259
1238
|
numberOfTiles: f.Fltr.TlNm,
|
|
1260
1239
|
maximumOffset: f.Fltr.TlOf,
|
|
1261
1240
|
fillEmptyAreaWith: descriptor_1.FlCl.decode(f.Fltr.FlCl),
|
|
1262
1241
|
randomSeed: f.Fltr.FlRs,
|
|
1263
1242
|
} });
|
|
1264
|
-
case 'TrcC': return
|
|
1243
|
+
case 'TrcC': return Object.assign(Object.assign({}, base), { type: 'trace contour', filter: {
|
|
1265
1244
|
level: f.Fltr['Lvl '],
|
|
1266
1245
|
edge: descriptor_1.CntE.decode(f.Fltr['Edg ']),
|
|
1267
1246
|
} });
|
|
1268
|
-
case 'Wnd ': return
|
|
1247
|
+
case 'Wnd ': return Object.assign(Object.assign({}, base), { type: 'wind', filter: {
|
|
1269
1248
|
method: descriptor_1.WndM.decode(f.Fltr.WndM),
|
|
1270
1249
|
direction: descriptor_1.Drct.decode(f.Fltr.Drct),
|
|
1271
1250
|
} });
|
|
1272
|
-
case 'Dntr': return
|
|
1251
|
+
case 'Dntr': return Object.assign(Object.assign({}, base), { type: 'de-interlace', filter: {
|
|
1273
1252
|
eliminate: descriptor_1.IntE.decode(f.Fltr.IntE),
|
|
1274
1253
|
newFieldsBy: descriptor_1.IntC.decode(f.Fltr.IntC),
|
|
1275
1254
|
} });
|
|
1276
|
-
case 'Cstm': return
|
|
1255
|
+
case 'Cstm': return Object.assign(Object.assign({}, base), { type: 'custom', filter: {
|
|
1277
1256
|
scale: f.Fltr['Scl '],
|
|
1278
1257
|
offset: f.Fltr.Ofst,
|
|
1279
1258
|
matrix: f.Fltr.Mtrx,
|
|
1280
1259
|
} });
|
|
1281
|
-
case 'HghP': return
|
|
1260
|
+
case 'HghP': return Object.assign(Object.assign({}, base), { type: 'high pass', filter: {
|
|
1282
1261
|
radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
|
|
1283
1262
|
} });
|
|
1284
|
-
case 'Mxm ': return
|
|
1263
|
+
case 'Mxm ': return Object.assign(Object.assign({}, base), { type: 'maximum', filter: {
|
|
1285
1264
|
radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
|
|
1286
1265
|
} });
|
|
1287
|
-
case 'Mnm ': return
|
|
1266
|
+
case 'Mnm ': return Object.assign(Object.assign({}, base), { type: 'minimum', filter: {
|
|
1288
1267
|
radius: (0, descriptor_1.parseUnits)(f.Fltr['Rds ']),
|
|
1289
1268
|
} });
|
|
1290
|
-
case 'Ofst': return
|
|
1269
|
+
case 'Ofst': return Object.assign(Object.assign({}, base), { type: 'offset', filter: {
|
|
1291
1270
|
horizontal: f.Fltr.Hrzn,
|
|
1292
1271
|
vertical: f.Fltr.Vrtc,
|
|
1293
1272
|
undefinedAreas: descriptor_1.FlMd.decode(f.Fltr['Fl ']),
|
|
1294
1273
|
} });
|
|
1295
|
-
case 'rigidTransform': return
|
|
1274
|
+
case 'rigidTransform': return Object.assign(Object.assign({}, base), { type: 'puppet', filter: {
|
|
1296
1275
|
rigidType: f.Fltr.rigidType,
|
|
1297
1276
|
bounds: [
|
|
1298
1277
|
{ x: f.Fltr.PuX0, y: f.Fltr.PuY0, },
|
|
@@ -1300,7 +1279,7 @@ function parseFilterFXItem(f, options) {
|
|
|
1300
1279
|
{ x: f.Fltr.PuX2, y: f.Fltr.PuY2, },
|
|
1301
1280
|
{ x: f.Fltr.PuX3, y: f.Fltr.PuY3, },
|
|
1302
1281
|
],
|
|
1303
|
-
puppetShapeList: f.Fltr.puppetShapeList.map(
|
|
1282
|
+
puppetShapeList: f.Fltr.puppetShapeList.map(p => ({
|
|
1304
1283
|
rigidType: p.rigidType,
|
|
1305
1284
|
// TODO: VrsM
|
|
1306
1285
|
// TODO: VrsN
|
|
@@ -1320,41 +1299,41 @@ function parseFilterFXItem(f, options) {
|
|
|
1320
1299
|
meshRigidity: p.meshRigidity,
|
|
1321
1300
|
imageResolution: p.imageResolution,
|
|
1322
1301
|
meshBoundaryPath: {
|
|
1323
|
-
pathComponents: p.meshBoundaryPath.pathComponents.map(
|
|
1302
|
+
pathComponents: p.meshBoundaryPath.pathComponents.map(c => ({
|
|
1324
1303
|
shapeOperation: c.shapeOperation.split('.')[1],
|
|
1325
|
-
paths: c.SbpL.map(
|
|
1304
|
+
paths: c.SbpL.map(t => ({
|
|
1326
1305
|
closed: t.Clsp,
|
|
1327
|
-
points: t['Pts '].map(
|
|
1306
|
+
points: t['Pts '].map(pt => ({
|
|
1328
1307
|
anchor: hrznVrtcToPoint(pt.Anch),
|
|
1329
1308
|
forward: hrznVrtcToPoint(pt['Fwd ']),
|
|
1330
1309
|
backward: hrznVrtcToPoint(pt['Bwd ']),
|
|
1331
1310
|
smooth: pt.Smoo,
|
|
1332
|
-
})
|
|
1333
|
-
})
|
|
1334
|
-
})
|
|
1311
|
+
})),
|
|
1312
|
+
})),
|
|
1313
|
+
})),
|
|
1335
1314
|
},
|
|
1336
|
-
})
|
|
1315
|
+
})),
|
|
1337
1316
|
} });
|
|
1338
1317
|
case 'PbPl': {
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
for (
|
|
1342
|
-
if (!Flrt[
|
|
1318
|
+
const parameters = [];
|
|
1319
|
+
const Flrt = f.Fltr;
|
|
1320
|
+
for (let i = 0; i < fromAtoZ.length; i++) {
|
|
1321
|
+
if (!Flrt[`PN${fromAtoZ[i]}a`])
|
|
1343
1322
|
break;
|
|
1344
|
-
for (
|
|
1345
|
-
if (!Flrt[
|
|
1323
|
+
for (let j = 0; j < fromAtoZ.length; j++) {
|
|
1324
|
+
if (!Flrt[`PN${fromAtoZ[i]}${fromAtoZ[j]}`])
|
|
1346
1325
|
break;
|
|
1347
1326
|
parameters.push({
|
|
1348
|
-
name: Flrt[
|
|
1349
|
-
value: Flrt[
|
|
1327
|
+
name: Flrt[`PN${fromAtoZ[i]}${fromAtoZ[j]}`],
|
|
1328
|
+
value: Flrt[`PF${fromAtoZ[i]}${fromAtoZ[j]}`]
|
|
1350
1329
|
});
|
|
1351
1330
|
}
|
|
1352
1331
|
}
|
|
1353
|
-
return
|
|
1332
|
+
return Object.assign(Object.assign({}, base), { type: 'oil paint plugin', filter: {
|
|
1354
1333
|
name: f.Fltr.KnNm,
|
|
1355
1334
|
gpu: f.Fltr.GpuY,
|
|
1356
1335
|
lighting: f.Fltr.LIWy,
|
|
1357
|
-
parameters
|
|
1336
|
+
parameters,
|
|
1358
1337
|
} });
|
|
1359
1338
|
}
|
|
1360
1339
|
// case 2089: return {
|
|
@@ -1369,11 +1348,11 @@ function parseFilterFXItem(f, options) {
|
|
|
1369
1348
|
// imageY: f.Fltr.imgY,
|
|
1370
1349
|
// },
|
|
1371
1350
|
// };
|
|
1372
|
-
case 'HsbP': return
|
|
1351
|
+
case 'HsbP': return Object.assign(Object.assign({}, base), { type: 'hsb/hsl', filter: {
|
|
1373
1352
|
inputMode: descriptor_1.ClrS.decode(f.Fltr.Inpt),
|
|
1374
1353
|
rowOrder: descriptor_1.ClrS.decode(f.Fltr.Otpt),
|
|
1375
1354
|
} });
|
|
1376
|
-
case 'oilPaint': return
|
|
1355
|
+
case 'oilPaint': return Object.assign(Object.assign({}, base), { type: 'oil paint', filter: {
|
|
1377
1356
|
lightingOn: f.Fltr.lightingOn,
|
|
1378
1357
|
stylization: f.Fltr.stylization,
|
|
1379
1358
|
cleanliness: f.Fltr.cleanliness,
|
|
@@ -1384,30 +1363,30 @@ function parseFilterFXItem(f, options) {
|
|
|
1384
1363
|
} });
|
|
1385
1364
|
case 'LqFy':
|
|
1386
1365
|
{
|
|
1387
|
-
return
|
|
1366
|
+
return Object.assign(Object.assign({}, base), { type: 'liquify', filter: {
|
|
1388
1367
|
liquifyMesh: f.Fltr.LqMe,
|
|
1389
1368
|
} });
|
|
1390
1369
|
}
|
|
1391
1370
|
;
|
|
1392
1371
|
case 'perspectiveWarpTransform':
|
|
1393
1372
|
{
|
|
1394
|
-
return
|
|
1373
|
+
return Object.assign(Object.assign({}, base), { type: 'perspective warp', filter: {
|
|
1395
1374
|
vertices: f.Fltr.vertices.map(hrznVrtcToPoint),
|
|
1396
1375
|
warpedVertices: f.Fltr.warpedVertices.map(hrznVrtcToPoint),
|
|
1397
|
-
quads: f.Fltr.quads.map(
|
|
1376
|
+
quads: f.Fltr.quads.map(q => q.indices),
|
|
1398
1377
|
} });
|
|
1399
1378
|
}
|
|
1400
1379
|
;
|
|
1401
1380
|
case 'Crvs':
|
|
1402
1381
|
{
|
|
1403
|
-
return
|
|
1404
|
-
adjustments: f.Fltr.Adjs.map(
|
|
1405
|
-
|
|
1382
|
+
return Object.assign(Object.assign({}, base), { type: 'curves', filter: Object.assign({ presetKind: descriptor_1.presetKindType.decode(f.Fltr.presetKind) }, (f.Fltr.Adjs ? {
|
|
1383
|
+
adjustments: f.Fltr.Adjs.map(a => {
|
|
1384
|
+
const channels = a.Chnl.map(descriptor_1.Chnl.decode);
|
|
1406
1385
|
if (a['Crv ']) {
|
|
1407
1386
|
return {
|
|
1408
|
-
channels
|
|
1409
|
-
curve: a['Crv '].map(
|
|
1410
|
-
|
|
1387
|
+
channels,
|
|
1388
|
+
curve: a['Crv '].map(c => {
|
|
1389
|
+
const point = { x: c.Hrzn, y: c.Vrtc };
|
|
1411
1390
|
if (c.Cnty)
|
|
1412
1391
|
point.curved = true;
|
|
1413
1392
|
return point;
|
|
@@ -1415,10 +1394,10 @@ function parseFilterFXItem(f, options) {
|
|
|
1415
1394
|
};
|
|
1416
1395
|
}
|
|
1417
1396
|
else if (a.Mpng) {
|
|
1418
|
-
return { channels
|
|
1397
|
+
return { channels, values: a.Mpng };
|
|
1419
1398
|
}
|
|
1420
1399
|
else {
|
|
1421
|
-
throw new Error(
|
|
1400
|
+
throw new Error(`Unknown curve adjustment`);
|
|
1422
1401
|
}
|
|
1423
1402
|
})
|
|
1424
1403
|
} : {})) });
|
|
@@ -1426,7 +1405,7 @@ function parseFilterFXItem(f, options) {
|
|
|
1426
1405
|
;
|
|
1427
1406
|
case 'BrgC':
|
|
1428
1407
|
{
|
|
1429
|
-
return
|
|
1408
|
+
return Object.assign(Object.assign({}, base), { type: 'brightness/contrast', filter: {
|
|
1430
1409
|
brightness: f.Fltr.Brgh,
|
|
1431
1410
|
contrast: f.Fltr.Cntr,
|
|
1432
1411
|
useLegacy: !!f.Fltr.useLegacy,
|
|
@@ -1436,30 +1415,30 @@ function parseFilterFXItem(f, options) {
|
|
|
1436
1415
|
default:
|
|
1437
1416
|
if (options.throwForMissingFeatures) {
|
|
1438
1417
|
// console.log('FILTER', require('util').inspect(f, false, 99, true));
|
|
1439
|
-
throw new Error(
|
|
1418
|
+
throw new Error(`Unknown filter classId: ${f.Fltr._classID}`);
|
|
1440
1419
|
}
|
|
1441
1420
|
return undefined;
|
|
1442
1421
|
}
|
|
1443
1422
|
}
|
|
1444
1423
|
else {
|
|
1445
1424
|
switch (f.filterID) {
|
|
1446
|
-
case 1098281575: return
|
|
1447
|
-
case 1114403360: return
|
|
1448
|
-
case 1114403405: return
|
|
1449
|
-
case 1148416099: return
|
|
1450
|
-
case 1180922912: return
|
|
1451
|
-
case 1181902701: return
|
|
1452
|
-
case 1399353968: return
|
|
1453
|
-
case 1399353925: return
|
|
1454
|
-
case 1399353933: return
|
|
1455
|
-
case 1181639749: return
|
|
1456
|
-
case 1399616122: return
|
|
1457
|
-
case 1314149187: return
|
|
1458
|
-
case 1231976050: return
|
|
1425
|
+
case 1098281575: return Object.assign(Object.assign({}, base), { type: 'average' });
|
|
1426
|
+
case 1114403360: return Object.assign(Object.assign({}, base), { type: 'blur' });
|
|
1427
|
+
case 1114403405: return Object.assign(Object.assign({}, base), { type: 'blur more' });
|
|
1428
|
+
case 1148416099: return Object.assign(Object.assign({}, base), { type: 'despeckle' });
|
|
1429
|
+
case 1180922912: return Object.assign(Object.assign({}, base), { type: 'facet' });
|
|
1430
|
+
case 1181902701: return Object.assign(Object.assign({}, base), { type: 'fragment' });
|
|
1431
|
+
case 1399353968: return Object.assign(Object.assign({}, base), { type: 'sharpen' });
|
|
1432
|
+
case 1399353925: return Object.assign(Object.assign({}, base), { type: 'sharpen edges' });
|
|
1433
|
+
case 1399353933: return Object.assign(Object.assign({}, base), { type: 'sharpen more' });
|
|
1434
|
+
case 1181639749: return Object.assign(Object.assign({}, base), { type: 'find edges' });
|
|
1435
|
+
case 1399616122: return Object.assign(Object.assign({}, base), { type: 'solarize' });
|
|
1436
|
+
case 1314149187: return Object.assign(Object.assign({}, base), { type: 'ntsc colors' });
|
|
1437
|
+
case 1231976050: return Object.assign(Object.assign({}, base), { type: 'invert' });
|
|
1459
1438
|
default:
|
|
1460
1439
|
if (options.throwForMissingFeatures) {
|
|
1461
1440
|
// console.log('FILTER', require('util').inspect(f, false, 99, true));
|
|
1462
|
-
throw new Error(
|
|
1441
|
+
throw new Error(`Unknown filterID: ${f.filterID}`);
|
|
1463
1442
|
}
|
|
1464
1443
|
}
|
|
1465
1444
|
}
|
|
@@ -1471,14 +1450,14 @@ function parseFilterFX(desc, options) {
|
|
|
1471
1450
|
maskEnabled: desc.filterMaskEnable,
|
|
1472
1451
|
maskLinked: desc.filterMaskLinked,
|
|
1473
1452
|
maskExtendWithWhite: desc.filterMaskExtendWithWhite,
|
|
1474
|
-
list: desc.filterFXList.map(
|
|
1453
|
+
list: desc.filterFXList.map(x => parseFilterFXItem(x, options)).filter((x) => !!x),
|
|
1475
1454
|
};
|
|
1476
1455
|
}
|
|
1477
1456
|
function uvRadius(t) {
|
|
1478
1457
|
return (0, descriptor_1.unitsValue)(t.radius, 'radius');
|
|
1479
1458
|
}
|
|
1480
1459
|
function serializeFilterFXItem(f) {
|
|
1481
|
-
|
|
1460
|
+
const base = {
|
|
1482
1461
|
_name: '',
|
|
1483
1462
|
_classID: 'filterFX',
|
|
1484
1463
|
'Nm ': f.name,
|
|
@@ -1494,34 +1473,34 @@ function serializeFilterFXItem(f) {
|
|
|
1494
1473
|
BckC: (0, descriptor_1.serializeColor)(f.backgroundColor),
|
|
1495
1474
|
};
|
|
1496
1475
|
switch (f.type) {
|
|
1497
|
-
case 'average': return
|
|
1498
|
-
case 'blur': return
|
|
1499
|
-
case 'blur more': return
|
|
1500
|
-
case 'box blur': return
|
|
1476
|
+
case 'average': return Object.assign(Object.assign({}, base), { filterID: 1098281575 });
|
|
1477
|
+
case 'blur': return Object.assign(Object.assign({}, base), { filterID: 1114403360 });
|
|
1478
|
+
case 'blur more': return Object.assign(Object.assign({}, base), { filterID: 1114403405 });
|
|
1479
|
+
case 'box blur': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1501
1480
|
_name: 'Box Blur',
|
|
1502
1481
|
_classID: 'boxblur',
|
|
1503
1482
|
'Rds ': uvRadius(f.filter),
|
|
1504
1483
|
}, filterID: 697 });
|
|
1505
|
-
case 'gaussian blur': return
|
|
1484
|
+
case 'gaussian blur': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1506
1485
|
// _name: '高斯模糊', // Testing
|
|
1507
1486
|
_name: 'Gaussian Blur',
|
|
1508
1487
|
_classID: 'GsnB',
|
|
1509
1488
|
'Rds ': uvRadius(f.filter),
|
|
1510
1489
|
}, filterID: 1198747202 });
|
|
1511
|
-
case 'motion blur': return
|
|
1490
|
+
case 'motion blur': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1512
1491
|
_name: 'Motion Blur',
|
|
1513
1492
|
_classID: 'MtnB',
|
|
1514
1493
|
Angl: f.filter.angle,
|
|
1515
1494
|
Dstn: (0, descriptor_1.unitsValue)(f.filter.distance, 'distance'),
|
|
1516
1495
|
}, filterID: 1299476034 });
|
|
1517
|
-
case 'radial blur': return
|
|
1496
|
+
case 'radial blur': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1518
1497
|
_name: 'Radial Blur',
|
|
1519
1498
|
_classID: 'RdlB',
|
|
1520
1499
|
Amnt: f.filter.amount,
|
|
1521
1500
|
BlrM: descriptor_1.BlrM.encode(f.filter.method),
|
|
1522
1501
|
BlrQ: descriptor_1.BlrQ.encode(f.filter.quality),
|
|
1523
1502
|
}, filterID: 1382313026 });
|
|
1524
|
-
case 'shape blur': return
|
|
1503
|
+
case 'shape blur': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1525
1504
|
_name: 'Shape Blur',
|
|
1526
1505
|
_classID: 'shapeBlur',
|
|
1527
1506
|
'Rds ': uvRadius(f.filter),
|
|
@@ -1532,7 +1511,7 @@ function serializeFilterFXItem(f) {
|
|
|
1532
1511
|
Idnt: f.filter.customShape.id,
|
|
1533
1512
|
}
|
|
1534
1513
|
}, filterID: 702 });
|
|
1535
|
-
case 'smart blur': return
|
|
1514
|
+
case 'smart blur': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1536
1515
|
_name: 'Smart Blur',
|
|
1537
1516
|
_classID: 'SmrB',
|
|
1538
1517
|
'Rds ': f.filter.radius,
|
|
@@ -1540,13 +1519,13 @@ function serializeFilterFXItem(f) {
|
|
|
1540
1519
|
SmBQ: descriptor_1.SmBQ.encode(f.filter.quality),
|
|
1541
1520
|
SmBM: descriptor_1.SmBM.encode(f.filter.mode),
|
|
1542
1521
|
}, filterID: 1399681602 });
|
|
1543
|
-
case 'surface blur': return
|
|
1522
|
+
case 'surface blur': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1544
1523
|
_name: 'Surface Blur',
|
|
1545
1524
|
_classID: 'surfaceBlur',
|
|
1546
1525
|
'Rds ': uvRadius(f.filter),
|
|
1547
1526
|
Thsh: f.filter.threshold,
|
|
1548
1527
|
}, filterID: 701 });
|
|
1549
|
-
case 'displace': return
|
|
1528
|
+
case 'displace': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1550
1529
|
_name: 'Displace',
|
|
1551
1530
|
_classID: 'Dspl',
|
|
1552
1531
|
HrzS: f.filter.horizontalScale,
|
|
@@ -1558,42 +1537,42 @@ function serializeFilterFXItem(f) {
|
|
|
1558
1537
|
path: f.filter.displacementFile.path,
|
|
1559
1538
|
},
|
|
1560
1539
|
}, filterID: 1148416108 });
|
|
1561
|
-
case 'pinch': return
|
|
1540
|
+
case 'pinch': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1562
1541
|
_name: 'Pinch',
|
|
1563
1542
|
_classID: 'Pnch',
|
|
1564
1543
|
Amnt: f.filter.amount,
|
|
1565
1544
|
}, filterID: 1349411688 });
|
|
1566
|
-
case 'polar coordinates': return
|
|
1545
|
+
case 'polar coordinates': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1567
1546
|
_name: 'Polar Coordinates',
|
|
1568
1547
|
_classID: 'Plr ',
|
|
1569
1548
|
Cnvr: descriptor_1.Cnvr.encode(f.filter.conversion),
|
|
1570
1549
|
}, filterID: 1349284384 });
|
|
1571
|
-
case 'ripple': return
|
|
1550
|
+
case 'ripple': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1572
1551
|
_name: 'Ripple',
|
|
1573
1552
|
_classID: 'Rple',
|
|
1574
1553
|
Amnt: f.filter.amount,
|
|
1575
1554
|
RplS: descriptor_1.RplS.encode(f.filter.size),
|
|
1576
1555
|
}, filterID: 1383099493 });
|
|
1577
|
-
case 'shear': return
|
|
1556
|
+
case 'shear': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1578
1557
|
_name: 'Shear',
|
|
1579
1558
|
_classID: 'Shr ',
|
|
1580
|
-
ShrP: f.filter.shearPoints.map(
|
|
1559
|
+
ShrP: f.filter.shearPoints.map(p => ({ _name: '', _classID: 'Pnt ', Hrzn: p.x, Vrtc: p.y })),
|
|
1581
1560
|
UndA: descriptor_1.UndA.encode(f.filter.undefinedAreas),
|
|
1582
1561
|
ShrS: f.filter.shearStart,
|
|
1583
1562
|
ShrE: f.filter.shearEnd,
|
|
1584
1563
|
}, filterID: 1399353888 });
|
|
1585
|
-
case 'spherize': return
|
|
1564
|
+
case 'spherize': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1586
1565
|
_name: 'Spherize',
|
|
1587
1566
|
_classID: 'Sphr',
|
|
1588
1567
|
Amnt: f.filter.amount,
|
|
1589
1568
|
SphM: descriptor_1.SphM.encode(f.filter.mode),
|
|
1590
1569
|
}, filterID: 1399875698 });
|
|
1591
|
-
case 'twirl': return
|
|
1570
|
+
case 'twirl': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1592
1571
|
_name: 'Twirl',
|
|
1593
1572
|
_classID: 'Twrl',
|
|
1594
1573
|
Angl: f.filter.angle,
|
|
1595
1574
|
}, filterID: 1417114220 });
|
|
1596
|
-
case 'wave': return
|
|
1575
|
+
case 'wave': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1597
1576
|
_name: 'Wave',
|
|
1598
1577
|
_classID: 'Wave',
|
|
1599
1578
|
Wvtp: descriptor_1.Wvtp.encode(f.filter.type),
|
|
@@ -1607,14 +1586,14 @@ function serializeFilterFXItem(f) {
|
|
|
1607
1586
|
UndA: descriptor_1.UndA.encode(f.filter.undefinedAreas),
|
|
1608
1587
|
RndS: f.filter.randomSeed,
|
|
1609
1588
|
}, filterID: 1466005093 });
|
|
1610
|
-
case 'zigzag': return
|
|
1589
|
+
case 'zigzag': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1611
1590
|
_name: 'ZigZag',
|
|
1612
1591
|
_classID: 'ZgZg',
|
|
1613
1592
|
Amnt: f.filter.amount,
|
|
1614
1593
|
NmbR: f.filter.ridges,
|
|
1615
1594
|
ZZTy: descriptor_1.ZZTy.encode(f.filter.style),
|
|
1616
1595
|
}, filterID: 1516722791 });
|
|
1617
|
-
case 'add noise': return
|
|
1596
|
+
case 'add noise': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1618
1597
|
_name: 'Add Noise',
|
|
1619
1598
|
_classID: 'AdNs',
|
|
1620
1599
|
Dstr: descriptor_1.Dstr.encode(f.filter.distribution),
|
|
@@ -1622,28 +1601,28 @@ function serializeFilterFXItem(f) {
|
|
|
1622
1601
|
Mnch: f.filter.monochromatic,
|
|
1623
1602
|
FlRs: f.filter.randomSeed,
|
|
1624
1603
|
}, filterID: 1097092723 });
|
|
1625
|
-
case 'despeckle': return
|
|
1626
|
-
case 'dust and scratches': return
|
|
1604
|
+
case 'despeckle': return Object.assign(Object.assign({}, base), { filterID: 1148416099 });
|
|
1605
|
+
case 'dust and scratches': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1627
1606
|
_name: 'Dust & Scratches',
|
|
1628
1607
|
_classID: 'DstS',
|
|
1629
1608
|
'Rds ': f.filter.radius,
|
|
1630
1609
|
Thsh: f.filter.threshold,
|
|
1631
1610
|
}, filterID: 1148417107 });
|
|
1632
|
-
case 'median': return
|
|
1611
|
+
case 'median': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1633
1612
|
_name: 'Median',
|
|
1634
1613
|
_classID: 'Mdn ',
|
|
1635
1614
|
'Rds ': uvRadius(f.filter),
|
|
1636
1615
|
}, filterID: 1298427424 });
|
|
1637
|
-
case 'reduce noise': return
|
|
1616
|
+
case 'reduce noise': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1638
1617
|
_name: 'Reduce Noise',
|
|
1639
1618
|
_classID: 'denoise',
|
|
1640
1619
|
ClNs: (0, descriptor_1.unitsPercentF)(f.filter.reduceColorNoise),
|
|
1641
1620
|
Shrp: (0, descriptor_1.unitsPercentF)(f.filter.sharpenDetails),
|
|
1642
1621
|
removeJPEGArtifact: f.filter.removeJpegArtifact,
|
|
1643
|
-
channelDenoise: f.filter.channelDenoise.map(
|
|
1622
|
+
channelDenoise: f.filter.channelDenoise.map(c => (Object.assign({ _name: '', _classID: 'channelDenoiseParams', Chnl: c.channels.map(i => descriptor_1.Chnl.encode(i)), Amnt: c.amount }, (c.preserveDetails ? { EdgF: c.preserveDetails } : {})))),
|
|
1644
1623
|
preset: f.filter.preset,
|
|
1645
1624
|
}, filterID: 633 });
|
|
1646
|
-
case 'color halftone': return
|
|
1625
|
+
case 'color halftone': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1647
1626
|
_name: 'Color Halftone',
|
|
1648
1627
|
_classID: 'ClrH',
|
|
1649
1628
|
'Rds ': f.filter.radius,
|
|
@@ -1652,49 +1631,49 @@ function serializeFilterFXItem(f) {
|
|
|
1652
1631
|
Ang3: f.filter.angle3,
|
|
1653
1632
|
Ang4: f.filter.angle4,
|
|
1654
1633
|
}, filterID: 1131180616 });
|
|
1655
|
-
case 'crystallize': return
|
|
1634
|
+
case 'crystallize': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1656
1635
|
_name: 'Crystallize',
|
|
1657
1636
|
_classID: 'Crst',
|
|
1658
1637
|
ClSz: f.filter.cellSize,
|
|
1659
1638
|
FlRs: f.filter.randomSeed,
|
|
1660
1639
|
}, filterID: 1131574132 });
|
|
1661
|
-
case 'facet': return
|
|
1662
|
-
case 'fragment': return
|
|
1663
|
-
case 'mezzotint': return
|
|
1640
|
+
case 'facet': return Object.assign(Object.assign({}, base), { filterID: 1180922912 });
|
|
1641
|
+
case 'fragment': return Object.assign(Object.assign({}, base), { filterID: 1181902701 });
|
|
1642
|
+
case 'mezzotint': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1664
1643
|
_name: 'Mezzotint',
|
|
1665
1644
|
_classID: 'Mztn',
|
|
1666
1645
|
MztT: descriptor_1.MztT.encode(f.filter.type),
|
|
1667
1646
|
FlRs: f.filter.randomSeed,
|
|
1668
1647
|
}, filterID: 1299870830 });
|
|
1669
|
-
case 'mosaic': return
|
|
1648
|
+
case 'mosaic': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1670
1649
|
_name: 'Mosaic',
|
|
1671
1650
|
_classID: 'Msc ',
|
|
1672
1651
|
ClSz: (0, descriptor_1.unitsValue)(f.filter.cellSize, 'cellSize'),
|
|
1673
1652
|
}, filterID: 1299407648 });
|
|
1674
|
-
case 'pointillize': return
|
|
1653
|
+
case 'pointillize': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1675
1654
|
_name: 'Pointillize',
|
|
1676
1655
|
_classID: 'Pntl',
|
|
1677
1656
|
ClSz: f.filter.cellSize,
|
|
1678
1657
|
FlRs: f.filter.randomSeed,
|
|
1679
1658
|
}, filterID: 1349416044 });
|
|
1680
|
-
case 'clouds': return
|
|
1659
|
+
case 'clouds': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1681
1660
|
_name: 'Clouds',
|
|
1682
1661
|
_classID: 'Clds',
|
|
1683
1662
|
FlRs: f.filter.randomSeed,
|
|
1684
1663
|
}, filterID: 1131177075 });
|
|
1685
|
-
case 'difference clouds': return
|
|
1664
|
+
case 'difference clouds': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1686
1665
|
_name: 'Difference Clouds',
|
|
1687
1666
|
_classID: 'DfrC',
|
|
1688
1667
|
FlRs: f.filter.randomSeed,
|
|
1689
1668
|
}, filterID: 1147564611 });
|
|
1690
|
-
case 'fibers': return
|
|
1669
|
+
case 'fibers': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1691
1670
|
_name: 'Fibers',
|
|
1692
1671
|
_classID: 'Fbrs',
|
|
1693
1672
|
Vrnc: f.filter.variance,
|
|
1694
1673
|
Strg: f.filter.strength,
|
|
1695
1674
|
RndS: f.filter.randomSeed,
|
|
1696
1675
|
}, filterID: 1180856947 });
|
|
1697
|
-
case 'lens flare': return
|
|
1676
|
+
case 'lens flare': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1698
1677
|
_name: 'Lens Flare',
|
|
1699
1678
|
_classID: 'LnsF',
|
|
1700
1679
|
Brgh: f.filter.brightness,
|
|
@@ -1706,10 +1685,10 @@ function serializeFilterFXItem(f) {
|
|
|
1706
1685
|
},
|
|
1707
1686
|
'Lns ': descriptor_1.Lns.encode(f.filter.lensType),
|
|
1708
1687
|
}, filterID: 1282306886 });
|
|
1709
|
-
case 'sharpen': return
|
|
1710
|
-
case 'sharpen edges': return
|
|
1711
|
-
case 'sharpen more': return
|
|
1712
|
-
case 'smart sharpen': return
|
|
1688
|
+
case 'sharpen': return Object.assign(Object.assign({}, base), { filterID: 1399353968 });
|
|
1689
|
+
case 'sharpen edges': return Object.assign(Object.assign({}, base), { filterID: 1399353925 });
|
|
1690
|
+
case 'sharpen more': return Object.assign(Object.assign({}, base), { filterID: 1399353933 });
|
|
1691
|
+
case 'smart sharpen': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1713
1692
|
_name: 'Smart Sharpen',
|
|
1714
1693
|
_classID: 'smartSharpen',
|
|
1715
1694
|
Amnt: (0, descriptor_1.unitsPercentF)(f.filter.amount),
|
|
@@ -1734,27 +1713,27 @@ function serializeFilterFXItem(f) {
|
|
|
1734
1713
|
'Rds ': f.filter.highlight.radius,
|
|
1735
1714
|
},
|
|
1736
1715
|
}, filterID: 698 });
|
|
1737
|
-
case 'unsharp mask': return
|
|
1716
|
+
case 'unsharp mask': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1738
1717
|
_name: 'Unsharp Mask',
|
|
1739
1718
|
_classID: 'UnsM',
|
|
1740
1719
|
Amnt: (0, descriptor_1.unitsPercentF)(f.filter.amount),
|
|
1741
1720
|
'Rds ': uvRadius(f.filter),
|
|
1742
1721
|
Thsh: f.filter.threshold,
|
|
1743
1722
|
}, filterID: 1433301837 });
|
|
1744
|
-
case 'diffuse': return
|
|
1723
|
+
case 'diffuse': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1745
1724
|
_name: 'Diffuse',
|
|
1746
1725
|
_classID: 'Dfs ',
|
|
1747
1726
|
'Md ': descriptor_1.DfsM.encode(f.filter.mode),
|
|
1748
1727
|
FlRs: f.filter.randomSeed,
|
|
1749
1728
|
}, filterID: 1147564832 });
|
|
1750
|
-
case 'emboss': return
|
|
1729
|
+
case 'emboss': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1751
1730
|
_name: 'Emboss',
|
|
1752
1731
|
_classID: 'Embs',
|
|
1753
1732
|
Angl: f.filter.angle,
|
|
1754
1733
|
Hght: f.filter.height,
|
|
1755
1734
|
Amnt: f.filter.amount,
|
|
1756
1735
|
}, filterID: 1164796531 });
|
|
1757
|
-
case 'extrude': return
|
|
1736
|
+
case 'extrude': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1758
1737
|
_name: 'Extrude',
|
|
1759
1738
|
_classID: 'Extr',
|
|
1760
1739
|
ExtS: f.filter.size,
|
|
@@ -1765,9 +1744,9 @@ function serializeFilterFXItem(f) {
|
|
|
1765
1744
|
ExtR: descriptor_1.ExtR.encode(f.filter.depthMode),
|
|
1766
1745
|
FlRs: f.filter.randomSeed,
|
|
1767
1746
|
}, filterID: 1165522034 });
|
|
1768
|
-
case 'find edges': return
|
|
1769
|
-
case 'solarize': return
|
|
1770
|
-
case 'tiles': return
|
|
1747
|
+
case 'find edges': return Object.assign(Object.assign({}, base), { filterID: 1181639749 });
|
|
1748
|
+
case 'solarize': return Object.assign(Object.assign({}, base), { filterID: 1399616122 });
|
|
1749
|
+
case 'tiles': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1771
1750
|
_name: 'Tiles',
|
|
1772
1751
|
_classID: 'Tls ',
|
|
1773
1752
|
TlNm: f.filter.numberOfTiles,
|
|
@@ -1775,61 +1754,61 @@ function serializeFilterFXItem(f) {
|
|
|
1775
1754
|
FlCl: descriptor_1.FlCl.encode(f.filter.fillEmptyAreaWith),
|
|
1776
1755
|
FlRs: f.filter.randomSeed,
|
|
1777
1756
|
}, filterID: 1416393504 });
|
|
1778
|
-
case 'trace contour': return
|
|
1757
|
+
case 'trace contour': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1779
1758
|
_name: 'Trace Contour',
|
|
1780
1759
|
_classID: 'TrcC',
|
|
1781
1760
|
'Lvl ': f.filter.level,
|
|
1782
1761
|
'Edg ': descriptor_1.CntE.encode(f.filter.edge),
|
|
1783
1762
|
}, filterID: 1416782659 });
|
|
1784
|
-
case 'wind': return
|
|
1763
|
+
case 'wind': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1785
1764
|
_name: 'Wind',
|
|
1786
1765
|
_classID: 'Wnd ',
|
|
1787
1766
|
WndM: descriptor_1.WndM.encode(f.filter.method),
|
|
1788
1767
|
Drct: descriptor_1.Drct.encode(f.filter.direction),
|
|
1789
1768
|
}, filterID: 1466852384 });
|
|
1790
|
-
case 'de-interlace': return
|
|
1769
|
+
case 'de-interlace': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1791
1770
|
_name: 'De-Interlace',
|
|
1792
1771
|
_classID: 'Dntr',
|
|
1793
1772
|
IntE: descriptor_1.IntE.encode(f.filter.eliminate),
|
|
1794
1773
|
IntC: descriptor_1.IntC.encode(f.filter.newFieldsBy),
|
|
1795
1774
|
}, filterID: 1148089458 });
|
|
1796
|
-
case 'ntsc colors': return
|
|
1797
|
-
case 'invert': return
|
|
1798
|
-
case 'custom': return
|
|
1775
|
+
case 'ntsc colors': return Object.assign(Object.assign({}, base), { filterID: 1314149187 });
|
|
1776
|
+
case 'invert': return Object.assign(Object.assign({}, base), { filterID: 1231976050 });
|
|
1777
|
+
case 'custom': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1799
1778
|
_name: 'Custom',
|
|
1800
1779
|
_classID: 'Cstm',
|
|
1801
1780
|
'Scl ': f.filter.scale,
|
|
1802
1781
|
Ofst: f.filter.offset,
|
|
1803
1782
|
Mtrx: f.filter.matrix,
|
|
1804
1783
|
}, filterID: 1131639917 });
|
|
1805
|
-
case 'high pass': return
|
|
1784
|
+
case 'high pass': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1806
1785
|
_name: 'High Pass',
|
|
1807
1786
|
_classID: 'HghP',
|
|
1808
1787
|
'Rds ': uvRadius(f.filter),
|
|
1809
1788
|
}, filterID: 1214736464 });
|
|
1810
|
-
case 'maximum': return
|
|
1789
|
+
case 'maximum': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1811
1790
|
_name: 'Maximum',
|
|
1812
1791
|
_classID: 'Mxm ',
|
|
1813
1792
|
'Rds ': uvRadius(f.filter),
|
|
1814
1793
|
}, filterID: 1299737888 });
|
|
1815
|
-
case 'minimum': return
|
|
1794
|
+
case 'minimum': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1816
1795
|
_name: 'Minimum',
|
|
1817
1796
|
_classID: 'Mnm ',
|
|
1818
1797
|
'Rds ': uvRadius(f.filter),
|
|
1819
1798
|
}, filterID: 1299082528 });
|
|
1820
|
-
case 'offset': return
|
|
1799
|
+
case 'offset': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1821
1800
|
_name: 'Offset',
|
|
1822
1801
|
_classID: 'Ofst',
|
|
1823
1802
|
Hrzn: f.filter.horizontal,
|
|
1824
1803
|
Vrtc: f.filter.vertical,
|
|
1825
1804
|
'Fl ': descriptor_1.FlMd.encode(f.filter.undefinedAreas),
|
|
1826
1805
|
}, filterID: 1332114292 });
|
|
1827
|
-
case 'puppet': return
|
|
1806
|
+
case 'puppet': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1828
1807
|
_name: 'Rigid Transform',
|
|
1829
1808
|
_classID: 'rigidTransform',
|
|
1830
1809
|
'null': ['Ordn.Trgt'],
|
|
1831
1810
|
rigidType: f.filter.rigidType,
|
|
1832
|
-
puppetShapeList: f.filter.puppetShapeList.map(
|
|
1811
|
+
puppetShapeList: f.filter.puppetShapeList.map(p => ({
|
|
1833
1812
|
_name: '',
|
|
1834
1813
|
_classID: 'puppetShape',
|
|
1835
1814
|
rigidType: p.rigidType,
|
|
@@ -1852,27 +1831,27 @@ function serializeFilterFXItem(f) {
|
|
|
1852
1831
|
meshBoundaryPath: {
|
|
1853
1832
|
_name: '',
|
|
1854
1833
|
_classID: 'pathClass',
|
|
1855
|
-
pathComponents: p.meshBoundaryPath.pathComponents.map(
|
|
1834
|
+
pathComponents: p.meshBoundaryPath.pathComponents.map(c => ({
|
|
1856
1835
|
_name: '',
|
|
1857
1836
|
_classID: 'PaCm',
|
|
1858
|
-
shapeOperation:
|
|
1859
|
-
SbpL: c.paths.map(
|
|
1837
|
+
shapeOperation: `shapeOperation.${c.shapeOperation}`,
|
|
1838
|
+
SbpL: c.paths.map(path => ({
|
|
1860
1839
|
_name: '',
|
|
1861
1840
|
_classID: 'Sbpl',
|
|
1862
1841
|
Clsp: path.closed,
|
|
1863
|
-
'Pts ': path.points.map(
|
|
1842
|
+
'Pts ': path.points.map(pt => ({
|
|
1864
1843
|
_name: '',
|
|
1865
1844
|
_classID: 'Pthp',
|
|
1866
1845
|
Anch: pointToHrznVrtc(pt.anchor),
|
|
1867
1846
|
'Fwd ': pointToHrznVrtc(pt.forward),
|
|
1868
1847
|
'Bwd ': pointToHrznVrtc(pt.backward),
|
|
1869
1848
|
Smoo: pt.smooth,
|
|
1870
|
-
})
|
|
1871
|
-
})
|
|
1872
|
-
})
|
|
1849
|
+
})),
|
|
1850
|
+
})),
|
|
1851
|
+
})),
|
|
1873
1852
|
},
|
|
1874
1853
|
selectedPin: p.selectedPin,
|
|
1875
|
-
})
|
|
1854
|
+
})),
|
|
1876
1855
|
PuX0: f.filter.bounds[0].x,
|
|
1877
1856
|
PuX1: f.filter.bounds[1].x,
|
|
1878
1857
|
PuX2: f.filter.bounds[2].x,
|
|
@@ -1883,17 +1862,17 @@ function serializeFilterFXItem(f) {
|
|
|
1883
1862
|
PuY3: f.filter.bounds[3].y,
|
|
1884
1863
|
}, filterID: 991 });
|
|
1885
1864
|
case 'oil paint plugin': {
|
|
1886
|
-
|
|
1887
|
-
for (
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
params[
|
|
1891
|
-
params[
|
|
1892
|
-
params[
|
|
1865
|
+
const params = {};
|
|
1866
|
+
for (let i = 0; i < f.filter.parameters.length; i++) {
|
|
1867
|
+
const { name, value } = f.filter.parameters[i];
|
|
1868
|
+
const suffix = `${fromAtoZ[Math.floor(i / fromAtoZ.length)]}${fromAtoZ[i % fromAtoZ.length]}`;
|
|
1869
|
+
params[`PN${suffix}`] = name;
|
|
1870
|
+
params[`PT${suffix}`] = 0;
|
|
1871
|
+
params[`PF${suffix}`] = value;
|
|
1893
1872
|
}
|
|
1894
|
-
return
|
|
1873
|
+
return Object.assign(Object.assign({}, base), { Fltr: Object.assign({ _name: 'Oil Paint Plugin', _classID: 'PbPl', KnNm: f.filter.name, GpuY: f.filter.gpu, LIWy: f.filter.lighting, FPth: '1' }, params), filterID: 1348620396 });
|
|
1895
1874
|
}
|
|
1896
|
-
case 'oil paint': return
|
|
1875
|
+
case 'oil paint': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1897
1876
|
_name: 'Oil Paint',
|
|
1898
1877
|
_classID: 'oilPaint',
|
|
1899
1878
|
lightingOn: f.filter.lightingOn,
|
|
@@ -1904,32 +1883,32 @@ function serializeFilterFXItem(f) {
|
|
|
1904
1883
|
LghD: f.filter.lightDirection,
|
|
1905
1884
|
specularity: f.filter.specularity,
|
|
1906
1885
|
}, filterID: 1122 });
|
|
1907
|
-
case 'liquify': return
|
|
1886
|
+
case 'liquify': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1908
1887
|
_name: 'Liquify',
|
|
1909
1888
|
_classID: 'LqFy',
|
|
1910
1889
|
LqMe: f.filter.liquifyMesh,
|
|
1911
1890
|
}, filterID: 1282492025 });
|
|
1912
|
-
case 'perspective warp': return
|
|
1891
|
+
case 'perspective warp': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1913
1892
|
_name: 'Perspective Warp',
|
|
1914
1893
|
_classID: 'perspectiveWarpTransform',
|
|
1915
1894
|
vertices: f.filter.vertices.map(pointToHrznVrtc),
|
|
1916
1895
|
warpedVertices: f.filter.warpedVertices.map(pointToHrznVrtc),
|
|
1917
|
-
quads: f.filter.quads.map(
|
|
1896
|
+
quads: f.filter.quads.map(indices => ({ indices })),
|
|
1918
1897
|
}, filterID: 442 });
|
|
1919
|
-
case 'curves': return
|
|
1920
|
-
Adjs: f.filter.adjustments.map(
|
|
1898
|
+
case 'curves': return Object.assign(Object.assign({}, base), { Fltr: Object.assign({ _name: 'Curves', _classID: 'Crvs', presetKind: descriptor_1.presetKindType.encode(f.filter.presetKind) }, (f.filter.adjustments ? {
|
|
1899
|
+
Adjs: f.filter.adjustments.map(a => 'curve' in a ? {
|
|
1921
1900
|
_name: '',
|
|
1922
1901
|
_classID: 'CrvA',
|
|
1923
1902
|
Chnl: a.channels.map(descriptor_1.Chnl.encode),
|
|
1924
|
-
'Crv ': a.curve.map(
|
|
1903
|
+
'Crv ': a.curve.map(c => (Object.assign({ _name: '', _classID: 'Pnt ', Hrzn: c.x, Vrtc: c.y }, (c.curved ? { Cnty: true } : {})))),
|
|
1925
1904
|
} : {
|
|
1926
1905
|
_name: '',
|
|
1927
1906
|
_classID: 'CrvA',
|
|
1928
1907
|
Chnl: a.channels.map(descriptor_1.Chnl.encode),
|
|
1929
1908
|
Mpng: a.values,
|
|
1930
|
-
}
|
|
1909
|
+
})
|
|
1931
1910
|
} : {})), filterID: 1131574899 });
|
|
1932
|
-
case 'brightness/contrast': return
|
|
1911
|
+
case 'brightness/contrast': return Object.assign(Object.assign({}, base), { Fltr: {
|
|
1933
1912
|
_name: 'Brightness/Contrast',
|
|
1934
1913
|
_classID: 'BrgC',
|
|
1935
1914
|
Brgh: f.filter.brightness,
|
|
@@ -1939,7 +1918,7 @@ function serializeFilterFXItem(f) {
|
|
|
1939
1918
|
// case 'hsb/hsl': return {
|
|
1940
1919
|
// TODO: ...
|
|
1941
1920
|
// };
|
|
1942
|
-
default: throw new Error(
|
|
1921
|
+
default: throw new Error(`Unknow filter type: ${f.type}`);
|
|
1943
1922
|
}
|
|
1944
1923
|
}
|
|
1945
1924
|
// let t: any;
|
|
@@ -1948,10 +1927,10 @@ function getWarpFromPlacedLayer(placed) {
|
|
|
1948
1927
|
return placed.warp;
|
|
1949
1928
|
if (!placed.width || !placed.height)
|
|
1950
1929
|
throw new Error('You must provide width and height of the linked image in placedLayer');
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1930
|
+
const w = placed.width;
|
|
1931
|
+
const h = placed.height;
|
|
1932
|
+
const x0 = 0, x1 = w / 3, x2 = w * 2 / 3, x3 = w;
|
|
1933
|
+
const y0 = 0, y1 = h / 3, y2 = h * 2 / 3, y3 = h;
|
|
1955
1934
|
return {
|
|
1956
1935
|
style: 'custom',
|
|
1957
1936
|
value: 0,
|
|
@@ -1976,13 +1955,13 @@ function getWarpFromPlacedLayer(placed) {
|
|
|
1976
1955
|
},
|
|
1977
1956
|
};
|
|
1978
1957
|
}
|
|
1979
|
-
addHandler('SoLd', hasKey('placedLayer'),
|
|
1958
|
+
addHandler('SoLd', hasKey('placedLayer'), (reader, target, left) => {
|
|
1980
1959
|
if ((0, psdReader_1.readSignature)(reader) !== 'soLD')
|
|
1981
|
-
throw new Error(
|
|
1982
|
-
|
|
1960
|
+
throw new Error(`Invalid SoLd type`);
|
|
1961
|
+
const version = (0, psdReader_1.readInt32)(reader);
|
|
1983
1962
|
if (version !== 4 && version !== 5)
|
|
1984
|
-
throw new Error(
|
|
1985
|
-
|
|
1963
|
+
throw new Error(`Invalid SoLd version`);
|
|
1964
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader, true);
|
|
1986
1965
|
// console.log('SoLd', require('util').inspect(desc, false, 99, true));
|
|
1987
1966
|
// console.log('SoLd.warp', require('util').inspect(desc.warp, false, 99, true));
|
|
1988
1967
|
// console.log('SoLd.quiltWarp', require('util').inspect(desc.quiltWarp, false, 99, true));
|
|
@@ -2005,7 +1984,7 @@ addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
|
|
|
2005
1984
|
resolution: (0, descriptor_1.parseUnits)(desc.Rslt),
|
|
2006
1985
|
warp: parseWarp((desc.quiltWarp || desc.warp)),
|
|
2007
1986
|
};
|
|
2008
|
-
if (desc.nonAffineTransform && desc.nonAffineTransform.some(
|
|
1987
|
+
if (desc.nonAffineTransform && desc.nonAffineTransform.some((x, i) => x !== desc.Trnf[i])) {
|
|
2009
1988
|
target.placedLayer.nonAffineTransform = desc.nonAffineTransform;
|
|
2010
1989
|
}
|
|
2011
1990
|
if (desc.Crop)
|
|
@@ -2022,15 +2001,15 @@ addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
|
|
|
2022
2001
|
target.placedLayer.filter = parseFilterFX(desc.filterFX, reader);
|
|
2023
2002
|
// console.log('filter', require('util').inspect(target.placedLayer.filter, false, 99, true));
|
|
2024
2003
|
(0, psdReader_1.skipBytes)(reader, left()); // HACK
|
|
2025
|
-
},
|
|
2004
|
+
}, (writer, target) => {
|
|
2026
2005
|
var _a, _b;
|
|
2027
2006
|
(0, psdWriter_1.writeSignature)(writer, 'soLD');
|
|
2028
2007
|
(0, psdWriter_1.writeInt32)(writer, 4); // version
|
|
2029
|
-
|
|
2008
|
+
const placed = target.placedLayer;
|
|
2030
2009
|
if (!placed.id || typeof placed.id !== 'string' || !/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/.test(placed.id)) {
|
|
2031
2010
|
throw new Error('Placed layer ID must be in a GUID format (example: 20953ddb-9391-11ec-b4f1-c15674f50bc4)');
|
|
2032
2011
|
}
|
|
2033
|
-
|
|
2012
|
+
const desc = Object.assign(Object.assign({ Idnt: placed.id, placed: (_a = placed.placed) !== null && _a !== void 0 ? _a : placed.id, PgNm: placed.pageNumber || 1, totalPages: placed.totalPages || 1 }, (placed.crop ? { Crop: placed.crop } : {})), { frameStep: placed.frameStep || { numerator: 0, denominator: 600 }, duration: placed.duration || { numerator: 0, denominator: 600 }, frameCount: placed.frameCount || 0, Annt: 16, Type: placedLayerTypes.indexOf(placed.type), Trnf: placed.transform, nonAffineTransform: (_b = placed.nonAffineTransform) !== null && _b !== void 0 ? _b : placed.transform,
|
|
2034
2013
|
// quiltWarp: {} as any,
|
|
2035
2014
|
warp: encodeWarp(getWarpFromPlacedLayer(placed)), 'Sz ': {
|
|
2036
2015
|
_name: '',
|
|
@@ -2047,7 +2026,7 @@ addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
|
|
|
2047
2026
|
filterMaskEnable: placed.filter.maskEnabled,
|
|
2048
2027
|
filterMaskLinked: placed.filter.maskLinked,
|
|
2049
2028
|
filterMaskExtendWithWhite: placed.filter.maskExtendWithWhite,
|
|
2050
|
-
filterFXList: placed.filter.list.map(
|
|
2029
|
+
filterFXList: placed.filter.list.map(f => serializeFilterFXItem(f)),
|
|
2051
2030
|
};
|
|
2052
2031
|
}
|
|
2053
2032
|
// TODO:
|
|
@@ -2065,7 +2044,7 @@ addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
|
|
|
2065
2044
|
// // throw new Error('DIFFERENT');
|
|
2066
2045
|
// }
|
|
2067
2046
|
if (placed.warp && isQuiltWarp(placed.warp)) {
|
|
2068
|
-
|
|
2047
|
+
const quiltWarp = encodeWarp(placed.warp);
|
|
2069
2048
|
desc.quiltWarp = quiltWarp;
|
|
2070
2049
|
desc.warp = {
|
|
2071
2050
|
warpStyle: 'warpStyle.warpNone',
|
|
@@ -2088,61 +2067,64 @@ addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
|
|
|
2088
2067
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc, desc.quiltWarp ? 'quiltWarp' : 'warp');
|
|
2089
2068
|
});
|
|
2090
2069
|
addHandlerAlias('SoLE', 'SoLd');
|
|
2091
|
-
addHandler('fxrp', hasKey('referencePoint'),
|
|
2070
|
+
addHandler('fxrp', hasKey('referencePoint'), (reader, target) => {
|
|
2092
2071
|
target.referencePoint = {
|
|
2093
2072
|
x: (0, psdReader_1.readFloat64)(reader),
|
|
2094
2073
|
y: (0, psdReader_1.readFloat64)(reader),
|
|
2095
2074
|
};
|
|
2096
|
-
},
|
|
2075
|
+
}, (writer, target) => {
|
|
2097
2076
|
(0, psdWriter_1.writeFloat64)(writer, target.referencePoint.x);
|
|
2098
2077
|
(0, psdWriter_1.writeFloat64)(writer, target.referencePoint.y);
|
|
2099
2078
|
});
|
|
2100
|
-
addHandler('Lr16',
|
|
2079
|
+
addHandler('Lr16', () => false, (reader, _target, _left, psd, imageResources) => {
|
|
2101
2080
|
(0, psdReader_1.readLayerInfo)(reader, psd, imageResources);
|
|
2102
|
-
},
|
|
2081
|
+
}, (_writer, _target) => {
|
|
2103
2082
|
});
|
|
2104
|
-
addHandler('Lr32',
|
|
2083
|
+
addHandler('Lr32', () => false, (reader, _target, _left, psd, imageResources) => {
|
|
2105
2084
|
(0, psdReader_1.readLayerInfo)(reader, psd, imageResources);
|
|
2106
|
-
},
|
|
2085
|
+
}, (_writer, _target) => {
|
|
2107
2086
|
});
|
|
2108
|
-
addHandler('LMsk', hasKey('userMask'),
|
|
2087
|
+
addHandler('LMsk', hasKey('userMask'), (reader, target) => {
|
|
2109
2088
|
target.userMask = {
|
|
2110
2089
|
colorSpace: (0, psdReader_1.readColor)(reader),
|
|
2111
2090
|
opacity: (0, psdReader_1.readUint16)(reader) / 0xff,
|
|
2112
2091
|
};
|
|
2113
|
-
|
|
2092
|
+
const flag = (0, psdReader_1.readUint8)(reader);
|
|
2114
2093
|
if (flag !== 128)
|
|
2115
2094
|
throw new Error('Invalid flag value');
|
|
2116
2095
|
(0, psdReader_1.skipBytes)(reader, 1);
|
|
2117
|
-
},
|
|
2118
|
-
|
|
2096
|
+
}, (writer, target) => {
|
|
2097
|
+
const userMask = target.userMask;
|
|
2119
2098
|
(0, psdWriter_1.writeColor)(writer, userMask.colorSpace);
|
|
2120
2099
|
(0, psdWriter_1.writeUint16)(writer, (0, helpers_1.clamp)(userMask.opacity, 0, 1) * 0xff);
|
|
2121
2100
|
(0, psdWriter_1.writeUint8)(writer, 128);
|
|
2122
2101
|
(0, psdWriter_1.writeZeros)(writer, 1);
|
|
2123
2102
|
});
|
|
2124
2103
|
if (helpers_1.MOCK_HANDLERS) {
|
|
2125
|
-
addHandler('Patt',
|
|
2104
|
+
addHandler('Patt', target => target._Patt !== undefined, (reader, target, left) => {
|
|
2126
2105
|
// console.log('additional info: Patt');
|
|
2127
2106
|
target._Patt = (0, psdReader_1.readBytes)(reader, left());
|
|
2128
|
-
},
|
|
2107
|
+
}, (writer, target) => false && (0, psdWriter_1.writeBytes)(writer, target._Patt));
|
|
2129
2108
|
}
|
|
2130
2109
|
else {
|
|
2131
2110
|
addHandler('Patt', // TODO: handle also Pat2 & Pat3
|
|
2132
|
-
|
|
2133
|
-
target
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2111
|
+
// TODO: handle also Pat2 & Pat3
|
|
2112
|
+
target => !!(target.patterns && target.patterns.length > 0), (reader, target, left) => {
|
|
2113
|
+
while (left() > 0) {
|
|
2114
|
+
const pattern = (0, psdReader_1.readPattern)(reader);
|
|
2115
|
+
if (target.patterns === undefined)
|
|
2116
|
+
target.patterns = [];
|
|
2117
|
+
target.patterns.push(pattern);
|
|
2118
|
+
}
|
|
2119
|
+
}, (writer, target, _, _options) => {
|
|
2120
|
+
const patterns = target.patterns || [];
|
|
2121
|
+
for (const pattern of patterns) {
|
|
2122
|
+
(0, psdWriter_1.writePattern)(writer, pattern);
|
|
2123
|
+
}
|
|
2144
2124
|
});
|
|
2145
2125
|
}
|
|
2126
|
+
addHandlerAlias('Pat2', 'Patt');
|
|
2127
|
+
addHandlerAlias('Pat3', 'Patt');
|
|
2146
2128
|
/*
|
|
2147
2129
|
interface CAIDesc {
|
|
2148
2130
|
_name: '';
|
|
@@ -2166,9 +2148,9 @@ addHandler(
|
|
|
2166
2148
|
);
|
|
2167
2149
|
// */
|
|
2168
2150
|
if (helpers_1.MOCK_HANDLERS) {
|
|
2169
|
-
addHandler('CAI ',
|
|
2151
|
+
addHandler('CAI ', target => target._CAI_ !== undefined, (reader, target, left) => {
|
|
2170
2152
|
target._CAI_ = (0, psdReader_1.readBytes)(reader, left());
|
|
2171
|
-
},
|
|
2153
|
+
}, (writer, target) => {
|
|
2172
2154
|
(0, psdWriter_1.writeBytes)(writer, target._CAI_);
|
|
2173
2155
|
});
|
|
2174
2156
|
}
|
|
@@ -2185,12 +2167,12 @@ if (helpers_1.MOCK_HANDLERS) {
|
|
|
2185
2167
|
// }
|
|
2186
2168
|
if (helpers_1.MOCK_HANDLERS) {
|
|
2187
2169
|
addHandler('OCIO', // document color management info
|
|
2188
|
-
|
|
2189
|
-
target
|
|
2170
|
+
// document color management info
|
|
2171
|
+
target => target._OCIO !== undefined, (reader, target, left) => {
|
|
2190
2172
|
// const desc = readVersionAndDescriptor(reader, true) as OCIODescriptor;
|
|
2191
2173
|
// console.log('OCIO', require('util').inspect(desc, false, 99, true));
|
|
2192
2174
|
target._OCIO = (0, psdReader_1.readBytes)(reader, left());
|
|
2193
|
-
},
|
|
2175
|
+
}, (writer, target) => {
|
|
2194
2176
|
(0, psdWriter_1.writeBytes)(writer, target._OCIO);
|
|
2195
2177
|
});
|
|
2196
2178
|
}
|
|
@@ -2202,21 +2184,21 @@ if (helpers_1.MOCK_HANDLERS) {
|
|
|
2202
2184
|
// }
|
|
2203
2185
|
if (helpers_1.MOCK_HANDLERS) {
|
|
2204
2186
|
addHandler('GenI', // generative tech
|
|
2205
|
-
|
|
2206
|
-
target
|
|
2207
|
-
|
|
2187
|
+
// generative tech
|
|
2188
|
+
target => target._GenI !== undefined, (reader, target, left) => {
|
|
2189
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader, true); // as GenIDescriptor;
|
|
2208
2190
|
console.log('GenI', require('util').inspect(desc, false, 99, true));
|
|
2209
2191
|
target._GenI = (0, psdReader_1.readBytes)(reader, left());
|
|
2210
|
-
},
|
|
2192
|
+
}, (writer, target) => {
|
|
2211
2193
|
(0, psdWriter_1.writeBytes)(writer, target._GenI);
|
|
2212
2194
|
});
|
|
2213
2195
|
}
|
|
2214
2196
|
function readRect(reader) {
|
|
2215
|
-
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
return { top
|
|
2197
|
+
const top = (0, psdReader_1.readInt32)(reader);
|
|
2198
|
+
const left = (0, psdReader_1.readInt32)(reader);
|
|
2199
|
+
const bottom = (0, psdReader_1.readInt32)(reader);
|
|
2200
|
+
const right = (0, psdReader_1.readInt32)(reader);
|
|
2201
|
+
return { top, left, bottom, right };
|
|
2220
2202
|
}
|
|
2221
2203
|
function writeRect(writer, rect) {
|
|
2222
2204
|
(0, psdWriter_1.writeInt32)(writer, rect.top);
|
|
@@ -2224,29 +2206,29 @@ function writeRect(writer, rect) {
|
|
|
2224
2206
|
(0, psdWriter_1.writeInt32)(writer, rect.bottom);
|
|
2225
2207
|
(0, psdWriter_1.writeInt32)(writer, rect.right);
|
|
2226
2208
|
}
|
|
2227
|
-
addHandler('Anno',
|
|
2228
|
-
|
|
2229
|
-
|
|
2209
|
+
addHandler('Anno', target => target.annotations !== undefined, (reader, target, left) => {
|
|
2210
|
+
const major = (0, psdReader_1.readUint16)(reader);
|
|
2211
|
+
const minor = (0, psdReader_1.readUint16)(reader);
|
|
2230
2212
|
if (major !== 2 || minor !== 1)
|
|
2231
2213
|
throw new Error('Invalid Anno version');
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
for (
|
|
2214
|
+
const count = (0, psdReader_1.readUint32)(reader);
|
|
2215
|
+
const annotations = [];
|
|
2216
|
+
for (let i = 0; i < count; i++) {
|
|
2235
2217
|
/*const length =*/ (0, psdReader_1.readUint32)(reader);
|
|
2236
|
-
|
|
2237
|
-
|
|
2218
|
+
const type = (0, psdReader_1.readSignature)(reader);
|
|
2219
|
+
const open = !!(0, psdReader_1.readUint8)(reader);
|
|
2238
2220
|
/*const flags =*/ (0, psdReader_1.readUint8)(reader); // always 28
|
|
2239
2221
|
/*const optionalBlocks =*/ (0, psdReader_1.readUint16)(reader);
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2222
|
+
const iconLocation = readRect(reader);
|
|
2223
|
+
const popupLocation = readRect(reader);
|
|
2224
|
+
const color = (0, psdReader_1.readColor)(reader);
|
|
2225
|
+
const author = (0, psdReader_1.readPascalString)(reader, 2);
|
|
2226
|
+
const name = (0, psdReader_1.readPascalString)(reader, 2);
|
|
2227
|
+
const date = (0, psdReader_1.readPascalString)(reader, 2);
|
|
2246
2228
|
/*const contentLength =*/ (0, psdReader_1.readUint32)(reader);
|
|
2247
2229
|
/*const dataType =*/ (0, psdReader_1.readSignature)(reader);
|
|
2248
|
-
|
|
2249
|
-
|
|
2230
|
+
const dataLength = (0, psdReader_1.readUint32)(reader);
|
|
2231
|
+
let data;
|
|
2250
2232
|
if (type === 'txtA') {
|
|
2251
2233
|
if (dataLength >= 2 && (0, psdReader_1.readUint16)(reader) === 0xfeff) {
|
|
2252
2234
|
data = (0, psdReader_1.readUnicodeStringWithLength)(reader, (dataLength - 2) / 2);
|
|
@@ -2264,32 +2246,23 @@ addHandler('Anno', function (target) { return target.annotations !== undefined;
|
|
|
2264
2246
|
throw new Error('Unknown annotation type');
|
|
2265
2247
|
}
|
|
2266
2248
|
annotations.push({
|
|
2267
|
-
type: type === 'txtA' ? 'text' : 'sound',
|
|
2268
|
-
open: open_1,
|
|
2269
|
-
iconLocation: iconLocation,
|
|
2270
|
-
popupLocation: popupLocation,
|
|
2271
|
-
color: color,
|
|
2272
|
-
author: author,
|
|
2273
|
-
name: name_2,
|
|
2274
|
-
date: date,
|
|
2275
|
-
data: data,
|
|
2249
|
+
type: type === 'txtA' ? 'text' : 'sound', open, iconLocation, popupLocation, color, author, name, date, data,
|
|
2276
2250
|
});
|
|
2277
2251
|
}
|
|
2278
2252
|
target.annotations = annotations;
|
|
2279
2253
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
2280
|
-
},
|
|
2281
|
-
|
|
2254
|
+
}, (writer, target) => {
|
|
2255
|
+
const annotations = target.annotations;
|
|
2282
2256
|
(0, psdWriter_1.writeUint16)(writer, 2);
|
|
2283
2257
|
(0, psdWriter_1.writeUint16)(writer, 1);
|
|
2284
2258
|
(0, psdWriter_1.writeUint32)(writer, annotations.length);
|
|
2285
|
-
for (
|
|
2286
|
-
|
|
2287
|
-
var sound = annotation.type === 'sound';
|
|
2259
|
+
for (const annotation of annotations) {
|
|
2260
|
+
const sound = annotation.type === 'sound';
|
|
2288
2261
|
if (sound && !(annotation.data instanceof Uint8Array))
|
|
2289
2262
|
throw new Error('Sound annotation data should be Uint8Array');
|
|
2290
2263
|
if (!sound && typeof annotation.data !== 'string')
|
|
2291
2264
|
throw new Error('Text annotation data should be string');
|
|
2292
|
-
|
|
2265
|
+
const lengthOffset = writer.offset;
|
|
2293
2266
|
(0, psdWriter_1.writeUint32)(writer, 0); // length
|
|
2294
2267
|
(0, psdWriter_1.writeSignature)(writer, sound ? 'sndA' : 'txtA');
|
|
2295
2268
|
(0, psdWriter_1.writeUint8)(writer, annotation.open ? 1 : 0);
|
|
@@ -2301,18 +2274,18 @@ addHandler('Anno', function (target) { return target.annotations !== undefined;
|
|
|
2301
2274
|
(0, psdWriter_1.writePascalString)(writer, annotation.author || '', 2);
|
|
2302
2275
|
(0, psdWriter_1.writePascalString)(writer, annotation.name || '', 2);
|
|
2303
2276
|
(0, psdWriter_1.writePascalString)(writer, annotation.date || '', 2);
|
|
2304
|
-
|
|
2277
|
+
const contentOffset = writer.offset;
|
|
2305
2278
|
(0, psdWriter_1.writeUint32)(writer, 0); // content length
|
|
2306
2279
|
(0, psdWriter_1.writeSignature)(writer, sound ? 'sndM' : 'txtC');
|
|
2307
2280
|
(0, psdWriter_1.writeUint32)(writer, 0); // data length
|
|
2308
|
-
|
|
2281
|
+
const dataOffset = writer.offset;
|
|
2309
2282
|
if (sound) {
|
|
2310
2283
|
(0, psdWriter_1.writeBytes)(writer, annotation.data);
|
|
2311
2284
|
}
|
|
2312
2285
|
else {
|
|
2313
2286
|
(0, psdWriter_1.writeUint16)(writer, 0xfeff); // unicode string indicator
|
|
2314
|
-
|
|
2315
|
-
for (
|
|
2287
|
+
const text = annotation.data.replace(/\n/g, '\r');
|
|
2288
|
+
for (let i = 0; i < text.length; i++)
|
|
2316
2289
|
(0, psdWriter_1.writeUint16)(writer, text.charCodeAt(i));
|
|
2317
2290
|
}
|
|
2318
2291
|
writer.view.setUint32(lengthOffset, writer.offset - lengthOffset, false);
|
|
@@ -2321,33 +2294,33 @@ addHandler('Anno', function (target) { return target.annotations !== undefined;
|
|
|
2321
2294
|
}
|
|
2322
2295
|
});
|
|
2323
2296
|
function createLnkHandler(tag) {
|
|
2324
|
-
addHandler(tag,
|
|
2325
|
-
|
|
2297
|
+
addHandler(tag, (target) => {
|
|
2298
|
+
const psd = target;
|
|
2326
2299
|
if (!psd.linkedFiles || !psd.linkedFiles.length)
|
|
2327
2300
|
return false;
|
|
2328
|
-
if (tag === 'lnkE' && !psd.linkedFiles.some(
|
|
2301
|
+
if (tag === 'lnkE' && !psd.linkedFiles.some(f => f.linkedFile))
|
|
2329
2302
|
return false;
|
|
2330
2303
|
return true;
|
|
2331
|
-
},
|
|
2332
|
-
|
|
2304
|
+
}, (reader, target, left, _psd) => {
|
|
2305
|
+
const psd = target;
|
|
2333
2306
|
psd.linkedFiles = psd.linkedFiles || [];
|
|
2334
2307
|
while (left() > 8) {
|
|
2335
|
-
|
|
2336
|
-
|
|
2337
|
-
|
|
2308
|
+
let size = readLength64(reader);
|
|
2309
|
+
const startOffset = reader.offset;
|
|
2310
|
+
const type = (0, psdReader_1.readSignature)(reader);
|
|
2338
2311
|
// liFD - linked file data
|
|
2339
2312
|
// liFE - linked file external
|
|
2340
2313
|
// liFA - linked file alias
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
2314
|
+
const version = (0, psdReader_1.readInt32)(reader);
|
|
2315
|
+
const id = (0, psdReader_1.readPascalString)(reader, 1);
|
|
2316
|
+
const name = (0, psdReader_1.readUnicodeString)(reader);
|
|
2317
|
+
const fileType = (0, psdReader_1.readSignature)(reader).trim(); // ' ' if empty
|
|
2318
|
+
const fileCreator = (0, psdReader_1.readSignature)(reader).trim(); // ' ' or '\0\0\0\0' if empty
|
|
2319
|
+
const dataSize = readLength64(reader);
|
|
2320
|
+
const hasFileOpenDescriptor = (0, psdReader_1.readUint8)(reader);
|
|
2321
|
+
const fileOpenDescriptor = hasFileOpenDescriptor ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
|
|
2322
|
+
const linkedFileDescriptor = type === 'liFE' ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
|
|
2323
|
+
const file = { id, name };
|
|
2351
2324
|
if (fileType)
|
|
2352
2325
|
file.type = fileType;
|
|
2353
2326
|
if (fileCreator)
|
|
@@ -2361,17 +2334,17 @@ function createLnkHandler(tag) {
|
|
|
2361
2334
|
};
|
|
2362
2335
|
}
|
|
2363
2336
|
if (type === 'liFE' && version > 3) {
|
|
2364
|
-
|
|
2365
|
-
|
|
2366
|
-
|
|
2367
|
-
|
|
2368
|
-
|
|
2369
|
-
|
|
2370
|
-
|
|
2371
|
-
|
|
2337
|
+
const year = (0, psdReader_1.readInt32)(reader);
|
|
2338
|
+
const month = (0, psdReader_1.readUint8)(reader);
|
|
2339
|
+
const day = (0, psdReader_1.readUint8)(reader);
|
|
2340
|
+
const hour = (0, psdReader_1.readUint8)(reader);
|
|
2341
|
+
const minute = (0, psdReader_1.readUint8)(reader);
|
|
2342
|
+
const seconds = (0, psdReader_1.readFloat64)(reader);
|
|
2343
|
+
const wholeSeconds = Math.floor(seconds);
|
|
2344
|
+
const ms = (seconds - wholeSeconds) * 1000;
|
|
2372
2345
|
file.time = (new Date(Date.UTC(year, month, day, hour, minute, wholeSeconds, ms))).toISOString();
|
|
2373
2346
|
}
|
|
2374
|
-
|
|
2347
|
+
const fileSize = type === 'liFE' ? readLength64(reader) : 0;
|
|
2375
2348
|
if (type === 'liFA')
|
|
2376
2349
|
(0, psdReader_1.skipBytes)(reader, 8);
|
|
2377
2350
|
if (type === 'liFD')
|
|
@@ -2388,7 +2361,7 @@ function createLnkHandler(tag) {
|
|
|
2388
2361
|
file.data = undefined;
|
|
2389
2362
|
if (tag === 'lnkE') {
|
|
2390
2363
|
file.linkedFile = {
|
|
2391
|
-
fileSize
|
|
2364
|
+
fileSize,
|
|
2392
2365
|
name: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor['Nm ']) || '',
|
|
2393
2366
|
fullPath: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor.fullPath) || '',
|
|
2394
2367
|
originalPath: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor.originalPath) || '',
|
|
@@ -2401,14 +2374,13 @@ function createLnkHandler(tag) {
|
|
|
2401
2374
|
reader.offset = startOffset + size;
|
|
2402
2375
|
}
|
|
2403
2376
|
(0, psdReader_1.skipBytes)(reader, left()); // ?
|
|
2404
|
-
},
|
|
2377
|
+
}, (writer, target) => {
|
|
2405
2378
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
2406
|
-
|
|
2407
|
-
for (
|
|
2408
|
-
var file = _k[_i];
|
|
2379
|
+
const psd = target;
|
|
2380
|
+
for (const file of psd.linkedFiles) {
|
|
2409
2381
|
if ((tag === 'lnkE') !== !!file.linkedFile)
|
|
2410
2382
|
continue;
|
|
2411
|
-
|
|
2383
|
+
let version = 2;
|
|
2412
2384
|
if (file.assetLockedState != null)
|
|
2413
2385
|
version = 7;
|
|
2414
2386
|
else if (file.assetModTime != null)
|
|
@@ -2418,7 +2390,7 @@ function createLnkHandler(tag) {
|
|
|
2418
2390
|
else if (tag === 'lnkE')
|
|
2419
2391
|
version = 3;
|
|
2420
2392
|
writeLength64(writer, 0);
|
|
2421
|
-
|
|
2393
|
+
const sizeOffset = writer.offset;
|
|
2422
2394
|
(0, psdWriter_1.writeSignature)(writer, (tag === 'lnkE') ? 'liFE' : (file.data ? 'liFD' : 'liFA'));
|
|
2423
2395
|
(0, psdWriter_1.writeInt32)(writer, version);
|
|
2424
2396
|
if (!file.id || typeof file.id !== 'string' || !/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/.test(file.id)) {
|
|
@@ -2426,11 +2398,11 @@ function createLnkHandler(tag) {
|
|
|
2426
2398
|
}
|
|
2427
2399
|
(0, psdWriter_1.writePascalString)(writer, file.id, 1);
|
|
2428
2400
|
(0, psdWriter_1.writeUnicodeStringWithPadding)(writer, file.name || '');
|
|
2429
|
-
(0, psdWriter_1.writeSignature)(writer, file.type ?
|
|
2430
|
-
(0, psdWriter_1.writeSignature)(writer, file.creator ?
|
|
2401
|
+
(0, psdWriter_1.writeSignature)(writer, file.type ? `${file.type} `.substring(0, 4) : ' ');
|
|
2402
|
+
(0, psdWriter_1.writeSignature)(writer, file.creator ? `${file.creator} `.substring(0, 4) : '\0\0\0\0');
|
|
2431
2403
|
writeLength64(writer, file.data ? file.data.byteLength : 0);
|
|
2432
2404
|
if (file.descriptor && file.descriptor.compInfo) {
|
|
2433
|
-
|
|
2405
|
+
const desc = {
|
|
2434
2406
|
compInfo: {
|
|
2435
2407
|
compID: file.descriptor.compInfo.compID,
|
|
2436
2408
|
originalCompID: file.descriptor.compInfo.originalCompID,
|
|
@@ -2443,7 +2415,7 @@ function createLnkHandler(tag) {
|
|
|
2443
2415
|
(0, psdWriter_1.writeUint8)(writer, 0);
|
|
2444
2416
|
}
|
|
2445
2417
|
if (tag === 'lnkE') {
|
|
2446
|
-
|
|
2418
|
+
const desc = {
|
|
2447
2419
|
descVersion: 2,
|
|
2448
2420
|
'Nm ': (_b = (_a = file.linkedFile) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : '',
|
|
2449
2421
|
fullPath: (_d = (_c = file.linkedFile) === null || _c === void 0 ? void 0 : _c.fullPath) !== null && _d !== void 0 ? _d : '',
|
|
@@ -2451,7 +2423,7 @@ function createLnkHandler(tag) {
|
|
|
2451
2423
|
relPath: (_h = (_g = file.linkedFile) === null || _g === void 0 ? void 0 : _g.relativePath) !== null && _h !== void 0 ? _h : '',
|
|
2452
2424
|
};
|
|
2453
2425
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'ExternalFileLink', desc);
|
|
2454
|
-
|
|
2426
|
+
const time = file.time ? new Date(file.time) : new Date();
|
|
2455
2427
|
(0, psdWriter_1.writeInt32)(writer, time.getUTCFullYear());
|
|
2456
2428
|
(0, psdWriter_1.writeUint8)(writer, time.getUTCMonth());
|
|
2457
2429
|
(0, psdWriter_1.writeUint8)(writer, time.getUTCDate());
|
|
@@ -2471,7 +2443,7 @@ function createLnkHandler(tag) {
|
|
|
2471
2443
|
(0, psdWriter_1.writeFloat64)(writer, file.assetModTime || 0);
|
|
2472
2444
|
if (version >= 7)
|
|
2473
2445
|
(0, psdWriter_1.writeUint8)(writer, file.assetLockedState || 0);
|
|
2474
|
-
|
|
2446
|
+
let size = writer.offset - sizeOffset;
|
|
2475
2447
|
writer.view.setUint32(sizeOffset - 4, size, false); // write size
|
|
2476
2448
|
while (size % 4) {
|
|
2477
2449
|
size++;
|
|
@@ -2484,20 +2456,20 @@ createLnkHandler('lnk2');
|
|
|
2484
2456
|
createLnkHandler('lnkE');
|
|
2485
2457
|
addHandlerAlias('lnkD', 'lnk2');
|
|
2486
2458
|
addHandlerAlias('lnk3', 'lnk2');
|
|
2487
|
-
addHandler('pths', hasKey('pathList'),
|
|
2488
|
-
|
|
2459
|
+
addHandler('pths', hasKey('pathList'), (reader, target) => {
|
|
2460
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader, true);
|
|
2489
2461
|
// console.log(require('util').inspect(desc, false, 99, true));
|
|
2490
2462
|
// if (options.throwForMissingFeatures && desc?.pathList?.length) throw new Error('non-empty pathList in `pths`');
|
|
2491
2463
|
desc;
|
|
2492
2464
|
target.pathList = []; // TODO: read paths
|
|
2493
|
-
},
|
|
2494
|
-
|
|
2465
|
+
}, (writer, _target) => {
|
|
2466
|
+
const desc = {
|
|
2495
2467
|
pathList: [], // TODO: write paths
|
|
2496
2468
|
};
|
|
2497
2469
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'pathsDataClass', desc);
|
|
2498
2470
|
});
|
|
2499
|
-
addHandler('lyvr', hasKey('version'),
|
|
2500
|
-
addHandler('lfxs',
|
|
2471
|
+
addHandler('lyvr', hasKey('version'), (reader, target) => target.version = (0, psdReader_1.readUint32)(reader), (writer, target) => (0, psdWriter_1.writeUint32)(writer, target.version));
|
|
2472
|
+
addHandler('lfxs', () => false, // TODO: not sure when we actually need to write this section
|
|
2501
2473
|
// NOTE: this might be insufficient
|
|
2502
2474
|
// target => target.effects !== undefined && (
|
|
2503
2475
|
// !!target.effects.dropShadow?.some(e => e.choke) ||
|
|
@@ -2505,22 +2477,22 @@ addHandler('lfxs', function () { return false; }, // TODO: not sure when we actu
|
|
|
2505
2477
|
// !!target.effects.outerGlow?.choke ||
|
|
2506
2478
|
// !!target.effects.innerGlow?.choke
|
|
2507
2479
|
// ),
|
|
2508
|
-
|
|
2509
|
-
|
|
2480
|
+
(reader, target, left) => {
|
|
2481
|
+
const version = (0, psdReader_1.readUint32)(reader);
|
|
2510
2482
|
if (version !== 0)
|
|
2511
|
-
throw new Error(
|
|
2512
|
-
|
|
2483
|
+
throw new Error(`Invalid lfxs version`);
|
|
2484
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
2513
2485
|
target.effects = (0, descriptor_1.parseEffects)(desc, !!reader.logMissingFeatures);
|
|
2514
2486
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
2515
|
-
},
|
|
2516
|
-
|
|
2487
|
+
}, (writer, target, _, options) => {
|
|
2488
|
+
const desc = (0, descriptor_1.serializeEffects)(target.effects, !!options.logMissingFeatures, true);
|
|
2517
2489
|
(0, psdWriter_1.writeUint32)(writer, 0); // version
|
|
2518
2490
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
|
|
2519
2491
|
});
|
|
2520
2492
|
function adjustmentType(type) {
|
|
2521
|
-
return
|
|
2493
|
+
return (target) => !!target.adjustment && target.adjustment.type === type;
|
|
2522
2494
|
}
|
|
2523
|
-
addHandler('brit', adjustmentType('brightness/contrast'),
|
|
2495
|
+
addHandler('brit', adjustmentType('brightness/contrast'), (reader, target, left) => {
|
|
2524
2496
|
if (!target.adjustment) { // ignore if got one from CgEd block
|
|
2525
2497
|
target.adjustment = {
|
|
2526
2498
|
type: 'brightness/contrast',
|
|
@@ -2532,9 +2504,9 @@ addHandler('brit', adjustmentType('brightness/contrast'), function (reader, targ
|
|
|
2532
2504
|
};
|
|
2533
2505
|
}
|
|
2534
2506
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
2535
|
-
},
|
|
2507
|
+
}, (writer, target) => {
|
|
2536
2508
|
var _a;
|
|
2537
|
-
|
|
2509
|
+
const info = target.adjustment;
|
|
2538
2510
|
(0, psdWriter_1.writeInt16)(writer, info.brightness || 0);
|
|
2539
2511
|
(0, psdWriter_1.writeInt16)(writer, info.contrast || 0);
|
|
2540
2512
|
(0, psdWriter_1.writeInt16)(writer, (_a = info.meanValue) !== null && _a !== void 0 ? _a : 127);
|
|
@@ -2542,12 +2514,12 @@ addHandler('brit', adjustmentType('brightness/contrast'), function (reader, targ
|
|
|
2542
2514
|
(0, psdWriter_1.writeZeros)(writer, 1);
|
|
2543
2515
|
});
|
|
2544
2516
|
function readLevelsChannel(reader) {
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
return { shadowInput
|
|
2517
|
+
const shadowInput = (0, psdReader_1.readInt16)(reader);
|
|
2518
|
+
const highlightInput = (0, psdReader_1.readInt16)(reader);
|
|
2519
|
+
const shadowOutput = (0, psdReader_1.readInt16)(reader);
|
|
2520
|
+
const highlightOutput = (0, psdReader_1.readInt16)(reader);
|
|
2521
|
+
const midtoneInput = (0, psdReader_1.readInt16)(reader) / 100;
|
|
2522
|
+
return { shadowInput, highlightInput, shadowOutput, highlightOutput, midtoneInput };
|
|
2551
2523
|
}
|
|
2552
2524
|
function writeLevelsChannel(writer, channel) {
|
|
2553
2525
|
(0, psdWriter_1.writeInt16)(writer, channel.shadowInput);
|
|
@@ -2556,14 +2528,14 @@ function writeLevelsChannel(writer, channel) {
|
|
|
2556
2528
|
(0, psdWriter_1.writeInt16)(writer, channel.highlightOutput);
|
|
2557
2529
|
(0, psdWriter_1.writeInt16)(writer, Math.round(channel.midtoneInput * 100));
|
|
2558
2530
|
}
|
|
2559
|
-
addHandler('levl', adjustmentType('levels'),
|
|
2531
|
+
addHandler('levl', adjustmentType('levels'), (reader, target, left) => {
|
|
2560
2532
|
if ((0, psdReader_1.readUint16)(reader) !== 2)
|
|
2561
2533
|
throw new Error('Invalid levl version');
|
|
2562
|
-
target.adjustment =
|
|
2534
|
+
target.adjustment = Object.assign(Object.assign({}, target.adjustment), { type: 'levels', rgb: readLevelsChannel(reader), red: readLevelsChannel(reader), green: readLevelsChannel(reader), blue: readLevelsChannel(reader) });
|
|
2563
2535
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
2564
|
-
},
|
|
2565
|
-
|
|
2566
|
-
|
|
2536
|
+
}, (writer, target) => {
|
|
2537
|
+
const info = target.adjustment;
|
|
2538
|
+
const defaultChannel = {
|
|
2567
2539
|
shadowInput: 0,
|
|
2568
2540
|
highlightInput: 255,
|
|
2569
2541
|
shadowOutput: 0,
|
|
@@ -2575,34 +2547,33 @@ addHandler('levl', adjustmentType('levels'), function (reader, target, left) {
|
|
|
2575
2547
|
writeLevelsChannel(writer, info.red || defaultChannel);
|
|
2576
2548
|
writeLevelsChannel(writer, info.blue || defaultChannel);
|
|
2577
2549
|
writeLevelsChannel(writer, info.green || defaultChannel);
|
|
2578
|
-
for (
|
|
2550
|
+
for (let i = 0; i < 59; i++)
|
|
2579
2551
|
writeLevelsChannel(writer, defaultChannel);
|
|
2580
2552
|
});
|
|
2581
2553
|
function readCurveChannel(reader) {
|
|
2582
|
-
|
|
2583
|
-
|
|
2584
|
-
for (
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
channel.push({ input
|
|
2554
|
+
const nodes = (0, psdReader_1.readUint16)(reader);
|
|
2555
|
+
const channel = [];
|
|
2556
|
+
for (let j = 0; j < nodes; j++) {
|
|
2557
|
+
const output = (0, psdReader_1.readInt16)(reader);
|
|
2558
|
+
const input = (0, psdReader_1.readInt16)(reader);
|
|
2559
|
+
channel.push({ input, output });
|
|
2588
2560
|
}
|
|
2589
2561
|
return channel;
|
|
2590
2562
|
}
|
|
2591
2563
|
function writeCurveChannel(writer, channel) {
|
|
2592
2564
|
(0, psdWriter_1.writeUint16)(writer, channel.length);
|
|
2593
|
-
for (
|
|
2594
|
-
var n = channel_1[_i];
|
|
2565
|
+
for (const n of channel) {
|
|
2595
2566
|
(0, psdWriter_1.writeUint16)(writer, n.output);
|
|
2596
2567
|
(0, psdWriter_1.writeUint16)(writer, n.input);
|
|
2597
2568
|
}
|
|
2598
2569
|
}
|
|
2599
|
-
addHandler('curv', adjustmentType('curves'),
|
|
2570
|
+
addHandler('curv', adjustmentType('curves'), (reader, target, left) => {
|
|
2600
2571
|
(0, psdReader_1.readUint8)(reader);
|
|
2601
2572
|
if ((0, psdReader_1.readUint16)(reader) !== 1)
|
|
2602
2573
|
throw new Error('Invalid curv version');
|
|
2603
2574
|
(0, psdReader_1.readUint16)(reader);
|
|
2604
|
-
|
|
2605
|
-
|
|
2575
|
+
const channels = (0, psdReader_1.readUint16)(reader);
|
|
2576
|
+
const info = { type: 'curves' };
|
|
2606
2577
|
if (channels & 1)
|
|
2607
2578
|
info.rgb = readCurveChannel(reader);
|
|
2608
2579
|
if (channels & 2)
|
|
@@ -2611,7 +2582,7 @@ addHandler('curv', adjustmentType('curves'), function (reader, target, left) {
|
|
|
2611
2582
|
info.green = readCurveChannel(reader);
|
|
2612
2583
|
if (channels & 8)
|
|
2613
2584
|
info.blue = readCurveChannel(reader);
|
|
2614
|
-
target.adjustment =
|
|
2585
|
+
target.adjustment = Object.assign(Object.assign({}, target.adjustment), info);
|
|
2615
2586
|
// ignoring, duplicate information
|
|
2616
2587
|
// checkSignature(reader, 'Crv ');
|
|
2617
2588
|
// const cVersion = readUint16(reader);
|
|
@@ -2626,11 +2597,11 @@ addHandler('curv', adjustmentType('curves'), function (reader, target, left) {
|
|
|
2626
2597
|
// }
|
|
2627
2598
|
// }
|
|
2628
2599
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
2629
|
-
},
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
|
|
2600
|
+
}, (writer, target) => {
|
|
2601
|
+
const info = target.adjustment;
|
|
2602
|
+
const { rgb, red, green, blue } = info;
|
|
2603
|
+
let channels = 0;
|
|
2604
|
+
let channelCount = 0;
|
|
2634
2605
|
if (rgb && rgb.length) {
|
|
2635
2606
|
channels |= 1;
|
|
2636
2607
|
channelCount++;
|
|
@@ -2680,30 +2651,30 @@ addHandler('curv', adjustmentType('curves'), function (reader, target, left) {
|
|
|
2680
2651
|
writeCurveChannel(writer, blue);
|
|
2681
2652
|
}
|
|
2682
2653
|
});
|
|
2683
|
-
addHandler('expA', adjustmentType('exposure'),
|
|
2654
|
+
addHandler('expA', adjustmentType('exposure'), (reader, target, left) => {
|
|
2684
2655
|
if ((0, psdReader_1.readUint16)(reader) !== 1)
|
|
2685
2656
|
throw new Error('Invalid expA version');
|
|
2686
|
-
target.adjustment =
|
|
2657
|
+
target.adjustment = Object.assign(Object.assign({}, target.adjustment), { type: 'exposure', exposure: (0, psdReader_1.readFloat32)(reader), offset: (0, psdReader_1.readFloat32)(reader), gamma: (0, psdReader_1.readFloat32)(reader) });
|
|
2687
2658
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
2688
|
-
},
|
|
2689
|
-
|
|
2659
|
+
}, (writer, target) => {
|
|
2660
|
+
const info = target.adjustment;
|
|
2690
2661
|
(0, psdWriter_1.writeUint16)(writer, 1); // version
|
|
2691
2662
|
(0, psdWriter_1.writeFloat32)(writer, info.exposure);
|
|
2692
2663
|
(0, psdWriter_1.writeFloat32)(writer, info.offset);
|
|
2693
2664
|
(0, psdWriter_1.writeFloat32)(writer, info.gamma);
|
|
2694
2665
|
(0, psdWriter_1.writeZeros)(writer, 2);
|
|
2695
2666
|
});
|
|
2696
|
-
addHandler('vibA', adjustmentType('vibrance'),
|
|
2697
|
-
|
|
2667
|
+
addHandler('vibA', adjustmentType('vibrance'), (reader, target, left) => {
|
|
2668
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
2698
2669
|
target.adjustment = { type: 'vibrance' };
|
|
2699
2670
|
if (desc.vibrance !== undefined)
|
|
2700
2671
|
target.adjustment.vibrance = desc.vibrance;
|
|
2701
2672
|
if (desc.Strt !== undefined)
|
|
2702
2673
|
target.adjustment.saturation = desc.Strt;
|
|
2703
2674
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
2704
|
-
},
|
|
2705
|
-
|
|
2706
|
-
|
|
2675
|
+
}, (writer, target) => {
|
|
2676
|
+
const info = target.adjustment;
|
|
2677
|
+
const desc = {};
|
|
2707
2678
|
if (info.vibrance !== undefined)
|
|
2708
2679
|
desc.vibrance = info.vibrance;
|
|
2709
2680
|
if (info.saturation !== undefined)
|
|
@@ -2722,7 +2693,7 @@ function readHueChannel(reader) {
|
|
|
2722
2693
|
};
|
|
2723
2694
|
}
|
|
2724
2695
|
function writeHueChannel(writer, channel) {
|
|
2725
|
-
|
|
2696
|
+
const c = channel || {};
|
|
2726
2697
|
(0, psdWriter_1.writeInt16)(writer, c.a || 0);
|
|
2727
2698
|
(0, psdWriter_1.writeInt16)(writer, c.b || 0);
|
|
2728
2699
|
(0, psdWriter_1.writeInt16)(writer, c.c || 0);
|
|
@@ -2731,13 +2702,13 @@ function writeHueChannel(writer, channel) {
|
|
|
2731
2702
|
(0, psdWriter_1.writeInt16)(writer, c.saturation || 0);
|
|
2732
2703
|
(0, psdWriter_1.writeInt16)(writer, c.lightness || 0);
|
|
2733
2704
|
}
|
|
2734
|
-
addHandler('hue2', adjustmentType('hue/saturation'),
|
|
2705
|
+
addHandler('hue2', adjustmentType('hue/saturation'), (reader, target, left) => {
|
|
2735
2706
|
if ((0, psdReader_1.readUint16)(reader) !== 2)
|
|
2736
2707
|
throw new Error('Invalid hue2 version');
|
|
2737
|
-
target.adjustment =
|
|
2708
|
+
target.adjustment = Object.assign(Object.assign({}, target.adjustment), { type: 'hue/saturation', master: readHueChannel(reader), reds: readHueChannel(reader), yellows: readHueChannel(reader), greens: readHueChannel(reader), cyans: readHueChannel(reader), blues: readHueChannel(reader), magentas: readHueChannel(reader) });
|
|
2738
2709
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
2739
|
-
},
|
|
2740
|
-
|
|
2710
|
+
}, (writer, target) => {
|
|
2711
|
+
const info = target.adjustment;
|
|
2741
2712
|
(0, psdWriter_1.writeUint16)(writer, 2); // version
|
|
2742
2713
|
writeHueChannel(writer, info.master);
|
|
2743
2714
|
writeHueChannel(writer, info.reds);
|
|
@@ -2759,7 +2730,7 @@ function writeColorBalance(writer, value) {
|
|
|
2759
2730
|
(0, psdWriter_1.writeInt16)(writer, value.magentaGreen || 0);
|
|
2760
2731
|
(0, psdWriter_1.writeInt16)(writer, value.yellowBlue || 0);
|
|
2761
2732
|
}
|
|
2762
|
-
addHandler('blnc', adjustmentType('color balance'),
|
|
2733
|
+
addHandler('blnc', adjustmentType('color balance'), (reader, target, left) => {
|
|
2763
2734
|
target.adjustment = {
|
|
2764
2735
|
type: 'color balance',
|
|
2765
2736
|
shadows: readColorBalance(reader),
|
|
@@ -2768,16 +2739,16 @@ addHandler('blnc', adjustmentType('color balance'), function (reader, target, le
|
|
|
2768
2739
|
preserveLuminosity: !!(0, psdReader_1.readUint8)(reader),
|
|
2769
2740
|
};
|
|
2770
2741
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
2771
|
-
},
|
|
2772
|
-
|
|
2742
|
+
}, (writer, target) => {
|
|
2743
|
+
const info = target.adjustment;
|
|
2773
2744
|
writeColorBalance(writer, info.shadows || {});
|
|
2774
2745
|
writeColorBalance(writer, info.midtones || {});
|
|
2775
2746
|
writeColorBalance(writer, info.highlights || {});
|
|
2776
2747
|
(0, psdWriter_1.writeUint8)(writer, info.preserveLuminosity ? 1 : 0);
|
|
2777
2748
|
(0, psdWriter_1.writeZeros)(writer, 1);
|
|
2778
2749
|
});
|
|
2779
|
-
addHandler('blwh', adjustmentType('black & white'),
|
|
2780
|
-
|
|
2750
|
+
addHandler('blwh', adjustmentType('black & white'), (reader, target, left) => {
|
|
2751
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
2781
2752
|
target.adjustment = {
|
|
2782
2753
|
type: 'black & white',
|
|
2783
2754
|
reds: desc['Rd '],
|
|
@@ -2793,9 +2764,9 @@ addHandler('blwh', adjustmentType('black & white'), function (reader, target, le
|
|
|
2793
2764
|
if (desc.tintColor !== undefined)
|
|
2794
2765
|
target.adjustment.tintColor = (0, descriptor_1.parseColor)(desc.tintColor);
|
|
2795
2766
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
2796
|
-
},
|
|
2797
|
-
|
|
2798
|
-
|
|
2767
|
+
}, (writer, target) => {
|
|
2768
|
+
const info = target.adjustment;
|
|
2769
|
+
const desc = {
|
|
2799
2770
|
'Rd ': info.reds || 0,
|
|
2800
2771
|
Yllw: info.yellows || 0,
|
|
2801
2772
|
'Grn ': info.greens || 0,
|
|
@@ -2809,11 +2780,11 @@ addHandler('blwh', adjustmentType('black & white'), function (reader, target, le
|
|
|
2809
2780
|
};
|
|
2810
2781
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
|
|
2811
2782
|
});
|
|
2812
|
-
addHandler('phfl', adjustmentType('photo filter'),
|
|
2813
|
-
|
|
2783
|
+
addHandler('phfl', adjustmentType('photo filter'), (reader, target, left) => {
|
|
2784
|
+
const version = (0, psdReader_1.readUint16)(reader);
|
|
2814
2785
|
if (version !== 2 && version !== 3)
|
|
2815
2786
|
throw new Error('Invalid phfl version');
|
|
2816
|
-
|
|
2787
|
+
let color;
|
|
2817
2788
|
if (version === 2) {
|
|
2818
2789
|
color = (0, psdReader_1.readColor)(reader);
|
|
2819
2790
|
}
|
|
@@ -2827,13 +2798,13 @@ addHandler('phfl', adjustmentType('photo filter'), function (reader, target, lef
|
|
|
2827
2798
|
}
|
|
2828
2799
|
target.adjustment = {
|
|
2829
2800
|
type: 'photo filter',
|
|
2830
|
-
color
|
|
2801
|
+
color,
|
|
2831
2802
|
density: (0, psdReader_1.readUint32)(reader) / 100,
|
|
2832
2803
|
preserveLuminosity: !!(0, psdReader_1.readUint8)(reader),
|
|
2833
2804
|
};
|
|
2834
2805
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
2835
|
-
},
|
|
2836
|
-
|
|
2806
|
+
}, (writer, target) => {
|
|
2807
|
+
const info = target.adjustment;
|
|
2837
2808
|
(0, psdWriter_1.writeUint16)(writer, 2); // version
|
|
2838
2809
|
(0, psdWriter_1.writeColor)(writer, info.color || { l: 0, a: 0, b: 0 });
|
|
2839
2810
|
(0, psdWriter_1.writeUint32)(writer, (info.density || 0) * 100);
|
|
@@ -2841,25 +2812,25 @@ addHandler('phfl', adjustmentType('photo filter'), function (reader, target, lef
|
|
|
2841
2812
|
(0, psdWriter_1.writeZeros)(writer, 3);
|
|
2842
2813
|
});
|
|
2843
2814
|
function readMixrChannel(reader) {
|
|
2844
|
-
|
|
2845
|
-
|
|
2846
|
-
|
|
2815
|
+
const red = (0, psdReader_1.readInt16)(reader);
|
|
2816
|
+
const green = (0, psdReader_1.readInt16)(reader);
|
|
2817
|
+
const blue = (0, psdReader_1.readInt16)(reader);
|
|
2847
2818
|
(0, psdReader_1.skipBytes)(reader, 2);
|
|
2848
|
-
|
|
2849
|
-
return { red
|
|
2819
|
+
const constant = (0, psdReader_1.readInt16)(reader);
|
|
2820
|
+
return { red, green, blue, constant };
|
|
2850
2821
|
}
|
|
2851
2822
|
function writeMixrChannel(writer, channel) {
|
|
2852
|
-
|
|
2823
|
+
const c = channel || {};
|
|
2853
2824
|
(0, psdWriter_1.writeInt16)(writer, c.red);
|
|
2854
2825
|
(0, psdWriter_1.writeInt16)(writer, c.green);
|
|
2855
2826
|
(0, psdWriter_1.writeInt16)(writer, c.blue);
|
|
2856
2827
|
(0, psdWriter_1.writeZeros)(writer, 2);
|
|
2857
2828
|
(0, psdWriter_1.writeInt16)(writer, c.constant);
|
|
2858
2829
|
}
|
|
2859
|
-
addHandler('mixr', adjustmentType('channel mixer'),
|
|
2830
|
+
addHandler('mixr', adjustmentType('channel mixer'), (reader, target, left) => {
|
|
2860
2831
|
if ((0, psdReader_1.readUint16)(reader) !== 1)
|
|
2861
2832
|
throw new Error('Invalid mixr version');
|
|
2862
|
-
|
|
2833
|
+
const adjustment = target.adjustment = Object.assign(Object.assign({}, target.adjustment), { type: 'channel mixer', monochrome: !!(0, psdReader_1.readUint16)(reader) });
|
|
2863
2834
|
if (!adjustment.monochrome) {
|
|
2864
2835
|
adjustment.red = readMixrChannel(reader);
|
|
2865
2836
|
adjustment.green = readMixrChannel(reader);
|
|
@@ -2867,8 +2838,8 @@ addHandler('mixr', adjustmentType('channel mixer'), function (reader, target, le
|
|
|
2867
2838
|
}
|
|
2868
2839
|
adjustment.gray = readMixrChannel(reader);
|
|
2869
2840
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
2870
|
-
},
|
|
2871
|
-
|
|
2841
|
+
}, (writer, target) => {
|
|
2842
|
+
const info = target.adjustment;
|
|
2872
2843
|
(0, psdWriter_1.writeUint16)(writer, 1); // version
|
|
2873
2844
|
(0, psdWriter_1.writeUint16)(writer, info.monochrome ? 1 : 0);
|
|
2874
2845
|
if (info.monochrome) {
|
|
@@ -2882,26 +2853,26 @@ addHandler('mixr', adjustmentType('channel mixer'), function (reader, target, le
|
|
|
2882
2853
|
writeMixrChannel(writer, info.gray);
|
|
2883
2854
|
}
|
|
2884
2855
|
});
|
|
2885
|
-
|
|
2856
|
+
const colorLookupType = (0, helpers_1.createEnum)('colorLookupType', '3DLUT', {
|
|
2886
2857
|
'3dlut': '3DLUT',
|
|
2887
2858
|
abstractProfile: 'abstractProfile',
|
|
2888
2859
|
deviceLinkProfile: 'deviceLinkProfile',
|
|
2889
2860
|
});
|
|
2890
|
-
|
|
2861
|
+
const LUTFormatType = (0, helpers_1.createEnum)('LUTFormatType', 'look', {
|
|
2891
2862
|
look: 'LUTFormatLOOK',
|
|
2892
2863
|
cube: 'LUTFormatCUBE',
|
|
2893
2864
|
'3dl': 'LUTFormat3DL',
|
|
2894
2865
|
});
|
|
2895
|
-
|
|
2866
|
+
const colorLookupOrder = (0, helpers_1.createEnum)('colorLookupOrder', 'rgb', {
|
|
2896
2867
|
rgb: 'rgbOrder',
|
|
2897
2868
|
bgr: 'bgrOrder',
|
|
2898
2869
|
});
|
|
2899
|
-
addHandler('clrL', adjustmentType('color lookup'),
|
|
2870
|
+
addHandler('clrL', adjustmentType('color lookup'), (reader, target, left) => {
|
|
2900
2871
|
if ((0, psdReader_1.readUint16)(reader) !== 1)
|
|
2901
2872
|
throw new Error('Invalid clrL version');
|
|
2902
|
-
|
|
2873
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
2903
2874
|
target.adjustment = { type: 'color lookup' };
|
|
2904
|
-
|
|
2875
|
+
const info = target.adjustment;
|
|
2905
2876
|
if (desc.lookupType !== undefined)
|
|
2906
2877
|
info.lookupType = colorLookupType.decode(desc.lookupType);
|
|
2907
2878
|
if (desc['Nm '] !== undefined)
|
|
@@ -2921,9 +2892,9 @@ addHandler('clrL', adjustmentType('color lookup'), function (reader, target, lef
|
|
|
2921
2892
|
if (desc.LUT3DFileName !== undefined)
|
|
2922
2893
|
info.lut3DFileName = desc.LUT3DFileName;
|
|
2923
2894
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
2924
|
-
},
|
|
2925
|
-
|
|
2926
|
-
|
|
2895
|
+
}, (writer, target) => {
|
|
2896
|
+
const info = target.adjustment;
|
|
2897
|
+
const desc = {};
|
|
2927
2898
|
if (info.lookupType !== undefined)
|
|
2928
2899
|
desc.lookupType = colorLookupType.encode(info.lookupType);
|
|
2929
2900
|
if (info.name !== undefined)
|
|
@@ -2945,58 +2916,58 @@ addHandler('clrL', adjustmentType('color lookup'), function (reader, target, lef
|
|
|
2945
2916
|
(0, psdWriter_1.writeUint16)(writer, 1); // version
|
|
2946
2917
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
|
|
2947
2918
|
});
|
|
2948
|
-
addHandler('nvrt', adjustmentType('invert'),
|
|
2919
|
+
addHandler('nvrt', adjustmentType('invert'), (reader, target, left) => {
|
|
2949
2920
|
target.adjustment = { type: 'invert' };
|
|
2950
2921
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
2951
|
-
},
|
|
2922
|
+
}, () => {
|
|
2952
2923
|
// nothing to write here
|
|
2953
2924
|
});
|
|
2954
|
-
addHandler('post', adjustmentType('posterize'),
|
|
2925
|
+
addHandler('post', adjustmentType('posterize'), (reader, target, left) => {
|
|
2955
2926
|
target.adjustment = {
|
|
2956
2927
|
type: 'posterize',
|
|
2957
2928
|
levels: (0, psdReader_1.readUint16)(reader),
|
|
2958
2929
|
};
|
|
2959
2930
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
2960
|
-
},
|
|
2931
|
+
}, (writer, target) => {
|
|
2961
2932
|
var _a;
|
|
2962
|
-
|
|
2933
|
+
const info = target.adjustment;
|
|
2963
2934
|
(0, psdWriter_1.writeUint16)(writer, (_a = info.levels) !== null && _a !== void 0 ? _a : 4);
|
|
2964
2935
|
(0, psdWriter_1.writeZeros)(writer, 2);
|
|
2965
2936
|
});
|
|
2966
|
-
addHandler('thrs', adjustmentType('threshold'),
|
|
2937
|
+
addHandler('thrs', adjustmentType('threshold'), (reader, target, left) => {
|
|
2967
2938
|
target.adjustment = {
|
|
2968
2939
|
type: 'threshold',
|
|
2969
2940
|
level: (0, psdReader_1.readUint16)(reader),
|
|
2970
2941
|
};
|
|
2971
2942
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
2972
|
-
},
|
|
2943
|
+
}, (writer, target) => {
|
|
2973
2944
|
var _a;
|
|
2974
|
-
|
|
2945
|
+
const info = target.adjustment;
|
|
2975
2946
|
(0, psdWriter_1.writeUint16)(writer, (_a = info.level) !== null && _a !== void 0 ? _a : 128);
|
|
2976
2947
|
(0, psdWriter_1.writeZeros)(writer, 2);
|
|
2977
2948
|
});
|
|
2978
|
-
|
|
2979
|
-
addHandler('grdm', adjustmentType('gradient map'),
|
|
2980
|
-
|
|
2949
|
+
const grdmColorModels = ['', '', '', 'rgb', 'hsb', '', 'lab'];
|
|
2950
|
+
addHandler('grdm', adjustmentType('gradient map'), (reader, target, left) => {
|
|
2951
|
+
const version = (0, psdReader_1.readUint16)(reader);
|
|
2981
2952
|
if (version !== 1 && version !== 3)
|
|
2982
2953
|
throw new Error('Invalid grdm version');
|
|
2983
|
-
|
|
2954
|
+
const info = {
|
|
2984
2955
|
type: 'gradient map',
|
|
2985
2956
|
gradientType: 'solid',
|
|
2986
2957
|
};
|
|
2987
2958
|
info.reverse = !!(0, psdReader_1.readUint8)(reader);
|
|
2988
2959
|
info.dither = !!(0, psdReader_1.readUint8)(reader);
|
|
2989
|
-
|
|
2960
|
+
const hasMethod = !!(0, psdReader_1.readUint8)(reader);
|
|
2990
2961
|
reader.offset--;
|
|
2991
2962
|
if (hasMethod) {
|
|
2992
|
-
|
|
2963
|
+
const method = (0, psdReader_1.readSignature)(reader);
|
|
2993
2964
|
info.method = descriptor_1.gradientInterpolationMethodType.decode(method);
|
|
2994
2965
|
}
|
|
2995
2966
|
info.name = (0, psdReader_1.readUnicodeString)(reader);
|
|
2996
2967
|
info.colorStops = [];
|
|
2997
2968
|
info.opacityStops = [];
|
|
2998
|
-
|
|
2999
|
-
for (
|
|
2969
|
+
const stopsCount = (0, psdReader_1.readUint16)(reader);
|
|
2970
|
+
for (let i = 0; i < stopsCount; i++) {
|
|
3000
2971
|
info.colorStops.push({
|
|
3001
2972
|
location: (0, psdReader_1.readUint32)(reader),
|
|
3002
2973
|
midpoint: (0, psdReader_1.readUint32)(reader) / 100,
|
|
@@ -3004,20 +2975,20 @@ addHandler('grdm', adjustmentType('gradient map'), function (reader, target, lef
|
|
|
3004
2975
|
});
|
|
3005
2976
|
(0, psdReader_1.skipBytes)(reader, 2);
|
|
3006
2977
|
}
|
|
3007
|
-
|
|
3008
|
-
for (
|
|
2978
|
+
const opacityStopsCount = (0, psdReader_1.readUint16)(reader);
|
|
2979
|
+
for (let i = 0; i < opacityStopsCount; i++) {
|
|
3009
2980
|
info.opacityStops.push({
|
|
3010
2981
|
location: (0, psdReader_1.readUint32)(reader),
|
|
3011
2982
|
midpoint: (0, psdReader_1.readUint32)(reader) / 100,
|
|
3012
2983
|
opacity: (0, psdReader_1.readUint16)(reader) / 0xff,
|
|
3013
2984
|
});
|
|
3014
2985
|
}
|
|
3015
|
-
|
|
2986
|
+
const expansionCount = (0, psdReader_1.readUint16)(reader);
|
|
3016
2987
|
if (expansionCount !== 2)
|
|
3017
2988
|
throw new Error('Invalid grdm expansion count');
|
|
3018
|
-
|
|
2989
|
+
const interpolation = (0, psdReader_1.readUint16)(reader);
|
|
3019
2990
|
info.smoothness = interpolation / 4096;
|
|
3020
|
-
|
|
2991
|
+
const length = (0, psdReader_1.readUint16)(reader);
|
|
3021
2992
|
if (length !== 32)
|
|
3022
2993
|
throw new Error('Invalid grdm length');
|
|
3023
2994
|
info.gradientType = (0, psdReader_1.readUint16)(reader) ? 'noise' : 'solid';
|
|
@@ -3039,18 +3010,14 @@ addHandler('grdm', adjustmentType('gradient map'), function (reader, target, lef
|
|
|
3039
3010
|
(0, psdReader_1.readUint16)(reader) / 0x8000,
|
|
3040
3011
|
];
|
|
3041
3012
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
3042
|
-
for (
|
|
3043
|
-
var s = _a[_i];
|
|
3013
|
+
for (const s of info.colorStops)
|
|
3044
3014
|
s.location /= interpolation;
|
|
3045
|
-
|
|
3046
|
-
for (var _b = 0, _c = info.opacityStops; _b < _c.length; _b++) {
|
|
3047
|
-
var s = _c[_b];
|
|
3015
|
+
for (const s of info.opacityStops)
|
|
3048
3016
|
s.location /= interpolation;
|
|
3049
|
-
}
|
|
3050
3017
|
target.adjustment = info;
|
|
3051
|
-
},
|
|
3018
|
+
}, (writer, target) => {
|
|
3052
3019
|
var _a, _b, _c;
|
|
3053
|
-
|
|
3020
|
+
const info = target.adjustment;
|
|
3054
3021
|
(0, psdWriter_1.writeUint16)(writer, info.method !== undefined ? 3 : 1); // version
|
|
3055
3022
|
(0, psdWriter_1.writeUint8)(writer, info.reverse ? 1 : 0);
|
|
3056
3023
|
(0, psdWriter_1.writeUint8)(writer, info.dither ? 1 : 0);
|
|
@@ -3059,17 +3026,15 @@ addHandler('grdm', adjustmentType('gradient map'), function (reader, target, lef
|
|
|
3059
3026
|
}
|
|
3060
3027
|
(0, psdWriter_1.writeUnicodeStringWithPadding)(writer, info.name || '');
|
|
3061
3028
|
(0, psdWriter_1.writeUint16)(writer, info.colorStops && info.colorStops.length || 0);
|
|
3062
|
-
|
|
3063
|
-
for (
|
|
3064
|
-
var s = _d[_i];
|
|
3029
|
+
const interpolation = Math.round(((_a = info.smoothness) !== null && _a !== void 0 ? _a : 1) * 4096);
|
|
3030
|
+
for (const s of info.colorStops || []) {
|
|
3065
3031
|
(0, psdWriter_1.writeUint32)(writer, Math.round(s.location * interpolation));
|
|
3066
3032
|
(0, psdWriter_1.writeUint32)(writer, Math.round(s.midpoint * 100));
|
|
3067
3033
|
(0, psdWriter_1.writeColor)(writer, s.color);
|
|
3068
3034
|
(0, psdWriter_1.writeZeros)(writer, 2);
|
|
3069
3035
|
}
|
|
3070
3036
|
(0, psdWriter_1.writeUint16)(writer, info.opacityStops && info.opacityStops.length || 0);
|
|
3071
|
-
for (
|
|
3072
|
-
var s = _f[_e];
|
|
3037
|
+
for (const s of info.opacityStops || []) {
|
|
3073
3038
|
(0, psdWriter_1.writeUint32)(writer, Math.round(s.location * interpolation));
|
|
3074
3039
|
(0, psdWriter_1.writeUint32)(writer, Math.round(s.midpoint * 100));
|
|
3075
3040
|
(0, psdWriter_1.writeUint16)(writer, Math.round(s.opacity * 0xff));
|
|
@@ -3082,11 +3047,11 @@ addHandler('grdm', adjustmentType('gradient map'), function (reader, target, lef
|
|
|
3082
3047
|
(0, psdWriter_1.writeUint16)(writer, info.addTransparency ? 1 : 0);
|
|
3083
3048
|
(0, psdWriter_1.writeUint16)(writer, info.restrictColors ? 1 : 0);
|
|
3084
3049
|
(0, psdWriter_1.writeUint32)(writer, Math.round(((_b = info.roughness) !== null && _b !== void 0 ? _b : 1) * 4096));
|
|
3085
|
-
|
|
3050
|
+
const colorModel = grdmColorModels.indexOf((_c = info.colorModel) !== null && _c !== void 0 ? _c : 'rgb');
|
|
3086
3051
|
(0, psdWriter_1.writeUint16)(writer, colorModel === -1 ? 3 : colorModel);
|
|
3087
|
-
for (
|
|
3052
|
+
for (let i = 0; i < 4; i++)
|
|
3088
3053
|
(0, psdWriter_1.writeUint16)(writer, Math.round((info.min && info.min[i] || 0) * 0x8000));
|
|
3089
|
-
for (
|
|
3054
|
+
for (let i = 0; i < 4; i++)
|
|
3090
3055
|
(0, psdWriter_1.writeUint16)(writer, Math.round((info.max && info.max[i] || 0) * 0x8000));
|
|
3091
3056
|
(0, psdWriter_1.writeZeros)(writer, 4);
|
|
3092
3057
|
});
|
|
@@ -3099,20 +3064,20 @@ function readSelectiveColors(reader) {
|
|
|
3099
3064
|
};
|
|
3100
3065
|
}
|
|
3101
3066
|
function writeSelectiveColors(writer, cmyk) {
|
|
3102
|
-
|
|
3067
|
+
const c = cmyk || {};
|
|
3103
3068
|
(0, psdWriter_1.writeInt16)(writer, c.c);
|
|
3104
3069
|
(0, psdWriter_1.writeInt16)(writer, c.m);
|
|
3105
3070
|
(0, psdWriter_1.writeInt16)(writer, c.y);
|
|
3106
3071
|
(0, psdWriter_1.writeInt16)(writer, c.k);
|
|
3107
3072
|
}
|
|
3108
|
-
addHandler('selc', adjustmentType('selective color'),
|
|
3073
|
+
addHandler('selc', adjustmentType('selective color'), (reader, target) => {
|
|
3109
3074
|
if ((0, psdReader_1.readUint16)(reader) !== 1)
|
|
3110
3075
|
throw new Error('Invalid selc version');
|
|
3111
|
-
|
|
3076
|
+
const mode = (0, psdReader_1.readUint16)(reader) ? 'absolute' : 'relative';
|
|
3112
3077
|
(0, psdReader_1.skipBytes)(reader, 8);
|
|
3113
3078
|
target.adjustment = {
|
|
3114
3079
|
type: 'selective color',
|
|
3115
|
-
mode
|
|
3080
|
+
mode,
|
|
3116
3081
|
reds: readSelectiveColors(reader),
|
|
3117
3082
|
yellows: readSelectiveColors(reader),
|
|
3118
3083
|
greens: readSelectiveColors(reader),
|
|
@@ -3123,8 +3088,8 @@ addHandler('selc', adjustmentType('selective color'), function (reader, target)
|
|
|
3123
3088
|
neutrals: readSelectiveColors(reader),
|
|
3124
3089
|
blacks: readSelectiveColors(reader),
|
|
3125
3090
|
};
|
|
3126
|
-
},
|
|
3127
|
-
|
|
3091
|
+
}, (writer, target) => {
|
|
3092
|
+
const info = target.adjustment;
|
|
3128
3093
|
(0, psdWriter_1.writeUint16)(writer, 1); // version
|
|
3129
3094
|
(0, psdWriter_1.writeUint16)(writer, info.mode === 'absolute' ? 1 : 0);
|
|
3130
3095
|
(0, psdWriter_1.writeZeros)(writer, 8);
|
|
@@ -3138,26 +3103,26 @@ addHandler('selc', adjustmentType('selective color'), function (reader, target)
|
|
|
3138
3103
|
writeSelectiveColors(writer, info.neutrals);
|
|
3139
3104
|
writeSelectiveColors(writer, info.blacks);
|
|
3140
3105
|
});
|
|
3141
|
-
addHandler('CgEd',
|
|
3142
|
-
|
|
3106
|
+
addHandler('CgEd', target => {
|
|
3107
|
+
const a = target.adjustment;
|
|
3143
3108
|
if (!a)
|
|
3144
3109
|
return false;
|
|
3145
3110
|
return (a.type === 'brightness/contrast' && !a.useLegacy) ||
|
|
3146
3111
|
((a.type === 'levels' || a.type === 'curves' || a.type === 'exposure' || a.type === 'channel mixer' ||
|
|
3147
3112
|
a.type === 'hue/saturation') && a.presetFileName !== undefined);
|
|
3148
|
-
},
|
|
3149
|
-
|
|
3113
|
+
}, (reader, target, left) => {
|
|
3114
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
3150
3115
|
if (desc.Vrsn !== 1)
|
|
3151
3116
|
throw new Error('Invalid CgEd version');
|
|
3152
3117
|
// this section can specify preset file name for other adjustment types
|
|
3153
3118
|
if ('presetFileName' in desc) {
|
|
3154
|
-
target.adjustment =
|
|
3119
|
+
target.adjustment = Object.assign(Object.assign({}, target.adjustment), { presetKind: desc.presetKind, presetFileName: desc.presetFileName });
|
|
3155
3120
|
}
|
|
3156
3121
|
else if ('curvesPresetFileName' in desc) {
|
|
3157
|
-
target.adjustment =
|
|
3122
|
+
target.adjustment = Object.assign(Object.assign({}, target.adjustment), { presetKind: desc.curvesPresetKind, presetFileName: desc.curvesPresetFileName });
|
|
3158
3123
|
}
|
|
3159
3124
|
else if ('mixerPresetFileName' in desc) {
|
|
3160
|
-
target.adjustment =
|
|
3125
|
+
target.adjustment = Object.assign(Object.assign({}, target.adjustment), { presetKind: desc.mixerPresetKind, presetFileName: desc.mixerPresetFileName });
|
|
3161
3126
|
}
|
|
3162
3127
|
else {
|
|
3163
3128
|
target.adjustment = {
|
|
@@ -3171,11 +3136,11 @@ addHandler('CgEd', function (target) {
|
|
|
3171
3136
|
};
|
|
3172
3137
|
}
|
|
3173
3138
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
3174
|
-
},
|
|
3139
|
+
}, (writer, target) => {
|
|
3175
3140
|
var _a, _b, _c, _d;
|
|
3176
|
-
|
|
3141
|
+
const info = target.adjustment;
|
|
3177
3142
|
if (info.type === 'levels' || info.type === 'exposure' || info.type === 'hue/saturation') {
|
|
3178
|
-
|
|
3143
|
+
const desc = {
|
|
3179
3144
|
Vrsn: 1,
|
|
3180
3145
|
presetKind: (_a = info.presetKind) !== null && _a !== void 0 ? _a : 1,
|
|
3181
3146
|
presetFileName: info.presetFileName || '',
|
|
@@ -3183,7 +3148,7 @@ addHandler('CgEd', function (target) {
|
|
|
3183
3148
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
|
|
3184
3149
|
}
|
|
3185
3150
|
else if (info.type === 'curves') {
|
|
3186
|
-
|
|
3151
|
+
const desc = {
|
|
3187
3152
|
Vrsn: 1,
|
|
3188
3153
|
curvesPresetKind: (_b = info.presetKind) !== null && _b !== void 0 ? _b : 1,
|
|
3189
3154
|
curvesPresetFileName: info.presetFileName || '',
|
|
@@ -3191,7 +3156,7 @@ addHandler('CgEd', function (target) {
|
|
|
3191
3156
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
|
|
3192
3157
|
}
|
|
3193
3158
|
else if (info.type === 'channel mixer') {
|
|
3194
|
-
|
|
3159
|
+
const desc = {
|
|
3195
3160
|
Vrsn: 1,
|
|
3196
3161
|
mixerPresetKind: (_c = info.presetKind) !== null && _c !== void 0 ? _c : 1,
|
|
3197
3162
|
mixerPresetFileName: info.presetFileName || '',
|
|
@@ -3199,7 +3164,7 @@ addHandler('CgEd', function (target) {
|
|
|
3199
3164
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
|
|
3200
3165
|
}
|
|
3201
3166
|
else if (info.type === 'brightness/contrast') {
|
|
3202
|
-
|
|
3167
|
+
const desc = {
|
|
3203
3168
|
Vrsn: 1,
|
|
3204
3169
|
Brgh: info.brightness || 0,
|
|
3205
3170
|
Cntr: info.contrast || 0,
|
|
@@ -3215,12 +3180,11 @@ addHandler('CgEd', function (target) {
|
|
|
3215
3180
|
}
|
|
3216
3181
|
});
|
|
3217
3182
|
function getTextLayersSortedByIndex(psd) {
|
|
3218
|
-
|
|
3183
|
+
const layers = [];
|
|
3219
3184
|
function collect(layer) {
|
|
3220
3185
|
var _a;
|
|
3221
3186
|
if (layer.children) {
|
|
3222
|
-
for (
|
|
3223
|
-
var child = _b[_i];
|
|
3187
|
+
for (const child of layer.children) {
|
|
3224
3188
|
if (((_a = child.text) === null || _a === void 0 ? void 0 : _a.index) !== undefined) {
|
|
3225
3189
|
layers[child.text.index] = child;
|
|
3226
3190
|
}
|
|
@@ -3231,16 +3195,16 @@ function getTextLayersSortedByIndex(psd) {
|
|
|
3231
3195
|
collect(psd);
|
|
3232
3196
|
return layers;
|
|
3233
3197
|
}
|
|
3234
|
-
addHandler('Txt2', hasKey('engineData'),
|
|
3235
|
-
|
|
3198
|
+
addHandler('Txt2', hasKey('engineData'), (reader, target, left, psd) => {
|
|
3199
|
+
const data = (0, psdReader_1.readBytes)(reader, left());
|
|
3236
3200
|
target.engineData = (0, base64_js_1.fromByteArray)(data);
|
|
3237
|
-
|
|
3238
|
-
|
|
3239
|
-
|
|
3240
|
-
|
|
3201
|
+
const layersByIndex = getTextLayersSortedByIndex(psd);
|
|
3202
|
+
const engineData = (0, engineData_1.parseEngineData)(data);
|
|
3203
|
+
const engineData2 = (0, engineData2_1.decodeEngineData2)(engineData);
|
|
3204
|
+
const TextFrameSet = engineData2.ResourceDict.TextFrameSet;
|
|
3241
3205
|
if (TextFrameSet) {
|
|
3242
|
-
for (
|
|
3243
|
-
|
|
3206
|
+
for (let i = 0; i < TextFrameSet.length; i++) {
|
|
3207
|
+
const layer = layersByIndex[i];
|
|
3244
3208
|
if (TextFrameSet[i].path && (layer === null || layer === void 0 ? void 0 : layer.text)) {
|
|
3245
3209
|
layer.text.textPath = TextFrameSet[i].path;
|
|
3246
3210
|
}
|
|
@@ -3250,94 +3214,93 @@ addHandler('Txt2', hasKey('engineData'), function (reader, target, left, psd) {
|
|
|
3250
3214
|
// require('fs').writeFileSync('test_data.bin', data);
|
|
3251
3215
|
// require('fs').writeFileSync('test_data.txt', require('util').inspect(engineData, false, 99, false), 'utf8');
|
|
3252
3216
|
// require('fs').writeFileSync('test_data.json', JSON.stringify(engineData2, null, 2), 'utf8');
|
|
3253
|
-
},
|
|
3254
|
-
|
|
3217
|
+
}, (writer, target) => {
|
|
3218
|
+
const buffer = (0, base64_js_1.toByteArray)(target.engineData);
|
|
3255
3219
|
(0, psdWriter_1.writeBytes)(writer, buffer);
|
|
3256
3220
|
});
|
|
3257
|
-
addHandler('FEid', hasKey('filterEffectsMasks'),
|
|
3258
|
-
|
|
3221
|
+
addHandler('FEid', hasKey('filterEffectsMasks'), (reader, target, leftBytes) => {
|
|
3222
|
+
const version = (0, psdReader_1.readInt32)(reader);
|
|
3259
3223
|
if (version < 1 || version > 3)
|
|
3260
|
-
throw new Error(
|
|
3224
|
+
throw new Error(`Invalid filterEffects version ${version}`);
|
|
3261
3225
|
target.filterEffectsMasks = [];
|
|
3262
3226
|
while (leftBytes() > 8) {
|
|
3263
3227
|
if ((0, psdReader_1.readUint32)(reader))
|
|
3264
3228
|
throw new Error('filterEffects: 64 bit length is not supported');
|
|
3265
|
-
|
|
3266
|
-
|
|
3267
|
-
|
|
3268
|
-
|
|
3229
|
+
const length = (0, psdReader_1.readUint32)(reader);
|
|
3230
|
+
const end = reader.offset + length;
|
|
3231
|
+
const id = (0, psdReader_1.readPascalString)(reader, 1);
|
|
3232
|
+
const effectVersion = (0, psdReader_1.readInt32)(reader);
|
|
3269
3233
|
if (effectVersion !== 1)
|
|
3270
|
-
throw new Error(
|
|
3234
|
+
throw new Error(`Invalid filterEffect version ${effectVersion}`);
|
|
3271
3235
|
if ((0, psdReader_1.readUint32)(reader))
|
|
3272
3236
|
throw new Error('filterEffect: 64 bit length is not supported');
|
|
3273
3237
|
/*const effectLength =*/ (0, psdReader_1.readUint32)(reader);
|
|
3274
3238
|
// const endOfEffect = reader.offset + effectLength;
|
|
3275
|
-
|
|
3276
|
-
|
|
3277
|
-
|
|
3278
|
-
|
|
3279
|
-
|
|
3280
|
-
|
|
3281
|
-
|
|
3239
|
+
const top = (0, psdReader_1.readInt32)(reader);
|
|
3240
|
+
const left = (0, psdReader_1.readInt32)(reader);
|
|
3241
|
+
const bottom = (0, psdReader_1.readInt32)(reader);
|
|
3242
|
+
const right = (0, psdReader_1.readInt32)(reader);
|
|
3243
|
+
const depth = (0, psdReader_1.readInt32)(reader);
|
|
3244
|
+
const maxChannels = (0, psdReader_1.readInt32)(reader);
|
|
3245
|
+
const channels = [];
|
|
3282
3246
|
// 0 -> R, 1 -> G, 2 -> B, 25 -> A
|
|
3283
|
-
for (
|
|
3284
|
-
|
|
3247
|
+
for (let i = 0; i < (maxChannels + 2); i++) { // channels + user mask + sheet mask
|
|
3248
|
+
const exists = (0, psdReader_1.readInt32)(reader);
|
|
3285
3249
|
if (exists) {
|
|
3286
3250
|
if ((0, psdReader_1.readUint32)(reader))
|
|
3287
3251
|
throw new Error('filterEffect: 64 bit length is not supported');
|
|
3288
|
-
|
|
3252
|
+
const channelLength = (0, psdReader_1.readUint32)(reader);
|
|
3289
3253
|
if (!channelLength)
|
|
3290
3254
|
throw new Error('filterEffect: Empty channel');
|
|
3291
|
-
|
|
3292
|
-
|
|
3293
|
-
channels.push({ compressionMode
|
|
3255
|
+
const compressionMode = (0, psdReader_1.readUint16)(reader);
|
|
3256
|
+
const data = (0, psdReader_1.readBytes)(reader, channelLength - 2);
|
|
3257
|
+
channels.push({ compressionMode, data });
|
|
3294
3258
|
}
|
|
3295
3259
|
else {
|
|
3296
3260
|
channels.push(undefined);
|
|
3297
3261
|
}
|
|
3298
3262
|
}
|
|
3299
|
-
target.filterEffectsMasks.push({ id
|
|
3263
|
+
target.filterEffectsMasks.push({ id, top, left, bottom, right, depth, channels });
|
|
3300
3264
|
if (reader.offset < end && (0, psdReader_1.readUint8)(reader)) {
|
|
3301
|
-
|
|
3302
|
-
|
|
3303
|
-
|
|
3304
|
-
|
|
3265
|
+
const top = (0, psdReader_1.readInt32)(reader);
|
|
3266
|
+
const left = (0, psdReader_1.readInt32)(reader);
|
|
3267
|
+
const bottom = (0, psdReader_1.readInt32)(reader);
|
|
3268
|
+
const right = (0, psdReader_1.readInt32)(reader);
|
|
3305
3269
|
if ((0, psdReader_1.readUint32)(reader))
|
|
3306
3270
|
throw new Error('filterEffect: 64 bit length is not supported');
|
|
3307
|
-
|
|
3308
|
-
|
|
3309
|
-
|
|
3310
|
-
target.filterEffectsMasks[target.filterEffectsMasks.length - 1].extra = { top
|
|
3271
|
+
const extraLength = (0, psdReader_1.readUint32)(reader);
|
|
3272
|
+
const compressionMode = (0, psdReader_1.readUint16)(reader);
|
|
3273
|
+
const data = (0, psdReader_1.readBytes)(reader, extraLength - 2);
|
|
3274
|
+
target.filterEffectsMasks[target.filterEffectsMasks.length - 1].extra = { top, left, bottom, right, compressionMode, data };
|
|
3311
3275
|
}
|
|
3312
3276
|
reader.offset = end;
|
|
3313
|
-
|
|
3277
|
+
let len = length;
|
|
3314
3278
|
while (len % 4) {
|
|
3315
3279
|
reader.offset++;
|
|
3316
3280
|
len++;
|
|
3317
3281
|
}
|
|
3318
3282
|
}
|
|
3319
|
-
},
|
|
3283
|
+
}, (writer, target) => {
|
|
3320
3284
|
var _a;
|
|
3321
3285
|
(0, psdWriter_1.writeInt32)(writer, 3); // version
|
|
3322
|
-
for (
|
|
3323
|
-
var mask = _b[_i];
|
|
3286
|
+
for (const mask of target.filterEffectsMasks) {
|
|
3324
3287
|
(0, psdWriter_1.writeUint32)(writer, 0);
|
|
3325
3288
|
(0, psdWriter_1.writeUint32)(writer, 0);
|
|
3326
|
-
|
|
3289
|
+
const lengthOffset = writer.offset;
|
|
3327
3290
|
(0, psdWriter_1.writePascalString)(writer, mask.id, 1);
|
|
3328
3291
|
(0, psdWriter_1.writeInt32)(writer, 1); // version
|
|
3329
3292
|
(0, psdWriter_1.writeUint32)(writer, 0);
|
|
3330
3293
|
(0, psdWriter_1.writeUint32)(writer, 0);
|
|
3331
|
-
|
|
3294
|
+
const length2Offset = writer.offset;
|
|
3332
3295
|
(0, psdWriter_1.writeInt32)(writer, mask.top);
|
|
3333
3296
|
(0, psdWriter_1.writeInt32)(writer, mask.left);
|
|
3334
3297
|
(0, psdWriter_1.writeInt32)(writer, mask.bottom);
|
|
3335
3298
|
(0, psdWriter_1.writeInt32)(writer, mask.right);
|
|
3336
3299
|
(0, psdWriter_1.writeInt32)(writer, mask.depth);
|
|
3337
|
-
|
|
3300
|
+
const maxChannels = Math.max(0, mask.channels.length - 2);
|
|
3338
3301
|
(0, psdWriter_1.writeInt32)(writer, maxChannels);
|
|
3339
|
-
for (
|
|
3340
|
-
|
|
3302
|
+
for (let i = 0; i < (maxChannels + 2); i++) {
|
|
3303
|
+
const channel = mask.channels[i];
|
|
3341
3304
|
(0, psdWriter_1.writeInt32)(writer, channel ? 1 : 0);
|
|
3342
3305
|
if (channel) {
|
|
3343
3306
|
(0, psdWriter_1.writeUint32)(writer, 0);
|
|
@@ -3347,7 +3310,7 @@ addHandler('FEid', hasKey('filterEffectsMasks'), function (reader, target, leftB
|
|
|
3347
3310
|
}
|
|
3348
3311
|
}
|
|
3349
3312
|
writer.view.setUint32(length2Offset - 4, writer.offset - length2Offset, false);
|
|
3350
|
-
|
|
3313
|
+
const extra = (_a = target.filterEffectsMasks[target.filterEffectsMasks.length - 1]) === null || _a === void 0 ? void 0 : _a.extra;
|
|
3351
3314
|
if (extra) {
|
|
3352
3315
|
(0, psdWriter_1.writeUint8)(writer, 1);
|
|
3353
3316
|
(0, psdWriter_1.writeInt32)(writer, extra.top);
|
|
@@ -3359,29 +3322,29 @@ addHandler('FEid', hasKey('filterEffectsMasks'), function (reader, target, leftB
|
|
|
3359
3322
|
(0, psdWriter_1.writeUint16)(writer, extra.compressionMode);
|
|
3360
3323
|
(0, psdWriter_1.writeBytes)(writer, extra.data);
|
|
3361
3324
|
}
|
|
3362
|
-
|
|
3363
|
-
writer.view.setUint32(lengthOffset - 4,
|
|
3364
|
-
while (
|
|
3325
|
+
let length = writer.offset - lengthOffset;
|
|
3326
|
+
writer.view.setUint32(lengthOffset - 4, length, false);
|
|
3327
|
+
while (length % 4) {
|
|
3365
3328
|
(0, psdWriter_1.writeZeros)(writer, 1);
|
|
3366
|
-
|
|
3329
|
+
length++;
|
|
3367
3330
|
}
|
|
3368
3331
|
}
|
|
3369
3332
|
});
|
|
3370
3333
|
addHandlerAlias('FXid', 'FEid');
|
|
3371
|
-
addHandler('FMsk', hasKey('filterMask'),
|
|
3334
|
+
addHandler('FMsk', hasKey('filterMask'), (reader, target) => {
|
|
3372
3335
|
target.filterMask = {
|
|
3373
3336
|
colorSpace: (0, psdReader_1.readColor)(reader),
|
|
3374
3337
|
opacity: (0, psdReader_1.readUint16)(reader) / 0xff,
|
|
3375
3338
|
};
|
|
3376
|
-
},
|
|
3339
|
+
}, (writer, target) => {
|
|
3377
3340
|
var _a;
|
|
3378
3341
|
(0, psdWriter_1.writeColor)(writer, target.filterMask.colorSpace);
|
|
3379
3342
|
(0, psdWriter_1.writeUint16)(writer, (0, helpers_1.clamp)((_a = target.filterMask.opacity) !== null && _a !== void 0 ? _a : 1, 0, 1) * 0xff);
|
|
3380
3343
|
});
|
|
3381
3344
|
addHandler('artd', // document-wide artboard info
|
|
3382
|
-
|
|
3383
|
-
target
|
|
3384
|
-
|
|
3345
|
+
// document-wide artboard info
|
|
3346
|
+
target => target.artboards !== undefined, (reader, target, left) => {
|
|
3347
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
3385
3348
|
target.artboards = {
|
|
3386
3349
|
count: desc['Cnt '],
|
|
3387
3350
|
autoExpandOffset: { horizontal: desc.autoExpandOffset.Hrzn, vertical: desc.autoExpandOffset.Vrtc },
|
|
@@ -3394,10 +3357,10 @@ target) { return target.artboards !== undefined; }, function (reader, target, le
|
|
|
3394
3357
|
docDefaultNewArtboardBackgroundType: desc.docDefaultNewArtboardBackgroundType,
|
|
3395
3358
|
};
|
|
3396
3359
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
3397
|
-
},
|
|
3360
|
+
}, (writer, target) => {
|
|
3398
3361
|
var _a, _b, _c, _d, _e;
|
|
3399
|
-
|
|
3400
|
-
|
|
3362
|
+
const artb = target.artboards;
|
|
3363
|
+
const desc = {
|
|
3401
3364
|
'Cnt ': artb.count,
|
|
3402
3365
|
autoExpandOffset: artb.autoExpandOffset ? { Hrzn: artb.autoExpandOffset.horizontal, Vrtc: artb.autoExpandOffset.vertical } : { Hrzn: 0, Vrtc: 0 },
|
|
3403
3366
|
origin: artb.origin ? { Hrzn: artb.origin.horizontal, Vrtc: artb.origin.vertical } : { Hrzn: 0, Vrtc: 0 },
|
|
@@ -3411,27 +3374,27 @@ target) { return target.artboards !== undefined; }, function (reader, target, le
|
|
|
3411
3374
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc, 'artd');
|
|
3412
3375
|
});
|
|
3413
3376
|
function hasMultiEffects(effects) {
|
|
3414
|
-
return Object.keys(effects).map(
|
|
3377
|
+
return Object.keys(effects).map(key => effects[key]).some(v => Array.isArray(v) && v.length > 1);
|
|
3415
3378
|
}
|
|
3416
3379
|
exports.hasMultiEffects = hasMultiEffects;
|
|
3417
|
-
addHandler('lfx2',
|
|
3418
|
-
|
|
3380
|
+
addHandler('lfx2', target => target.effects !== undefined && !hasMultiEffects(target.effects), (reader, target, left) => {
|
|
3381
|
+
const version = (0, psdReader_1.readUint32)(reader);
|
|
3419
3382
|
if (version !== 0)
|
|
3420
|
-
throw new Error(
|
|
3421
|
-
|
|
3383
|
+
throw new Error(`Invalid lfx2 version`);
|
|
3384
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
3422
3385
|
// console.log('READ', require('util').inspect(desc, false, 99, true));
|
|
3423
3386
|
// TODO: don't discard if we got it from lmfx
|
|
3424
3387
|
// discard if read in 'lrFX' section
|
|
3425
3388
|
target.effects = (0, descriptor_1.parseEffects)(desc, !!reader.logMissingFeatures);
|
|
3426
3389
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
3427
|
-
},
|
|
3428
|
-
|
|
3390
|
+
}, (writer, target, _, options) => {
|
|
3391
|
+
const desc = (0, descriptor_1.serializeEffects)(target.effects, !!options.logMissingFeatures, true);
|
|
3429
3392
|
// console.log('WRITE', require('util').inspect(desc, false, 99, true));
|
|
3430
3393
|
(0, psdWriter_1.writeUint32)(writer, 0); // version
|
|
3431
3394
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
|
|
3432
3395
|
});
|
|
3433
|
-
addHandler('cinf', hasKey('compositorUsed'),
|
|
3434
|
-
|
|
3396
|
+
addHandler('cinf', hasKey('compositorUsed'), (reader, target, left) => {
|
|
3397
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
3435
3398
|
// console.log(require('util').inspect(desc, false, 99, true));
|
|
3436
3399
|
function enumValue(desc) {
|
|
3437
3400
|
return desc.split('.')[1];
|
|
@@ -3456,61 +3419,60 @@ addHandler('cinf', hasKey('compositorUsed'), function (reader, target, left) {
|
|
|
3456
3419
|
if (desc.compCoreGPUSupport)
|
|
3457
3420
|
target.compositorUsed.compCoreGPUSupport = enumValue(desc.compCoreGPUSupport);
|
|
3458
3421
|
(0, psdReader_1.skipBytes)(reader, left());
|
|
3459
|
-
},
|
|
3460
|
-
|
|
3461
|
-
|
|
3422
|
+
}, (writer, target) => {
|
|
3423
|
+
const cinf = target.compositorUsed;
|
|
3424
|
+
const desc = {
|
|
3462
3425
|
Vrsn: cinf.version || { major: 1, minor: 0, fix: 0 },
|
|
3463
3426
|
};
|
|
3464
3427
|
if (cinf.photoshopVersion)
|
|
3465
3428
|
desc.psVersion = cinf.photoshopVersion;
|
|
3466
3429
|
desc.description = cinf.description;
|
|
3467
3430
|
desc.reason = cinf.reason;
|
|
3468
|
-
desc.Engn =
|
|
3431
|
+
desc.Engn = `Engn.${cinf.engine}`;
|
|
3469
3432
|
if (cinf.enableCompCore)
|
|
3470
|
-
desc.enableCompCore =
|
|
3433
|
+
desc.enableCompCore = `enable.${cinf.enableCompCore}`;
|
|
3471
3434
|
if (cinf.enableCompCoreGPU)
|
|
3472
|
-
desc.enableCompCoreGPU =
|
|
3435
|
+
desc.enableCompCoreGPU = `enable.${cinf.enableCompCoreGPU}`;
|
|
3473
3436
|
if (cinf.enableCompCoreThreads)
|
|
3474
|
-
desc.enableCompCoreThreads =
|
|
3437
|
+
desc.enableCompCoreThreads = `enable.${cinf.enableCompCoreThreads}`;
|
|
3475
3438
|
if (cinf.compCoreSupport)
|
|
3476
|
-
desc.compCoreSupport =
|
|
3439
|
+
desc.compCoreSupport = `reason.${cinf.compCoreSupport}`;
|
|
3477
3440
|
if (cinf.compCoreGPUSupport)
|
|
3478
|
-
desc.compCoreGPUSupport =
|
|
3441
|
+
desc.compCoreGPUSupport = `reason.${cinf.compCoreGPUSupport}`;
|
|
3479
3442
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
|
|
3480
3443
|
});
|
|
3481
3444
|
// extension settings ?, ignore it
|
|
3482
|
-
addHandler('extn',
|
|
3483
|
-
|
|
3445
|
+
addHandler('extn', target => target._extn !== undefined, (reader, target) => {
|
|
3446
|
+
const desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
|
|
3484
3447
|
// console.log(require('util').inspect(desc, false, 99, true));
|
|
3485
3448
|
if (helpers_1.MOCK_HANDLERS)
|
|
3486
3449
|
target._extn = desc;
|
|
3487
|
-
},
|
|
3450
|
+
}, (writer, target) => {
|
|
3488
3451
|
// TODO: need to add correct types for desc fields (resources/src.psd)
|
|
3489
3452
|
if (helpers_1.MOCK_HANDLERS)
|
|
3490
3453
|
(0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', target._extn);
|
|
3491
3454
|
});
|
|
3492
|
-
addHandler('iOpa', hasKey('fillOpacity'),
|
|
3455
|
+
addHandler('iOpa', hasKey('fillOpacity'), (reader, target) => {
|
|
3493
3456
|
target.fillOpacity = (0, psdReader_1.readUint8)(reader) / 0xff;
|
|
3494
3457
|
(0, psdReader_1.skipBytes)(reader, 3);
|
|
3495
|
-
},
|
|
3458
|
+
}, (writer, target) => {
|
|
3496
3459
|
(0, psdWriter_1.writeUint8)(writer, target.fillOpacity * 0xff);
|
|
3497
3460
|
(0, psdWriter_1.writeZeros)(writer, 3);
|
|
3498
3461
|
});
|
|
3499
|
-
addHandler('brst', hasKey('channelBlendingRestrictions'),
|
|
3462
|
+
addHandler('brst', hasKey('channelBlendingRestrictions'), (reader, target, left) => {
|
|
3500
3463
|
target.channelBlendingRestrictions = [];
|
|
3501
3464
|
while (left() > 4) {
|
|
3502
3465
|
target.channelBlendingRestrictions.push((0, psdReader_1.readInt32)(reader));
|
|
3503
3466
|
}
|
|
3504
|
-
},
|
|
3505
|
-
for (
|
|
3506
|
-
var channel = _a[_i];
|
|
3467
|
+
}, (writer, target) => {
|
|
3468
|
+
for (const channel of target.channelBlendingRestrictions) {
|
|
3507
3469
|
(0, psdWriter_1.writeInt32)(writer, channel);
|
|
3508
3470
|
}
|
|
3509
3471
|
});
|
|
3510
|
-
addHandler('tsly', hasKey('transparencyShapesLayer'),
|
|
3472
|
+
addHandler('tsly', hasKey('transparencyShapesLayer'), (reader, target) => {
|
|
3511
3473
|
target.transparencyShapesLayer = !!(0, psdReader_1.readUint8)(reader);
|
|
3512
3474
|
(0, psdReader_1.skipBytes)(reader, 3);
|
|
3513
|
-
},
|
|
3475
|
+
}, (writer, target) => {
|
|
3514
3476
|
(0, psdWriter_1.writeUint8)(writer, target.transparencyShapesLayer ? 1 : 0);
|
|
3515
3477
|
(0, psdWriter_1.writeZeros)(writer, 3);
|
|
3516
3478
|
});
|