Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d6343f2

Browse files
committed
Merge branch 'patrickhulce-fix_progressive_decoding'
2 parents 68805a6 + c9cad17 commit d6343f2

File tree

6 files changed

+2034
-708
lines changed

6 files changed

+2034
-708
lines changed

lib/decoder.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ var JpegImage = (function jpegImage() {
200200
var k = spectralStart, e = spectralEnd, r = 0;
201201
while (k <= e) {
202202
var z = dctZigZag[k];
203+
var direction = zz[z] < 0 ? -1 : 1;
203204
switch (successiveACState) {
204205
case 0: // initial state
205206
var rs = decodeHuffman(component.huffmanTableAC);
@@ -222,7 +223,7 @@ var JpegImage = (function jpegImage() {
222223
case 1: // skipping r zero items
223224
case 2:
224225
if (zz[z])
225-
zz[z] += (readBit() << successive);
226+
zz[z] += (readBit() << successive) * direction;
226227
else {
227228
r--;
228229
if (r === 0)
@@ -231,15 +232,15 @@ var JpegImage = (function jpegImage() {
231232
break;
232233
case 3: // set value for a zero item
233234
if (zz[z])
234-
zz[z] += (readBit() << successive);
235+
zz[z] += (readBit() << successive) * direction;
235236
else {
236237
zz[z] = successiveACNextValue << successive;
237238
successiveACState = 0;
238239
}
239240
break;
240241
case 4: // eob
241242
if (zz[z])
242-
zz[z] += (readBit() << successive);
243+
zz[z] += (readBit() << successive) * direction;
243244
break;
244245
}
245246
k++;
@@ -715,7 +716,7 @@ var JpegImage = (function jpegImage() {
715716
huffmanValues[j] = data[offset];
716717
i += 17 + codeLengthSum;
717718

718-
((huffmanTableSpec >> 4) === 0 ?
719+
((huffmanTableSpec >> 4) === 0 ?
719720
huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] =
720721
buildHuffmanTable(codeLengths, huffmanValues);
721722
}

test/fixtures/cmyk-grey.cmyk

Lines changed: 803 additions & 704 deletions
Large diffs are not rendered by default.

test/fixtures/skater-progressive.jpg

17.5 KB
Loading

test/fixtures/skater-progressive.rgba

Lines changed: 1203 additions & 0 deletions
Large diffs are not rendered by default.

test/fixtures/skater.jpg

17.2 KB
Loading

test/index.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,29 @@ it('should be able to decode a unconventional table JPEG', function (t) {
104104
t.end();
105105
});
106106

107+
it('should be able to decode a progressive JPEG', function(t) {
108+
var jpegData = fixture('skater-progressive.jpg');
109+
var rawImageData = jpeg.decode(jpegData);
110+
t.equal(rawImageData.width, 256);
111+
t.equal(rawImageData.height, 256);
112+
var expected = fixture('skater-progressive.rgba');
113+
t.deepEqual(rawImageData.data, expected);
114+
t.end();
115+
});
116+
117+
it('should be able to decode a progressive JPEG the same as non-progressive', function(t) {
118+
var jpegData = fixture('skater.jpg');
119+
var rawImageData = jpeg.decode(jpegData);
120+
121+
var otherJpegData = fixture('skater-progressive.jpg');
122+
var otherRawImageData = jpeg.decode(otherJpegData);
123+
124+
t.equal(rawImageData.width, otherRawImageData.width);
125+
t.equal(rawImageData.height, otherRawImageData.height);
126+
t.deepEqual(rawImageData.data, otherRawImageData.data);
127+
t.end();
128+
});
129+
107130
it('should be able to encode a JPEG', function (t) {
108131
var frameData = fixture('grumpycat.rgba');
109132
var rawImageData = {

0 commit comments

Comments
 (0)