embroidery-viewer/src/lib/format-readers/dst.js
2025-06-04 15:31:53 -03:00

89 lines
2 KiB
JavaScript

import { stitchTypes } from '$lib/file-renderer/pattern';
/**
* Decodes stitch flags from the 3rd byte of a DST stitch command.
*
* @param {number} b2 The third byte of the stitch command.
* @returns {number} Bitmask representing stitch types.
*/
function decodeExp(b2) {
if (b2 === 0xf3) {
return stitchTypes.end;
}
if ((b2 & 0xc3) === 0xc3) {
return stitchTypes.trim | stitchTypes.stop;
}
let returnCode = 0;
if (b2 & 0x80) {
returnCode |= stitchTypes.trim;
}
if (b2 & 0x40) {
returnCode |= stitchTypes.stop;
}
return returnCode;
}
/**
* Reads a DST embroidery file and populates the pattern object.
*
*
* @param {EmbroideryFileView} file
* @param {EmbroideryPattern} pattern
*/
export function dstRead(file, pattern) {
let prevJump = false;
const byteCount = file.byteLength;
file.seek(512); // Skip DST header
while (file.tell() < byteCount - 3) {
/** @type {number[]} */
const b = [file.getUint8(), file.getUint8(), file.getUint8()];
let x = 0;
let y = 0;
// Decode X movements
if (b[0] & 0x01) x += 1;
if (b[0] & 0x02) x -= 1;
if (b[0] & 0x04) x += 9;
if (b[0] & 0x08) x -= 9;
if (b[1] & 0x01) x += 3;
if (b[1] & 0x02) x -= 3;
if (b[1] & 0x04) x += 27;
if (b[1] & 0x08) x -= 27;
if (b[2] & 0x04) x += 81;
if (b[2] & 0x08) x -= 81;
// Decode Y movements
if (b[0] & 0x80) y += 1;
if (b[0] & 0x40) y -= 1;
if (b[0] & 0x20) y += 9;
if (b[0] & 0x10) y -= 9;
if (b[1] & 0x80) y += 3;
if (b[1] & 0x40) y -= 3;
if (b[1] & 0x20) y += 27;
if (b[1] & 0x10) y -= 27;
if (b[2] & 0x20) y += 81;
if (b[2] & 0x10) y -= 81;
let flags = decodeExp(b[2]);
const thisJump = (flags & stitchTypes.jump) !== 0;
if (prevJump) {
flags |= stitchTypes.jump;
}
pattern.addStitchRel(x, y, flags, true);
prevJump = thisJump;
}
pattern.addStitchRel(0, 0, stitchTypes.end, true);
pattern.invertPatternVertical();
}