Use FXDIB_ALPHA_UNION() in more places in cfx_scanlinecompositor.cpp
Replace a bunch of duplicate code with FXDIB_ALPHA_UNION(). Then change
this macro to an actual function and rename it AlphaUnion().
Change-Id: Ib53953e18a59e7888c96276f45fe599dda6515e2
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/123151
Reviewed-by: Tom Sepez <tsepez@google.com>
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxge/dib/cfx_scanlinecompositor.cpp b/core/fxge/dib/cfx_scanlinecompositor.cpp
index 2ff41bc..02a0c6c 100644
--- a/core/fxge/dib/cfx_scanlinecompositor.cpp
+++ b/core/fxge/dib/cfx_scanlinecompositor.cpp
@@ -21,10 +21,12 @@
using fxge::Blend;
-#define FXDIB_ALPHA_UNION(dest, src) ((dest) + (src) - (dest) * (src) / 255)
-
namespace {
+uint8_t AlphaUnion(uint8_t dest, uint8_t src) {
+ return dest + src - dest * src / 255;
+}
+
template <typename T, typename U>
void CopyInputAndAlpha(const T& input, uint8_t alpha, U& output) {
output.blue = input.blue;
@@ -165,7 +167,7 @@
if (src_alpha == 0) {
return;
}
- output = FXDIB_ALPHA_UNION(output, src_alpha);
+ output = AlphaUnion(output, src_alpha);
}
void CompositeRowArgb2Mask(pdfium::span<const FX_BGRA_STRUCT<uint8_t>> src_span,
@@ -195,7 +197,7 @@
return;
}
for (int i = 0; i < width; ++i) {
- *dest_scan = FXDIB_ALPHA_UNION(*dest_scan, *clip_scan);
+ *dest_scan = AlphaUnion(*dest_scan, *clip_scan);
++dest_scan;
++clip_scan;
}
@@ -355,8 +357,7 @@
src_scan += src_Bpp;
continue;
}
- uint8_t dest_alpha =
- back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
dest_scan[3] = dest_alpha;
int alpha_ratio = src_alpha * 255 / dest_alpha;
if (bNonseparableBlend) {
@@ -403,8 +404,7 @@
continue;
}
int back_alpha = dest_scan[3];
- uint8_t dest_alpha =
- back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
dest_scan[3] = dest_alpha;
int alpha_ratio = src_alpha * 255 / dest_alpha;
for (int color = 0; color < 3; color++) {
@@ -549,7 +549,7 @@
return;
}
- const uint8_t dest_alpha = FXDIB_ALPHA_UNION(output.alpha, src_alpha);
+ const uint8_t dest_alpha = AlphaUnion(output.alpha, src_alpha);
const int alpha_ratio = src_alpha * 255 / dest_alpha;
FX_RGB_STRUCT<int> blended_color = RgbBlend(blend_type, input, output);
AlphaMergeToSource(input, blended_color, output.alpha);
@@ -571,7 +571,7 @@
return;
}
- const uint8_t dest_alpha = FXDIB_ALPHA_UNION(output.alpha, src_alpha);
+ const uint8_t dest_alpha = AlphaUnion(output.alpha, src_alpha);
const int alpha_ratio = src_alpha * 255 / dest_alpha;
FX_RGB_STRUCT<int> blended_color = {
.red = Blend(blend_type, output.red, input.red),
@@ -596,7 +596,7 @@
return;
}
- const uint8_t dest_alpha = FXDIB_ALPHA_UNION(output.alpha, src_alpha);
+ const uint8_t dest_alpha = AlphaUnion(output.alpha, src_alpha);
const int alpha_ratio = src_alpha * 255 / dest_alpha;
AlphaMerge(input, output, alpha_ratio);
output.alpha = dest_alpha;
@@ -982,8 +982,7 @@
continue;
}
int back_alpha = dest_scan[3];
- uint8_t dest_alpha =
- back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
dest_scan[3] = dest_alpha;
int alpha_ratio = src_alpha * 255 / dest_alpha;
*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
@@ -1040,8 +1039,7 @@
continue;
}
int back_alpha = dest_scan[3];
- uint8_t dest_alpha =
- back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
dest_scan[3] = dest_alpha;
int alpha_ratio = src_alpha * 255 / dest_alpha;
*dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
@@ -1078,8 +1076,7 @@
dest_scan += 4;
continue;
}
- uint8_t dest_alpha =
- back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
dest_scan[3] = dest_alpha;
int alpha_ratio = src_alpha * 255 / dest_alpha;
if (IsNonSeparableBlendMode(blend_type)) {
@@ -1185,7 +1182,7 @@
if (!back_alpha) {
*dest_scan = src_alpha;
} else if (src_alpha) {
- *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_scan = AlphaUnion(back_alpha, src_alpha);
}
UNSAFE_TODO(dest_scan++);
}
@@ -1245,8 +1242,7 @@
dest_scan += 4;
continue;
}
- uint8_t dest_alpha =
- back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
dest_scan[3] = dest_alpha;
int alpha_ratio = src_alpha * 255 / dest_alpha;
if (IsNonSeparableBlendMode(blend_type)) {
@@ -1381,7 +1377,7 @@
if (!back_alpha) {
*dest_scan = src_alpha;
} else if (src_alpha) {
- *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_scan = AlphaUnion(back_alpha, src_alpha);
}
dest_scan++;
}
@@ -1563,8 +1559,7 @@
src_scan += src_Bpp;
continue;
}
- uint8_t dest_alpha =
- back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
dest_scan[3] = dest_alpha;
int alpha_ratio = src_alpha * 255 / dest_alpha;
if (bNonseparableBlend) {
@@ -1658,8 +1653,7 @@
continue;
}
int back_alpha = dest_scan[3];
- uint8_t dest_alpha =
- back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
dest_scan[3] = dest_alpha;
int alpha_ratio = src_alpha * 255 / dest_alpha;
for (int color = 0; color < 3; color++) {
@@ -1831,8 +1825,7 @@
continue;
}
int back_alpha = dest_scan[3];
- uint8_t dest_alpha =
- back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
dest_scan[3] = dest_alpha;
int alpha_ratio = src_alpha * 255 / dest_alpha;
dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);
@@ -1899,8 +1892,7 @@
continue;
}
int back_alpha = dest_scan[3];
- uint8_t dest_alpha =
- back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
dest_scan[3] = dest_alpha;
int alpha_ratio = src_alpha * 255 / dest_alpha;
dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);
@@ -1936,8 +1928,7 @@
dest_scan += 4;
continue;
}
- uint8_t dest_alpha =
- back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
dest_scan[3] = dest_alpha;
int alpha_ratio = src_alpha * 255 / dest_alpha;
if (IsNonSeparableBlendMode(blend_type)) {
@@ -2064,8 +2055,7 @@
dest_scan += 4;
continue;
}
- uint8_t dest_alpha =
- back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ uint8_t dest_alpha = AlphaUnion(back_alpha, src_alpha);
dest_scan[3] = dest_alpha;
int alpha_ratio = src_alpha * 255 / dest_alpha;
if (IsNonSeparableBlendMode(blend_type)) {