Remove FXARGB_SetRGBOrderDIB()
Instead of trying to spanify FXARGB_SetRGBOrderDIB(), recognize it is
only used in CompositeFoo_RgbByteOrder() functions inside
cfx_scanlinecompositor.cpp. These functions are nearly identical to
their CompositeFoo() counterparts. Since the relevant CompositeFoo()
functions are all using FX_BGRA_STRUCT for their destination spans,
templatize them so they can accept spans of FX_RGBA_STRUCT as well.
Then delete CompositeFoo_RgbByteOrder() and FXARGB_SetRGBOrderDIB().
Bug: 42271176
Change-Id: Icf04c34d96042375e90f5372c2a39a8131b89fd6
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/132591
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 72ffd06..870f0df 100644
--- a/core/fxge/dib/cfx_scanlinecompositor.cpp
+++ b/core/fxge/dib/cfx_scanlinecompositor.cpp
@@ -297,11 +297,11 @@
});
}
-void CompositeRow_Bgr2Bgra_Blend_NoClip(
- pdfium::span<FX_BGRA_STRUCT<uint8_t>> dest_span,
- pdfium::span<const uint8_t> src_span,
- BlendMode blend_type,
- size_t src_Bpp) {
+template <typename DestPixelStruct>
+void CompositeRow_Bgr2Bgra_Blend_NoClip(pdfium::span<DestPixelStruct> dest_span,
+ pdfium::span<const uint8_t> src_span,
+ BlendMode blend_type,
+ size_t src_Bpp) {
const bool non_separable_blend = IsNonSeparableBlendMode(blend_type);
for (auto& dest : dest_span) {
const auto& src =
@@ -417,8 +417,9 @@
});
}
+template <typename DestPixelStruct>
void CompositeRow_Bgr2Bgra_NoBlend_NoClip(
- pdfium::span<FX_BGRA_STRUCT<uint8_t>> dest_span,
+ pdfium::span<DestPixelStruct> dest_span,
pdfium::span<const uint8_t> src_span,
size_t src_Bpp) {
for (auto& dest : dest_span) {
@@ -1174,7 +1175,8 @@
});
}
-void CompositeRow_ByteMask2Bgra(pdfium::span<FX_BGRA_STRUCT<uint8_t>> dest_span,
+template <typename DestPixelStruct>
+void CompositeRow_ByteMask2Bgra(pdfium::span<DestPixelStruct> dest_span,
pdfium::span<const uint8_t> src_span,
FX_BGRA_STRUCT<uint8_t> mask,
int pixel_count,
@@ -1292,7 +1294,8 @@
}
}
-void CompositeRow_BitMask2Bgra(pdfium::span<FX_BGRA_STRUCT<uint8_t>> dest_span,
+template <typename DestPixelStruct>
+void CompositeRow_BitMask2Bgra(pdfium::span<DestPixelStruct> dest_span,
pdfium::span<const uint8_t> src_span,
FX_BGRA_STRUCT<uint8_t> mask,
int src_left,
@@ -1303,12 +1306,12 @@
const uint8_t* clip_scan = clip_span.data();
UNSAFE_TODO({
if (blend_type == BlendMode::kNormal && !clip_scan && mask.alpha == 255) {
- FX_BGRA_STRUCT<uint8_t> opaque_mask = mask;
- opaque_mask.alpha = 255;
for (int col = 0; col < pixel_count; col++) {
if (src_scan[(src_left + col) / 8] &
(1 << (7 - (src_left + col) % 8))) {
- dest_span[col] = opaque_mask;
+ auto& dest = dest_span[col];
+ CopyColorComponents(mask, dest);
+ dest.alpha = 255;
}
}
return;
@@ -1467,75 +1470,6 @@
});
}
-void CompositeRow_Bgr2Bgra_Blend_NoClip_RgbByteOrder(
- pdfium::span<uint8_t> dest_span,
- pdfium::span<const uint8_t> src_span,
- int width,
- BlendMode blend_type,
- int src_Bpp) {
- uint8_t* dest_scan = dest_span.data();
- const uint8_t* src_scan = src_span.data();
- bool bNonseparableBlend = IsNonSeparableBlendMode(blend_type);
- int src_gap = src_Bpp - 3;
- int blended_colors[3];
- UNSAFE_TODO({
- for (int col = 0; col < width; col++) {
- uint8_t back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- if (src_Bpp == 4) {
- FXARGB_SetRGBOrderDIB(dest_scan,
- 0xff000000 | FXARGB_GetDIB(src_scan));
- } else {
- FXARGB_SetRGBOrderDIB(
- dest_scan,
- ArgbEncode(0xff, src_scan[2], src_scan[1], src_scan[0]));
- }
- dest_scan += 4;
- src_scan += src_Bpp;
- continue;
- }
- dest_scan[3] = 0xff;
- if (bNonseparableBlend) {
- uint8_t dest_scan_o[3];
- ReverseCopy3Bytes(dest_scan_o, dest_scan);
- RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
- }
- for (int color = 0; color < 3; color++) {
- int index = 2 - color;
- int src_color = *src_scan;
- int blended = bNonseparableBlend
- ? blended_colors[color]
- : Blend(blend_type, dest_scan[index], src_color);
- dest_scan[index] = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
- src_scan++;
- }
- dest_scan += 4;
- src_scan += src_gap;
- }
- });
-}
-
-void CompositeRow_Bgr2Bgra_NoBlend_NoClip_RgbByteOrder(
- pdfium::span<uint8_t> dest_span,
- pdfium::span<const uint8_t> src_span,
- int width,
- int src_Bpp) {
- uint8_t* dest_scan = dest_span.data();
- const uint8_t* src_scan = src_span.data();
- UNSAFE_TODO({
- for (int col = 0; col < width; col++) {
- if (src_Bpp == 4) {
- FXARGB_SetRGBOrderDIB(dest_scan, 0xff000000 | FXARGB_GetDIB(src_scan));
- } else {
- FXARGB_SetRGBOrderDIB(
- dest_scan, ArgbEncode(0xff, src_scan[2], src_scan[1], src_scan[0]));
- }
- dest_scan += 4;
- src_scan += src_Bpp;
- }
- });
-}
-
void CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(
pdfium::span<uint8_t> dest_span,
pdfium::span<const uint8_t> src_span,
@@ -1960,63 +1894,6 @@
});
}
-void CompositeRow_ByteMask2Bgra_RgbByteOrder(
- pdfium::span<uint8_t> dest_span,
- pdfium::span<const uint8_t> src_span,
- FX_BGRA_STRUCT<uint8_t> mask,
- int pixel_count,
- BlendMode blend_type,
- pdfium::span<const uint8_t> clip_span) {
- uint8_t* dest_scan = dest_span.data();
- UNSAFE_TODO({
- for (int col = 0; col < pixel_count; col++) {
- int src_alpha = GetAlphaWithSrc(mask.alpha, clip_span, src_span, col);
- uint8_t back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- FXARGB_SetRGBOrderDIB(
- dest_scan, ArgbEncode(src_alpha, mask.red, mask.green, mask.blue));
- dest_scan += 4;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan += 4;
- continue;
- }
- 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)) {
- int blended_colors[3];
- uint8_t dest_scan_o[3];
- ReverseCopy3Bytes(dest_scan_o, dest_scan);
- RGB_Blend(blend_type, reinterpret_cast<const uint8_t*>(&mask),
- dest_scan_o, blended_colors);
- dest_scan[2] =
- FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);
- dest_scan[1] =
- FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);
- dest_scan[0] =
- FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);
- } else if (blend_type != BlendMode::kNormal) {
- int blended = Blend(blend_type, dest_scan[2], mask.blue);
- blended = FXDIB_ALPHA_MERGE(mask.blue, blended, back_alpha);
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);
- blended = Blend(blend_type, dest_scan[1], mask.green);
- blended = FXDIB_ALPHA_MERGE(mask.green, blended, back_alpha);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);
- blended = Blend(blend_type, dest_scan[0], mask.red);
- blended = FXDIB_ALPHA_MERGE(mask.red, blended, back_alpha);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);
- } else {
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], mask.blue, alpha_ratio);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], mask.green, alpha_ratio);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], mask.red, alpha_ratio);
- }
- dest_scan += 4;
- }
- });
-}
-
void CompositeRow_ByteMask2Rgb_RgbByteOrder(
pdfium::span<uint8_t> dest_span,
pdfium::span<const uint8_t> src_span,
@@ -2062,78 +1939,6 @@
});
}
-void CompositeRow_BitMask2Bgra_RgbByteOrder(
- pdfium::span<uint8_t> dest_span,
- pdfium::span<const uint8_t> src_span,
- FX_BGRA_STRUCT<uint8_t> mask,
- int src_left,
- int pixel_count,
- BlendMode blend_type,
- pdfium::span<const uint8_t> clip_span) {
- uint8_t* dest_scan = dest_span.data();
- const uint8_t* src_scan = src_span.data();
- const uint8_t* clip_scan = clip_span.data();
- UNSAFE_TODO({
- if (blend_type == BlendMode::kNormal && !clip_scan && mask.alpha == 255) {
- FX_ARGB argb = ArgbEncode(0xff, mask.red, mask.green, mask.blue);
- for (int col = 0; col < pixel_count; col++) {
- if (src_scan[(src_left + col) / 8] &
- (1 << (7 - (src_left + col) % 8))) {
- FXARGB_SetRGBOrderDIB(dest_scan, argb);
- }
- dest_scan += 4;
- }
- return;
- }
- for (int col = 0; col < pixel_count; col++) {
- if (!(src_scan[(src_left + col) / 8] &
- (1 << (7 - (src_left + col) % 8)))) {
- dest_scan += 4;
- continue;
- }
- int src_alpha = GetAlpha(mask.alpha, clip_scan, col);
- uint8_t back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- FXARGB_SetRGBOrderDIB(
- dest_scan, ArgbEncode(src_alpha, mask.red, mask.green, mask.blue));
- dest_scan += 4;
- continue;
- }
- 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)) {
- int blended_colors[3];
- uint8_t dest_scan_o[3];
- ReverseCopy3Bytes(dest_scan_o, dest_scan);
- RGB_Blend(blend_type, reinterpret_cast<const uint8_t*>(&mask),
- dest_scan_o, blended_colors);
- dest_scan[2] =
- FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);
- dest_scan[1] =
- FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);
- dest_scan[0] =
- FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);
- } else if (blend_type != BlendMode::kNormal) {
- int blended = Blend(blend_type, dest_scan[2], mask.blue);
- blended = FXDIB_ALPHA_MERGE(mask.blue, blended, back_alpha);
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);
- blended = Blend(blend_type, dest_scan[1], mask.green);
- blended = FXDIB_ALPHA_MERGE(mask.green, blended, back_alpha);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);
- blended = Blend(blend_type, dest_scan[0], mask.red);
- blended = FXDIB_ALPHA_MERGE(mask.red, blended, back_alpha);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);
- } else {
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], mask.blue, alpha_ratio);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], mask.green, alpha_ratio);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], mask.red, alpha_ratio);
- }
- dest_scan += 4;
- }
- });
-}
-
void CompositeRow_BitMask2Rgb_RgbByteOrder(
pdfium::span<uint8_t> dest_span,
pdfium::span<const uint8_t> src_span,
@@ -2401,8 +2206,10 @@
dest_scan, src_scan, width, src_Bpp, clip_scan);
return;
}
- CompositeRow_Bgr2Bgra_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan,
- width, src_Bpp);
+ auto dest_span =
+ fxcrt::reinterpret_span<FX_RGBA_STRUCT<uint8_t>>(dest_scan).first(
+ static_cast<size_t>(width));
+ CompositeRow_Bgr2Bgra_NoBlend_NoClip(dest_span, src_scan, src_Bpp);
return;
}
if (!clip_scan.empty()) {
@@ -2410,8 +2217,11 @@
dest_scan, src_scan, width, blend_type_, src_Bpp, clip_scan);
return;
}
- CompositeRow_Bgr2Bgra_Blend_NoClip_RgbByteOrder(
- dest_scan, src_scan, width, blend_type_, src_Bpp);
+ auto dest_span =
+ fxcrt::reinterpret_span<FX_RGBA_STRUCT<uint8_t>>(dest_scan).first(
+ static_cast<size_t>(width));
+ CompositeRow_Bgr2Bgra_Blend_NoClip(dest_span, src_scan, blend_type_,
+ src_Bpp);
return;
}
@@ -2752,8 +2562,10 @@
}
case FXDIB_Format::kBgra: {
if (rgb_byte_order_) {
- CompositeRow_ByteMask2Bgra_RgbByteOrder(
- dest_scan, src_scan, std::get<FX_BGRA_STRUCT<uint8_t>>(mask_color_),
+ auto dest_span =
+ fxcrt::reinterpret_span<FX_RGBA_STRUCT<uint8_t>>(dest_scan);
+ CompositeRow_ByteMask2Bgra(
+ dest_span, src_scan, std::get<FX_BGRA_STRUCT<uint8_t>>(mask_color_),
width, blend_type_, clip_scan);
return;
}
@@ -2819,8 +2631,10 @@
}
case FXDIB_Format::kBgra: {
if (rgb_byte_order_) {
- CompositeRow_BitMask2Bgra_RgbByteOrder(
- dest_scan, src_scan, std::get<FX_BGRA_STRUCT<uint8_t>>(mask_color_),
+ auto dest_span =
+ fxcrt::reinterpret_span<FX_RGBA_STRUCT<uint8_t>>(dest_scan);
+ CompositeRow_BitMask2Bgra(
+ dest_span, src_scan, std::get<FX_BGRA_STRUCT<uint8_t>>(mask_color_),
src_left, width, blend_type_, clip_scan);
return;
}
diff --git a/core/fxge/dib/fx_dib.h b/core/fxge/dib/fx_dib.h
index 2794e7a..f539f74 100644
--- a/core/fxge/dib/fx_dib.h
+++ b/core/fxge/dib/fx_dib.h
@@ -226,16 +226,6 @@
p[3] = FXARGB_A(argb);
}
-// PRECONDITIONS: Caller must ensure 4 valid bytes at `p`.
-UNSAFE_BUFFER_USAGE inline void FXARGB_SetRGBOrderDIB(uint8_t* p,
- uint32_t argb) {
- // SAFETY: required from caller, enforced by UNSAFE_BUFFER_USAGE.
- UNSAFE_BUFFERS(p[0]) = FXARGB_R(argb);
- UNSAFE_BUFFERS(p[1]) = FXARGB_G(argb);
- UNSAFE_BUFFERS(p[2]) = FXARGB_B(argb);
- UNSAFE_BUFFERS(p[3]) = FXARGB_A(argb);
-}
-
// PRECONDITIONS: Caller must ensure 3 valid bytes at `dest` and `src`.
UNSAFE_BUFFER_USAGE inline void ReverseCopy3Bytes(uint8_t* dest,
const uint8_t* src) {