Reduce scope of GetBGR() calls inside CFX_AggRenderer::CompositeSpan()
Avoid calling GetBGR() for grayscale color data, which results in a bad
variant access.
Bug: 374218980
Change-Id: I3d40b0e40ba24fee34332a8191ba7e824ec55219
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/125270
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Tom Sepez <tsepez@google.com>
diff --git a/core/fxge/agg/cfx_agg_devicedriver.cpp b/core/fxge/agg/cfx_agg_devicedriver.cpp
index 5d78ed7..71662e3 100644
--- a/core/fxge/agg/cfx_agg_devicedriver.cpp
+++ b/core/fxge/agg/cfx_agg_devicedriver.cpp
@@ -469,12 +469,12 @@
const uint8_t* cover_scan,
const uint8_t* clip_scan) {
CHECK(bytes_per_pixel);
- const auto& bgr = GetBGR();
UNSAFE_TODO({
dest_scan += col_start * bytes_per_pixel;
backdrop_scan += col_start * bytes_per_pixel;
if (m_bRgbByteOrder) {
if (bytes_per_pixel == 4 && bDestAlpha) {
+ const auto& bgr = GetBGR();
for (int col = col_start; col < col_end; col++) {
int src_alpha = GetSrcAlpha(clip_scan, col);
uint8_t dest_alpha =
@@ -506,6 +506,7 @@
return;
}
if (bytes_per_pixel == 3 || bytes_per_pixel == 4) {
+ const auto& bgr = GetBGR();
for (int col = col_start; col < col_end; col++) {
int src_alpha = GetSrcAlpha(clip_scan, col);
int r = FXDIB_ALPHA_MERGE(*backdrop_scan++, bgr.red, src_alpha);
@@ -523,6 +524,7 @@
return;
}
if (bytes_per_pixel == 4 && bDestAlpha) {
+ const auto& bgr = GetBGR();
for (int col = col_start; col < col_end; col++) {
int src_alpha = GetSrcAlpha(clip_scan, col);
int src_alpha_covered = src_alpha * cover_scan[col] / 255;
@@ -558,6 +560,7 @@
return;
}
if (bytes_per_pixel == 3 || bytes_per_pixel == 4) {
+ const auto& bgr = GetBGR();
for (int col = col_start; col < col_end; col++) {
int src_alpha = GetSrcAlpha(clip_scan, col);
if (m_bFullCover) {