png_loader: correct colorspace

decoding color channels rgba -> bgra

@Issue: https://github.com/Samsung/thorvg/issues/1007
This commit is contained in:
Hermet Park 2021-11-11 21:44:01 +09:00 committed by Hermet Park
parent 24e0133f78
commit 56e2498466

View file

@ -2089,30 +2089,44 @@ static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scan
size_t i;
switch (filterType) {
case 0:
for (i = 0; i != length; ++i) recon[i] = scanline[i];
case 0: {
if (bytewidth == 4) {
for (i = 0; i < length; i += 4) {
//RGBA -> BGRA
recon[i + 0] = scanline[i + 2];
recon[i + 1] = scanline[i + 1];
recon[i + 2] = scanline[i + 0];
recon[i + 3] = scanline[i + 3];
}
} else {
for (i = 0; i != length; ++i) recon[i] = scanline[i];
}
break;
case 1:
}
case 1: {
for (i = 0; i != bytewidth; ++i) recon[i] = scanline[i];
for (i = bytewidth; i < length; ++i) recon[i] = scanline[i] + recon[i - bytewidth];
break;
case 2:
}
case 2: {
if (precon) {
for(i = 0; i != length; ++i) recon[i] = scanline[i] + precon[i];
for (i = 0; i != length; ++i) recon[i] = scanline[i] + precon[i];
} else {
for(i = 0; i != length; ++i) recon[i] = scanline[i];
for (i = 0; i != length; ++i) recon[i] = scanline[i];
}
break;
case 3:
if (precon) {
for (i = 0; i != bytewidth; ++i) recon[i] = scanline[i] + (precon[i] >> 1u);
for (i = bytewidth; i < length; ++i) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) >> 1u);
} else {
for (i = 0; i != bytewidth; ++i) recon[i] = scanline[i];
for (i = bytewidth; i < length; ++i) recon[i] = scanline[i] + (recon[i - bytewidth] >> 1u);
}
break;
case 4:
}
case 3: {
if (precon) {
for (i = 0; i != bytewidth; ++i) recon[i] = scanline[i] + (precon[i] >> 1u);
for (i = bytewidth; i < length; ++i) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) >> 1u);
} else {
for (i = 0; i != bytewidth; ++i) recon[i] = scanline[i];
for (i = bytewidth; i < length; ++i) recon[i] = scanline[i] + (recon[i - bytewidth] >> 1u);
}
break;
}
case 4: {
if (precon) {
for (i = 0; i != bytewidth; ++i) {
recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/
@ -2168,6 +2182,7 @@ static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scan
}
}
break;
}
default: return 36; /* error: invalid filter type given */
}
return 0;