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.
- package/.v8-cache/v22.13.1-x64-00250a7c/4511bacf +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/57d3380b +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/6cbfc0ec +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/7100ee08 +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/75e41e43 +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/8d0bf0b5 +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/acc36e66 +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/b3c2fab7 +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/c314aece +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/cfc49f4f +0 -0
- package/.v8-cache/v22.13.1-x64-00250a7c/e03e2acd +0 -0
- package/CHANGELOG.md +7 -0
- package/{TODO → TODO.md} +46 -0
- package/accept.js +18 -1
- package/dist/additionalInfo.js +62 -63
- package/dist/additionalInfo.js.map +1 -1
- package/dist/bundle.js +246 -186
- package/dist/descriptor.d.ts +4 -3
- package/dist/descriptor.js +9 -5
- package/dist/descriptor.js.map +1 -1
- package/dist/helpers.d.ts +1 -0
- package/dist/helpers.js.map +1 -1
- package/dist/imageResources.js +39 -5
- package/dist/imageResources.js.map +1 -1
- package/dist/psd.d.ts +12 -1
- package/dist/psd.js.map +1 -1
- package/dist/psdReader.js +39 -36
- package/dist/psdReader.js.map +1 -1
- package/dist/psdWriter.js +96 -76
- package/dist/psdWriter.js.map +1 -1
- package/dist-es/additionalInfo.js +62 -63
- package/dist-es/additionalInfo.js.map +1 -1
- package/dist-es/descriptor.d.ts +4 -3
- package/dist-es/descriptor.js +9 -5
- package/dist-es/descriptor.js.map +1 -1
- package/dist-es/helpers.d.ts +1 -0
- package/dist-es/helpers.js.map +1 -1
- package/dist-es/imageResources.js +41 -7
- package/dist-es/imageResources.js.map +1 -1
- package/dist-es/psd.d.ts +12 -1
- package/dist-es/psd.js.map +1 -1
- package/dist-es/psdReader.js +39 -36
- package/dist-es/psdReader.js.map +1 -1
- package/dist-es/psdWriter.js +96 -76
- package/dist-es/psdWriter.js.map +1 -1
- package/package.json +1 -1
- package/src/additionalInfo.ts +66 -66
- package/src/descriptor.ts +12 -8
- package/src/helpers.ts +1 -0
- package/src/imageResources.ts +46 -20
- package/src/psd.ts +9 -1
- package/src/psdReader.ts +43 -40
- package/src/psdWriter.ts +92 -78
package/src/psdWriter.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Psd, Layer, LayerAdditionalInfo, ColorMode, SectionDividerType, WriteOptions, Color, GlobalLayerMaskInfo, PixelData } from './psd';
|
|
1
|
+
import { Psd, Layer, LayerAdditionalInfo, ColorMode, SectionDividerType, WriteOptions, Color, GlobalLayerMaskInfo, PixelData, LayerMaskData } from './psd';
|
|
2
2
|
import { hasAlpha, createCanvas, writeDataRLE, LayerChannelData, ChannelData, offsetForChannel, createImageData, fromBlendMode, ChannelID, Compression, clamp, LayerMaskFlags, MaskParams, ColorSpace, Bounds, largeAdditionalInfoKeys, RAW_IMAGE_DATA, writeDataZipWithoutPrediction, imageDataToCanvas } from './helpers';
|
|
3
3
|
import { ExtendedWriteOptions, infoHandlers } from './additionalInfo';
|
|
4
4
|
import { resourceHandlers } from './imageResources';
|
|
@@ -354,7 +354,7 @@ function writeLayerInfo(writer: PsdWriter, psd: Psd, globalAlpha: boolean, optio
|
|
|
354
354
|
let flags = 0x08; // 1 for Photoshop 5.0 and later, tells if bit 4 has useful information
|
|
355
355
|
if (layer.transparencyProtected) flags |= 0x01;
|
|
356
356
|
if (layer.hidden) flags |= 0x02;
|
|
357
|
-
if (layer.vectorMask || (layer.sectionDivider && layer.sectionDivider.type !== SectionDividerType.Other)) {
|
|
357
|
+
if (layer.vectorMask || (layer.sectionDivider && layer.sectionDivider.type !== SectionDividerType.Other) || layer.adjustment) {
|
|
358
358
|
flags |= 0x10; // pixel data irrelevant to appearance of document
|
|
359
359
|
}
|
|
360
360
|
if (layer.effectsOpen) flags |= 0x20;
|
|
@@ -363,7 +363,7 @@ function writeLayerInfo(writer: PsdWriter, psd: Psd, globalAlpha: boolean, optio
|
|
|
363
363
|
writeUint8(writer, 0); // filler
|
|
364
364
|
writeSection(writer, 1, () => {
|
|
365
365
|
writeLayerMaskData(writer, layer, layerData);
|
|
366
|
-
writeLayerBlendingRanges(writer,
|
|
366
|
+
writeLayerBlendingRanges(writer, layer);
|
|
367
367
|
writePascalString(writer, (layer.name || '').substring(0, 255), 4);
|
|
368
368
|
writeAdditionalLayerInfo(writer, layer, psd, options);
|
|
369
369
|
});
|
|
@@ -382,57 +382,77 @@ function writeLayerInfo(writer: PsdWriter, psd: Psd, globalAlpha: boolean, optio
|
|
|
382
382
|
}, true, options.psb);
|
|
383
383
|
}
|
|
384
384
|
|
|
385
|
-
function writeLayerMaskData(writer: PsdWriter, { mask }: Layer, layerData: LayerChannelData) {
|
|
385
|
+
function writeLayerMaskData(writer: PsdWriter, { mask, realMask }: Layer, layerData: LayerChannelData) {
|
|
386
386
|
writeSection(writer, 1, () => {
|
|
387
|
-
if (!mask) return;
|
|
387
|
+
if (!mask && !realMask) return;
|
|
388
|
+
|
|
389
|
+
let params = 0, flags = 0, realFlags = 0;
|
|
390
|
+
|
|
391
|
+
if (mask) {
|
|
392
|
+
if (mask.userMaskDensity !== undefined) params |= MaskParams.UserMaskDensity;
|
|
393
|
+
if (mask.userMaskFeather !== undefined) params |= MaskParams.UserMaskFeather;
|
|
394
|
+
if (mask.vectorMaskDensity !== undefined) params |= MaskParams.VectorMaskDensity;
|
|
395
|
+
if (mask.vectorMaskFeather !== undefined) params |= MaskParams.VectorMaskFeather;
|
|
396
|
+
|
|
397
|
+
if (mask.disabled) flags |= LayerMaskFlags.LayerMaskDisabled;
|
|
398
|
+
if (mask.positionRelativeToLayer) flags |= LayerMaskFlags.PositionRelativeToLayer;
|
|
399
|
+
if (mask.fromVectorData) flags |= LayerMaskFlags.LayerMaskFromRenderingOtherData;
|
|
400
|
+
if (params) flags |= LayerMaskFlags.MaskHasParametersAppliedToIt;
|
|
401
|
+
}
|
|
388
402
|
|
|
389
403
|
const m = layerData.mask || {} as Partial<Bounds>;
|
|
390
404
|
writeInt32(writer, m.top || 0);
|
|
391
405
|
writeInt32(writer, m.left || 0);
|
|
392
406
|
writeInt32(writer, m.bottom || 0);
|
|
393
407
|
writeInt32(writer, m.right || 0);
|
|
394
|
-
writeUint8(writer, mask.defaultColor || 0);
|
|
395
|
-
|
|
396
|
-
let params = 0;
|
|
397
|
-
if (mask.userMaskDensity !== undefined) params |= MaskParams.UserMaskDensity;
|
|
398
|
-
if (mask.userMaskFeather !== undefined) params |= MaskParams.UserMaskFeather;
|
|
399
|
-
if (mask.vectorMaskDensity !== undefined) params |= MaskParams.VectorMaskDensity;
|
|
400
|
-
if (mask.vectorMaskFeather !== undefined) params |= MaskParams.VectorMaskFeather;
|
|
401
|
-
|
|
402
|
-
let flags = 0;
|
|
403
|
-
if (mask.disabled) flags |= LayerMaskFlags.LayerMaskDisabled;
|
|
404
|
-
if (mask.positionRelativeToLayer) flags |= LayerMaskFlags.PositionRelativeToLayer;
|
|
405
|
-
if (mask.fromVectorData) flags |= LayerMaskFlags.LayerMaskFromRenderingOtherData;
|
|
406
|
-
if (params) flags |= LayerMaskFlags.MaskHasParametersAppliedToIt;
|
|
407
|
-
|
|
408
|
+
writeUint8(writer, mask && mask.defaultColor || 0);
|
|
408
409
|
writeUint8(writer, flags);
|
|
409
410
|
|
|
410
|
-
if (
|
|
411
|
-
|
|
411
|
+
if (realMask) {
|
|
412
|
+
if (realMask.disabled) realFlags |= LayerMaskFlags.LayerMaskDisabled;
|
|
413
|
+
if (realMask.positionRelativeToLayer) realFlags |= LayerMaskFlags.PositionRelativeToLayer;
|
|
414
|
+
if (realMask.fromVectorData) realFlags |= LayerMaskFlags.LayerMaskFromRenderingOtherData;
|
|
415
|
+
|
|
416
|
+
const r = layerData.realMask || {} as Partial<Bounds>;
|
|
417
|
+
writeUint8(writer, realFlags);
|
|
418
|
+
writeUint8(writer, realMask.defaultColor || 0);
|
|
419
|
+
writeInt32(writer, r.top || 0);
|
|
420
|
+
writeInt32(writer, r.left || 0);
|
|
421
|
+
writeInt32(writer, r.bottom || 0);
|
|
422
|
+
writeInt32(writer, r.right || 0);
|
|
423
|
+
}
|
|
412
424
|
|
|
425
|
+
if (params && mask) {
|
|
426
|
+
writeUint8(writer, params);
|
|
413
427
|
if (mask.userMaskDensity !== undefined) writeUint8(writer, Math.round(mask.userMaskDensity * 0xff));
|
|
414
428
|
if (mask.userMaskFeather !== undefined) writeFloat64(writer, mask.userMaskFeather);
|
|
415
429
|
if (mask.vectorMaskDensity !== undefined) writeUint8(writer, Math.round(mask.vectorMaskDensity * 0xff));
|
|
416
430
|
if (mask.vectorMaskFeather !== undefined) writeFloat64(writer, mask.vectorMaskFeather);
|
|
417
431
|
}
|
|
418
432
|
|
|
419
|
-
// TODO: handle rest of the fields
|
|
420
|
-
|
|
421
433
|
writeZeros(writer, 2);
|
|
422
434
|
});
|
|
423
435
|
}
|
|
424
436
|
|
|
425
|
-
function
|
|
437
|
+
function writerBlendingRange(writer: PsdWriter, range: number[]) {
|
|
438
|
+
writeUint8(writer, range[0]);
|
|
439
|
+
writeUint8(writer, range[1]);
|
|
440
|
+
writeUint8(writer, range[2]);
|
|
441
|
+
writeUint8(writer, range[3]);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
function writeLayerBlendingRanges(writer: PsdWriter, layer: Layer) {
|
|
426
445
|
writeSection(writer, 1, () => {
|
|
427
|
-
|
|
428
|
-
writeUint32(writer, 65535);
|
|
446
|
+
const ranges = layer.blendingRanges;
|
|
429
447
|
|
|
430
|
-
|
|
431
|
-
|
|
448
|
+
if (ranges) {
|
|
449
|
+
writerBlendingRange(writer, ranges.compositeGrayBlendSource);
|
|
450
|
+
writerBlendingRange(writer, ranges.compositeGraphBlendDestinationRange);
|
|
432
451
|
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
452
|
+
for (const r of ranges.ranges) {
|
|
453
|
+
writerBlendingRange(writer, r.sourceRange);
|
|
454
|
+
writerBlendingRange(writer, r.destRange);
|
|
455
|
+
}
|
|
436
456
|
}
|
|
437
457
|
});
|
|
438
458
|
}
|
|
@@ -477,8 +497,8 @@ function writeAdditionalLayerInfo(writer: PsdWriter, target: LayerAdditionalInfo
|
|
|
477
497
|
function addChildren(layers: Layer[], children: Layer[] | undefined) {
|
|
478
498
|
if (!children) return;
|
|
479
499
|
|
|
480
|
-
// const layerIds = [];
|
|
481
|
-
// const timestamps = []
|
|
500
|
+
// const layerIds: number[] = [2];
|
|
501
|
+
// const timestamps: number[] = [1740120767.0230637];
|
|
482
502
|
|
|
483
503
|
for (const c of children) {
|
|
484
504
|
if (c.children && c.canvas) throw new Error(`Invalid layer, cannot have both 'canvas' and 'children' properties`);
|
|
@@ -490,6 +510,7 @@ function addChildren(layers: Layer[], children: Layer[] | undefined) {
|
|
|
490
510
|
sectionDivider: {
|
|
491
511
|
type: SectionDividerType.BoundingSectionDivider,
|
|
492
512
|
},
|
|
513
|
+
// blendingRanges: children[0].blendingRanges,
|
|
493
514
|
// nameSource: 'lset',
|
|
494
515
|
// id: layerIds.shift(),
|
|
495
516
|
// protected: {
|
|
@@ -497,12 +518,9 @@ function addChildren(layers: Layer[], children: Layer[] | undefined) {
|
|
|
497
518
|
// composite: false,
|
|
498
519
|
// position: false,
|
|
499
520
|
// },
|
|
500
|
-
// layerColor: '
|
|
521
|
+
// layerColor: 'red',
|
|
501
522
|
// timestamp: timestamps.shift(),
|
|
502
|
-
// referencePoint: {
|
|
503
|
-
// x: 0,
|
|
504
|
-
// y: 0,
|
|
505
|
-
// },
|
|
523
|
+
// referencePoint: { x: 0, y: 0 },
|
|
506
524
|
});
|
|
507
525
|
addChildren(layers, c.children);
|
|
508
526
|
layers.push({
|
|
@@ -573,54 +591,50 @@ function createThumbnail(psd: Psd) {
|
|
|
573
591
|
return canvas;
|
|
574
592
|
}
|
|
575
593
|
|
|
576
|
-
function
|
|
577
|
-
|
|
578
|
-
)
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
let top = (mask.top as any) | 0;
|
|
584
|
-
let left = (mask.left as any) | 0;
|
|
585
|
-
let right = (mask.right as any) | 0;
|
|
586
|
-
let bottom = (mask.bottom as any) | 0;
|
|
587
|
-
let { width, height } = getLayerDimentions(mask);
|
|
588
|
-
let imageData = mask.imageData;
|
|
589
|
-
|
|
590
|
-
if (!imageData && mask.canvas && width && height) {
|
|
591
|
-
imageData = mask.canvas.getContext('2d')!.getImageData(0, 0, width, height);
|
|
592
|
-
}
|
|
594
|
+
function getMaskChannels(tempBuffer: Uint8Array, layerData: LayerChannelData, layer: Layer, mask: LayerMaskData, options: WriteOptions, realMask: boolean) {
|
|
595
|
+
let top = (mask.top as any) | 0;
|
|
596
|
+
let left = (mask.left as any) | 0;
|
|
597
|
+
let right = (mask.right as any) | 0;
|
|
598
|
+
let bottom = (mask.bottom as any) | 0;
|
|
599
|
+
let { width, height } = getLayerDimentions(mask);
|
|
600
|
+
let imageData = mask.imageData;
|
|
593
601
|
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
602
|
+
if (!imageData && mask.canvas && width && height) {
|
|
603
|
+
imageData = mask.canvas.getContext('2d')!.getImageData(0, 0, width, height);
|
|
604
|
+
}
|
|
597
605
|
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
606
|
+
if (width && height && imageData) {
|
|
607
|
+
right = left + width;
|
|
608
|
+
bottom = top + height;
|
|
601
609
|
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
compression = (layer as any).maskDataRawCompression;
|
|
609
|
-
} else if (options.compress) {
|
|
610
|
-
buffer = writeDataZipWithoutPrediction(imageData, [0]);
|
|
611
|
-
compression = Compression.ZipWithoutPrediction;
|
|
612
|
-
} else {
|
|
613
|
-
buffer = writeDataRLE(tempBuffer, imageData, [0], !!options.psb)!;
|
|
614
|
-
compression = Compression.RleCompressed;
|
|
615
|
-
}
|
|
610
|
+
if (imageData.width !== width || imageData.height !== height) {
|
|
611
|
+
throw new Error('Invalid imageData dimentions');
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
let buffer: Uint8Array;
|
|
615
|
+
let compression: Compression;
|
|
616
616
|
|
|
617
|
-
|
|
618
|
-
|
|
617
|
+
if (RAW_IMAGE_DATA && (layer as any)[realMask ? 'realMaskDataRaw' : 'maskDataRaw']) {
|
|
618
|
+
buffer = (layer as any)[realMask ? 'realMaskDataRaw' : 'maskDataRaw'];
|
|
619
|
+
compression = (layer as any)[realMask ? 'realMaskDataRawCompression' : 'maskDataRawCompression'];
|
|
620
|
+
} else if (options.compress) {
|
|
621
|
+
buffer = writeDataZipWithoutPrediction(imageData, [0]);
|
|
622
|
+
compression = Compression.ZipWithoutPrediction;
|
|
619
623
|
} else {
|
|
620
|
-
|
|
624
|
+
buffer = writeDataRLE(tempBuffer, imageData, [0], !!options.psb)!;
|
|
625
|
+
compression = Compression.RleCompressed;
|
|
621
626
|
}
|
|
627
|
+
|
|
628
|
+
layerData.channels.push({ channelId: realMask ? ChannelID.RealUserMask : ChannelID.UserMask, compression, buffer, length: 2 + buffer.length });
|
|
622
629
|
}
|
|
623
630
|
|
|
631
|
+
layerData[realMask ? 'realMask' : 'mask'] = { top, left, right, bottom };
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
function getChannels(tempBuffer: Uint8Array, layer: Layer, background: boolean, options: WriteOptions): LayerChannelData {
|
|
635
|
+
const layerData = getLayerChannels(tempBuffer, layer, background, options);
|
|
636
|
+
if (layer.mask) getMaskChannels(tempBuffer, layerData, layer, layer.mask, options, false);
|
|
637
|
+
if (layer.realMask) getMaskChannels(tempBuffer, layerData, layer, layer.realMask, options, true);
|
|
624
638
|
return layerData;
|
|
625
639
|
}
|
|
626
640
|
|