Merge pull request #4886 from yurydelendik/issue4883

Adds color components decoding to the JPEG
This commit is contained in:
Yury Delendik 2014-06-04 09:22:30 -05:00
commit e03ac809d8
4 changed files with 43 additions and 5 deletions

View File

@ -811,7 +811,7 @@ var JpegImage = (function jpegImage() {
var scaleX = this.width / width, scaleY = this.height / height;
var component, componentScaleX, componentScaleY, blocksPerScanline;
var x, y, i, j;
var x, y, i, j, k;
var index;
var offset = 0;
var output;
@ -843,6 +843,17 @@ var JpegImage = (function jpegImage() {
}
}
}
// decodeTransform will contains pairs of multiplier (-256..256) and
// additive
var transform = this.decodeTransform;
if (transform) {
for (i = 0; i < dataLength;) {
for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {
data[i] = ((data[i] * transform[k]) >> 8) + transform[k + 1];
}
}
}
return data;
},
@ -852,8 +863,6 @@ var JpegImage = (function jpegImage() {
return true;
} else if (this.numComponents == 3) {
return true;
} else if (typeof this.colorTransform !== 'undefined') {
return !!this.colorTransform;
} else {
return false;
}

View File

@ -878,9 +878,27 @@ var JpegStream = (function JpegStreamClosure() {
}
try {
var jpegImage = new JpegImage();
if (this.colorTransform != -1) {
jpegImage.colorTransform = this.colorTransform;
// checking if values needs to be transformed before conversion
if (this.dict && isArray(this.dict.get('Decode'))) {
var decodeArr = this.dict.get('Decode');
var bitsPerComponent = this.dict.get('BitsPerComponent') || 8;
var decodeArrLength = decodeArr.length;
var transform = new Int32Array(decodeArrLength);
var transformNeeded = false;
var maxValue = (1 << bitsPerComponent) - 1;
for (var i = 0; i < decodeArrLength; i += 2) {
transform[i] = ((decodeArr[i + 1] - decodeArr[i]) * 256) | 0;
transform[i + 1] = (decodeArr[i] * maxValue) | 0;
if (transform[i] !== 256 || transform[i + 1] !== 0) {
transformNeeded = true;
}
}
if (transformNeeded) {
jpegImage.decodeTransform = transform;
}
}
jpegImage.parse(this.bytes);
var data = jpegImage.getData(this.drawWidth, this.drawHeight,
/* forceRGBoutput = */true);

View File

@ -0,0 +1 @@
http://web.archive.org/web/20140603135304/http://www.tipp2014.nl/TIPP2014_3rd_bulletin.pdf

View File

@ -1613,6 +1613,16 @@
"lastPage": 2,
"type": "eq"
},
{ "id": "issue4883",
"file": "pdfs/issue4883.pdf",
"md5": "2fac0d9a189ca5fcef8626153d050be8",
"rounds": 1,
"link": true,
"firstPage": 1,
"lastPage": 1,
"type": "eq",
"about": "CMYK JPEG with Decode"
},
{ "id": "bug903856",
"file": "pdfs/bug903856.pdf",
"md5": "286eaa9d06a5809f4f08f2093cef8f3f",