89 lines
2 KiB
JavaScript
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();
|
|
}
|