mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-13 19:44:28 +00:00
png_loader: correct colorspace
decoding color channels rgba -> bgra @Issue: https://github.com/Samsung/thorvg/issues/1007
This commit is contained in:
parent
24e0133f78
commit
56e2498466
1 changed files with 31 additions and 16 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue