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:
commit
4cc0f8c721
@ -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++;
|
||||||
}
|
}
|
||||||
|
1
test/pdfs/.gitignore
vendored
1
test/pdfs/.gitignore
vendored
@ -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
|
||||||
|
BIN
test/pdfs/decodeACSuccessive.pdf
Normal file
BIN
test/pdfs/decodeACSuccessive.pdf
Normal file
Binary file not shown.
@ -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",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user