Commit e16ad2fd authored by Joel Martin's avatar Joel Martin

Refactoring hot blocks to help Chrome optimizing compiler.

parent 1d728ace
...@@ -10,16 +10,16 @@ ...@@ -10,16 +10,16 @@
var Base64 = { var Base64 = {
/* Convert data (an array of integers) to a Base64 string. */ /* Convert data (an array of integers) to a Base64 string. */
toBase64Table : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''), toBase64Table : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.split(''),
base64Pad : '=', base64Pad : '=',
encode: function (data) { encode: function (data) {
"use strict"; "use strict";
var result = ''; var result = '';
var toBase64Table = Base64.toBase64Table; var toBase64Table = Base64.toBase64Table;
var base64Pad = Base64.base64Pad; var length = data.length
var length = data.length; var lengthpad = (length%3);
var i; var i = 0, j = 0;
// Convert every three bytes to 4 ascii characters. // Convert every three bytes to 4 ascii characters.
/* BEGIN LOOP */ /* BEGIN LOOP */
for (i = 0; i < (length - 2); i += 3) { for (i = 0; i < (length - 2); i += 3) {
...@@ -31,17 +31,18 @@ encode: function (data) { ...@@ -31,17 +31,18 @@ encode: function (data) {
/* END LOOP */ /* END LOOP */
// Convert the remaining 1 or 2 bytes, pad out to 4 characters. // Convert the remaining 1 or 2 bytes, pad out to 4 characters.
if (length%3) { if (lengthpad === 2) {
i = length - (length%3); j = length - lengthpad;
result += toBase64Table[data[i] >> 2]; result += toBase64Table[data[j] >> 2];
if ((length%3) === 2) { result += toBase64Table[((data[j] & 0x03) << 4) + (data[j+1] >> 4)];
result += toBase64Table[((data[i] & 0x03) << 4) + (data[i+1] >> 4)]; result += toBase64Table[(data[j+1] & 0x0f) << 2];
result += toBase64Table[(data[i+1] & 0x0f) << 2]; result += toBase64Table[64];
result += base64Pad; } else if (lengthpad === 1) {
} else { j = length - lengthpad;
result += toBase64Table[(data[i] & 0x03) << 4]; result += toBase64Table[data[j] >> 2];
result += base64Pad + base64Pad; result += toBase64Table[(data[j] & 0x03) << 4];
} result += toBase64Table[64];
result += toBase64Table[64];
} }
return result; return result;
......
...@@ -502,8 +502,8 @@ that.finishTile = function() { ...@@ -502,8 +502,8 @@ 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) { rgbImageData = function(x, y, vx, vy, width, height, arr, offset) {
var img, i, j, data, v = viewport; var img, i, j, data;
/* /*
if ((x - v.x >= v.w) || (y - v.y >= v.h) || if ((x - v.x >= v.w) || (y - v.y >= v.h) ||
(x - v.x + width < 0) || (y - v.y + height < 0)) { (x - v.x + width < 0) || (y - v.y + height < 0)) {
...@@ -519,11 +519,11 @@ rgbImageData = function(x, y, width, height, arr, offset) { ...@@ -519,11 +519,11 @@ rgbImageData = function(x, y, width, height, arr, offset) {
data[i + 2] = arr[j + 2]; data[i + 2] = arr[j + 2];
data[i + 3] = 255; // Set Alpha data[i + 3] = 255; // Set Alpha
} }
c_ctx.putImageData(img, x - v.x, y - v.y); c_ctx.putImageData(img, x - vx, y - vy);
}; };
bgrxImageData = function(x, y, width, height, arr, offset) { bgrxImageData = function(x, y, vx, vy, width, height, arr, offset) {
var img, i, j, data, v = viewport; var img, i, j, data;
/* /*
if ((x - v.x >= v.w) || (y - v.y >= v.h) || if ((x - v.x >= v.w) || (y - v.y >= v.h) ||
(x - v.x + width < 0) || (y - v.y + height < 0)) { (x - v.x + width < 0) || (y - v.y + height < 0)) {
...@@ -539,10 +539,10 @@ bgrxImageData = function(x, y, width, height, arr, offset) { ...@@ -539,10 +539,10 @@ bgrxImageData = function(x, y, width, height, arr, offset) {
data[i + 2] = arr[j ]; data[i + 2] = arr[j ];
data[i + 3] = 255; // Set Alpha data[i + 3] = 255; // Set Alpha
} }
c_ctx.putImageData(img, x - v.x, y - v.y); c_ctx.putImageData(img, x - vx, y - vy);
}; };
cmapImageData = function(x, y, width, height, arr, offset) { cmapImageData = function(x, y, vx, vy, width, height, arr, offset) {
var img, i, j, data, bgr, cmap; var img, i, j, data, bgr, cmap;
img = c_ctx.createImageData(width, height); img = c_ctx.createImageData(width, height);
data = img.data; data = img.data;
...@@ -554,23 +554,23 @@ cmapImageData = function(x, y, width, height, arr, offset) { ...@@ -554,23 +554,23 @@ cmapImageData = function(x, y, width, height, arr, offset) {
data[i + 2] = bgr[0]; data[i + 2] = bgr[0];
data[i + 3] = 255; // Set Alpha data[i + 3] = 255; // Set Alpha
} }
c_ctx.putImageData(img, x - viewport.x, y - viewport.y); c_ctx.putImageData(img, x - vx, y - vy);
}; };
that.blitImage = function(x, y, width, height, arr, offset) { that.blitImage = function(x, y, width, height, arr, offset) {
if (conf.true_color) { if (conf.true_color) {
bgrxImageData(x, y, width, height, arr, offset); bgrxImageData(x, y, viewport.x, viewport.y, width, height, arr, offset);
} else { } else {
cmapImageData(x, y, width, height, arr, offset); cmapImageData(x, y, viewport.x, viewport.y, width, height, arr, offset);
} }
}; };
that.blitRgbImage = function(x, y, width, height, arr, offset) { that.blitRgbImage = function(x, y, width, height, arr, offset) {
if (conf.true_color) { if (conf.true_color) {
rgbImageData(x, y, width, height, arr, offset); rgbImageData(x, y, viewport.x, viewport.y, width, height, arr, offset);
} else { } else {
// prolly wrong... // prolly wrong...
cmapImageData(x, y, width, height, arr, offset); cmapImageData(x, y, viewport.x, viewport.y, width, height, arr, offset);
} }
}; };
......
...@@ -352,20 +352,28 @@ this.getbit = function(d) ...@@ -352,20 +352,28 @@ this.getbit = function(d)
} }
/* read a num bit value from a stream and add base */ /* read a num bit value from a stream and add base */
function read_bits_direct(source, bitcount, tag, idx, num)
{
var val = 0;
while (bitcount < 24) {
tag = tag | (source[idx++] & 0xff) << bitcount;
bitcount += 8;
}
val = tag & (0xffff >> (16 - num));
tag >>= num;
bitcount -= num;
return [bitcount, tag, idx, val];
}
this.read_bits = function(d, num, base) this.read_bits = function(d, num, base)
{ {
if (!num) if (!num)
return base; return base;
var val = 0; var ret = read_bits_direct(d.source, d.bitcount, d.tag, d.sourceIndex, num);
while (d.bitcount < 24) { d.bitcount = ret[0];
d.tag = d.tag | (d.source[d.sourceIndex++] & 0xff) << d.bitcount; d.tag = ret[1];
d.bitcount += 8; d.sourceIndex = ret[2];
} return ret[3] + base;
val = d.tag & (0xffff >> (16 - num));
d.tag >>= num;
d.bitcount -= num;
return val + base;
} }
/* given a data stream and a tree, decode a symbol */ /* given a data stream and a tree, decode a symbol */
......
...@@ -1361,6 +1361,45 @@ function display_tight(isTightPNG) { ...@@ -1361,6 +1361,45 @@ function display_tight(isTightPNG) {
return uncompressed.data; return uncompressed.data;
} }
var indexedToRGB = function (data, numColors, palette, width, height) {
// Convert indexed (palette based) image data to RGB
// TODO: reduce number of calculations inside loop
var dest = [];
var x, y, b, w, w1, dp, sp;
if (numColors === 2) {
w = Math.floor((width + 7) / 8);
w1 = Math.floor(width / 8);
for (y = 0; y < height; y++) {
for (x = 0; x < w1; x++) {
for (b = 7; b >= 0; b--) {
dp = (y*width + x*8 + 7-b) * 3;
sp = (data[y*w + x] >> b & 1) * 3;
dest[dp ] = palette[sp ];
dest[dp+1] = palette[sp+1];
dest[dp+2] = palette[sp+2];
}
}
for (b = 7; b >= 8 - width % 8; b--) {
dp = (y*width + x*8 + 7-b) * 3;
sp = (data[y*w + x] >> b & 1) * 3;
dest[dp ] = palette[sp ];
dest[dp+1] = palette[sp+1];
dest[dp+2] = palette[sp+2];
}
}
} else {
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
dp = (y*width + x) * 3;
sp = data[y*width + x] * 3;
dest[dp ] = palette[sp ];
dest[dp+1] = palette[sp+1];
dest[dp+2] = palette[sp+2];
}
}
}
return dest;
};
var handlePalette = function() { var handlePalette = function() {
var numColors = rQ[rQi + 2] + 1; var numColors = rQ[rQi + 2] + 1;
var paletteSize = numColors * fb_depth; var paletteSize = numColors * fb_depth;
...@@ -1392,45 +1431,12 @@ function display_tight(isTightPNG) { ...@@ -1392,45 +1431,12 @@ function display_tight(isTightPNG) {
} }
// Convert indexed (palette based) image data to RGB // Convert indexed (palette based) image data to RGB
// TODO: reduce number of calculations inside loop var rgb = indexedToRGB(data, numColors, palette, FBU.width, FBU.height);
var dest = [];
var x, y, b, w, w1, dp, sp;
if (numColors === 2) {
w = Math.floor((FBU.width + 7) / 8);
w1 = Math.floor(FBU.width / 8);
for (y = 0; y < FBU.height; y++) {
for (x = 0; x < w1; x++) {
for (b = 7; b >= 0; b--) {
dp = (y*FBU.width + x*8 + 7-b) * 3;
sp = (data[y*w + x] >> b & 1) * 3;
dest[dp ] = palette[sp ];
dest[dp+1] = palette[sp+1];
dest[dp+2] = palette[sp+2];
}
}
for (b = 7; b >= 8 - FBU.width % 8; b--) {
dp = (y*FBU.width + x*8 + 7-b) * 3;
sp = (data[y*w + x] >> b & 1) * 3;
dest[dp ] = palette[sp ];
dest[dp+1] = palette[sp+1];
dest[dp+2] = palette[sp+2];
}
}
} else {
for (y = 0; y < FBU.height; y++) {
for (x = 0; x < FBU.width; x++) {
dp = (y*FBU.width + x) * 3;
sp = data[y*FBU.width + x] * 3;
dest[dp ] = palette[sp ];
dest[dp+1] = palette[sp+1];
dest[dp+2] = palette[sp+2];
}
}
}
// Add it to the render queue
display.renderQ_push({ display.renderQ_push({
'type': 'blitRgb', 'type': 'blitRgb',
'data': dest, 'data': rgb,
'x': FBU.x, 'x': FBU.x,
'y': FBU.y, 'y': FBU.y,
'width': FBU.width, 'width': FBU.width,
......
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