diff --git a/pdf.js b/pdf.js index 18a56da38..46f946c40 100644 --- a/pdf.js +++ b/pdf.js @@ -4331,7 +4331,7 @@ var PartialEvaluator = (function() { var startRange = tokens[j]; var endRange = tokens[j + 1]; var code = tokens[j + 2]; - while(startRange < endRange) { + while (startRange < endRange) { encodingMap[startRange] = code++; ++startRange; } @@ -4365,9 +4365,9 @@ var PartialEvaluator = (function() { case 0x5D: // collect array items var items = [], item; - while (tokens.length && (item = tokens.pop()) != beginArrayToken) { + while (tokens.length && + (item = tokens.pop()) != beginArrayToken) items.unshift(item); - } tokens.push(items); break; } @@ -5359,9 +5359,10 @@ var SeparationCS = (function() { var tinted = this.tintFn.func(color); return this.base.getRgb(tinted); }, - getRgbBuffer: function sepcs_getRgbBuffer(input) { + getRgbBuffer: function sepcs_getRgbBuffer(input, bits) { var tintFn = this.tintFn; var base = this.base; + var scale = 1 / ((1 << bits) - 1); var length = 3 * input.length; var pos = 0; @@ -5369,12 +5370,12 @@ var SeparationCS = (function() { var numComps = base.numComps; var baseBuf = new Uint8Array(numComps * input.length); for (var i = 0, ii = input.length; i < ii; ++i) { - var scaled = input[i] / 255; + var scaled = input[i] * scale; var tinted = tintFn.func([scaled]); for (var j = 0; j < numComps; ++j) baseBuf[pos++] = 255 * tinted[j]; } - return base.getRgbBuffer(baseBuf); + return base.getRgbBuffer(baseBuf, 8); } }; @@ -5443,7 +5444,7 @@ var IndexedCS = (function() { } } - return base.getRgbBuffer(baseBuf); + return base.getRgbBuffer(baseBuf, 8); } }; return constructor; @@ -5461,11 +5462,12 @@ var DeviceGrayCS = (function() { var c = color[0]; return [c, c, c]; }, - getRgbBuffer: function graycs_getRgbBuffer(input) { + getRgbBuffer: function graycs_getRgbBuffer(input, bits) { + var scale = 255 / ((1 << bits) - 1); var length = input.length * 3; var rgbBuf = new Uint8Array(length); for (var i = 0, j = 0; i < length; ++i) { - var c = input[i]; + var c = (scale * input[i]) | 0; rgbBuf[j++] = c; rgbBuf[j++] = c; rgbBuf[j++] = c; @@ -5477,7 +5479,7 @@ var DeviceGrayCS = (function() { })(); var DeviceRgbCS = (function() { - function constructor() { + function constructor(bits) { this.name = 'DeviceRGB'; this.numComps = 3; this.defaultColor = [0, 0, 0]; @@ -5486,8 +5488,15 @@ var DeviceRgbCS = (function() { getRgb: function rgbcs_getRgb(color) { return color; }, - getRgbBuffer: function rgbcs_getRgbBuffer(input) { - return input; + getRgbBuffer: function rgbcs_getRgbBuffer(input, bits) { + if (bits == 8) + return input; + var scale = 255 / ((1 << bits) - 1); + var i, length = input.length; + var rgbBuf = new Uint8Array(length); + for (i = 0; i < length; ++i) + rgbBuf[i] = (scale * input[i]) | 0; + return rgbBuf; } }; return constructor; @@ -5554,7 +5563,8 @@ var DeviceCmykCS = (function() { return [r, g, b]; }, - getRgbBuffer: function cmykcs_getRgbBuffer(colorBuf) { + getRgbBuffer: function cmykcs_getRgbBuffer(colorBuf, bits) { + var scale = 1 / ((1 << bits) - 1); var length = colorBuf.length / 4; var rgbBuf = new Uint8Array(length * 3); var rgbBufPos = 0; @@ -5563,7 +5573,7 @@ var DeviceCmykCS = (function() { for (var i = 0; i < length; i++) { var cmyk = []; for (var j = 0; j < 4; ++j) - cmyk.push(colorBuf[colorBufPos++] / 255); + cmyk.push(scale * colorBuf[colorBufPos++]); var rgb = this.getRgb(cmyk); for (var j = 0; j < 3; ++j) @@ -5946,13 +5956,14 @@ var PDFImage = (function() { var length = width * height; var bufferPos = 0; - var output = new Uint8Array(length); + var output = bpc <= 8 ? new Uint8Array(length) : + bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length); if (bpc == 1) { - var valueZero = 0, valueOne = 255; + var valueZero = 0, valueOne = 1; if (decodeMap) { - valueZero = decodeMap[0] ? 255 : 0; - valueOne = decodeMap[1] ? 255 : 0; + valueZero = decodeMap[0] ? 1 : 0; + valueOne = decodeMap[1] ? 1 : 0; } var rowComps = width * numComps; var mask = 0; @@ -5977,25 +5988,22 @@ var PDFImage = (function() { if (decodeMap != null) TODO('interpolate component values'); var rowComps = width * numComps; - var bits = 0; - var buf = 0; - + var bits, buf; for (var i = 0, ii = length; i < ii; ++i) { + if (i % rowComps == 0) { + buf = 0; + bits = 0; + } + while (bits < bpc) { buf = (buf << 8) | buffer[bufferPos++]; bits += 8; } - var remainingBits = bits - bpc; - var ret = buf >> remainingBits; - if (i % rowComps == 0) { - buf = 0; - bits = 0; - } else { - buf = buf & ((1 << remainingBits) - 1); - bits = remainingBits; - } - output[i] = Math.round(255 * ret / ((1 << bpc) - 1)); + var remainingBits = bits - bpc; + output[i] = buf >> remainingBits; + buf = buf & ((1 << remainingBits) - 1); + bits = remainingBits; } } return output; @@ -6055,7 +6063,7 @@ var PDFImage = (function() { var imgArray = this.image.getBytes(height * rowBytes); var comps = this.colorSpace.getRgbBuffer( - this.getComponents(imgArray, decodeMap)); + this.getComponents(imgArray, decodeMap), bpc); var compsPos = 0; var opacity = this.getOpacity(); var opacityPos = 0; diff --git a/test/pdfs/pdkids.pdf.link b/test/pdfs/pdkids.pdf.link new file mode 100644 index 000000000..5e2be0820 --- /dev/null +++ b/test/pdfs/pdkids.pdf.link @@ -0,0 +1 @@ +http://www.archive.org/download/PdKids/PdKids.pdf diff --git a/test/test_manifest.json b/test/test_manifest.json index a83ca2fb1..1155195cb 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -103,5 +103,11 @@ "link": true, "rounds": 1, "type": "eq" + }, + { "id": "pdkids", + "file": "pdfs/pdkids.pdf", + "link": true, + "rounds": 1, + "type": "eq" } ]