Merge pull request #9325 from Snuffleupagus/decodeACSuccessive-less-blur

Adjust `decodeACSuccessive` in src/core/jpg.js to improve the rendering quality of (progressive) JPEG images
This commit is contained in:
Tim van der Meij 2017-12-30 19:26:07 +01:00 committed by GitHub
commit 4cc0f8c721
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 52 additions and 42 deletions

View File

@ -235,53 +235,54 @@ var JpegImage = (function JpegImageClosure() {
var s; var s;
var rs; var rs;
while (k <= e) { while (k <= e) {
var z = dctZigZag[k]; let offsetZ = offset + dctZigZag[k];
let sign = component.blockData[offsetZ] < 0 ? -1 : 1;
switch (successiveACState) { switch (successiveACState) {
case 0: // initial state case 0: // initial state
rs = decodeHuffman(component.huffmanTableAC); rs = decodeHuffman(component.huffmanTableAC);
s = rs & 15; s = rs & 15;
r = rs >> 4; r = rs >> 4;
if (s === 0) { if (s === 0) {
if (r < 15) { if (r < 15) {
eobrun = receive(r) + (1 << r); eobrun = receive(r) + (1 << r);
successiveACState = 4; successiveACState = 4;
} else {
r = 16;
successiveACState = 1;
}
} else { } else {
r = 16; if (s !== 1) {
successiveACState = 1; throw new JpegError('invalid ACn encoding');
}
successiveACNextValue = receiveAndExtend(s);
successiveACState = r ? 2 : 3;
} }
} else { continue;
if (s !== 1) { case 1: // skipping r zero items
throw new JpegError('invalid ACn encoding'); case 2:
if (component.blockData[offsetZ]) {
component.blockData[offsetZ] += sign * (readBit() << successive);
} else {
r--;
if (r === 0) {
successiveACState = successiveACState === 2 ? 3 : 0;
}
} }
successiveACNextValue = receiveAndExtend(s); break;
successiveACState = r ? 2 : 3; case 3: // set value for a zero item
} if (component.blockData[offsetZ]) {
continue; component.blockData[offsetZ] += sign * (readBit() << successive);
case 1: // skipping r zero items } else {
case 2: component.blockData[offsetZ] =
if (component.blockData[offset + z]) { successiveACNextValue << successive;
component.blockData[offset + z] += (readBit() << successive); successiveACState = 0;
} else {
r--;
if (r === 0) {
successiveACState = successiveACState === 2 ? 3 : 0;
} }
} break;
break; case 4: // eob
case 3: // set value for a zero item if (component.blockData[offsetZ]) {
if (component.blockData[offset + z]) { component.blockData[offsetZ] += sign * (readBit() << successive);
component.blockData[offset + z] += (readBit() << successive); }
} else { break;
component.blockData[offset + z] =
successiveACNextValue << successive;
successiveACState = 0;
}
break;
case 4: // eob
if (component.blockData[offset + z]) {
component.blockData[offset + z] += (readBit() << successive);
}
break;
} }
k++; k++;
} }

View File

@ -67,6 +67,7 @@
!issue9105_reduced.pdf !issue9105_reduced.pdf
!issue9291.pdf !issue9291.pdf
!bad-PageLabels.pdf !bad-PageLabels.pdf
!decodeACSuccessive.pdf
!filled-background.pdf !filled-background.pdf
!ArabicCIDTrueType.pdf !ArabicCIDTrueType.pdf
!ThuluthFeatures.pdf !ThuluthFeatures.pdf

Binary file not shown.

View File

@ -3589,6 +3589,14 @@
"type": "eq", "type": "eq",
"nativeImageDecoderSupport": "none" "nativeImageDecoderSupport": "none"
}, },
{ "id": "decodeACSuccessive",
"file": "pdfs/decodeACSuccessive.pdf",
"md5": "7749c032624fe27ab8e8d7d5e9a4a93f",
"rounds": 1,
"link": false,
"type": "eq",
"nativeImageDecoderSupport": "none"
},
{ "id": "issue5592", { "id": "issue5592",
"file": "pdfs/issue5592.pdf", "file": "pdfs/issue5592.pdf",
"md5": "a0750f95afa80c880f7966df7062616c", "md5": "a0750f95afa80c880f7966df7062616c",