Update SkiaPaths RgbByteOrderTransferBitmap() implementation.
It is meant to be a duplicate of AGG's function of the same name. Update
it keep them in sync.
Bug: chromium:1386123
Change-Id: Ib8fb75e2e65e3d3b178015dcd80df1335511d4c6
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/101671
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Nigi <nigi@chromium.org>
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index 4187348..eba69d7 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -84,8 +84,6 @@
#if defined(_SKIA_SUPPORT_PATHS_)
void RgbByteOrderTransferBitmap(const RetainPtr<CFX_DIBitmap>& pBitmap,
- int dest_left,
- int dest_top,
int width,
int height,
const RetainPtr<CFX_DIBBase>& pSrcBitmap,
@@ -94,26 +92,34 @@
if (!pBitmap)
return;
+ int dest_left = 0;
+ int dest_top = 0;
if (!pBitmap->GetOverlapRect(dest_left, dest_top, width, height,
pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(),
src_left, src_top, nullptr)) {
return;
}
- int Bpp = pBitmap->GetBPP() / 8;
- FXDIB_Format dest_format = pBitmap->GetFormat();
- FXDIB_Format src_format = pSrcBitmap->GetFormat();
- int pitch = pBitmap->GetPitch();
- uint8_t* buffer = pBitmap->GetBuffer().data();
+ const int Bpp = pBitmap->GetBPP() / 8;
+ const FXDIB_Format dest_format = pBitmap->GetFormat();
+ const FXDIB_Format src_format = pSrcBitmap->GetFormat();
+ const int dest_pitch = pBitmap->GetPitch();
+
+ const size_t dest_x_offset = Fx2DSizeOrDie(dest_left, Bpp);
+ const size_t dest_y_offset = Fx2DSizeOrDie(dest_top, dest_pitch);
+
+ uint8_t* dest_buf =
+ pBitmap->GetBuffer().subspan(dest_y_offset).subspan(dest_x_offset).data();
if (dest_format == src_format) {
+ const size_t src_x_offset = Fx2DSizeOrDie(src_left, Bpp);
for (int row = 0; row < height; row++) {
- uint8_t* dest_scan = buffer + (dest_top + row) * pitch + dest_left * Bpp;
+ uint8_t* dest_scan = dest_buf;
const uint8_t* src_scan =
- pSrcBitmap->GetScanline(src_top + row).subspan(src_left * Bpp).data();
+ pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
if (Bpp == 4) {
for (int col = 0; col < width; col++) {
- FXARGB_SETDIB(dest_scan, ArgbEncode(src_scan[3], src_scan[0],
- src_scan[1], src_scan[2]));
+ FXARGB_SETRGBORDERDIB(dest_scan,
+ *reinterpret_cast<const uint32_t*>(src_scan));
dest_scan += 4;
src_scan += 4;
}
@@ -125,64 +131,64 @@
src_scan += 3;
}
}
+ dest_buf += dest_pitch;
}
return;
}
- uint8_t* dest_buf = buffer + dest_top * pitch + dest_left * Bpp;
if (dest_format == FXDIB_Format::kRgb) {
- if (src_format == FXDIB_Format::kRgb32) {
- for (int row = 0; row < height; row++) {
- uint8_t* dest_scan = dest_buf + row * pitch;
- const uint8_t* src_scan =
- pSrcBitmap->GetScanline(src_top + row).subspan(src_left * 4).data();
- for (int col = 0; col < width; col++) {
- *dest_scan++ = src_scan[2];
- *dest_scan++ = src_scan[1];
- *dest_scan++ = src_scan[0];
- src_scan += 4;
- }
+ DCHECK_EQ(src_format, FXDIB_Format::kRgb32);
+ const size_t src_x_offset = Fx2DSizeOrDie(src_left, 4);
+ for (int row = 0; row < height; row++) {
+ uint8_t* dest_scan = dest_buf;
+ const uint8_t* src_scan =
+ pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
+ for (int col = 0; col < width; col++) {
+ *dest_scan++ = src_scan[2];
+ *dest_scan++ = src_scan[1];
+ *dest_scan++ = src_scan[0];
+ src_scan += 4;
}
- } else {
- NOTREACHED();
+ dest_buf += dest_pitch;
}
return;
}
- if (dest_format == FXDIB_Format::kArgb ||
- dest_format == FXDIB_Format::kRgb32) {
- if (src_format == FXDIB_Format::kRgb) {
- for (int row = 0; row < height; row++) {
- uint8_t* dest_scan = (uint8_t*)(dest_buf + row * pitch);
- const uint8_t* src_scan =
- pSrcBitmap->GetScanline(src_top + row).subspan(src_left * 3).data();
- for (int col = 0; col < width; col++) {
- FXARGB_SETDIB(dest_scan, ArgbEncode(0xff, src_scan[0], src_scan[1],
- src_scan[2]));
- dest_scan += 4;
- src_scan += 3;
- }
+ DCHECK(dest_format == FXDIB_Format::kArgb ||
+ dest_format == FXDIB_Format::kRgb32);
+ if (src_format == FXDIB_Format::kRgb) {
+ const size_t src_x_offset = Fx2DSizeOrDie(src_left, 3);
+ for (int row = 0; row < height; row++) {
+ uint8_t* dest_scan = dest_buf;
+ const uint8_t* src_scan =
+ pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
+ for (int col = 0; col < width; col++) {
+ FXARGB_SETDIB(dest_scan,
+ ArgbEncode(0xff, src_scan[0], src_scan[1], src_scan[2]));
+ dest_scan += 4;
+ src_scan += 3;
}
- } else if (src_format == FXDIB_Format::kRgb32) {
- DCHECK_EQ(dest_format, FXDIB_Format::kArgb);
- for (int row = 0; row < height; row++) {
- uint8_t* dest_scan = dest_buf + row * pitch;
- const uint8_t* src_scan =
- pSrcBitmap->GetScanline(src_top + row).subspan(src_left * 4).data();
- for (int col = 0; col < width; col++) {
- FXARGB_SETDIB(dest_scan, ArgbEncode(0xff, src_scan[0], src_scan[1],
- src_scan[2]));
- src_scan += 4;
- dest_scan += 4;
- }
- }
+ dest_buf += dest_pitch;
}
return;
}
-
- NOTREACHED();
+ if (src_format != FXDIB_Format::kRgb32)
+ return;
+ DCHECK_EQ(dest_format, FXDIB_Format::kArgb);
+ const size_t src_x_offset = Fx2DSizeOrDie(src_left, 4);
+ for (int row = 0; row < height; row++) {
+ uint8_t* dest_scan = dest_buf;
+ const uint8_t* src_scan =
+ pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
+ for (int col = 0; col < width; col++) {
+ FXARGB_SETDIB(dest_scan,
+ ArgbEncode(0xff, src_scan[0], src_scan[1], src_scan[2]));
+ src_scan += 4;
+ dest_scan += 4;
+ }
+ dest_buf += dest_pitch;
+ }
}
-
#endif // defined(_SKIA_SUPPORT_PATHS_)
#define SHOW_SKIA_PATH 0 // set to 1 to print the path contents
@@ -2516,8 +2522,8 @@
left = std::min(left, 0);
top = std::min(top, 0);
if (m_bRgbByteOrder) {
- RgbByteOrderTransferBitmap(pBitmap, 0, 0, rect.Width(), rect.Height(),
- pBack, left, top);
+ RgbByteOrderTransferBitmap(pBitmap, rect.Width(), rect.Height(), pBack,
+ left, top);
} else {
bRet = pBitmap->TransferBitmap(0, 0, rect.Width(), rect.Height(), pBack,
left, top);