ag-psd 22.0.2 → 23.1.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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## v23.1.0
4
+ - Added support for perspective warp filter
5
+
6
+ ## v23.0.0
7
+ - Fixed handling externally linked files in smart object layers
8
+
3
9
  ## v22.0.0
4
10
  - Fixed parsing path `smooth` gradient interpolation method
5
11
  - Changed `PsdReader` type
@@ -1300,11 +1300,22 @@ function parseFilterFXItem(f, options) {
1300
1300
  lightDirection: f.Fltr.LghD,
1301
1301
  specularity: f.Fltr.specularity,
1302
1302
  } });
1303
- case 'LqFy': {
1304
- return __assign(__assign({}, base), { type: 'liquify', filter: {
1305
- liquifyMesh: f.Fltr.LqMe,
1306
- } });
1307
- }
1303
+ case 'LqFy':
1304
+ {
1305
+ return __assign(__assign({}, base), { type: 'liquify', filter: {
1306
+ liquifyMesh: f.Fltr.LqMe,
1307
+ } });
1308
+ }
1309
+ ;
1310
+ case 'perspectiveWarpTransform':
1311
+ {
1312
+ return __assign(__assign({}, base), { type: 'perspective warp', filter: {
1313
+ vertices: f.Fltr.vertices.map(hrznVrtcToPoint),
1314
+ warpedVertices: f.Fltr.warpedVertices.map(hrznVrtcToPoint),
1315
+ quads: f.Fltr.quads.map(function (q) { return q.indices; }),
1316
+ } });
1317
+ }
1318
+ ;
1308
1319
  default:
1309
1320
  if (options.throwForMissingFeatures) {
1310
1321
  throw new Error("Unknown filter classId: ".concat(f.Fltr._classID));
@@ -1777,6 +1788,13 @@ function serializeFilterFXItem(f) {
1777
1788
  _classID: 'LqFy',
1778
1789
  LqMe: f.filter.liquifyMesh,
1779
1790
  }, filterID: 1282492025 });
1791
+ case 'perspective warp': return __assign(__assign({}, base), { Fltr: {
1792
+ _name: 'Perspective Warp',
1793
+ _classID: 'perspectiveWarpTransform',
1794
+ vertices: f.filter.vertices.map(pointToHrznVrtc),
1795
+ warpedVertices: f.filter.warpedVertices.map(pointToHrznVrtc),
1796
+ quads: f.filter.quads.map(function (indices) { return ({ indices: indices }); }),
1797
+ }, filterID: 442 });
1780
1798
  default: throw new Error("Unknow filter type: ".concat(f.type));
1781
1799
  }
1782
1800
  }
@@ -2131,130 +2149,170 @@ addHandler('Anno', function (target) { return target.annotations !== undefined;
2131
2149
  writer.view.setUint32(dataOffset - 4, writer.offset - dataOffset, false);
2132
2150
  }
2133
2151
  });
2134
- addHandler('lnk2', function (target) { return !!target.linkedFiles && target.linkedFiles.length > 0; }, function (reader, target, left) {
2135
- var psd = target;
2136
- psd.linkedFiles = psd.linkedFiles || [];
2137
- while (left() > 8) {
2138
- var size = readLength64(reader); // size
2139
- var startOffset = reader.offset;
2140
- var type = (0, psdReader_1.readSignature)(reader);
2141
- // liFD - linked file data
2142
- // liFE - linked file external
2143
- // liFA - linked file alias
2144
- var version = (0, psdReader_1.readInt32)(reader);
2145
- var id = (0, psdReader_1.readPascalString)(reader, 1);
2146
- var name_3 = (0, psdReader_1.readUnicodeString)(reader);
2147
- var fileType = (0, psdReader_1.readSignature)(reader).trim(); // ' ' if empty
2148
- var fileCreator = (0, psdReader_1.readSignature)(reader).trim(); // ' ' or '\0\0\0\0' if empty
2149
- var dataSize = readLength64(reader);
2150
- var hasFileOpenDescriptor = (0, psdReader_1.readUint8)(reader);
2151
- var fileOpenDescriptor = hasFileOpenDescriptor ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
2152
- var linkedFileDescriptor = type === 'liFE' ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
2153
- var file = { id: id, name: name_3 };
2154
- if (fileType)
2155
- file.type = fileType;
2156
- if (fileCreator)
2157
- file.creator = fileCreator;
2158
- if (fileOpenDescriptor) {
2159
- file.descriptor = {
2160
- compInfo: {
2161
- compID: fileOpenDescriptor.compInfo.compID,
2162
- originalCompID: fileOpenDescriptor.compInfo.originalCompID,
2163
- }
2164
- };
2165
- }
2166
- if (type === 'liFE' && version > 3) {
2167
- var year = (0, psdReader_1.readInt32)(reader);
2168
- var month = (0, psdReader_1.readUint8)(reader);
2169
- var day = (0, psdReader_1.readUint8)(reader);
2170
- var hour = (0, psdReader_1.readUint8)(reader);
2171
- var minute = (0, psdReader_1.readUint8)(reader);
2172
- var seconds = (0, psdReader_1.readFloat64)(reader);
2173
- var wholeSeconds = Math.floor(seconds);
2174
- var ms = (seconds - wholeSeconds) * 1000;
2175
- file.time = (new Date(year, month, day, hour, minute, wholeSeconds, ms)).toISOString();
2176
- }
2177
- var fileSize = type === 'liFE' ? readLength64(reader) : 0;
2178
- if (type === 'liFA')
2179
- (0, psdReader_1.skipBytes)(reader, 8);
2180
- if (type === 'liFD')
2181
- file.data = (0, psdReader_1.readBytes)(reader, dataSize); // seems to be a typo in docs
2182
- if (version >= 5)
2183
- file.childDocumentID = (0, psdReader_1.readUnicodeString)(reader);
2184
- if (version >= 6)
2185
- file.assetModTime = (0, psdReader_1.readFloat64)(reader);
2186
- if (version >= 7)
2187
- file.assetLockedState = (0, psdReader_1.readUint8)(reader);
2188
- if (type === 'liFE' && version === 2)
2189
- file.data = (0, psdReader_1.readBytes)(reader, fileSize);
2190
- if (reader.skipLinkedFilesData)
2191
- file.data = undefined;
2192
- psd.linkedFiles.push(file);
2193
- linkedFileDescriptor;
2194
- while (size % 4)
2195
- size++;
2196
- reader.offset = startOffset + size;
2197
- }
2198
- (0, psdReader_1.skipBytes)(reader, left()); // ?
2199
- }, function (writer, target) {
2200
- var psd = target;
2201
- for (var _i = 0, _a = psd.linkedFiles; _i < _a.length; _i++) {
2202
- var file = _a[_i];
2203
- var version = 2;
2204
- if (file.assetLockedState != null)
2205
- version = 7;
2206
- else if (file.assetModTime != null)
2207
- version = 6;
2208
- else if (file.childDocumentID != null)
2209
- version = 5;
2210
- // TODO: else if (file.time != null) version = 3; (only for liFE)
2211
- (0, psdWriter_1.writeUint32)(writer, 0);
2212
- (0, psdWriter_1.writeUint32)(writer, 0); // size
2213
- var sizeOffset = writer.offset;
2214
- (0, psdWriter_1.writeSignature)(writer, file.data ? 'liFD' : 'liFA');
2215
- (0, psdWriter_1.writeInt32)(writer, version);
2216
- if (!file.id || typeof file.id !== 'string' || !/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/.test(file.id)) {
2217
- throw new Error('Linked file ID must be in a GUID format (example: 20953ddb-9391-11ec-b4f1-c15674f50bc4)');
2218
- }
2219
- (0, psdWriter_1.writePascalString)(writer, file.id, 1);
2220
- (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, file.name || '');
2221
- (0, psdWriter_1.writeSignature)(writer, file.type ? "".concat(file.type, " ").substring(0, 4) : ' ');
2222
- (0, psdWriter_1.writeSignature)(writer, file.creator ? "".concat(file.creator, " ").substring(0, 4) : '\0\0\0\0');
2223
- writeLength64(writer, file.data ? file.data.byteLength : 0);
2224
- if (file.descriptor && file.descriptor.compInfo) {
2225
- var desc = {
2226
- compInfo: {
2227
- compID: file.descriptor.compInfo.compID,
2228
- originalCompID: file.descriptor.compInfo.originalCompID,
2229
- }
2230
- };
2231
- (0, psdWriter_1.writeUint8)(writer, 1);
2232
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
2233
- }
2234
- else {
2235
- (0, psdWriter_1.writeUint8)(writer, 0);
2152
+ function createLnkHandler(tag) {
2153
+ addHandler(tag, function (target) {
2154
+ var psd = target;
2155
+ if (!psd.linkedFiles || !psd.linkedFiles.length)
2156
+ return false;
2157
+ if (tag === 'lnkE' && !psd.linkedFiles.some(function (f) { return f.linkedFile; }))
2158
+ return false;
2159
+ return true;
2160
+ }, function (reader, target, left, _psd) {
2161
+ var psd = target;
2162
+ psd.linkedFiles = psd.linkedFiles || [];
2163
+ while (left() > 8) {
2164
+ var size = readLength64(reader);
2165
+ var startOffset = reader.offset;
2166
+ var type = (0, psdReader_1.readSignature)(reader);
2167
+ // liFD - linked file data
2168
+ // liFE - linked file external
2169
+ // liFA - linked file alias
2170
+ var version = (0, psdReader_1.readInt32)(reader);
2171
+ var id = (0, psdReader_1.readPascalString)(reader, 1);
2172
+ var name_3 = (0, psdReader_1.readUnicodeString)(reader);
2173
+ var fileType = (0, psdReader_1.readSignature)(reader).trim(); // ' ' if empty
2174
+ var fileCreator = (0, psdReader_1.readSignature)(reader).trim(); // ' ' or '\0\0\0\0' if empty
2175
+ var dataSize = readLength64(reader);
2176
+ var hasFileOpenDescriptor = (0, psdReader_1.readUint8)(reader);
2177
+ var fileOpenDescriptor = hasFileOpenDescriptor ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
2178
+ var linkedFileDescriptor = type === 'liFE' ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
2179
+ var file = { id: id, name: name_3 };
2180
+ if (fileType)
2181
+ file.type = fileType;
2182
+ if (fileCreator)
2183
+ file.creator = fileCreator;
2184
+ if (fileOpenDescriptor) {
2185
+ file.descriptor = {
2186
+ compInfo: {
2187
+ compID: fileOpenDescriptor.compInfo.compID,
2188
+ originalCompID: fileOpenDescriptor.compInfo.originalCompID,
2189
+ }
2190
+ };
2191
+ }
2192
+ if (type === 'liFE' && version > 3) {
2193
+ var year = (0, psdReader_1.readInt32)(reader);
2194
+ var month = (0, psdReader_1.readUint8)(reader);
2195
+ var day = (0, psdReader_1.readUint8)(reader);
2196
+ var hour = (0, psdReader_1.readUint8)(reader);
2197
+ var minute = (0, psdReader_1.readUint8)(reader);
2198
+ var seconds = (0, psdReader_1.readFloat64)(reader);
2199
+ var wholeSeconds = Math.floor(seconds);
2200
+ var ms = (seconds - wholeSeconds) * 1000;
2201
+ file.time = (new Date(Date.UTC(year, month, day, hour, minute, wholeSeconds, ms))).toISOString();
2202
+ }
2203
+ var fileSize = type === 'liFE' ? readLength64(reader) : 0;
2204
+ if (type === 'liFA')
2205
+ (0, psdReader_1.skipBytes)(reader, 8);
2206
+ if (type === 'liFD')
2207
+ file.data = (0, psdReader_1.readBytes)(reader, dataSize); // seems to be a typo in docs
2208
+ if (version >= 5)
2209
+ file.childDocumentID = (0, psdReader_1.readUnicodeString)(reader);
2210
+ if (version >= 6)
2211
+ file.assetModTime = (0, psdReader_1.readFloat64)(reader);
2212
+ if (version >= 7)
2213
+ file.assetLockedState = (0, psdReader_1.readUint8)(reader);
2214
+ if (type === 'liFE' && version === 2)
2215
+ file.data = (0, psdReader_1.readBytes)(reader, fileSize);
2216
+ if (reader.skipLinkedFilesData)
2217
+ file.data = undefined;
2218
+ if (tag === 'lnkE') {
2219
+ file.linkedFile = {
2220
+ fileSize: fileSize,
2221
+ name: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor['Nm ']) || '',
2222
+ fullPath: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor.fullPath) || '',
2223
+ originalPath: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor.originalPath) || '',
2224
+ relativePath: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor.relPath) || '',
2225
+ };
2226
+ }
2227
+ psd.linkedFiles.push(file);
2228
+ while (size % 4)
2229
+ size++;
2230
+ reader.offset = startOffset + size;
2236
2231
  }
2237
- if (file.data)
2238
- (0, psdWriter_1.writeBytes)(writer, file.data);
2239
- else
2232
+ (0, psdReader_1.skipBytes)(reader, left()); // ?
2233
+ }, function (writer, target) {
2234
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
2235
+ var psd = target;
2236
+ for (var _i = 0, _k = psd.linkedFiles; _i < _k.length; _i++) {
2237
+ var file = _k[_i];
2238
+ if ((tag === 'lnkE') !== !!file.linkedFile)
2239
+ continue;
2240
+ var version = 2;
2241
+ if (file.assetLockedState != null)
2242
+ version = 7;
2243
+ else if (file.assetModTime != null)
2244
+ version = 6;
2245
+ else if (file.childDocumentID != null)
2246
+ version = 5;
2247
+ else if (tag == 'lnkE')
2248
+ version = 3;
2240
2249
  writeLength64(writer, 0);
2241
- if (version >= 5)
2242
- (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, file.childDocumentID || '');
2243
- if (version >= 6)
2244
- (0, psdWriter_1.writeFloat64)(writer, file.assetModTime || 0);
2245
- if (version >= 7)
2246
- (0, psdWriter_1.writeUint8)(writer, file.assetLockedState || 0);
2247
- var size = writer.offset - sizeOffset;
2248
- writer.view.setUint32(sizeOffset - 4, size, false); // write size
2249
- while (size % 4) {
2250
- size++;
2251
- (0, psdWriter_1.writeUint8)(writer, 0);
2250
+ var sizeOffset = writer.offset;
2251
+ (0, psdWriter_1.writeSignature)(writer, (tag === 'lnkE') ? 'liFE' : (file.data ? 'liFD' : 'liFA'));
2252
+ (0, psdWriter_1.writeInt32)(writer, version);
2253
+ if (!file.id || typeof file.id !== 'string' || !/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/.test(file.id)) {
2254
+ throw new Error('Linked file ID must be in a GUID format (example: 20953ddb-9391-11ec-b4f1-c15674f50bc4)');
2255
+ }
2256
+ (0, psdWriter_1.writePascalString)(writer, file.id, 1);
2257
+ (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, file.name || '');
2258
+ (0, psdWriter_1.writeSignature)(writer, file.type ? "".concat(file.type, " ").substring(0, 4) : ' ');
2259
+ (0, psdWriter_1.writeSignature)(writer, file.creator ? "".concat(file.creator, " ").substring(0, 4) : '\0\0\0\0');
2260
+ writeLength64(writer, file.data ? file.data.byteLength : 0);
2261
+ if (file.descriptor && file.descriptor.compInfo) {
2262
+ var desc = {
2263
+ compInfo: {
2264
+ compID: file.descriptor.compInfo.compID,
2265
+ originalCompID: file.descriptor.compInfo.originalCompID,
2266
+ },
2267
+ };
2268
+ (0, psdWriter_1.writeUint8)(writer, 1);
2269
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
2270
+ }
2271
+ else {
2272
+ (0, psdWriter_1.writeUint8)(writer, 0);
2273
+ }
2274
+ if (tag === 'lnkE') {
2275
+ var desc = {
2276
+ descVersion: 2,
2277
+ 'Nm ': (_b = (_a = file.linkedFile) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : '',
2278
+ fullPath: (_d = (_c = file.linkedFile) === null || _c === void 0 ? void 0 : _c.fullPath) !== null && _d !== void 0 ? _d : '',
2279
+ originalPath: (_f = (_e = file.linkedFile) === null || _e === void 0 ? void 0 : _e.originalPath) !== null && _f !== void 0 ? _f : '',
2280
+ relPath: (_h = (_g = file.linkedFile) === null || _g === void 0 ? void 0 : _g.relativePath) !== null && _h !== void 0 ? _h : '',
2281
+ };
2282
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'ExternalFileLink', desc);
2283
+ var time = file.time ? new Date(file.time) : new Date();
2284
+ (0, psdWriter_1.writeInt32)(writer, time.getUTCFullYear());
2285
+ (0, psdWriter_1.writeUint8)(writer, time.getUTCMonth());
2286
+ (0, psdWriter_1.writeUint8)(writer, time.getUTCDate());
2287
+ (0, psdWriter_1.writeUint8)(writer, time.getUTCHours());
2288
+ (0, psdWriter_1.writeUint8)(writer, time.getUTCMinutes());
2289
+ (0, psdWriter_1.writeFloat64)(writer, time.getUTCSeconds() + time.getUTCMilliseconds() / 1000);
2290
+ }
2291
+ if (file.data) {
2292
+ (0, psdWriter_1.writeBytes)(writer, file.data);
2293
+ }
2294
+ else {
2295
+ writeLength64(writer, ((_j = file.linkedFile) === null || _j === void 0 ? void 0 : _j.fileSize) || 0);
2296
+ }
2297
+ if (version >= 5)
2298
+ (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, file.childDocumentID || '');
2299
+ if (version >= 6)
2300
+ (0, psdWriter_1.writeFloat64)(writer, file.assetModTime || 0);
2301
+ if (version >= 7)
2302
+ (0, psdWriter_1.writeUint8)(writer, file.assetLockedState || 0);
2303
+ var size = writer.offset - sizeOffset;
2304
+ writer.view.setUint32(sizeOffset - 4, size, false); // write size
2305
+ while (size % 4) {
2306
+ size++;
2307
+ (0, psdWriter_1.writeUint8)(writer, 0);
2308
+ }
2252
2309
  }
2253
- }
2254
- });
2310
+ });
2311
+ }
2312
+ createLnkHandler('lnk2');
2313
+ createLnkHandler('lnkE');
2255
2314
  addHandlerAlias('lnkD', 'lnk2');
2256
2315
  addHandlerAlias('lnk3', 'lnk2');
2257
- addHandlerAlias('lnkE', 'lnk2');
2258
2316
  addHandler('pths', hasKey('pathList'), function (reader, target) {
2259
2317
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader, true);
2260
2318
  // console.log(require('util').inspect(desc, false, 99, true));