[Pkg-javascript-commits] [pdf.js] 84/210: Optimized JPG.js - reduced memory usage + 2.16x faster getLinearizedBlockData
David Prévot
taffit at moszumanska.debian.org
Thu Jun 5 14:21:04 UTC 2014
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch upstream
in repository pdf.js.
commit 287274d3dce1234ede5e46d179b2a1af50e09275
Author: p01 <p01 at opera.com>
Date: Tue Apr 29 17:09:54 2014 +0200
Optimized JPG.js - reduced memory usage + 2.16x faster getLinearizedBlockData
Linearize and scale the mcu blocks into the destination buffer in a single pass
---
src/core/jpg.js | 59 +++++++++++++++++----------------------------------------
1 file changed, 17 insertions(+), 42 deletions(-)
diff --git a/src/core/jpg.js b/src/core/jpg.js
index 5ec0611..eafd771 100644
--- a/src/core/jpg.js
+++ b/src/core/jpg.js
@@ -810,60 +810,35 @@ var JpegImage = (function jpegImage() {
_getLinearizedBlockData: function getLinearizedBlockData(width, height) {
var scaleX = this.width / width, scaleY = this.height / height;
- var component, componentScaleX, componentScaleY;
- var x, y, i;
+ var component, componentScaleX, componentScaleY, blocksPerScanline;
+ var x, y, i, j;
+ var index;
var offset = 0;
- var Y, Cb, Cr, K, C, M, Ye, R, G, B;
- var colorTransform;
+ var output;
var numComponents = this.components.length;
var dataLength = width * height * numComponents;
var data = new Uint8Array(dataLength);
- var componentLine;
-
- // lineData is reused for all components. Assume first component is
- // the biggest
- var lineData = new Uint8Array((this.components[0].blocksPerLine << 3) *
- this.components[0].blocksPerColumn * 8);
+ var xScaleBlockOffset = new Uint32Array(width);
+ var mask3LSB = 0xfffffff8; // used to clear the 3 LSBs
- // First construct image data ...
for (i = 0; i < numComponents; i++) {
component = this.components[i];
- var blocksPerLine = component.blocksPerLine;
- var blocksPerColumn = component.blocksPerColumn;
- var samplesPerLine = blocksPerLine << 3;
-
- var j, k, ll = 0;
- var sample;
- var lineOffset = 0;
- for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
- var scanLine = blockRow << 3;
- for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
- var bufferOffset = getBlockBufferOffset(component,
- blockRow, blockCol);
- offset = 0;
- sample = blockCol << 3;
- for (j = 0; j < 8; j++) {
- lineOffset = (scanLine + j) * samplesPerLine;
- for (k = 0; k < 8; k++) {
- lineData[lineOffset + sample + k] =
- component.output[bufferOffset + offset++];
- }
- }
- }
- }
-
componentScaleX = component.scaleX * scaleX;
componentScaleY = component.scaleY * scaleY;
offset = i;
-
- var cx, cy;
- var index;
+ output = component.output;
+ blocksPerScanline = (component.blocksPerLine + 1) << 3;
+ // precalculate the xScaleBlockOffset
+ for (x = 0; x < width; x++) {
+ j = 0 | (x * componentScaleX);
+ xScaleBlockOffset[x] = ((j & mask3LSB) << 3) | (j & 7);
+ }
+ // linearize the blocks of the component
for (y = 0; y < height; y++) {
+ j = 0 | (y * componentScaleY);
+ index = blocksPerScanline * (j & mask3LSB) | ((j & 7) << 3);
for (x = 0; x < width; x++) {
- cy = 0 | (y * componentScaleY);
- cx = 0 | (x * componentScaleX);
- index = cy * samplesPerLine + cx;
- data[offset] = lineData[index];
+ data[offset] = output[index + xScaleBlockOffset[x]];
offset += numComponents;
}
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/pdf.js.git
More information about the Pkg-javascript-commits
mailing list