Use more spans in CStretchEngine.
Access `m_InterBuf` using spans instead of raw pointers.
Change-Id: Ied7948725e74ab253a5ce09fcd44b6f3a68729f5
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/100615
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxge/dib/cstretchengine.cpp b/core/fxge/dib/cstretchengine.cpp
index 6719879..4acd692 100644
--- a/core/fxge/dib/cstretchengine.cpp
+++ b/core/fxge/dib/cstretchengine.cpp
@@ -313,8 +313,10 @@
}
const uint8_t* src_scan = m_pSource->GetScanline(m_CurRow).data();
- uint8_t* dest_scan =
- m_InterBuf.data() + (m_CurRow - m_SrcClip.top) * m_InterPitch;
+ pdfium::span<uint8_t> dest_span =
+ pdfium::make_span(m_InterBuf)
+ .subspan((m_CurRow - m_SrcClip.top) * m_InterPitch, m_InterPitch);
+ size_t dest_span_index = 0;
const uint8_t* src_scan_mask = nullptr;
uint8_t* dest_scan_mask = nullptr;
if (!m_ExtraAlphaBuf.empty()) {
@@ -334,7 +336,7 @@
if (src_scan[j / 8] & (1 << (7 - j % 8)))
dest_a += pixel_weight * 255;
}
- *dest_scan++ = PixelFromFixed(dest_a);
+ dest_span[dest_span_index++] = PixelFromFixed(dest_a);
}
break;
}
@@ -346,7 +348,7 @@
uint32_t pixel_weight = pWeights->GetWeightForPosition(j);
dest_a += pixel_weight * src_scan[j];
}
- *dest_scan++ = PixelFromFixed(dest_a);
+ dest_span[dest_span_index++] = PixelFromFixed(dest_a);
}
break;
}
@@ -361,7 +363,7 @@
dest_r += pixel_weight * src_scan[j];
dest_a += pixel_weight;
}
- *dest_scan++ = PixelFromFixed(dest_r);
+ dest_span[dest_span_index++] = PixelFromFixed(dest_r);
*dest_scan_mask++ = PixelFromFixed(255 * dest_a);
}
break;
@@ -385,9 +387,9 @@
dest_r += pixel_weight * static_cast<uint8_t>(argb >> 8);
}
}
- *dest_scan++ = PixelFromFixed(dest_b);
- *dest_scan++ = PixelFromFixed(dest_g);
- *dest_scan++ = PixelFromFixed(dest_r);
+ dest_span[dest_span_index++] = PixelFromFixed(dest_b);
+ dest_span[dest_span_index++] = PixelFromFixed(dest_g);
+ dest_span[dest_span_index++] = PixelFromFixed(dest_r);
}
break;
}
@@ -407,9 +409,9 @@
dest_r += pixel_weight * static_cast<uint8_t>(argb >> 8);
dest_a += pixel_weight;
}
- *dest_scan++ = PixelFromFixed(dest_b);
- *dest_scan++ = PixelFromFixed(dest_g);
- *dest_scan++ = PixelFromFixed(dest_r);
+ dest_span[dest_span_index++] = PixelFromFixed(dest_b);
+ dest_span[dest_span_index++] = PixelFromFixed(dest_g);
+ dest_span[dest_span_index++] = PixelFromFixed(dest_r);
*dest_scan_mask++ = PixelFromFixed(255 * dest_a);
}
break;
@@ -427,10 +429,10 @@
dest_g += pixel_weight * (*src_pixel++);
dest_r += pixel_weight * (*src_pixel);
}
- *dest_scan++ = PixelFromFixed(dest_b);
- *dest_scan++ = PixelFromFixed(dest_g);
- *dest_scan++ = PixelFromFixed(dest_r);
- dest_scan += Bpp - 3;
+ dest_span[dest_span_index++] = PixelFromFixed(dest_b);
+ dest_span[dest_span_index++] = PixelFromFixed(dest_g);
+ dest_span[dest_span_index++] = PixelFromFixed(dest_r);
+ dest_span_index += Bpp - 3;
}
break;
}
@@ -454,14 +456,14 @@
dest_r += pixel_weight * (*src_pixel);
dest_a += pixel_weight;
}
- *dest_scan++ = PixelFromFixed(dest_b);
- *dest_scan++ = PixelFromFixed(dest_g);
- *dest_scan++ = PixelFromFixed(dest_r);
+ dest_span[dest_span_index++] = PixelFromFixed(dest_b);
+ dest_span[dest_span_index++] = PixelFromFixed(dest_g);
+ dest_span[dest_span_index++] = PixelFromFixed(dest_r);
if (m_DestFormat == FXDIB_Format::kArgb)
- *dest_scan = PixelFromFixed(255 * dest_a);
+ dest_span[dest_span_index] = PixelFromFixed(255 * dest_a);
if (dest_scan_mask)
*dest_scan_mask++ = PixelFromFixed(255 * dest_a);
- dest_scan += Bpp - 3;
+ dest_span_index += Bpp - 3;
}
break;
}
@@ -492,13 +494,14 @@
case TransformMethod::k1BppToManyBpp:
case TransformMethod::k8BppTo8Bpp: {
for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
- unsigned char* src_scan =
- m_InterBuf.data() + (col - m_DestClip.left) * DestBpp;
+ pdfium::span<const uint8_t> src_span =
+ pdfium::make_span(m_InterBuf)
+ .subspan((col - m_DestClip.left) * DestBpp);
uint32_t dest_a = 0;
for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
uint32_t pixel_weight = pWeights->GetWeightForPosition(j);
dest_a +=
- pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];
+ pixel_weight * src_span[(j - m_SrcClip.top) * m_InterPitch];
}
*dest_scan = PixelFromFixed(dest_a);
dest_scan += DestBpp;
@@ -507,8 +510,9 @@
}
case TransformMethod::k8BppTo8BppWithAlpha: {
for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
- unsigned char* src_scan =
- m_InterBuf.data() + (col - m_DestClip.left) * DestBpp;
+ pdfium::span<const uint8_t> src_span =
+ pdfium::make_span(m_InterBuf)
+ .subspan((col - m_DestClip.left) * DestBpp);
unsigned char* src_scan_mask =
m_ExtraAlphaBuf.data() + (col - m_DestClip.left);
uint32_t dest_a = 0;
@@ -516,7 +520,7 @@
for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
uint32_t pixel_weight = pWeights->GetWeightForPosition(j);
dest_k +=
- pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];
+ pixel_weight * src_span[(j - m_SrcClip.top) * m_InterPitch];
dest_a += pixel_weight *
src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];
}
@@ -529,18 +533,19 @@
case TransformMethod::k8BppToManyBpp:
case TransformMethod::kManyBpptoManyBpp: {
for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
- unsigned char* src_scan =
- m_InterBuf.data() + (col - m_DestClip.left) * DestBpp;
+ pdfium::span<const uint8_t> src_span =
+ pdfium::make_span(m_InterBuf)
+ .subspan((col - m_DestClip.left) * DestBpp);
uint32_t dest_r = 0;
uint32_t dest_g = 0;
uint32_t dest_b = 0;
for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
uint32_t pixel_weight = pWeights->GetWeightForPosition(j);
- const uint8_t* src_pixel =
- src_scan + (j - m_SrcClip.top) * m_InterPitch;
- dest_b += pixel_weight * (*src_pixel++);
- dest_g += pixel_weight * (*src_pixel++);
- dest_r += pixel_weight * (*src_pixel);
+ pdfium::span<const uint8_t> src_pixel =
+ src_span.subspan((j - m_SrcClip.top) * m_InterPitch, 3);
+ dest_b += pixel_weight * src_pixel[0];
+ dest_g += pixel_weight * src_pixel[1];
+ dest_r += pixel_weight * src_pixel[2];
}
dest_scan[0] = PixelFromFixed(dest_b);
dest_scan[1] = PixelFromFixed(dest_g);
@@ -552,8 +557,9 @@
case TransformMethod::k8BppToManyBppWithAlpha:
case TransformMethod::kManyBpptoManyBppWithAlpha: {
for (int col = m_DestClip.left; col < m_DestClip.right; ++col) {
- unsigned char* src_scan =
- m_InterBuf.data() + (col - m_DestClip.left) * DestBpp;
+ pdfium::span<const uint8_t> src_span =
+ pdfium::make_span(m_InterBuf)
+ .subspan((col - m_DestClip.left) * DestBpp);
unsigned char* src_scan_mask = nullptr;
if (m_DestFormat != FXDIB_Format::kArgb)
src_scan_mask = m_ExtraAlphaBuf.data() + (col - m_DestClip.left);
@@ -561,18 +567,20 @@
uint32_t dest_r = 0;
uint32_t dest_g = 0;
uint32_t dest_b = 0;
+ const size_t pixel_bytes =
+ m_DestFormat == FXDIB_Format::kArgb ? 4 : 3;
for (int j = pWeights->m_SrcStart; j <= pWeights->m_SrcEnd; ++j) {
uint32_t pixel_weight = pWeights->GetWeightForPosition(j);
- const uint8_t* src_pixel =
- src_scan + (j - m_SrcClip.top) * m_InterPitch;
+ pdfium::span<const uint8_t> src_pixel = src_span.subspan(
+ (j - m_SrcClip.top) * m_InterPitch, pixel_bytes);
int mask_v = 255;
if (src_scan_mask)
mask_v = src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];
- dest_b += pixel_weight * (*src_pixel++);
- dest_g += pixel_weight * (*src_pixel++);
- dest_r += pixel_weight * (*src_pixel);
+ dest_b += pixel_weight * src_pixel[0];
+ dest_g += pixel_weight * src_pixel[1];
+ dest_r += pixel_weight * src_pixel[2];
if (m_DestFormat == FXDIB_Format::kArgb)
- dest_a += pixel_weight * (*(src_pixel + 1));
+ dest_a += pixel_weight * src_pixel[3];
else
dest_a += pixel_weight * mask_v;
}