[Spice-devel] [3/ ]fold do_run into uncompress
Aric Stewart
aric at codeweavers.com
Mon Sep 24 08:49:18 PDT 2012
eliminates a function call and many object references for performance
Signed-off-by: Aric Stewart <aric at codeweavers.com>
---
quic.js | 134 ++++++++++++++++++++++++++++++++++----------------------------
1 files changed, 73 insertions(+), 61 deletions(-)
diff --git a/quic.js b/quic.js
index 0bae57e..0e33610 100644
--- a/quic.js
+++ b/quic.js
@@ -748,16 +748,12 @@ QuicEncoder.prototype.quic_rgb32_uncompress_row_seg = function( prev_row, cur_ro
var waitmask = bppmask[this.rgb_state.wmidx];
var a;
- var b = {
- i: i,
- run_index: 0,
- stopidx: 0,
- run_end: 0,
- end : end
- };
+ var run_index = 0;
+ var stopidx = 0;
+ var run_end = 0;
var c;
- if (!b.i)
+ if (!i)
{
cur_row[rgb32_pixel_pad] = 0;
@@ -778,25 +774,45 @@ QuicEncoder.prototype.quic_rgb32_uncompress_row_seg = function( prev_row, cur_ro
this.channels[c].find_bucket_8bpc(this.channels[c].correlate_row.zero).update_model_8bpc(this.rgb_state, this.channels[c].correlate_row.row[0], bpc);
} while (++c < n_channels);
}
- b.stopidx = ++b.i + this.rgb_state.waitcnt;
+ stopidx = ++i + this.rgb_state.waitcnt;
} else {
- b.stopidx = b.i + this.rgb_state.waitcnt;
+ stopidx = i + this.rgb_state.waitcnt;
}
for (;;) {
- b.rc = 0;
- while (b.stopidx < b.end && !b.rc) {
- for (; b.i <= b.stopidx && !b.rc; b.i++) {
- var pixel = b.i * rgb32_pixel_size;
- var pixelm1 = (b.i-1) * rgb32_pixel_size;
- var pixelm2 = (b.i-2) * rgb32_pixel_size;
+ rc = 0;
+ while (stopidx < end && !rc) {
+ for (; i <= stopidx && !rc; i++) {
+ var pixel = i * rgb32_pixel_size;
+ var pixelm1 = (i-1) * rgb32_pixel_size;
+ var pixelm2 = (i-2) * rgb32_pixel_size;
if ( prev_row[pixelm1+rgb32_pixel_r] == prev_row[pixel+rgb32_pixel_r] && prev_row[pixelm1+rgb32_pixel_g] == prev_row[pixel+rgb32_pixel_g] && prev_row[pixelm1 + rgb32_pixel_b] == prev_row[pixel+rgb32_pixel_b])
{
- if (b.run_index != b.i && b.i > 2 && (cur_row[pixelm1+rgb32_pixel_r] == cur_row[pixelm2+rgb32_pixel_r] && cur_row[pixelm1+rgb32_pixel_g] == cur_row[pixelm2+rgb32_pixel_g] && cur_row[pixelm1+rgb32_pixel_b] == cur_row[pixelm2+rgb32_pixel_b]))
+ if (run_index != i && i > 2 && (cur_row[pixelm1+rgb32_pixel_r] == cur_row[pixelm2+rgb32_pixel_r] && cur_row[pixelm1+rgb32_pixel_g] == cur_row[pixelm2+rgb32_pixel_g] && cur_row[pixelm1+rgb32_pixel_b] == cur_row[pixelm2+rgb32_pixel_b]))
{
- this.do_run(b, cur_row);
- if (b.rc === 2) return;
- else break;
+ /* do run */
+ this.rgb_state.waitcnt = stopidx - i;
+ run_index = i;
+ run_end = i + this.decode_run();
+
+ for (; i < run_end; i++) {
+ var pixel = i * rgb32_pixel_size;
+ var pixelm1 = (i-1) * rgb32_pixel_size;
+ cur_row[pixel+rgb32_pixel_pad] = 0;
+ cur_row[pixel+rgb32_pixel_r] = cur_row[pixelm1+rgb32_pixel_r];
+ cur_row[pixel+rgb32_pixel_g] = cur_row[pixelm1+rgb32_pixel_g];
+ cur_row[pixel+rgb32_pixel_b] = cur_row[pixelm1+rgb32_pixel_b];
+ }
+
+ if (i == end) {
+ return;
+ }
+ else
+ {
+ stopidx = i + this.rgb_state.waitcnt;
+ rc = 1;
+ break;
+ }
}
}
@@ -806,35 +822,55 @@ QuicEncoder.prototype.quic_rgb32_uncompress_row_seg = function( prev_row, cur_ro
var cc = this.channels[c];
var cr = cc.correlate_row;
- a = golomb_decoding_8bpc(cc.find_bucket_8bpc(cr.row[b.i-1]).bestcode, this.io_word);
- cr.row[b.i] = a.rc;
+ a = golomb_decoding_8bpc(cc.find_bucket_8bpc(cr.row[i-1]).bestcode, this.io_word);
+ cr.row[i] = a.rc;
cur_row[pixel+(2-c)] = (family_8bpc.xlatL2U[a.rc] + ((cur_row[pixelm1+(2-c)] + prev_row[pixel+(2-c)]) >> 1)) & bpc_mask;
this.decode_eatbits(a.codewordlen);
} while (++c < n_channels);
}
- if (b.rc)
+ if (rc)
break;
c = 0;
do {
- this.channels[c].find_bucket_8bpc(this.channels[c].correlate_row.row[b.stopidx - 1]).update_model_8bpc(this.rgb_state, this.channels[c].correlate_row.row[b.stopidx], bpc);
+ this.channels[c].find_bucket_8bpc(this.channels[c].correlate_row.row[stopidx - 1]).update_model_8bpc(this.rgb_state, this.channels[c].correlate_row.row[stopidx], bpc);
} while (++c < n_channels);
- b.stopidx = b.i + (this.rgb_state.tabrand() & waitmask);
+ stopidx = i + (this.rgb_state.tabrand() & waitmask);
}
- for (; b.i < b.end && !b.rc; b.i++) {
- var pixel = b.i * rgb32_pixel_size;
- var pixelm1 = (b.i-1) * rgb32_pixel_size;
- var pixelm2 = (b.i-2) * rgb32_pixel_size;
+ for (; i < end && !rc; i++) {
+ var pixel = i * rgb32_pixel_size;
+ var pixelm1 = (i-1) * rgb32_pixel_size;
+ var pixelm2 = (i-2) * rgb32_pixel_size;
if (prev_row[pixelm1+rgb32_pixel_r] == prev_row[pixel+rgb32_pixel_r] && prev_row[pixelm1+rgb32_pixel_g] == prev_row[pixel+rgb32_pixel_g] && prev_row[pixelm1+rgb32_pixel_b] == prev_row[pixel+rgb32_pixel_b])
{
- if (b.run_index != b.i && b.i > 2 && (cur_row[pixelm1+rgb32_pixel_r] == cur_row[pixelm2+rgb32_pixel_r] && cur_row[pixelm1+rgb32_pixel_g] == cur_row[pixelm2+rgb32_pixel_g] && cur_row[pixelm1+rgb32_pixel_b] == cur_row[pixelm2+rgb32_pixel_b]))
+ if (run_index != i && i > 2 && (cur_row[pixelm1+rgb32_pixel_r] == cur_row[pixelm2+rgb32_pixel_r] && cur_row[pixelm1+rgb32_pixel_g] == cur_row[pixelm2+rgb32_pixel_g] && cur_row[pixelm1+rgb32_pixel_b] == cur_row[pixelm2+rgb32_pixel_b]))
{
- this.do_run(b, cur_row);
- if (b.rc==2) return;
- else break;
+ /* do run */
+ this.rgb_state.waitcnt = stopidx - i;
+ run_index = i;
+ run_end = i + this.decode_run();
+
+ for (; i < run_end; i++) {
+ var pixel = i * rgb32_pixel_size;
+ var pixelm1 = (i-1) * rgb32_pixel_size;
+ cur_row[pixel+rgb32_pixel_pad] = 0;
+ cur_row[pixel+rgb32_pixel_r] = cur_row[pixelm1+rgb32_pixel_r];
+ cur_row[pixel+rgb32_pixel_g] = cur_row[pixelm1+rgb32_pixel_g];
+ cur_row[pixel+rgb32_pixel_b] = cur_row[pixelm1+rgb32_pixel_b];
+ }
+
+ if (i == end) {
+ return;
+ }
+ else
+ {
+ stopidx = i + this.rgb_state.waitcnt;
+ rc = 1;
+ break;
+ }
}
}
@@ -842,16 +878,16 @@ QuicEncoder.prototype.quic_rgb32_uncompress_row_seg = function( prev_row, cur_ro
c = 0;
do
{
- a = golomb_decoding_8bpc(this.channels[c].find_bucket_8bpc(this.channels[c].correlate_row.row[b.i-1]).bestcode, this.io_word);
- this.channels[c].correlate_row.row[b.i] = a.rc;
+ a = golomb_decoding_8bpc(this.channels[c].find_bucket_8bpc(this.channels[c].correlate_row.row[i-1]).bestcode, this.io_word);
+ this.channels[c].correlate_row.row[i] = a.rc;
cur_row[pixel+(2-c)] = (family_8bpc.xlatL2U[a.rc] + ((cur_row[pixelm1+(2-c)] + prev_row[pixel+(2-c)]) >> 1)) & bpc_mask;
this.decode_eatbits(a.codewordlen);
} while (++c < n_channels);
}
- if (!b.rc)
+ if (!rc)
{
- this.rgb_state.waitcnt = b.stopidx - b.end;
+ this.rgb_state.waitcnt = stopidx - end;
return;
}
}
@@ -897,30 +933,6 @@ QuicEncoder.prototype.decode_run = function()
return runlen;
}
-QuicEncoder.prototype.do_run = function(b, cur_row)
-{
- this.rgb_state.waitcnt = b.stopidx - b.i;
- b.run_index = b.i;
- b.run_end = b.i + this.decode_run();
-
- for (; b.i < b.run_end; b.i++) {
- var pixel = b.i * rgb32_pixel_size;
- var pixelm1 = (b.i-1) * rgb32_pixel_size;
- cur_row[pixel+rgb32_pixel_pad] = 0;
- cur_row[pixel+rgb32_pixel_r] = cur_row[pixelm1+rgb32_pixel_r];
- cur_row[pixel+rgb32_pixel_g] = cur_row[pixelm1+rgb32_pixel_g];
- cur_row[pixel+rgb32_pixel_b] = cur_row[pixelm1+rgb32_pixel_b];
- }
-
- if (b.i == b.end) {
- b.rc = 2;
- return;
- }
-
- b.stopidx = b.i + this.rgb_state.waitcnt;
- b.rc = 1;
-}
-
QuicEncoder.prototype.quic_rgb32_uncompress_row = function (prev_row, cur_row)
{
var bpc = 8;
--
1.7.7.5 (Apple Git-26)
More information about the Spice-devel
mailing list