Fix CompositeBuffers()
Avoid a division by dest_alpha=0 when fg and bg are both fully
transparent.
Change-Id: I0620e2f1d162759b3c38421e8a921a98c446143a
Reviewed-on: https://chromium-review.googlesource.com/c/codecs/libwebp2/+/7067278
Reviewed-by: James Zern <jzern@google.com>
Tested-by: WebM Builds <builds@webmproject.org>
diff --git a/src/utils/argb_buffer.cc b/src/utils/argb_buffer.cc
index 01da4c6..4f74869 100644
--- a/src/utils/argb_buffer.cc
+++ b/src/utils/argb_buffer.cc
@@ -368,14 +368,20 @@
for (uint32_t x = 0; x < w.width; ++x) {
const uint8_t b = kAlphaMax - fg_row[4 * x + 0]; // ~ 255 * (1-alpha)
const uint8_t fg_alpha = fg_row[4 * x + 0];
- const uint8_t bg_alpha = bg_row[4 * x + 0];
- const uint8_t dest_alpha = fg_alpha + DivBy255(b * bg_row[4 * x + 0]);
- dest_row[4 * x + 0] = dest_alpha;
- for (uint32_t c = 1; c < 4; ++c) {
- dest_row[4 * x + c] =
- DivRound<int32_t>(fg_row[4 * x + c] * fg_alpha +
- DivBy255(b * bg_row[4 * x + c] * bg_alpha),
- dest_alpha);
+ if (fg_alpha == 0) {
+ for (uint32_t c = 0; c < 4; ++c) {
+ dest_row[4 * x + c] = bg_row[4 * x + c];
+ }
+ } else {
+ const uint8_t bg_alpha = bg_row[4 * x + 0];
+ const uint8_t dest_alpha = fg_alpha + DivBy255(b * bg_row[4 * x + 0]);
+ dest_row[4 * x + 0] = dest_alpha;
+ for (uint32_t c = 1; c < 4; ++c) {
+ dest_row[4 * x + c] = DivRound<int32_t>(
+ fg_row[4 * x + c] * fg_alpha +
+ DivBy255(b * bg_row[4 * x + c] * bg_alpha),
+ dest_alpha);
+ }
}
}
}