cleaned up code, used dict.get2, hoisted conditional outside loop when drawing image

This commit is contained in:
sbarman 2011-06-09 19:19:09 -07:00
parent f07cfc1bb8
commit 1dbf2d1d0c

152
pdf.js
View File

@ -75,12 +75,8 @@ var Stream = (function() {
if (end > strEnd) if (end > strEnd)
end = strEnd; end = strEnd;
var n = 0; this.pos = end;
var buf = new Uint8Array(length); return bytes.subarray(pos, end);
while (pos < end)
buf[n++] = bytes[pos++]
this.pos = pos;
return buf;
}, },
lookChar: function() { lookChar: function() {
var bytes = this.bytes; var bytes = this.bytes;
@ -95,15 +91,6 @@ var Stream = (function() {
this.pos++; this.pos++;
return ch; return ch;
}, },
snarf: function(dest) {
var bytes = this.bytes;
var pos = this.pos;
var end = this.end;
var n = 0;
while (pos < end)
dest[n++] = bytes[pos++];
this.pos = this.end;
},
skip: function(n) { skip: function(n) {
if (!n) if (!n)
n = 1; n = 1;
@ -338,13 +325,8 @@ var FlateStream = (function() {
if (end > bufEnd) if (end > bufEnd)
end = bufEnd; end = bufEnd;
var buffer = this.buffer; this.bufferPos = end;
var retBuffer = new Uint8Array(length); return this.buffer.subarray(pos, end)
var n = 0;
while (pos < end)
retBuffer[n++] = buffer[pos++];
this.bufferPos = pos;
return retBuffer;
}, },
lookChar: function() { lookChar: function() {
var bufferLength = this.bufferLength; var bufferLength = this.bufferLength;
@ -363,23 +345,6 @@ var FlateStream = (function() {
this.bufferPos++; this.bufferPos++;
return ch; return ch;
}, },
snarf: function(dest) {
// copy the leftover data in the buffer into dest
var bufferLength = this.bufferLength;
var bufferPos = this.bufferPos;
var n = 0;
// entire front of stream needs to be copied over since flate
// looksback when decoding
while (0 < bufferLength)
dest[n++] = this.buffer[bufferPos++];
// now use dest as our buffer and fill it
this.buffer = dest;
while (!this.eof)
this.readBlock();
// update stream position
this.pos = n;
},
skip: function(n) { skip: function(n) {
if (!n) if (!n)
n = 1; n = 1;
@ -1081,7 +1046,7 @@ var Parser = (function() {
length = xref.fetchIfRef(length); length = xref.fetchIfRef(length);
if (!IsInt(length)) { if (!IsInt(length)) {
error("Bad 'Length' attribute in stream"); error("Bad 'Length' attribute in stream");
lenght = 0; length = 0;
} }
// skip over the stream data // skip over the stream data
@ -2000,7 +1965,7 @@ var CanvasGraphics = (function() {
var bitsPerComponent = image.bitsPerComponent; var bitsPerComponent = image.bitsPerComponent;
if (!bitsPerComponent) { if (!bitsPerComponent) {
bitsPerComponent = dict.get("BitsPerComponent", "BPC"); bitsPerComponent = dict.get2("BitsPerComponent", "BPC");
if (!bitsPerComponent) { if (!bitsPerComponent) {
if (imageMask) if (imageMask)
bitsPerComponent = 1; bitsPerComponent = 1;
@ -2020,14 +1985,14 @@ var CanvasGraphics = (function() {
} }
// actual image // actual image
var csStream = dict.get("ColorSpace") || dict.get("CS"); var csStream = dict.get2("ColorSpace", "CS");
csStream = xref.fetchIfRef(csStream); csStream = xref.fetchIfRef(csStream);
if (IsName(csStream) && inline) if (IsName(csStream) && inline)
csStream = colorSpaces.get(csStream); csStream = colorSpaces.get(csStream);
var colorSpace = new ColorSpace(xref, csStream); var colorSpace = new ColorSpace(xref, csStream);
var decode = dict.get("Decode") || dict.get("D"); var decode = dict.get2("Decode", "D");
TODO("create color map"); TODO("create color map");
@ -2041,33 +2006,28 @@ var CanvasGraphics = (function() {
error("cannot combine smask and inlining"); error("cannot combine smask and inlining");
var maskDict = smask.dict; var maskDict = smask.dict;
var maskW = maskDict.get("Width") || maskDict.get("W"); var maskW = maskDict.get2("Width", "W");
var maskH = maskDict.get("Height") || maskDict.get("H"); var maskH = maskDict.get2("Height", "H");
if (!IsNum(maskW) || !IsNum(maskH) || maskW < 1 || maskH < 1) if (!IsNum(maskW) || !IsNum(maskH) || maskW < 1 || maskH < 1)
error("Invalid image width or height"); error("Invalid image width or height");
if (maskW !== w || maskH !== h) if (maskW !== w || maskH !== h)
error("Invalid image width or height"); error("Invalid image width or height");
var maskInterpolate = maskDict.get("Interpolate") || maskDict.get("I"); var maskInterpolate = maskDict.get2("Interpolate", "I");
if (!IsBool(maskInterpolate)) if (!IsBool(maskInterpolate))
maskInterpolate = false; maskInterpolate = false;
var maskBPC = maskDict.get("BitsPerComponent") var maskBPC = maskDict.get2("BitsPerComponent", "BPC");
|| maskDict.get("BPC");
if (!maskBPC) if (!maskBPC)
error("Invalid image mask bpc"); error("Invalid image mask bpc");
var maskCsStream = maskDict.get("ColorSpace") var maskCsStream = maskDict.get2("ColorSpace", "CS");
|| maskDict.get("CS");
maskCsStream = xref.fetchIfRef(maskCsStream); maskCsStream = xref.fetchIfRef(maskCsStream);
//if (IsName(maskCsStream))
// maskCsStream = colorSpaces.get(maskCsStream);
var maskColorSpace = new ColorSpace(xref, maskCsStream); var maskColorSpace = new ColorSpace(xref, maskCsStream);
if (maskColorSpace.mode !== "DeviceGray") if (maskColorSpace.mode !== "DeviceGray")
error("Invalid color space for smask"); error("Invalid color space for smask");
var maskDecode = maskDict.get("Decode") || maskDict.get("D"); var maskDecode = maskDict.get2("Decode", "D");
if (maskDecode) if (maskDecode)
TODO("Handle mask decode"); TODO("Handle mask decode");
// handle matte object // handle matte object
@ -2078,7 +2038,6 @@ var CanvasGraphics = (function() {
var tmpCanvas = document.createElement("canvas"); var tmpCanvas = document.createElement("canvas");
tmpCanvas.width = w; tmpCanvas.width = w;
tmpCanvas.height = h; tmpCanvas.height = h;
// tmpCanvas.mozOpaque = false;
var ctx = this.ctx; var ctx = this.ctx;
var tmpCtx = tmpCanvas.getContext("2d"); var tmpCtx = tmpCanvas.getContext("2d");
tmpCtx.fillStyle = "rgb(255, 255, 255)"; tmpCtx.fillStyle = "rgb(255, 255, 255)";
@ -2086,61 +2045,68 @@ var CanvasGraphics = (function() {
var imgData = tmpCtx.getImageData(0, 0, w, h); var imgData = tmpCtx.getImageData(0, 0, w, h);
var pixels = imgData.data; var pixels = imgData.data;
if (bitsPerComponent != 8)
error("unhandled number of bits per component");
if (smask) { if (smask) {
if (maskColorSpace.numComps != 1) if (maskColorSpace.numComps != 1)
error("Incorrect number of components in smask"); error("Incorrect number of components in smask");
var numComps = colorSpace.numComps; var numComps = colorSpace.numComps;
// factor in bits per component
var imgArray = image.getBytes(numComps * w * h); var imgArray = image.getBytes(numComps * w * h);
var imgIdx = 0; var imgIdx = 0;
var smArray = smask.getBytes(w * h); var smArray = smask.getBytes(w * h);
var smIdx = 0; var smIdx = 0;
// hoist out loop end var length = 4 * w * h;
for (var i = 0; i < 4 * w * h; i+=4) { switch (numComps) {
var alpha = smArray[smIdx++]; case 1:
var alphaComp = (1 << maskBPC) - 1 - alpha; for (var i = 0; i < length; i+=4) {
var p = imgArray[imageIdx++];
switch (numComps) { pixels[i] = p;
case 1: pixels[i+1] = p;
var p = imgArray[imageIdx++]*alpha; pixels[i+2] = p;
pixels[i] = (p + pixels[i]*alphaComp) >> maskBPC; pixels[i+3] = smArray[smIdx++];
pixels[i+1] = (p + pixels[i+1]*alphaComp) >> maskBPC;
pixels[i+2] = (p + pixels[i+2]*alphaComp) >> maskBPC;
pixels[i+3] = 255;
break;
case 3:
pixels[i] = imgArray[imgIdx++]; //*alpha) >> maskBPC;
pixels[i+1] = imgArray[imgIdx++];//*alpha) >> maskBPC;
pixels[i+2] = imgArray[imgIdx++];//*alpha) >> maskBPC;
pixels[i+3] = alpha;
break;
default:
error("unhandled amount of components per pixel: " + numComps);
} }
break;
case 3:
for (var i = 0; i < length; i+=4) {
pixels[i] = imgArray[imgIdx++];
pixels[i+1] = imgArray[imgIdx++];
pixels[i+2] = imgArray[imgIdx++];
pixels[i+3] = smArray[smIdx++];
}
break;
default:
error("unhandled amount of components per pixel: " + numComps);
} }
} else { } else {
var numComps = colorSpace.numComps; var numComps = colorSpace.numComps;
for (var i = 0; i < 4 * w * h; i+=4) { var imgArray = image.getBytes(numComps * w * h);
switch (numComps) { var imgIdx = 0;
case 1:
var t = image.getByte(); var length = 4 * w * h;
pixels[i] = t; switch (numComps) {
pixels[i+1] = t; case 1:
pixels[i+2] = t; for (var i = 0; i < length; i+=4) {
var p = imgArray[imageIdx++];
pixels[i] = p;
pixels[i+1] = p;
pixels[i+2] = p;
pixels[i+3] = 255; pixels[i+3] = 255;
break;
case 3:
pixels[i] = image.getByte();
pixels[i+1] = image.getByte();
pixels[i+2] = image.getByte();
pixels[i+3] = 255;
break;
default:
error("unhandled amount of components per pixel: " + numComps);
} }
break;
case 3:
for (var i = 0; i < length; i+=4) {
pixels[i] = imgArray[imgIdx++];
pixels[i+1] = imgArray[imgIdx++];
pixels[i+2] = imgArray[imgIdx++];
pixels[i+3] = 255;
}
break;
default:
error("unhandled amount of components per pixel: " + numComps);
} }
} }
tmpCtx.putImageData(imgData, 0, 0); tmpCtx.putImageData(imgData, 0, 0);