ag-psd 22.0.1 → 23.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Changelog
2
2
 
3
+ ## v23.0.0
4
+ - Fixed handling externally linked files in smart object layers
5
+
3
6
  ## v22.0.0
4
7
  - Fixed parsing path `smooth` gradient interpolation method
5
8
  - Changed `PsdReader` type
@@ -393,12 +393,13 @@ addHandler('lmfx', function (target) { return target.effects !== undefined && ha
393
393
  if (version !== 0)
394
394
  throw new Error('Invalid lmfx version');
395
395
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
396
- // console.log(require('util').inspect(info, false, 99, true));
396
+ // console.log('READ', require('util').inspect(desc, false, 99, true));
397
397
  // discard if read in 'lrFX' or 'lfx2' section
398
398
  target.effects = (0, descriptor_1.parseEffects)(desc, !!reader.logMissingFeatures);
399
399
  (0, psdReader_1.skipBytes)(reader, left());
400
400
  }, function (writer, target, _, options) {
401
401
  var desc = (0, descriptor_1.serializeEffects)(target.effects, !!options.logMissingFeatures, true);
402
+ // console.log('WRITE', require('util').inspect(desc, false, 99, true));
402
403
  (0, psdWriter_1.writeUint32)(writer, 0); // version
403
404
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
404
405
  });
@@ -2130,130 +2131,170 @@ addHandler('Anno', function (target) { return target.annotations !== undefined;
2130
2131
  writer.view.setUint32(dataOffset - 4, writer.offset - dataOffset, false);
2131
2132
  }
2132
2133
  });
2133
- addHandler('lnk2', function (target) { return !!target.linkedFiles && target.linkedFiles.length > 0; }, function (reader, target, left) {
2134
- var psd = target;
2135
- psd.linkedFiles = psd.linkedFiles || [];
2136
- while (left() > 8) {
2137
- var size = readLength64(reader); // size
2138
- var startOffset = reader.offset;
2139
- var type = (0, psdReader_1.readSignature)(reader);
2140
- // liFD - linked file data
2141
- // liFE - linked file external
2142
- // liFA - linked file alias
2143
- var version = (0, psdReader_1.readInt32)(reader);
2144
- var id = (0, psdReader_1.readPascalString)(reader, 1);
2145
- var name_3 = (0, psdReader_1.readUnicodeString)(reader);
2146
- var fileType = (0, psdReader_1.readSignature)(reader).trim(); // ' ' if empty
2147
- var fileCreator = (0, psdReader_1.readSignature)(reader).trim(); // ' ' or '\0\0\0\0' if empty
2148
- var dataSize = readLength64(reader);
2149
- var hasFileOpenDescriptor = (0, psdReader_1.readUint8)(reader);
2150
- var fileOpenDescriptor = hasFileOpenDescriptor ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
2151
- var linkedFileDescriptor = type === 'liFE' ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
2152
- var file = { id: id, name: name_3 };
2153
- if (fileType)
2154
- file.type = fileType;
2155
- if (fileCreator)
2156
- file.creator = fileCreator;
2157
- if (fileOpenDescriptor) {
2158
- file.descriptor = {
2159
- compInfo: {
2160
- compID: fileOpenDescriptor.compInfo.compID,
2161
- originalCompID: fileOpenDescriptor.compInfo.originalCompID,
2162
- }
2163
- };
2164
- }
2165
- if (type === 'liFE' && version > 3) {
2166
- var year = (0, psdReader_1.readInt32)(reader);
2167
- var month = (0, psdReader_1.readUint8)(reader);
2168
- var day = (0, psdReader_1.readUint8)(reader);
2169
- var hour = (0, psdReader_1.readUint8)(reader);
2170
- var minute = (0, psdReader_1.readUint8)(reader);
2171
- var seconds = (0, psdReader_1.readFloat64)(reader);
2172
- var wholeSeconds = Math.floor(seconds);
2173
- var ms = (seconds - wholeSeconds) * 1000;
2174
- file.time = (new Date(year, month, day, hour, minute, wholeSeconds, ms)).toISOString();
2175
- }
2176
- var fileSize = type === 'liFE' ? readLength64(reader) : 0;
2177
- if (type === 'liFA')
2178
- (0, psdReader_1.skipBytes)(reader, 8);
2179
- if (type === 'liFD')
2180
- file.data = (0, psdReader_1.readBytes)(reader, dataSize); // seems to be a typo in docs
2181
- if (version >= 5)
2182
- file.childDocumentID = (0, psdReader_1.readUnicodeString)(reader);
2183
- if (version >= 6)
2184
- file.assetModTime = (0, psdReader_1.readFloat64)(reader);
2185
- if (version >= 7)
2186
- file.assetLockedState = (0, psdReader_1.readUint8)(reader);
2187
- if (type === 'liFE' && version === 2)
2188
- file.data = (0, psdReader_1.readBytes)(reader, fileSize);
2189
- if (reader.skipLinkedFilesData)
2190
- file.data = undefined;
2191
- psd.linkedFiles.push(file);
2192
- linkedFileDescriptor;
2193
- while (size % 4)
2194
- size++;
2195
- reader.offset = startOffset + size;
2196
- }
2197
- (0, psdReader_1.skipBytes)(reader, left()); // ?
2198
- }, function (writer, target) {
2199
- var psd = target;
2200
- for (var _i = 0, _a = psd.linkedFiles; _i < _a.length; _i++) {
2201
- var file = _a[_i];
2202
- var version = 2;
2203
- if (file.assetLockedState != null)
2204
- version = 7;
2205
- else if (file.assetModTime != null)
2206
- version = 6;
2207
- else if (file.childDocumentID != null)
2208
- version = 5;
2209
- // TODO: else if (file.time != null) version = 3; (only for liFE)
2210
- (0, psdWriter_1.writeUint32)(writer, 0);
2211
- (0, psdWriter_1.writeUint32)(writer, 0); // size
2212
- var sizeOffset = writer.offset;
2213
- (0, psdWriter_1.writeSignature)(writer, file.data ? 'liFD' : 'liFA');
2214
- (0, psdWriter_1.writeInt32)(writer, version);
2215
- if (!file.id || typeof file.id !== 'string' || !/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/.test(file.id)) {
2216
- throw new Error('Linked file ID must be in a GUID format (example: 20953ddb-9391-11ec-b4f1-c15674f50bc4)');
2217
- }
2218
- (0, psdWriter_1.writePascalString)(writer, file.id, 1);
2219
- (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, file.name || '');
2220
- (0, psdWriter_1.writeSignature)(writer, file.type ? "".concat(file.type, " ").substring(0, 4) : ' ');
2221
- (0, psdWriter_1.writeSignature)(writer, file.creator ? "".concat(file.creator, " ").substring(0, 4) : '\0\0\0\0');
2222
- writeLength64(writer, file.data ? file.data.byteLength : 0);
2223
- if (file.descriptor && file.descriptor.compInfo) {
2224
- var desc = {
2225
- compInfo: {
2226
- compID: file.descriptor.compInfo.compID,
2227
- originalCompID: file.descriptor.compInfo.originalCompID,
2228
- }
2229
- };
2230
- (0, psdWriter_1.writeUint8)(writer, 1);
2231
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
2232
- }
2233
- else {
2234
- (0, psdWriter_1.writeUint8)(writer, 0);
2134
+ function createLnkHandler(tag) {
2135
+ addHandler(tag, function (target) {
2136
+ var psd = target;
2137
+ if (!psd.linkedFiles || !psd.linkedFiles.length)
2138
+ return false;
2139
+ if (tag === 'lnkE' && !psd.linkedFiles.some(function (f) { return f.linkedFile; }))
2140
+ return false;
2141
+ return true;
2142
+ }, function (reader, target, left, _psd) {
2143
+ var psd = target;
2144
+ psd.linkedFiles = psd.linkedFiles || [];
2145
+ while (left() > 8) {
2146
+ var size = readLength64(reader);
2147
+ var startOffset = reader.offset;
2148
+ var type = (0, psdReader_1.readSignature)(reader);
2149
+ // liFD - linked file data
2150
+ // liFE - linked file external
2151
+ // liFA - linked file alias
2152
+ var version = (0, psdReader_1.readInt32)(reader);
2153
+ var id = (0, psdReader_1.readPascalString)(reader, 1);
2154
+ var name_3 = (0, psdReader_1.readUnicodeString)(reader);
2155
+ var fileType = (0, psdReader_1.readSignature)(reader).trim(); // ' ' if empty
2156
+ var fileCreator = (0, psdReader_1.readSignature)(reader).trim(); // ' ' or '\0\0\0\0' if empty
2157
+ var dataSize = readLength64(reader);
2158
+ var hasFileOpenDescriptor = (0, psdReader_1.readUint8)(reader);
2159
+ var fileOpenDescriptor = hasFileOpenDescriptor ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
2160
+ var linkedFileDescriptor = type === 'liFE' ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
2161
+ var file = { id: id, name: name_3 };
2162
+ if (fileType)
2163
+ file.type = fileType;
2164
+ if (fileCreator)
2165
+ file.creator = fileCreator;
2166
+ if (fileOpenDescriptor) {
2167
+ file.descriptor = {
2168
+ compInfo: {
2169
+ compID: fileOpenDescriptor.compInfo.compID,
2170
+ originalCompID: fileOpenDescriptor.compInfo.originalCompID,
2171
+ }
2172
+ };
2173
+ }
2174
+ if (type === 'liFE' && version > 3) {
2175
+ var year = (0, psdReader_1.readInt32)(reader);
2176
+ var month = (0, psdReader_1.readUint8)(reader);
2177
+ var day = (0, psdReader_1.readUint8)(reader);
2178
+ var hour = (0, psdReader_1.readUint8)(reader);
2179
+ var minute = (0, psdReader_1.readUint8)(reader);
2180
+ var seconds = (0, psdReader_1.readFloat64)(reader);
2181
+ var wholeSeconds = Math.floor(seconds);
2182
+ var ms = (seconds - wholeSeconds) * 1000;
2183
+ file.time = (new Date(Date.UTC(year, month, day, hour, minute, wholeSeconds, ms))).toISOString();
2184
+ }
2185
+ var fileSize = type === 'liFE' ? readLength64(reader) : 0;
2186
+ if (type === 'liFA')
2187
+ (0, psdReader_1.skipBytes)(reader, 8);
2188
+ if (type === 'liFD')
2189
+ file.data = (0, psdReader_1.readBytes)(reader, dataSize); // seems to be a typo in docs
2190
+ if (version >= 5)
2191
+ file.childDocumentID = (0, psdReader_1.readUnicodeString)(reader);
2192
+ if (version >= 6)
2193
+ file.assetModTime = (0, psdReader_1.readFloat64)(reader);
2194
+ if (version >= 7)
2195
+ file.assetLockedState = (0, psdReader_1.readUint8)(reader);
2196
+ if (type === 'liFE' && version === 2)
2197
+ file.data = (0, psdReader_1.readBytes)(reader, fileSize);
2198
+ if (reader.skipLinkedFilesData)
2199
+ file.data = undefined;
2200
+ if (tag === 'lnkE') {
2201
+ file.linkedFile = {
2202
+ fileSize: fileSize,
2203
+ name: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor['Nm ']) || '',
2204
+ fullPath: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor.fullPath) || '',
2205
+ originalPath: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor.originalPath) || '',
2206
+ relativePath: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor.relPath) || '',
2207
+ };
2208
+ }
2209
+ psd.linkedFiles.push(file);
2210
+ while (size % 4)
2211
+ size++;
2212
+ reader.offset = startOffset + size;
2235
2213
  }
2236
- if (file.data)
2237
- (0, psdWriter_1.writeBytes)(writer, file.data);
2238
- else
2214
+ (0, psdReader_1.skipBytes)(reader, left()); // ?
2215
+ }, function (writer, target) {
2216
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
2217
+ var psd = target;
2218
+ for (var _i = 0, _k = psd.linkedFiles; _i < _k.length; _i++) {
2219
+ var file = _k[_i];
2220
+ if ((tag === 'lnkE') !== !!file.linkedFile)
2221
+ continue;
2222
+ var version = 2;
2223
+ if (file.assetLockedState != null)
2224
+ version = 7;
2225
+ else if (file.assetModTime != null)
2226
+ version = 6;
2227
+ else if (file.childDocumentID != null)
2228
+ version = 5;
2229
+ else if (tag == 'lnkE')
2230
+ version = 3;
2239
2231
  writeLength64(writer, 0);
2240
- if (version >= 5)
2241
- (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, file.childDocumentID || '');
2242
- if (version >= 6)
2243
- (0, psdWriter_1.writeFloat64)(writer, file.assetModTime || 0);
2244
- if (version >= 7)
2245
- (0, psdWriter_1.writeUint8)(writer, file.assetLockedState || 0);
2246
- var size = writer.offset - sizeOffset;
2247
- writer.view.setUint32(sizeOffset - 4, size, false); // write size
2248
- while (size % 4) {
2249
- size++;
2250
- (0, psdWriter_1.writeUint8)(writer, 0);
2232
+ var sizeOffset = writer.offset;
2233
+ (0, psdWriter_1.writeSignature)(writer, (tag === 'lnkE') ? 'liFE' : (file.data ? 'liFD' : 'liFA'));
2234
+ (0, psdWriter_1.writeInt32)(writer, version);
2235
+ if (!file.id || typeof file.id !== 'string' || !/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/.test(file.id)) {
2236
+ throw new Error('Linked file ID must be in a GUID format (example: 20953ddb-9391-11ec-b4f1-c15674f50bc4)');
2237
+ }
2238
+ (0, psdWriter_1.writePascalString)(writer, file.id, 1);
2239
+ (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, file.name || '');
2240
+ (0, psdWriter_1.writeSignature)(writer, file.type ? "".concat(file.type, " ").substring(0, 4) : ' ');
2241
+ (0, psdWriter_1.writeSignature)(writer, file.creator ? "".concat(file.creator, " ").substring(0, 4) : '\0\0\0\0');
2242
+ writeLength64(writer, file.data ? file.data.byteLength : 0);
2243
+ if (file.descriptor && file.descriptor.compInfo) {
2244
+ var desc = {
2245
+ compInfo: {
2246
+ compID: file.descriptor.compInfo.compID,
2247
+ originalCompID: file.descriptor.compInfo.originalCompID,
2248
+ },
2249
+ };
2250
+ (0, psdWriter_1.writeUint8)(writer, 1);
2251
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
2252
+ }
2253
+ else {
2254
+ (0, psdWriter_1.writeUint8)(writer, 0);
2255
+ }
2256
+ if (tag === 'lnkE') {
2257
+ var desc = {
2258
+ descVersion: 2,
2259
+ 'Nm ': (_b = (_a = file.linkedFile) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : '',
2260
+ fullPath: (_d = (_c = file.linkedFile) === null || _c === void 0 ? void 0 : _c.fullPath) !== null && _d !== void 0 ? _d : '',
2261
+ originalPath: (_f = (_e = file.linkedFile) === null || _e === void 0 ? void 0 : _e.originalPath) !== null && _f !== void 0 ? _f : '',
2262
+ relPath: (_h = (_g = file.linkedFile) === null || _g === void 0 ? void 0 : _g.relativePath) !== null && _h !== void 0 ? _h : '',
2263
+ };
2264
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'ExternalFileLink', desc);
2265
+ var time = file.time ? new Date(file.time) : new Date();
2266
+ (0, psdWriter_1.writeInt32)(writer, time.getUTCFullYear());
2267
+ (0, psdWriter_1.writeUint8)(writer, time.getUTCMonth());
2268
+ (0, psdWriter_1.writeUint8)(writer, time.getUTCDate());
2269
+ (0, psdWriter_1.writeUint8)(writer, time.getUTCHours());
2270
+ (0, psdWriter_1.writeUint8)(writer, time.getUTCMinutes());
2271
+ (0, psdWriter_1.writeFloat64)(writer, time.getUTCSeconds() + time.getUTCMilliseconds() / 1000);
2272
+ }
2273
+ if (file.data) {
2274
+ (0, psdWriter_1.writeBytes)(writer, file.data);
2275
+ }
2276
+ else {
2277
+ writeLength64(writer, ((_j = file.linkedFile) === null || _j === void 0 ? void 0 : _j.fileSize) || 0);
2278
+ }
2279
+ if (version >= 5)
2280
+ (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, file.childDocumentID || '');
2281
+ if (version >= 6)
2282
+ (0, psdWriter_1.writeFloat64)(writer, file.assetModTime || 0);
2283
+ if (version >= 7)
2284
+ (0, psdWriter_1.writeUint8)(writer, file.assetLockedState || 0);
2285
+ var size = writer.offset - sizeOffset;
2286
+ writer.view.setUint32(sizeOffset - 4, size, false); // write size
2287
+ while (size % 4) {
2288
+ size++;
2289
+ (0, psdWriter_1.writeUint8)(writer, 0);
2290
+ }
2251
2291
  }
2252
- }
2253
- });
2292
+ });
2293
+ }
2294
+ createLnkHandler('lnk2');
2295
+ createLnkHandler('lnkE');
2254
2296
  addHandlerAlias('lnkD', 'lnk2');
2255
2297
  addHandlerAlias('lnk3', 'lnk2');
2256
- addHandlerAlias('lnkE', 'lnk2');
2257
2298
  addHandler('pths', hasKey('pathList'), function (reader, target) {
2258
2299
  var desc = (0, descriptor_1.readVersionAndDescriptor)(reader, true);
2259
2300
  // console.log(require('util').inspect(desc, false, 99, true));