ag-psd 24.0.0 → 26.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/.v8-cache/v22.13.1-x64-00250a7c/4511bacf +0 -0
  2. package/.v8-cache/v22.13.1-x64-00250a7c/57d3380b +0 -0
  3. package/.v8-cache/v22.13.1-x64-00250a7c/6cbfc0ec +0 -0
  4. package/.v8-cache/v22.13.1-x64-00250a7c/7100ee08 +0 -0
  5. package/.v8-cache/v22.13.1-x64-00250a7c/75e41e43 +0 -0
  6. package/.v8-cache/v22.13.1-x64-00250a7c/8d0bf0b5 +0 -0
  7. package/.v8-cache/v22.13.1-x64-00250a7c/acc36e66 +0 -0
  8. package/.v8-cache/v22.13.1-x64-00250a7c/b3c2fab7 +0 -0
  9. package/.v8-cache/v22.13.1-x64-00250a7c/c314aece +0 -0
  10. package/.v8-cache/v22.13.1-x64-00250a7c/cfc49f4f +0 -0
  11. package/.v8-cache/v22.13.1-x64-00250a7c/e03e2acd +0 -0
  12. package/CHANGELOG.md +7 -0
  13. package/{TODO → TODO.md} +46 -0
  14. package/accept.js +18 -1
  15. package/dist/additionalInfo.js +62 -63
  16. package/dist/additionalInfo.js.map +1 -1
  17. package/dist/bundle.js +246 -186
  18. package/dist/descriptor.d.ts +4 -3
  19. package/dist/descriptor.js +9 -5
  20. package/dist/descriptor.js.map +1 -1
  21. package/dist/helpers.d.ts +1 -0
  22. package/dist/helpers.js.map +1 -1
  23. package/dist/imageResources.js +39 -5
  24. package/dist/imageResources.js.map +1 -1
  25. package/dist/psd.d.ts +12 -1
  26. package/dist/psd.js.map +1 -1
  27. package/dist/psdReader.js +39 -36
  28. package/dist/psdReader.js.map +1 -1
  29. package/dist/psdWriter.js +96 -76
  30. package/dist/psdWriter.js.map +1 -1
  31. package/dist-es/additionalInfo.js +62 -63
  32. package/dist-es/additionalInfo.js.map +1 -1
  33. package/dist-es/descriptor.d.ts +4 -3
  34. package/dist-es/descriptor.js +9 -5
  35. package/dist-es/descriptor.js.map +1 -1
  36. package/dist-es/helpers.d.ts +1 -0
  37. package/dist-es/helpers.js.map +1 -1
  38. package/dist-es/imageResources.js +41 -7
  39. package/dist-es/imageResources.js.map +1 -1
  40. package/dist-es/psd.d.ts +12 -1
  41. package/dist-es/psd.js.map +1 -1
  42. package/dist-es/psdReader.js +39 -36
  43. package/dist-es/psdReader.js.map +1 -1
  44. package/dist-es/psdWriter.js +96 -76
  45. package/dist-es/psdWriter.js.map +1 -1
  46. package/package.json +1 -1
  47. package/src/additionalInfo.ts +66 -66
  48. package/src/descriptor.ts +12 -8
  49. package/src/helpers.ts +1 -0
  50. package/src/imageResources.ts +46 -20
  51. package/src/psd.ts +9 -1
  52. package/src/psdReader.ts +43 -40
  53. package/src/psdWriter.ts +92 -78
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## v26.0.0
4
+ - Added support for `realMask` section
5
+
6
+ ## v25.0.0
7
+ - Added support for `blendingRanges` section
8
+ - Added support for `interpolationMethod` for gradients
9
+
3
10
  ## v24.0.0
4
11
  - Added support for `curves` smart object filter
5
12
  - Added support for reading and writing `palette` field
@@ -25,6 +25,7 @@ check: https://github.com/TheNicker/libpsd
25
25
 
26
26
  - decompress image data in FEid section
27
27
 
28
+ ```ts
28
29
  if (!channelLength) throw new Error('filterEffect: Empty channel');
29
30
  const compression = readUint16(reader);
30
31
  const data = createImageDataBitDepth(right - left, bottom - top, depth, 1);
@@ -43,4 +44,49 @@ check: https://github.com/TheNicker/libpsd
43
44
  const data = createImageDataBitDepth(right - left, bottom - top, depth, 1);
44
45
  readData(reader, extraLength - 2, data, compression, data.width, data.height, depth, 0, false, 1);
45
46
  target.filterEffectsMasks[target.filterEffectsMasks.length - 1].extra = { top, left, bottom, right, data };
47
+ ```
46
48
 
49
+ ```ts
50
+ export function decodeUtf16String(buffer: Uint8Array) {
51
+ let result = '';
52
+
53
+ for (let i = 0; i < buffer.byteLength;) {
54
+ const w1 = (buffer[i++] << 8) | buffer[i++];
55
+
56
+ if ((w1 & 0xF800) !== 0xD800) { // w1 < 0xD800 || w1 > 0xDFFF
57
+ result += String.fromCharCode(w1);
58
+ continue;
59
+ }
60
+
61
+ if ((w1 & 0xFC00) === 0xD800) { // w1 >= 0xD800 && w1 <= 0xDBFF
62
+ throw new Error('Invalid utf-16');
63
+ }
64
+
65
+ if (i === buffer.byteLength) {
66
+ throw new Error('Invalid utf-16');
67
+ }
68
+
69
+ const w2 = (buffer[i++] << 8) | buffer[i++];
70
+
71
+ if ((w2 & 0xFC00) !== 0xDC00) { // w2 < 0xDC00 || w2 > 0xDFFF)
72
+ throw new Error('Invalid utf-16');
73
+ }
74
+
75
+ result += String.fromCharCode(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);
76
+ }
77
+
78
+ return result;
79
+ }
80
+
81
+ export function encodeUtf16String(value: string) {
82
+ const buffer = new Uint8Array(value.length * 2);
83
+
84
+ for (let i = 0, j = 0; i < value.length; i++, j += 2) {
85
+ const word = value.charCodeAt(i);
86
+ buffer[j] = (word >> 8) & 0xff;
87
+ buffer[j + 1] = word & 0xff;
88
+ }
89
+
90
+ return buffer;
91
+ }
92
+ ```
package/accept.js CHANGED
@@ -9,7 +9,7 @@ if (type === 'read-write' || type === 'write') {
9
9
  const file = `expected.${ext}`;
10
10
  if (fs.existsSync(path.join('results', type, dir, file))) {
11
11
  fs.unlinkSync(path.join('test', type, dir, file));
12
- fs.renameSync(
12
+ fs.copyFileSync(
13
13
  path.join('results', type, dir, file),
14
14
  path.join('test', type, dir, file));
15
15
  console.log('copied', dir);
@@ -22,6 +22,23 @@ if (type === 'read-write' || type === 'write') {
22
22
  console.log('failed', dir, e.message);
23
23
  }
24
24
  }
25
+ } else if (type === 'read') {
26
+ for (const dir of fs.readdirSync(path.join('test', type))) {
27
+ try {
28
+ const file = `data.json`;
29
+ if (fs.existsSync(path.join('results', type, dir, file))) {
30
+ fs.unlinkSync(path.join('test', type, dir, file));
31
+ fs.copyFileSync(
32
+ path.join('results', type, dir, file),
33
+ path.join('test', type, dir, file));
34
+ console.log('copied', dir);
35
+ } else {
36
+ console.log('skipped', dir);
37
+ }
38
+ } catch (e) {
39
+ console.log('failed', dir, e.message);
40
+ }
41
+ }
25
42
  } else {
26
43
  console.error('Invalid type:', type);
27
44
  }
@@ -278,6 +278,13 @@ addHandler('vmsk', hasKey('vectorMask'), function (reader, target, left, _a) {
278
278
  });
279
279
  // TODO: need to write vmsk if has outline ?
280
280
  addHandlerAlias('vsms', 'vmsk');
281
+ // addHandlerAlias('vmsk', 'vsms');
282
+ addHandler('vowv', // something with vectors?
283
+ hasKey('vowv'), function (reader, target) {
284
+ target.vowv = (0, psdReader_1.readUint32)(reader); // always 2 ????
285
+ }, function (writer, target) {
286
+ (0, psdWriter_1.writeUint32)(writer, target.vowv);
287
+ });
281
288
  addHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left) {
282
289
  if ((0, psdReader_1.readInt32)(reader) !== 1)
283
290
  throw new Error("Invalid vogk version");
@@ -332,58 +339,55 @@ addHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left)
332
339
  var desc = { keyDescriptorList: [] };
333
340
  for (var i = 0; i < orig.keyDescriptorList.length; i++) {
334
341
  var item = orig.keyDescriptorList[i];
335
- if (item.keyShapeInvalidated) {
336
- desc.keyDescriptorList.push({ keyShapeInvalidated: true, keyOriginIndex: i });
342
+ desc.keyDescriptorList.push({}); // we're adding keyOriginIndex at the end
343
+ var out = desc.keyDescriptorList[desc.keyDescriptorList.length - 1];
344
+ if (item.keyOriginType != null)
345
+ out.keyOriginType = item.keyOriginType;
346
+ if (item.keyOriginResolution != null)
347
+ out.keyOriginResolution = item.keyOriginResolution;
348
+ var radii = item.keyOriginRRectRadii;
349
+ if (radii) {
350
+ out.keyOriginRRectRadii = {
351
+ unitValueQuadVersion: 1,
352
+ topRight: (0, descriptor_1.unitsValue)(radii.topRight, 'topRight'),
353
+ topLeft: (0, descriptor_1.unitsValue)(radii.topLeft, 'topLeft'),
354
+ bottomLeft: (0, descriptor_1.unitsValue)(radii.bottomLeft, 'bottomLeft'),
355
+ bottomRight: (0, descriptor_1.unitsValue)(radii.bottomRight, 'bottomRight'),
356
+ };
337
357
  }
338
- else {
339
- desc.keyDescriptorList.push({}); // we're adding keyOriginIndex at the end
340
- var out = desc.keyDescriptorList[desc.keyDescriptorList.length - 1];
341
- if (item.keyOriginType != null)
342
- out.keyOriginType = item.keyOriginType;
343
- if (item.keyOriginResolution != null)
344
- out.keyOriginResolution = item.keyOriginResolution;
345
- var radii = item.keyOriginRRectRadii;
346
- if (radii) {
347
- out.keyOriginRRectRadii = {
348
- unitValueQuadVersion: 1,
349
- topRight: (0, descriptor_1.unitsValue)(radii.topRight, 'topRight'),
350
- topLeft: (0, descriptor_1.unitsValue)(radii.topLeft, 'topLeft'),
351
- bottomLeft: (0, descriptor_1.unitsValue)(radii.bottomLeft, 'bottomLeft'),
352
- bottomRight: (0, descriptor_1.unitsValue)(radii.bottomRight, 'bottomRight'),
353
- };
354
- }
355
- var box = item.keyOriginShapeBoundingBox;
356
- if (box) {
357
- out.keyOriginShapeBBox = {
358
- unitValueQuadVersion: 1,
359
- 'Top ': (0, descriptor_1.unitsValue)(box.top, 'top'),
360
- Left: (0, descriptor_1.unitsValue)(box.left, 'left'),
361
- Btom: (0, descriptor_1.unitsValue)(box.bottom, 'bottom'),
362
- Rght: (0, descriptor_1.unitsValue)(box.right, 'right'),
363
- };
364
- }
365
- var corners = item.keyOriginBoxCorners;
366
- if (corners && corners.length === 4) {
367
- out.keyOriginBoxCorners = {
368
- rectangleCornerA: { Hrzn: corners[0].x, Vrtc: corners[0].y },
369
- rectangleCornerB: { Hrzn: corners[1].x, Vrtc: corners[1].y },
370
- rectangleCornerC: { Hrzn: corners[2].x, Vrtc: corners[2].y },
371
- rectangleCornerD: { Hrzn: corners[3].x, Vrtc: corners[3].y },
372
- };
373
- }
374
- var transform = item.transform;
375
- if (transform && transform.length === 6) {
376
- out.Trnf = {
377
- xx: transform[0],
378
- xy: transform[1],
379
- yx: transform[2],
380
- yy: transform[3],
381
- tx: transform[4],
382
- ty: transform[5],
383
- };
384
- }
385
- out.keyOriginIndex = i;
358
+ var box = item.keyOriginShapeBoundingBox;
359
+ if (box) {
360
+ out.keyOriginShapeBBox = {
361
+ unitValueQuadVersion: 1,
362
+ 'Top ': (0, descriptor_1.unitsValue)(box.top, 'top'),
363
+ Left: (0, descriptor_1.unitsValue)(box.left, 'left'),
364
+ Btom: (0, descriptor_1.unitsValue)(box.bottom, 'bottom'),
365
+ Rght: (0, descriptor_1.unitsValue)(box.right, 'right'),
366
+ };
367
+ }
368
+ var corners = item.keyOriginBoxCorners;
369
+ if (corners && corners.length === 4) {
370
+ out.keyOriginBoxCorners = {
371
+ rectangleCornerA: { Hrzn: corners[0].x, Vrtc: corners[0].y },
372
+ rectangleCornerB: { Hrzn: corners[1].x, Vrtc: corners[1].y },
373
+ rectangleCornerC: { Hrzn: corners[2].x, Vrtc: corners[2].y },
374
+ rectangleCornerD: { Hrzn: corners[3].x, Vrtc: corners[3].y },
375
+ };
376
+ }
377
+ var transform = item.transform;
378
+ if (transform && transform.length === 6) {
379
+ out.Trnf = {
380
+ xx: transform[0],
381
+ xy: transform[1],
382
+ yx: transform[2],
383
+ yy: transform[3],
384
+ tx: transform[4],
385
+ ty: transform[5],
386
+ };
386
387
  }
388
+ if (item.keyShapeInvalidated != null)
389
+ out.keyShapeInvalidated = item.keyShapeInvalidated;
390
+ out.keyOriginIndex = i;
387
391
  }
388
392
  (0, psdWriter_1.writeInt32)(writer, 1); // version
389
393
  (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
@@ -855,7 +859,13 @@ function isQuiltWarp(warp) {
855
859
  }
856
860
  function encodeWarp(warp) {
857
861
  var bounds = warp.bounds;
858
- var desc = __assign(__assign({ warpStyle: descriptor_1.warpStyle.encode(warp.style) }, (warp.values ? { warpValues: warp.values } : { warpValue: warp.value || 0 })), { warpPerspective: warp.perspective || 0, warpPerspectiveOther: warp.perspectiveOther || 0, warpRotate: descriptor_1.Ornt.encode(warp.rotate), bounds: {
862
+ var desc = __assign(__assign({ warpStyle: descriptor_1.warpStyle.encode(warp.style) }, (warp.values ? { warpValues: warp.values } : { warpValue: warp.value || 0 })), { warpPerspective: warp.perspective || 0, warpPerspectiveOther: warp.perspectiveOther || 0, warpRotate: descriptor_1.Ornt.encode(warp.rotate), bounds: /*1 ? { // testing
863
+ _classID: 'classFloatRect',
864
+ 'Top ': bounds && bounds.top && bounds.top.value || 0,
865
+ Left: bounds && bounds.left && bounds.left.value || 0,
866
+ Btom: bounds && bounds.bottom && bounds.bottom.value || 0,
867
+ Rght: bounds && bounds.right && bounds.right.value || 0,
868
+ } :*/ {
859
869
  'Top ': (0, descriptor_1.unitsValue)(bounds && bounds.top || { units: 'Pixels', value: 0 }, 'bounds.top'),
860
870
  Left: (0, descriptor_1.unitsValue)(bounds && bounds.left || { units: 'Pixels', value: 0 }, 'bounds.left'),
861
871
  Btom: (0, descriptor_1.unitsValue)(bounds && bounds.bottom || { units: 'Pixels', value: 0 }, 'bounds.bottom'),
@@ -1420,6 +1430,7 @@ function serializeFilterFXItem(f) {
1420
1430
  'Rds ': uvRadius(f.filter),
1421
1431
  }, filterID: 697 });
1422
1432
  case 'gaussian blur': return __assign(__assign({}, base), { Fltr: {
1433
+ // _name: '高斯模糊', // Testing
1423
1434
  _name: 'Gaussian Blur',
1424
1435
  _classID: 'GsnB',
1425
1436
  'Rds ': uvRadius(f.filter),
@@ -2032,18 +2043,6 @@ addHandler('LMsk', hasKey('userMask'), function (reader, target) {
2032
2043
  (0, psdWriter_1.writeUint8)(writer, 128);
2033
2044
  (0, psdWriter_1.writeZeros)(writer, 1);
2034
2045
  });
2035
- if (helpers_1.MOCK_HANDLERS) {
2036
- addHandler('vowv', // appears with Lr16 section ?
2037
- function (// appears with Lr16 section ?
2038
- _) { return false; }, function (reader, target, left) {
2039
- var value = (0, psdReader_1.readUint32)(reader); // always 2 ????
2040
- reader;
2041
- target;
2042
- console.log('vowv', { value: value }, left());
2043
- }, function (_writer, _target) {
2044
- // TODO: write
2045
- });
2046
- }
2047
2046
  if (helpers_1.MOCK_HANDLERS) {
2048
2047
  addHandler('Patt', function (target) { return target._Patt !== undefined; }, function (reader, target, left) {
2049
2048
  // console.log('additional info: Patt');