From 886b6b365b6c91e9b60c89970f44be4c38de12f3 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 7 Feb 2024 11:54:07 +0900 Subject: [PATCH] loaders: decode the image with premultiplied alpha. basically, the renderer requires images with premultiplied alpha. --- src/loaders/external_png/tvgPngLoader.cpp | 1 + src/loaders/external_webp/tvgWebpLoader.cpp | 3 +-- src/loaders/png/tvgPngLoader.cpp | 4 +++- src/loaders/webp/dec/webp.cpp | 2 +- src/loaders/webp/tvgWebpLoader.cpp | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/loaders/external_png/tvgPngLoader.cpp b/src/loaders/external_png/tvgPngLoader.cpp index 10277f84..95651afb 100644 --- a/src/loaders/external_png/tvgPngLoader.cpp +++ b/src/loaders/external_png/tvgPngLoader.cpp @@ -104,6 +104,7 @@ bool PngLoader::read() surface.h = (uint32_t)h; surface.channelSize = sizeof(uint32_t); surface.cs = ColorSpace::ARGB8888; + //TODO: we can acquire a pre-multiplied image. See "png_structrp" surface.premultiplied = false; clear(); diff --git a/src/loaders/external_webp/tvgWebpLoader.cpp b/src/loaders/external_webp/tvgWebpLoader.cpp index e7fafdbb..46842b5e 100644 --- a/src/loaders/external_webp/tvgWebpLoader.cpp +++ b/src/loaders/external_webp/tvgWebpLoader.cpp @@ -33,9 +33,8 @@ void WebpLoader::run(unsigned tid) { + //TODO: acquire the current colorspace format & pre-multiplied alpha image. surface.buf8 = WebPDecodeBGRA(data, size, nullptr, nullptr); - - //setup the surface surface.stride = (uint32_t)w; surface.w = (uint32_t)w; surface.h = (uint32_t)h; diff --git a/src/loaders/png/tvgPngLoader.cpp b/src/loaders/png/tvgPngLoader.cpp index c8920dce..45d68124 100644 --- a/src/loaders/png/tvgPngLoader.cpp +++ b/src/loaders/png/tvgPngLoader.cpp @@ -44,7 +44,9 @@ void PngLoader::run(unsigned tid) surface.w = width; surface.h = height; surface.channelSize = sizeof(uint32_t); - surface.premultiplied = false; + + if (state.info_png.color.colortype == LCT_RGBA) surface.premultiplied = false; + else surface.premultiplied = true; } diff --git a/src/loaders/webp/dec/webp.cpp b/src/loaders/webp/dec/webp.cpp index 7f6a5a44..df0d61f7 100644 --- a/src/loaders/webp/dec/webp.cpp +++ b/src/loaders/webp/dec/webp.cpp @@ -651,7 +651,7 @@ int WebPIoInitFromOptions(const WebPDecoderOptions* const options, uint8_t* WebPDecodeBGRA(const uint8_t* data, size_t data_size, int* width, int* height) { - return Decode(MODE_BGRA, data, data_size, width, height, NULL); + return Decode(MODE_bgrA, data, data_size, width, height, NULL); } diff --git a/src/loaders/webp/tvgWebpLoader.cpp b/src/loaders/webp/tvgWebpLoader.cpp index c9a7eb62..68c75c55 100644 --- a/src/loaders/webp/tvgWebpLoader.cpp +++ b/src/loaders/webp/tvgWebpLoader.cpp @@ -42,7 +42,7 @@ void WebpLoader::run(unsigned tid) surface.h = static_cast(h); surface.cs = ColorSpace::ARGB8888; surface.channelSize = sizeof(uint32_t); - surface.premultiplied = false; + surface.premultiplied = true; clear(); }