From 127ca791da5d21c59cdb2f4f9d6ee12ffb444953 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 26 Jul 2021 00:47:35 -0400 Subject: [PATCH] add thumb/preview decoding --- src/add/class.js | 6 +++++ src/mode/sla/x_cxdlp.js | 9 ++++--- web/kiri/cxdlp.html | 54 ++++++++++++++++++++++++++++++++++------- 3 files changed, 57 insertions(+), 12 deletions(-) diff --git a/src/add/class.js b/src/add/class.js index 0b86a52a..f9f099fe 100644 --- a/src/add/class.js +++ b/src/add/class.js @@ -106,6 +106,12 @@ self.DataReader = class DataReader { return p; } + readBytes(len) { + let buf = this.view.buffer.slice(this.pos, this.pos + len); + this.pos += len; + return buf; + } + readU8() { return this.view.getUint8(this.pos++); } diff --git a/src/mode/sla/x_cxdlp.js b/src/mode/sla/x_cxdlp.js index 4659ceb7..fcf542f1 100644 --- a/src/mode/sla/x_cxdlp.js +++ b/src/mode/sla/x_cxdlp.js @@ -64,9 +64,12 @@ res_y: read.readU16(), height: read.readU32(), skip: read.skip(60), - thumb: read.skip(26914), - preview1: read.skip(168202), - preview2: read.skip(168202), + thumb: read.readBytes(26912), + skip: read.skip(2), // 0xd0a term + preview1: read.readBytes(168200), + skip: read.skip(2), // 0xd0a term + preview2: read.readBytes(168200), + skip: read.skip(2), // 0xd0a term dim_x: read_string(true), dim_y: read_string(true), layer: read_string(true), diff --git a/web/kiri/cxdlp.html b/web/kiri/cxdlp.html index 0e5dd1f9..42792e6b 100644 --- a/web/kiri/cxdlp.html +++ b/web/kiri/cxdlp.html @@ -8,13 +8,24 @@ div { display: flex; flex-direction: row; + justify-content: flex-start; + align-items: flex-start; } th { text-align: left; } + canvas, #params, #ctrl { + margin: 1px; + padding: 3px; + border: 1px solid black; + border-radius: 3px; + } #slider { flex-grow: 1; } + #params { + flex-grow: 1; + } .over { background-color: rgba(0,255,0,0.1); } @@ -58,16 +69,41 @@ function row(key,value) { return `${key}${value}`; } + function rev(value, bits = 8) { + let out = 0 + for (let i=0; i> i & 1) << bits-1-i + } + return out >>> 0; + } + function decode(canvas, image, size) { + let tile = new Uint8Array(image); + let draw = canvas.getContext('2d'); + let data = draw.getImageData(0,0,size,size); + let rawd = data.data; + for (let x=0; x> 11) << 3) & 0xff; + rawd[pos+1] = ((rgb >> 5) << 2) & 0xff; + rawd[pos+2] = ((rgb >> 0) << 3) & 0xff; + rawd[pos+3] = 255; + } + } + draw.putImageData(data, 0, 0); + } function meta(cxdlp) { let rows = Object.entries(cxdlp).filter(e => { let t = typeof(e[1]); return t === 'number' || t === 'string'; }).map(e => row(e[0], e[1])); - params.innerHTML = [ - '', - ...rows, - '
' - ].join(''); + params.innerHTML = [ '', ...rows, '
' ].join(''); + console.log({cxdlp}); + decode(thumb, cxdlp.thumb, 116); + decode(pre1, cxdlp.preview1, 290); + decode(pre2, cxdlp.preview2, 290); } function render(layer) { let cxdlp = window.cxdlp; @@ -94,7 +130,7 @@ -
+
@@ -102,9 +138,9 @@
- - - + + +