Merge pull request #8783 from Snuffleupagus/image-decoders-Uint8ClampedArray

Use `Uint8ClampedArray` when returning image data in `src/core/jbig2.js` and `src/core/jpg.js`
This commit is contained in:
Tim van der Meij 2017-08-16 22:52:12 +02:00 committed by GitHub
commit 3a017b4317
4 changed files with 16 additions and 28 deletions

View File

@ -253,7 +253,7 @@ var PDFImage = (function PDFImageClosure() {
// in this thread can be relying on its contents. // in this thread can be relying on its contents.
if (inverseDecode) { if (inverseDecode) {
for (i = 0; i < actualLength; i++) { for (i = 0; i < actualLength; i++) {
data[i] = ~data[i]; data[i] ^= 0xFF;
} }
} }

View File

@ -955,7 +955,7 @@ var Jbig2Image = (function Jbig2ImageClosure() {
onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) { onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) {
this.currentPageInfo = info; this.currentPageInfo = info;
var rowSize = (info.width + 7) >> 3; var rowSize = (info.width + 7) >> 3;
var buffer = new Uint8Array(rowSize * info.height); var buffer = new Uint8ClampedArray(rowSize * info.height);
// The contents of ArrayBuffers are initialized to 0. // The contents of ArrayBuffers are initialized to 0.
// Fill the buffer with 0xFF only if info.defaultPixelValue is set // Fill the buffer with 0xFF only if info.defaultPixelValue is set
if (info.defaultPixelValue) { if (info.defaultPixelValue) {

View File

@ -1386,7 +1386,7 @@ var JpxImage = (function JpxImageClosure() {
transformedTiles[c] = transformTile(context, tile, c); transformedTiles[c] = transformTile(context, tile, c);
} }
var tile0 = transformedTiles[0]; var tile0 = transformedTiles[0];
var out = new Uint8Array(tile0.items.length * componentsCount); var out = new Uint8ClampedArray(tile0.items.length * componentsCount);
var result = { var result = {
left: tile0.left, left: tile0.left,
top: tile0.top, top: tile0.top,
@ -1396,8 +1396,8 @@ var JpxImage = (function JpxImageClosure() {
}; };
// Section G.2.2 Inverse multi component transform // Section G.2.2 Inverse multi component transform
var shift, offset, max, min, maxK; var shift, offset;
var pos = 0, j, jj, y0, y1, y2, r, g, b, k, val; var pos = 0, j, jj, y0, y1, y2;
if (tile.codingStyleDefaultParameters.multipleComponentTransform) { if (tile.codingStyleDefaultParameters.multipleComponentTransform) {
var fourComponents = componentsCount === 4; var fourComponents = componentsCount === 4;
var y0items = transformedTiles[0].items; var y0items = transformedTiles[0].items;
@ -1410,9 +1410,6 @@ var JpxImage = (function JpxImageClosure() {
// compute shift and offset only once. // compute shift and offset only once.
shift = components[0].precision - 8; shift = components[0].precision - 8;
offset = (128 << shift) + 0.5; offset = (128 << shift) + 0.5;
max = 255 * (1 << shift);
maxK = max * 0.5;
min = -maxK;
var component0 = tile.components[0]; var component0 = tile.components[0];
var alpha01 = componentsCount - 3; var alpha01 = componentsCount - 3;
@ -1423,12 +1420,9 @@ var JpxImage = (function JpxImageClosure() {
y0 = y0items[j] + offset; y0 = y0items[j] + offset;
y1 = y1items[j]; y1 = y1items[j];
y2 = y2items[j]; y2 = y2items[j];
r = y0 + 1.402 * y2; out[pos++] = (y0 + 1.402 * y2) >> shift;
g = y0 - 0.34413 * y1 - 0.71414 * y2; out[pos++] = (y0 - 0.34413 * y1 - 0.71414 * y2) >> shift;
b = y0 + 1.772 * y1; out[pos++] = (y0 + 1.772 * y1) >> shift;
out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift;
out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift;
out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift;
} }
} else { } else {
// inverse reversible multiple component transform // inverse reversible multiple component transform
@ -1436,18 +1430,16 @@ var JpxImage = (function JpxImageClosure() {
y0 = y0items[j] + offset; y0 = y0items[j] + offset;
y1 = y1items[j]; y1 = y1items[j];
y2 = y2items[j]; y2 = y2items[j];
g = y0 - ((y2 + y1) >> 2); let g = y0 - ((y2 + y1) >> 2);
r = g + y2;
b = g + y1; out[pos++] = (g + y2) >> shift;
out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; out[pos++] = g >> shift;
out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; out[pos++] = (g + y1) >> shift;
out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift;
} }
} }
if (fourComponents) { if (fourComponents) {
for (j = 0, pos = 3; j < jj; j++, pos += 4) { for (j = 0, pos = 3; j < jj; j++, pos += 4) {
k = y3items[j]; out[pos] = (y3items[j] + offset) >> shift;
out[pos] = k <= min ? 0 : k >= maxK ? 255 : (k + offset) >> shift;
} }
} }
} else { // no multi-component transform } else { // no multi-component transform
@ -1455,12 +1447,8 @@ var JpxImage = (function JpxImageClosure() {
var items = transformedTiles[c].items; var items = transformedTiles[c].items;
shift = components[c].precision - 8; shift = components[c].precision - 8;
offset = (128 << shift) + 0.5; offset = (128 << shift) + 0.5;
max = (127.5 * (1 << shift));
min = -max;
for (pos = c, j = 0, jj = items.length; j < jj; j++) { for (pos = c, j = 0, jj = items.length; j < jj; j++) {
val = items[j]; out[pos] = (items[j] + offset) >> shift;
out[pos] = val <= min ? 0 :
val >= max ? 255 : (val + offset) >> shift;
pos += componentsCount; pos += componentsCount;
} }
} }

View File

@ -991,7 +991,7 @@ var JpxStream = (function JpxStreamClosure() {
if (tileCount === 1) { if (tileCount === 1) {
this.buffer = jpxImage.tiles[0].items; this.buffer = jpxImage.tiles[0].items;
} else { } else {
var data = new Uint8Array(width * height * componentsCount); var data = new Uint8ClampedArray(width * height * componentsCount);
for (var k = 0; k < tileCount; k++) { for (var k = 0; k < tileCount; k++) {
var tileComponents = jpxImage.tiles[k]; var tileComponents = jpxImage.tiles[k];