reasonably fast for black and white images

This commit is contained in:
sbarman 2011-06-27 10:38:10 -07:00
parent 2fdb200626
commit c4d50b7677

97
pdf.js
View File

@ -4444,80 +4444,87 @@ var PDFImage = (function() {
}; };
constructor.prototype = { constructor.prototype = {
getCompFunction: function getCompFunction(bpc, width, numComps, buffer) { getComponents: function getComponents(buffer) {
var bpc = this.bpc;
if (bpc == 8)
return buffer;
var width = this.width;
var height = this.height;
var numComps = this.numComps;
var length = width * height;
var bufferPos = 0; var bufferPos = 0;
var output = new Uint8Array(length);
if (bpc == 1) { if (bpc == 1) {
var rowComps = width * numComps; var rowComps = width * numComps;
var curComp = 0;
var mask = 0; var mask = 0;
var buf = 0; var buf = 0;
var getComp = function() { for (var i = 0, ii = length; i < ii; ++i) {
if (mask <= 0) { if (i % rowComps == 0) {
buf = buffer[bufferPos++];
mask = 128;
}
var ret = buf & mask;
curComp++;
if (curComp % rowComps == 0) {
mask = 0; mask = 0;
buf = 0; buf = 0;
} else { } else {
mask >>= 1; mask >>= 1;
} }
return ret * 255;
} if (mask <= 0) {
} else if (bpc == 8) { buf = buffer[bufferPos++];
var getComp = function() { mask = 128;
return buffer[bufferPos++]; }
var t = buf & mask;
if (t == 0)
output[i] = 0;
else
output[i] = 255;
} }
} else { } else {
var rowComps = width * numComps; var rowComps = width * numComps;
var curComp = 0;
var bits = 0; var bits = 0;
var buf = 0; var buf = 0;
var getComp = function() { for (var i = 0, ii = length; i < ii; ++i) {
while (bits < bpc) { while (bits < bpc) {
buf = (buf << 8) | buffer[bufferPos++]; buf = (buf << 8) | buffer[bufferPos++];
bits += 8; bits += 8;
} }
var remainingBits = bits - bpc; var remainingBits = bits - bpc;
var ret = buf >> remainingBits; var ret = buf >> remainingBits;
curComp++;
if (curComp % rowComps == 0) { if (i % rowComps == 0) {
buf = 0; buf = 0;
bits = 0; bits = 0;
} else { } else {
buf = buf & ((1 << remainingBits) - 1); buf = buf & ((1 << remainingBits) - 1);
bits = remainingBits; bits = remainingBits;
} }
return Math.round(255 * ret / ((1 << bpc) - 1)); output[i] = Math.round(255 * ret / ((1 << bpc) - 1));
} }
} }
return getComp; return output;
}, },
getOpacityFunction: function getOpacityFunction() { getOpacity: function getOpacity() {
var smask = this.smask; var smask = this.smask;
var width = this.width;
var height = this.height;
var buf = new Uint8Array(width * height);
if (smask) { if (smask) {
var w = smask.width; var sw = smask.width;
var h = smask.height; var sh = smask.height;
if (w != this.width || h != this.height) if (sw != this.width || sh != this.height)
error("smask dimensions do not match image dimensions"); error("smask dimensions do not match image dimensions");
var buf = new Uint8Array(w * h);
smask.fillGrayBuffer(buf); smask.fillGrayBuffer(buf);
var bufPos = 0; return buf;
var opacity = function() {
return buf[bufPos++];
}
} else { } else {
var opacity = function() { return 255; } for (var i = 0, ii = width * height; i < ii; ++i)
buf[i] = 255;
} }
return opacity; return buf;
}, },
fillRgbaBuffer: function fillRgbaBuffer(buffer) { fillRgbaBuffer: function fillRgbaBuffer(buffer) {
var numComps = this.numComps; var numComps = this.numComps;
@ -4530,26 +4537,28 @@ var PDFImage = (function() {
var imgArray = this.image.getBytes(height * rowBytes); var imgArray = this.image.getBytes(height * rowBytes);
var imgPos = 0; var imgPos = 0;
var getComp = this.getCompFunction(bpc, width, numComps, imgArray) var comps = this.getComponents(imgArray);
var getOpacity = this.getOpacityFunction(); var compsPos = 0;
var opacity = this.getOpacity();
var opacityPos = 0;
var length = width * height * 4; var length = width * height * 4;
switch (numComps) { switch (numComps) {
case 1: case 1:
for (var i = 0; i < length; i += 4) { for (var i = 0; i < length; i += 4) {
var p = getComp(); var p = comps[compsPos++];
buffer[i] = p; buffer[i] = p;
buffer[i+1] = p; buffer[i+1] = p;
buffer[i+2] = p; buffer[i+2] = p;
buffer[i+3] = getOpacity(); buffer[i+3] = opacity[opacityPos++];
} }
break; break;
case 3: case 3:
for (var i = 0; i < length; i += 4) { for (var i = 0; i < length; i += 4) {
buffer[i] = getComp(); buffer[i] = comps[compsPos++];
buffer[i+1] = getComp(); buffer[i+1] = comps[compsPos++];
buffer[i+2] = getComp(); buffer[i+2] = comps[compsPos++];
buffer[i+3] = getOpacity(); buffer[i+3] = opacity[opacityPos++];
} }
break; break;
default: default:
@ -4569,11 +4578,11 @@ var PDFImage = (function() {
var rowBytes = (width * numComps * bpc + 7) >> 3; var rowBytes = (width * numComps * bpc + 7) >> 3;
var imgArray = this.image.getBytes(height * rowBytes); var imgArray = this.image.getBytes(height * rowBytes);
var getComp = this.getCompFunction(bpc, width, numComps, imgArray) var comps = this.getComponents(imgArray);
var length = width * height; var length = width * height;
for (var i = 0; i < length; ++i) for (var i = 0; i < length; ++i)
buffer[i] = getComp(); buffer[i] = comps[i];
}, },
}; };
return constructor; return constructor;