From 5364f336af62c9eccb39c51b6c801fa19f59d12c Mon Sep 17 00:00:00 2001 From: quark Date: Wed, 8 Jan 2025 10:15:40 +0800 Subject: [PATCH 1/4] feat: add perspective warp --- src/additionalInfo.ts | 26 ++++++++++++++++++++++++-- src/index.ts | 5 +++-- src/psd.ts | 7 +++++++ 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/additionalInfo.ts b/src/additionalInfo.ts index b798e48..5120f5d 100644 --- a/src/additionalInfo.ts +++ b/src/additionalInfo.ts @@ -1893,7 +1893,16 @@ type SoLdDescriptorFilterItem = { _classID: 'LqFy', LqMe: Uint8Array; }; -}); +}) | { + filterID: 442; + Fltr: { + _name: 'Perspective Warp'; + _classID: 'perspectiveWarpTransform'; + quads: { indices: number[] }[]; + vertices: HrznVrtcDescriptor[]; + warpedVertices: HrznVrtcDescriptor[]; + } +} interface SoLdDescriptorFilter { _name: '', @@ -2474,7 +2483,19 @@ function parseFilterFXItem(f: SoLdDescriptorFilterItem, options: ReadOptions): F liquifyMesh: f.Fltr.LqMe, }, }; - } + }; + case 'perspectiveWarpTransform': { + console.log("FILTERFX", f.Fltr); + return { + ...base, + type: 'perspective warp', + filter: { + vertices: f.Fltr.vertices.map(v => ({ x: v.Hrzn.value, y: v.Vrtc.value })), + warpedVertices: f.Fltr.warpedVertices.map(v => ({ x: v.Hrzn.value, y: v.Vrtc.value })), + indexes: f.Fltr.quads.map(q => q.indices), + }, + }; + }; default: if (options.throwForMissingFeatures) { throw new Error(`Unknown filter classId: ${(f as any).Fltr._classID}`); @@ -3226,6 +3247,7 @@ addHandler( const version = readInt32(reader); if (version !== 4 && version !== 5) throw new Error(`Invalid SoLd version`); const desc: SoLdDescriptor = readVersionAndDescriptor(reader, true); + console.log('SoLd', desc); // console.log('SoLd', require('util').inspect(desc, false, 99, true)); // console.log('SoLd.warp', require('util').inspect(desc.warp, false, 99, true)); // console.log('SoLd.quiltWarp', require('util').inspect(desc.quiltWarp, false, 99, true)); diff --git a/src/index.ts b/src/index.ts index f7419dc..db74d30 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,12 +1,13 @@ import { Psd, ReadOptions, WriteOptions } from './psd'; import { PsdWriter, writePsd as writePsdInternal, getWriterBuffer, createWriter, getWriterBufferNoCopy } from './psdWriter'; import { PsdReader, readPsd as readPsdInternal, createReader } from './psdReader'; +import { fromByteArray } from 'base64-js'; + export * from './abr'; export * from './csh'; export { initializeCanvas } from './helpers'; export * from './psd'; -import { fromByteArray } from 'base64-js'; -export { PsdReader, PsdWriter }; +export type { PsdReader, PsdWriter }; interface BufferLike { buffer: ArrayBuffer; diff --git a/src/psd.ts b/src/psd.ts index 6b46be1..e78e075 100644 --- a/src/psd.ts +++ b/src/psd.ts @@ -1110,6 +1110,13 @@ type FilterVariant = { filter: { liquifyMesh: Uint8Array; }; +} | { + type: 'perspective warp'; + filter: { + indexes: number[][]; + vertices: { x: number; y: number; }[]; + warpedVertices: { x: number; y: number; }[]; + } }; /* From 358b9cc095b9964510e4994d9aa98e91e199483b Mon Sep 17 00:00:00 2001 From: quark Date: Wed, 8 Jan 2025 10:21:09 +0800 Subject: [PATCH 2/4] chore: rm use less log code --- src/additionalInfo.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/additionalInfo.ts b/src/additionalInfo.ts index 5120f5d..d8ffb8b 100644 --- a/src/additionalInfo.ts +++ b/src/additionalInfo.ts @@ -3247,7 +3247,6 @@ addHandler( const version = readInt32(reader); if (version !== 4 && version !== 5) throw new Error(`Invalid SoLd version`); const desc: SoLdDescriptor = readVersionAndDescriptor(reader, true); - console.log('SoLd', desc); // console.log('SoLd', require('util').inspect(desc, false, 99, true)); // console.log('SoLd.warp', require('util').inspect(desc.warp, false, 99, true)); // console.log('SoLd.quiltWarp', require('util').inspect(desc.quiltWarp, false, 99, true)); From 08ac2a2f2ac725a812cec2d26704c84464eb9e4d Mon Sep 17 00:00:00 2001 From: quark Date: Wed, 8 Jan 2025 10:25:40 +0800 Subject: [PATCH 3/4] type: fix ts type error --- src/additionalInfo.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/additionalInfo.ts b/src/additionalInfo.ts index d8ffb8b..263fb71 100644 --- a/src/additionalInfo.ts +++ b/src/additionalInfo.ts @@ -1893,7 +1893,7 @@ type SoLdDescriptorFilterItem = { _classID: 'LqFy', LqMe: Uint8Array; }; -}) | { +} | { filterID: 442; Fltr: { _name: 'Perspective Warp'; @@ -1902,7 +1902,7 @@ type SoLdDescriptorFilterItem = { vertices: HrznVrtcDescriptor[]; warpedVertices: HrznVrtcDescriptor[]; } -} +}) interface SoLdDescriptorFilter { _name: '', From 066aae4c1fe96ac98523e9bbe24c2686b62a80c0 Mon Sep 17 00:00:00 2001 From: quark Date: Wed, 8 Jan 2025 11:58:51 +0800 Subject: [PATCH 4/4] chore: rm log code --- src/additionalInfo.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/additionalInfo.ts b/src/additionalInfo.ts index 263fb71..ba1b6d5 100644 --- a/src/additionalInfo.ts +++ b/src/additionalInfo.ts @@ -1902,7 +1902,7 @@ type SoLdDescriptorFilterItem = { vertices: HrznVrtcDescriptor[]; warpedVertices: HrznVrtcDescriptor[]; } -}) +}); interface SoLdDescriptorFilter { _name: '', @@ -2485,7 +2485,6 @@ function parseFilterFXItem(f: SoLdDescriptorFilterItem, options: ReadOptions): F }; }; case 'perspectiveWarpTransform': { - console.log("FILTERFX", f.Fltr); return { ...base, type: 'perspective warp',