mirror of
https://gitee.com/onvia/ccc-tnt-psd2ui
synced 2025-04-16 04:01:04 +00:00
45 lines
1.4 KiB
TypeScript
45 lines
1.4 KiB
TypeScript
|
import { readVectorMask } from './additionalInfo';
|
||
|
import { LayerVectorMask } from './psd';
|
||
|
import { readUint32, checkSignature, createReader, readPascalString, readUnicodeString } from './psdReader';
|
||
|
|
||
|
export interface Csh {
|
||
|
shapes: (LayerVectorMask & {
|
||
|
name: string;
|
||
|
id: string;
|
||
|
width: number;
|
||
|
height: number;
|
||
|
})[];
|
||
|
}
|
||
|
|
||
|
export function readCsh(buffer: ArrayBufferView): Csh {
|
||
|
const reader = createReader(buffer.buffer, buffer.byteOffset, buffer.byteLength);
|
||
|
const csh: Csh = { shapes: [] };
|
||
|
|
||
|
checkSignature(reader, 'cush');
|
||
|
if (readUint32(reader) !== 2) throw new Error('Invalid version');
|
||
|
const count = readUint32(reader);
|
||
|
|
||
|
for (let i = 0; i < count; i++) {
|
||
|
const name = readUnicodeString(reader);
|
||
|
while (reader.offset % 4) reader.offset++; // pad to 4byte bounds
|
||
|
if (readUint32(reader) !== 1) throw new Error('Invalid shape version');
|
||
|
const size = readUint32(reader);
|
||
|
const end = reader.offset + size;
|
||
|
const id = readPascalString(reader, 1);
|
||
|
// this might not be correct ???
|
||
|
const y1 = readUint32(reader);
|
||
|
const x1 = readUint32(reader);
|
||
|
const y2 = readUint32(reader);
|
||
|
const x2 = readUint32(reader);
|
||
|
const width = x2 - x1;
|
||
|
const height = y2 - y1;
|
||
|
const mask: LayerVectorMask = { paths: [] };
|
||
|
readVectorMask(reader, mask, width, height, end - reader.offset);
|
||
|
csh.shapes.push({ name, id, width, height, ...mask });
|
||
|
|
||
|
reader.offset = end;
|
||
|
}
|
||
|
|
||
|
return csh;
|
||
|
}
|