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; size_t i;
switch (filterType) { switch (filterType) {
case 0: case 0: {
for (i = 0; i != length; ++i) recon[i] = scanline[i]; 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; break;
case 1: }
case 1: {
for (i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; for (i = 0; i != bytewidth; ++i) recon[i] = scanline[i];
for (i = bytewidth; i < length; ++i) recon[i] = scanline[i] + recon[i - bytewidth]; for (i = bytewidth; i < length; ++i) recon[i] = scanline[i] + recon[i - bytewidth];
break; break;
case 2: }
case 2: {
if (precon) { 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 { } else {
for(i = 0; i != length; ++i) recon[i] = scanline[i]; for (i = 0; i != length; ++i) recon[i] = scanline[i];
} }
break; break;
case 3: }
if (precon) { case 3: {
for (i = 0; i != bytewidth; ++i) recon[i] = scanline[i] + (precon[i] >> 1u); if (precon) {
for (i = bytewidth; i < length; ++i) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) >> 1u); for (i = 0; i != bytewidth; ++i) recon[i] = scanline[i] + (precon[i] >> 1u);
} else { for (i = bytewidth; i < length; ++i) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) >> 1u);
for (i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; } else {
for (i = bytewidth; i < length; ++i) recon[i] = scanline[i] + (recon[i - bytewidth] >> 1u); 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: break;
}
case 4: {
if (precon) { if (precon) {
for (i = 0; i != bytewidth; ++i) { for (i = 0; i != bytewidth; ++i) {
recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[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; break;
}
default: return 36; /* error: invalid filter type given */ default: return 36; /* error: invalid filter type given */
} }
return 0; return 0;