ag-psd 15.0.5 → 15.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.
@@ -110,15 +110,17 @@ addHandler(
110
110
  };
111
111
 
112
112
  if (text.EngineData) {
113
- const engineData = decodeEngineData(parseEngineData(text.EngineData));
113
+ const engineData = parseEngineData(text.EngineData);
114
+ const textData = decodeEngineData(engineData);
114
115
 
116
+ // require('fs').writeFileSync(`layer-${target.name}.txt`, require('util').inspect(engineData, false, 99, false), 'utf8');
115
117
  // const before = parseEngineData(text.EngineData);
116
118
  // const after = encodeEngineData(engineData);
117
119
  // require('fs').writeFileSync('before.txt', require('util').inspect(before, false, 99, false), 'utf8');
118
120
  // require('fs').writeFileSync('after.txt', require('util').inspect(after, false, 99, false), 'utf8');
119
121
 
120
122
  // console.log(require('util').inspect(parseEngineData(text.EngineData), false, 99, true));
121
- target.text = { ...target.text, ...engineData };
123
+ target.text = { ...target.text, ...textData };
122
124
  // console.log(require('util').inspect(target.text, false, 99, true));
123
125
  }
124
126
 
@@ -1175,7 +1177,8 @@ addHandler(
1175
1177
  hasKey('placedLayer'),
1176
1178
  (reader, target, left) => {
1177
1179
  if (readSignature(reader) !== 'soLD') throw new Error(`Invalid SoLd type`);
1178
- if (readInt32(reader) !== 4) throw new Error(`Invalid SoLd version`);
1180
+ const version = readInt32(reader);
1181
+ if (version !== 4 && version !== 5) throw new Error(`Invalid SoLd version`);
1179
1182
  const desc: SoLdDescriptor = readVersionAndDescriptor(reader);
1180
1183
  // console.log('SoLd', require('util').inspect(desc, false, 99, true));
1181
1184
  // console.log('SoLd.warp', require('util').inspect(desc.warp, false, 99, true));
@@ -1258,6 +1261,8 @@ addHandler(
1258
1261
  },
1259
1262
  );
1260
1263
 
1264
+ addHandlerAlias('SoLE', 'SoLd');
1265
+
1261
1266
  addHandler(
1262
1267
  'fxrp',
1263
1268
  hasKey('referencePoint'),
@@ -1422,7 +1427,7 @@ addHandler(
1422
1427
  (target: any) => !!(target as Psd).linkedFiles && (target as Psd).linkedFiles!.length > 0,
1423
1428
  (reader, target, left, _, options) => {
1424
1429
  const psd = target as Psd;
1425
- psd.linkedFiles = [];
1430
+ psd.linkedFiles = psd.linkedFiles || [];
1426
1431
 
1427
1432
  while (left() > 8) {
1428
1433
  let size = readLength64(reader); // size
@@ -1452,7 +1457,7 @@ addHandler(
1452
1457
  const seconds = readFloat64(reader);
1453
1458
  const wholeSeconds = Math.floor(seconds);
1454
1459
  const ms = (seconds - wholeSeconds) * 1000;
1455
- file.time = new Date(year, month, day, hour, minute, wholeSeconds, ms);
1460
+ file.time = (new Date(year, month, day, hour, minute, wholeSeconds, ms)).toISOString();
1456
1461
  }
1457
1462
 
1458
1463
  const fileSize = type === 'liFE' ? readLength64(reader) : 0;
@@ -1523,24 +1528,10 @@ addHandler(
1523
1528
  }
1524
1529
  },
1525
1530
  );
1531
+
1526
1532
  addHandlerAlias('lnkD', 'lnk2');
1527
1533
  addHandlerAlias('lnk3', 'lnk2');
1528
-
1529
- // this seems to just be zero size block, ignore it
1530
- addHandler(
1531
- 'lnkE',
1532
- target => (target as any)._lnkE !== undefined,
1533
- (reader, target, left, _psds, options) => {
1534
- if (options.logMissingFeatures && left()) {
1535
- console.log(`Non-empty lnkE layer info (${left()} bytes)`);
1536
- }
1537
-
1538
- if (MOCK_HANDLERS) {
1539
- (target as any)._lnkE = readBytes(reader, left());
1540
- }
1541
- },
1542
- (writer, target) => MOCK_HANDLERS && writeBytes(writer, (target as any)._lnkE),
1543
- );
1534
+ addHandlerAlias('lnkE', 'lnk2');
1544
1535
 
1545
1536
  interface ExtensionDesc {
1546
1537
  generatorSettings: {
@@ -2508,7 +2499,7 @@ interface ArtdDescriptor {
2508
2499
  autoExpandEnabled: boolean;
2509
2500
  autoNestEnabled: boolean;
2510
2501
  autoPositionEnabled: boolean;
2511
- shrinkwrapOnSaveEnabled: boolean;
2502
+ shrinkwrapOnSaveEnabled?: boolean;
2512
2503
  docDefaultNewArtboardBackgroundColor: DescriptorColor;
2513
2504
  docDefaultNewArtboardBackgroundType: number;
2514
2505
  }
@@ -2525,7 +2516,7 @@ addHandler(
2525
2516
  autoExpandEnabled: desc.autoExpandEnabled,
2526
2517
  autoNestEnabled: desc.autoNestEnabled,
2527
2518
  autoPositionEnabled: desc.autoPositionEnabled,
2528
- shrinkwrapOnSaveEnabled: desc.shrinkwrapOnSaveEnabled,
2519
+ shrinkwrapOnSaveEnabled: !!desc.shrinkwrapOnSaveEnabled,
2529
2520
  docDefaultNewArtboardBackgroundColor: parseColor(desc.docDefaultNewArtboardBackgroundColor),
2530
2521
  docDefaultNewArtboardBackgroundType: desc.docDefaultNewArtboardBackgroundType,
2531
2522
  };
package/src/descriptor.ts CHANGED
@@ -190,7 +190,7 @@ const typeToField: { [key: string]: string[]; } = {
190
190
  'warpValue', 'warpPerspective', 'warpPerspectiveOther', 'Intr', 'Wdth', 'Hght',
191
191
  'strokeStyleMiterLimit', 'strokeStyleResolution', 'layerTime', 'keyOriginResolution',
192
192
  'xx', 'xy', 'yx', 'yy', 'tx', 'ty', 'FrGA', 'frameRate', 'audioLevel', 'rotation',
193
- 'X ', 'Y ',
193
+ 'X ', 'Y ', 'redFloat', 'greenFloat', 'blueFloat',
194
194
  ],
195
195
  'UntF': [
196
196
  'Scl ', 'sdwO', 'hglO', 'lagl', 'Lald', 'srgR', 'blur', 'Sftn', 'Opct', 'Dstn', 'Angl',
@@ -708,6 +708,10 @@ export type DescriptorColor = {
708
708
  Lmnc: number;
709
709
  'A ': number;
710
710
  'B ': number;
711
+ } | {
712
+ redFloat: number;
713
+ greenFloat: number;
714
+ blueFloat: number;
711
715
  };
712
716
 
713
717
  export interface DesciptorPattern {
@@ -1520,6 +1524,8 @@ export function parseColor(color: DescriptorColor): Color {
1520
1524
  return { k: color['Gry '] };
1521
1525
  } else if ('Lmnc' in color) {
1522
1526
  return { l: color.Lmnc, a: color['A '], b: color['B '] };
1527
+ } else if ('redFloat' in color) {
1528
+ return { fr: color.redFloat, fg: color.greenFloat, fb: color.blueFloat };
1523
1529
  } else {
1524
1530
  throw new Error('Unsupported color descriptor');
1525
1531
  }
@@ -1530,6 +1536,8 @@ export function serializeColor(color: Color | undefined): DescriptorColor {
1530
1536
  return { 'Rd ': 0, 'Grn ': 0, 'Bl ': 0 };
1531
1537
  } else if ('r' in color) {
1532
1538
  return { 'Rd ': color.r || 0, 'Grn ': color.g || 0, 'Bl ': color.b || 0 };
1539
+ } else if ('fr' in color) {
1540
+ return { redFloat: color.fr, greenFloat: color.fg, blueFloat: color.fb };
1533
1541
  } else if ('h' in color) {
1534
1542
  return { 'H ': unitsAngle(color.h * 360), Strt: color.s || 0, Brgh: color.b || 0 };
1535
1543
  } else if ('c' in color) {
package/src/psd.ts CHANGED
@@ -24,11 +24,12 @@ export const enum SectionDividerType {
24
24
 
25
25
  export type RGBA = { r: number; g: number; b: number; a: number; }; // values from 0 to 255
26
26
  export type RGB = { r: number; g: number; b: number; }; // values from 0 to 255
27
+ export type FRGB = { fr: number; fg: number; fb: number; }; // values from 0 to 1 (can be above 1)
27
28
  export type HSB = { h: number; s: number; b: number; }; // values from 0 to 1
28
29
  export type CMYK = { c: number; m: number; y: number; k: number; }; // values from 0 to 255
29
30
  export type LAB = { l: number; a: number; b: number; }; // values `l` from 0 to 1; `a` and `b` from -1 to 1
30
31
  export type Grayscale = { k: number }; // values from 0 to 255
31
- export type Color = RGBA | RGB | HSB | CMYK | LAB | Grayscale;
32
+ export type Color = RGBA | RGB | FRGB | HSB | CMYK | LAB | Grayscale;
32
33
 
33
34
  export interface EffectContour {
34
35
  name: string;
@@ -664,7 +665,7 @@ export interface LinkedFile {
664
665
  type?: string;
665
666
  creator?: string;
666
667
  data?: Uint8Array;
667
- time?: Date; // for external files
668
+ time?: string; // for external files
668
669
  descriptor?: {
669
670
  compInfo: { compID: number; originalCompID: number; };
670
671
  };
package/src/psdWriter.ts CHANGED
@@ -728,6 +728,12 @@ export function writeColor(writer: PsdWriter, color: Color | undefined) {
728
728
  writeUint16(writer, Math.round(color.g * 257));
729
729
  writeUint16(writer, Math.round(color.b * 257));
730
730
  writeUint16(writer, 0);
731
+ } else if ('fr' in color) {
732
+ writeUint16(writer, ColorSpace.RGB);
733
+ writeUint16(writer, Math.round(color.fr * 255 * 257));
734
+ writeUint16(writer, Math.round(color.fg * 255 * 257));
735
+ writeUint16(writer, Math.round(color.fb * 255 * 257));
736
+ writeUint16(writer, 0);
731
737
  } else if ('l' in color) {
732
738
  writeUint16(writer, ColorSpace.Lab);
733
739
  writeInt16(writer, Math.round(color.l * 10000));
package/src/text.ts CHANGED
@@ -498,6 +498,7 @@ export function decodeEngineData(engineData: EngineData) {
498
498
  for (let i = 0; i < styleRun.RunArray.length; i++) {
499
499
  const length = styleRun.RunLengthArray[i];
500
500
  const style = decodeStyle(styleRun.RunArray[i].StyleSheet.StyleSheetData, fonts);
501
+ if (!style.font) style.font = fonts[0];
501
502
  result.styleRuns.push({ length, style });
502
503
  }
503
504