VIP — Husqvarna / PFAFF

pyembroidery non ha un reader VIP, ma VIP è essenzialmente un body HUS con un header diverso: i flussi comando/x/y usano la stessa compressione Greg-Hus (EmbCompress) di HUS/VP3, senza XOR sulla parte dati (verificato decomprimendo i blocchi e confrontando il percorso punto-per-punto con i file di riferimento).

Header

OffsetTipoSignificato
0x00uint32magic 0x0190FC5D
0x04int32numberOfStitches (include l'END record finale)
0x08int32numberOfColors
0x0Cint16posX (max X)
0x0Eint16posY (max Y)
0x10int16negX (min X)
0x12int16negY (min Y)
0x14int32attributeOffset — início del blocco comandi (compresso)
0x18int32xOffset — início del blocco delta-X (compresso)
0x1Cint32yOffset — início del blocco delta-Y (compresso)
0x208 bytestringa / riservato (zero nei fixture)
0x2Aint32colorLength = 0x2E + 8·numberOfColors (formula nei fixture)
0x2E4·n byteblocco colori cifrato (vedi sotto)

Blocco colori

Ogni colore è 4 byte (r, g, b, 0), XOR-chained con un keystream derivato da vipDecodingTable di libembroidery (vendored in reference/vendor/, generato con scripts/gen_vip_table.py).

decoded[i] = encoded[i] ^ TABLE[i] ^ encoded[i-1]   (encoded[-1] = 0)
encoded[i] = decoded[i] ^ TABLE[i] ^ encoded[i-1]

Plaintext noto in tutti i fixture: 1a 15 eb 84#348D1A. Le formule per layout multicolore (colorLength, attributeOffset in funzione di n) sono verificate solo per n = 1 estrapolate — è flaggato nel writer.

Flussi compressi

command_block = file[attributeOffset : xOffset]
x_block       = file[xOffset        : yOffset]
y_block       = file[yOffset        : EOF]

commands = EmbCompress.expand(command_block, numberOfStitches)  // 1 byte/stitch
xs       = EmbCompress.expand(x_block,       numberOfStitches)  // signed8 delta
ys       = EmbCompress.expand(y_block,       numberOfStitches)  // signed8 delta

Comandi (come HUS)

bytemeaning
0x80STITCH
0x81JUMP
0x84COLOR CHANGE
0x88TRIM
0x90END

Per le 52 lettere monogramma del progetto, tutti i comandi sono 0x80 terminati da un singolo 0x90; numberOfColors == 1 in tutti i file.

Scrittura (core TS)

packages/core/src/writers/vip.ts e hus.ts condividono hus-vip-body.ts. I flussi usano un blocco EmbCompress stored (tabella Huffman letterale degenerata, ≤ 65535 record — con gate). Stato: software-verified (round-trip + read-back via pyembroidery scripts/verify_hus_vip.py); accettazione su macchina reale / Artist Toolkit ancora pendente.

pyembroidery scrive il count del blocco EmbCompress little-endian mentre tutti i decoder lo leggono MSB-first — funziona per puro lucky size. Il nostro writer lo scrive in decoder order, verificato per ogni size.

Compressione: EmbCompress

Classica "Greg's HUS compression". La sorgente Python provata è pyembroidery/EmbCompress.py (licenza MIT). Per leggere VIP/HUS/VP3 serve solo expand(); per scrivere serve anche compress(). Vedi la pagina EmbCompress.

← Tutti i formati ZHS →