Commit a820f126 authored by Mike Tinglof's avatar Mike Tinglof

added rgb image drawing, some zlib changes (huffman coding working, but lz77 not so much)

parent c577ca23
...@@ -20,7 +20,7 @@ var that = {}, // Public API methods ...@@ -20,7 +20,7 @@ var that = {}, // Public API methods
c_forceCanvas = false, c_forceCanvas = false,
// Predefine function variables (jslint) // Predefine function variables (jslint)
imageDataGet, bgrxImageData, cmapImageData, imageDataGet, rgbImageData, bgrxImageData, cmapImageData,
setFillColor, rescale, setFillColor, rescale,
// The full frame buffer (logical canvas) size // The full frame buffer (logical canvas) size
...@@ -497,6 +497,26 @@ that.finishTile = function() { ...@@ -497,6 +497,26 @@ that.finishTile = function() {
// else: No-op, if not prefer_js then already done by setSubTile // else: No-op, if not prefer_js then already done by setSubTile
}; };
rgbImageData = function(x, y, width, height, arr, offset) {
var img, i, j, data, v = viewport;
/*
if ((x - v.x >= v.w) || (y - v.y >= v.h) ||
(x - v.x + width < 0) || (y - v.y + height < 0)) {
// Skipping because outside of viewport
return;
}
*/
img = c_ctx.createImageData(width, height);
data = img.data;
for (i=0, j=offset; i < (width * height * 4); i=i+4, j=j+3) {
data[i ] = arr[j ];
data[i + 1] = arr[j + 1];
data[i + 2] = arr[j + 2];
data[i + 3] = 255; // Set Alpha
}
c_ctx.putImageData(img, x - v.x, y - v.y);
};
bgrxImageData = function(x, y, width, height, arr, offset) { bgrxImageData = function(x, y, width, height, arr, offset) {
var img, i, j, data, v = viewport; var img, i, j, data, v = viewport;
/* /*
...@@ -540,6 +560,15 @@ that.blitImage = function(x, y, width, height, arr, offset) { ...@@ -540,6 +560,15 @@ that.blitImage = function(x, y, width, height, arr, offset) {
} }
}; };
that.blitRgbImage = function(x, y, width, height, arr, offset) {
if (conf.true_color) {
rgbImageData(x, y, width, height, arr, offset);
} else {
// prolly wrong...
cmapImageData(x, y, width, height, arr, offset);
}
};
that.blitStringImage = function(str, x, y) { that.blitStringImage = function(str, x, y) {
var img = new Image(); var img = new Image();
img.onload = function () { img.onload = function () {
......
...@@ -197,6 +197,8 @@ function JSUnzip() { ...@@ -197,6 +197,8 @@ function JSUnzip() {
* emoller@opera.com * emoller@opera.com
*/ */
"use strict";
function TINF() { function TINF() {
this.OK = 0; this.OK = 0;
...@@ -392,7 +394,7 @@ this.decode_symbol = function(d, t) ...@@ -392,7 +394,7 @@ this.decode_symbol = function(d, t)
this.decode_trees = function(d, lt, dt) this.decode_trees = function(d, lt, dt)
{ {
var code_tree = new this.TREE(); var code_tree = new this.TREE();
lengths = new Array(288+32); var lengths = new Array(288+32);
var hlit, hdist, hclen; var hlit, hdist, hclen;
var i, num, length; var i, num, length;
...@@ -518,6 +520,13 @@ this.inflate_uncompressed_block = function(d) ...@@ -518,6 +520,13 @@ this.inflate_uncompressed_block = function(d)
var length, invlength; var length, invlength;
var i; var i;
if (d.bitcount > 7) {
var overflow = Math.floor(d.bitcount / 8);
d.sourceIndex -= overflow;
d.bitcount = 0;
d.tag = 0;
}
/* get length */ /* get length */
length = d.source[d.sourceIndex+1]; length = d.source[d.sourceIndex+1];
length = 256*length + d.source[d.sourceIndex]; length = 256*length + d.source[d.sourceIndex];
...@@ -605,8 +614,12 @@ this.uncompress = function(source, offset) ...@@ -605,8 +614,12 @@ this.uncompress = function(source, offset)
// Skip zlib header at start of stream // Skip zlib header at start of stream
if (typeof this.header == 'undefined') { if (typeof this.header == 'undefined') {
this.header = this.read_bits(d, 16, 0); this.header = this.read_bits(d, 16, 0);
/* byte 0: 0x78, 7 = 32k window size, 8 = deflate */
/* byte 1: check bits for header and other flags */
} }
var blocks = 0;
do { do {
var btype; var btype;
...@@ -638,21 +651,18 @@ this.uncompress = function(source, offset) ...@@ -638,21 +651,18 @@ this.uncompress = function(source, offset)
} }
if (res != this.OK) return { 'status' : this.DATA_ERROR }; if (res != this.OK) return { 'status' : this.DATA_ERROR };
blocks++;
} while (!bfinal && d.sourceIndex < d.source.length);
} while (!bfinal && d.sourceIndex < d.source.length - 3); if (blocks != 2) throw ("Unexpected number of blocks");
if (Object.prototype.toString.call(source) !== '[object Array]') { if (Object.prototype.toString.call(source) !== '[object Array]') {
d.dest = d.dest.join(''); d.dest = d.dest.join('');
} }
else { else {
if (d.dest.length >= this.WINDOW_SIZE) {
d.history = d.dest.slice(d.dest.length - this.WINDOW_SIZE);
} else {
var overflow = d.history.length + d.dest.length - this.WINDOW_SIZE;
if (overflow > 0)
d.history = d.history.slice(overflow);
}
d.history.push.apply(d.history, d.dest); d.history.push.apply(d.history, d.dest);
d.history = d.history.slice(-this.WINDOW_SIZE);
} }
return { 'status' : this.OK, 'data' : d.dest }; return { 'status' : this.OK, 'data' : d.dest };
......
...@@ -299,7 +299,7 @@ init_vars = function() { ...@@ -299,7 +299,7 @@ init_vars = function() {
FBU.lines = 0; // RAW FBU.lines = 0; // RAW
FBU.tiles = 0; // HEXTILE FBU.tiles = 0; // HEXTILE
FBU.imgQ = []; // TIGHT_PNG image queue FBU.imgQ = []; // TIGHT_PNG image queue
FBU.streams = []; // TIGHT zlib encoders FBU.zlibs = []; // TIGHT zlib encoders
mouse_buttonMask = 0; mouse_buttonMask = 0;
mouse_arr = []; mouse_arr = [];
...@@ -1290,11 +1290,22 @@ encHandlers.TIGHT = function display_tight() { ...@@ -1290,11 +1290,22 @@ encHandlers.TIGHT = function display_tight() {
return [header, data]; return [header, data];
}; };
var checksum = function(data) {
var sum=0, i;
for (i=0; i<data.length;i++) {
sum += data[i];
if (sum > 65536) sum -= 65536;
}
return sum;
}
var decompress = function(data) { var decompress = function(data) {
// TODO: process resetStreams here // TODO: process resetStreams here
var uncompressed = FBU.zlibs[streamId].uncompress(data, 0); var uncompressed = FBU.zlibs[streamId].uncompress(data, 0);
if (uncompressed.status != 0) if (uncompressed.status != 0)
throw("Invalid data in zlib stream"); throw("Invalid data in zlib stream");
Util.Warn("Decompressed " + data.length + " to " + uncompressed.data.length + " checksums " +
checksum(data) + ":" + checksum(uncompressed.data));
return uncompressed.data; return uncompressed.data;
} }
...@@ -1319,6 +1330,8 @@ encHandlers.TIGHT = function display_tight() { ...@@ -1319,6 +1330,8 @@ encHandlers.TIGHT = function display_tight() {
// Shift ctl, filter id, num colors, palette entries, and clength off // Shift ctl, filter id, num colors, palette entries, and clength off
ws.rQshiftBytes(3 + paletteSize + clength[0]); ws.rQshiftBytes(3 + paletteSize + clength[0]);
if (streamId == 0) throw ("Wrong stream");
// Process data // Process data
if (clength[1] < 12) if (clength[1] < 12)
data = ws.rQshiftBytes(clength[1]); data = ws.rQshiftBytes(clength[1]);
...@@ -1337,6 +1350,8 @@ encHandlers.TIGHT = function display_tight() { ...@@ -1337,6 +1350,8 @@ encHandlers.TIGHT = function display_tight() {
FBU.bytes = 1 + clength[0] + clength[1]; // ctl + clength size + zlib-data FBU.bytes = 1 + clength[0] + clength[1]; // ctl + clength size + zlib-data
if (ws.rQwait("TIGHT " + cmode, FBU.bytes)) { return false; } if (ws.rQwait("TIGHT " + cmode, FBU.bytes)) { return false; }
if (streamId != 0) throw ("Wrong stream");
ws.rQshiftBytes(1 + clength[0]); // ctl + clength ws.rQshiftBytes(1 + clength[0]); // ctl + clength
if (clength[1] < 12) if (clength[1] < 12)
data = ws.rQshiftBytes(clength[1]); data = ws.rQshiftBytes(clength[1]);
...@@ -1357,6 +1372,7 @@ encHandlers.TIGHT = function display_tight() { ...@@ -1357,6 +1372,7 @@ encHandlers.TIGHT = function display_tight() {
// Keep tight reset bits // Keep tight reset bits
resetStreams = ctl & 0xF; resetStreams = ctl & 0xF;
if (resetStreams) throw ("Tight reset");
// Figure out filter // Figure out filter
ctl = ctl >> 4; ctl = ctl >> 4;
...@@ -1540,7 +1556,7 @@ scan_tight_imgQ = function() { ...@@ -1540,7 +1556,7 @@ scan_tight_imgQ = function() {
if (data.type === 'fill') { if (data.type === 'fill') {
display.fillRect(data.x, data.y, data.width, data.height, data.color); display.fillRect(data.x, data.y, data.width, data.height, data.color);
} else if (data.type === 'rgb') { } else if (data.type === 'rgb') {
// TODO display.blitRgbImage(data.x, data.y, data.width, data.height, data.img.data, 0);
} else { } else {
ctx.drawImage(data.img, data.x, data.y); ctx.drawImage(data.img, data.x, data.y);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment