From a4c159cc8ab86fcc2a534609a776eba7383a01ad Mon Sep 17 00:00:00 2001 From: u8array Date: Thu, 21 May 2026 17:41:07 +0200 Subject: [PATCH] fix(parser): render ^GFA zero-bits as transparent, not opaque white MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0-bits used to be rendered as rgba(255,255,255,255) and obscured underlying objects. ZPL defines 0-bits as not-printed; in the canvas preview that maps to transparent so layered fields stay visible. createImageData starts zero-filled (rgba(0,0,0,0)), which already is the 0-bit case — only the 1-bit pixels need an alpha write. --- src/lib/zplParser.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/lib/zplParser.ts b/src/lib/zplParser.ts index da815e84..b38961a5 100644 --- a/src/lib/zplParser.ts +++ b/src/lib/zplParser.ts @@ -1158,11 +1158,12 @@ export function parseZPL(zpl: string, dpmm = 8): ParsedZPL { for (let bit = 0; bit < 8; bit++) { const px = byteIdx * 8 + bit; const idx = (row * gfWidthDots + px) * 4; - const isBlack = (byte & (0x80 >> bit)) !== 0; - pixels[idx] = isBlack ? 0 : 255; - pixels[idx + 1] = isBlack ? 0 : 255; - pixels[idx + 2] = isBlack ? 0 : 255; - pixels[idx + 3] = 255; + // ZPL ^GF: 1-bit = black (printed), 0-bit = transparent. + // ImageData starts zero-filled (rgba(0,0,0,0)), which is exactly + // the 0-bit case — only the 1-bit case needs a write. + if ((byte & (0x80 >> bit)) !== 0) { + pixels[idx + 3] = 255; + } } } }