mirror of
https://github.com/thorvg/thorvg.git
synced 2025-07-23 22:58:44 +00:00
png_loaders: fix the wrong premultiplying operations.
It should not modify the alpha channel value while premultiplying that turned out with the wrong visual result. @Issue: https://github.com/Samsung/thorvg/issues/655
This commit is contained in:
parent
62c9feb80a
commit
36da47af80
3 changed files with 14 additions and 8 deletions
|
@ -31,6 +31,12 @@ void tvgDrawCmds(tvg::Canvas* canvas)
|
||||||
{
|
{
|
||||||
if (!canvas) return;
|
if (!canvas) return;
|
||||||
|
|
||||||
|
//Background
|
||||||
|
auto bg = tvg::Shape::gen();
|
||||||
|
bg->appendRect(0, 0, WIDTH, HEIGHT, 0, 0); //x, y, w, h, rx, ry
|
||||||
|
bg->fill(255, 255, 255, 255); //r, g, b, a
|
||||||
|
canvas->push(move(bg));
|
||||||
|
|
||||||
//Load png file from path
|
//Load png file from path
|
||||||
auto opacity = 51;
|
auto opacity = 51;
|
||||||
|
|
||||||
|
|
|
@ -23,10 +23,10 @@
|
||||||
#include "tvgLoader.h"
|
#include "tvgLoader.h"
|
||||||
#include "tvgPngLoader.h"
|
#include "tvgPngLoader.h"
|
||||||
|
|
||||||
static inline uint32_t ALPHA_BLEND(uint32_t c, uint32_t a)
|
static inline uint32_t PREMULTIPLY(uint32_t c)
|
||||||
{
|
{
|
||||||
return (((((c >> 8) & 0x00ff00ff) * a + 0x00ff00ff) & 0xff00ff00) +
|
auto a = (c >> 24);
|
||||||
((((c & 0x00ff00ff) * a + 0x00ff00ff) >> 8) & 0x00ff00ff));
|
return (c & 0xff000000) + ((((c >> 8) & 0xff) * a) & 0xff00) + ((((c & 0x00ff00ff) * a) >> 8) & 0x00ff00ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ static void _premultiply(uint32_t* data, uint32_t w, uint32_t h)
|
||||||
for (uint32_t y = 0; y < h; ++y, buffer += w) {
|
for (uint32_t y = 0; y < h; ++y, buffer += w) {
|
||||||
auto src = buffer;
|
auto src = buffer;
|
||||||
for (uint32_t x = 0; x < w; ++x, ++src) {
|
for (uint32_t x = 0; x < w; ++x, ++src) {
|
||||||
*src = ALPHA_BLEND(*src, (*src >> 24));
|
*src = PREMULTIPLY(*src);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,10 +29,10 @@
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
static inline uint32_t ALPHA_BLEND(uint32_t c, uint32_t a)
|
static inline uint32_t PREMULTIPLY(uint32_t c)
|
||||||
{
|
{
|
||||||
return (((((c >> 8) & 0x00ff00ff) * a + 0x00ff00ff) & 0xff00ff00) +
|
auto a = (c >> 24);
|
||||||
((((c & 0x00ff00ff) * a + 0x00ff00ff) >> 8) & 0x00ff00ff));
|
return (c & 0xff000000) + ((((c >> 8) & 0xff) * a) & 0xff00) + ((((c & 0x00ff00ff) * a) >> 8) & 0x00ff00ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ static void _premultiply(uint32_t* data, uint32_t w, uint32_t h)
|
||||||
for (uint32_t y = 0; y < h; ++y, buffer += w) {
|
for (uint32_t y = 0; y < h; ++y, buffer += w) {
|
||||||
auto src = buffer;
|
auto src = buffer;
|
||||||
for (uint32_t x = 0; x < w; ++x, ++src) {
|
for (uint32_t x = 0; x < w; ++x, ++src) {
|
||||||
*src = ALPHA_BLEND(*src, (*src >> 24));
|
*src = PREMULTIPLY(*src);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue