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.
- package/CHANGELOG.md +10 -0
- package/README_PSD.md +4 -1
- package/dist/additionalInfo.js +11 -15
- package/dist/additionalInfo.js.map +1 -1
- package/dist/bundle.js +27 -16
- package/dist/descriptor.d.ts +4 -0
- package/dist/descriptor.js +7 -1
- package/dist/descriptor.js.map +1 -1
- package/dist/psd.d.ts +7 -2
- package/dist/psdWriter.js +7 -0
- package/dist/psdWriter.js.map +1 -1
- package/dist/text.js +2 -0
- package/dist/text.js.map +1 -1
- package/dist-es/additionalInfo.js +11 -15
- package/dist-es/additionalInfo.js.map +1 -1
- package/dist-es/descriptor.d.ts +4 -0
- package/dist-es/descriptor.js +7 -1
- package/dist-es/descriptor.js.map +1 -1
- package/dist-es/psd.d.ts +7 -2
- package/dist-es/psdWriter.js +7 -0
- package/dist-es/psdWriter.js.map +1 -1
- package/dist-es/text.js +2 -0
- package/dist-es/text.js.map +1 -1
- package/package.json +1 -1
- package/src/additionalInfo.ts +14 -23
- package/src/descriptor.ts +9 -1
- package/src/psd.ts +3 -2
- package/src/psdWriter.ts +6 -0
- package/src/text.ts +1 -0
package/src/additionalInfo.ts
CHANGED
|
@@ -110,15 +110,17 @@ addHandler(
|
|
|
110
110
|
};
|
|
111
111
|
|
|
112
112
|
if (text.EngineData) {
|
|
113
|
-
const 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, ...
|
|
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
|
-
|
|
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
|
|
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?:
|
|
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
|
|