summaryrefslogtreecommitdiff
path: root/core/fxge/win32
diff options
context:
space:
mode:
authorTom Sepez <tsepez@chromium.org>2018-04-12 19:45:45 +0000
committerChromium commit bot <commit-bot@chromium.org>2018-04-12 19:45:45 +0000
commit80a6cbe0a427e155de8555bc867af745d10f9777 (patch)
treef5a01546d4081a4c3618350f4b54d13690d30299 /core/fxge/win32
parent154e18f9a862975abecebe77b8f5fb418418d14c (diff)
downloadpdfium-80a6cbe0a427e155de8555bc867af745d10f9777.tar.xz
Return pdfium::span<char> from ByteString::GetBuffer().
Get bounds checking "for free". Change-Id: I7b14cacbc7130ced7b5cb1869b82c96ccff8e642 Reviewed-on: https://pdfium-review.googlesource.com/30451 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: dsinclair <dsinclair@chromium.org>
Diffstat (limited to 'core/fxge/win32')
-rw-r--r--core/fxge/win32/fx_win32_dib.cpp62
1 files changed, 33 insertions, 29 deletions
diff --git a/core/fxge/win32/fx_win32_dib.cpp b/core/fxge/win32/fx_win32_dib.cpp
index 452d033f64..b6bed7a987 100644
--- a/core/fxge/win32/fx_win32_dib.cpp
+++ b/core/fxge/win32/fx_win32_dib.cpp
@@ -13,39 +13,43 @@
ByteString CFX_WindowsDIB::GetBitmapInfo(
const RetainPtr<CFX_DIBitmap>& pBitmap) {
- ByteString result;
int len = sizeof(BITMAPINFOHEADER);
- if (pBitmap->GetBPP() == 1 || pBitmap->GetBPP() == 8) {
+ if (pBitmap->GetBPP() == 1 || pBitmap->GetBPP() == 8)
len += sizeof(DWORD) * (int)(1 << pBitmap->GetBPP());
- }
- BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)result.GetBuffer(len);
- memset(pbmih, 0, sizeof(BITMAPINFOHEADER));
- pbmih->biSize = sizeof(BITMAPINFOHEADER);
- pbmih->biBitCount = pBitmap->GetBPP();
- pbmih->biCompression = BI_RGB;
- pbmih->biHeight = -(int)pBitmap->GetHeight();
- pbmih->biPlanes = 1;
- pbmih->biWidth = pBitmap->GetWidth();
- if (pBitmap->GetBPP() == 8) {
- uint32_t* pPalette = (uint32_t*)(pbmih + 1);
- if (pBitmap->GetPalette()) {
- for (int i = 0; i < 256; i++) {
- pPalette[i] = pBitmap->GetPalette()[i];
- }
- } else {
- for (int i = 0; i < 256; i++) {
- pPalette[i] = i * 0x010101;
+
+ ByteString result;
+ {
+ // Span's lifetime must end before ReleaseBuffer() below.
+ pdfium::span<char> cspan = result.GetBuffer(len);
+ BITMAPINFOHEADER* pbmih = reinterpret_cast<BITMAPINFOHEADER*>(cspan.data());
+ memset(pbmih, 0, sizeof(BITMAPINFOHEADER));
+ pbmih->biSize = sizeof(BITMAPINFOHEADER);
+ pbmih->biBitCount = pBitmap->GetBPP();
+ pbmih->biCompression = BI_RGB;
+ pbmih->biHeight = -(int)pBitmap->GetHeight();
+ pbmih->biPlanes = 1;
+ pbmih->biWidth = pBitmap->GetWidth();
+ if (pBitmap->GetBPP() == 8) {
+ uint32_t* pPalette = (uint32_t*)(pbmih + 1);
+ if (pBitmap->GetPalette()) {
+ for (int i = 0; i < 256; i++) {
+ pPalette[i] = pBitmap->GetPalette()[i];
+ }
+ } else {
+ for (int i = 0; i < 256; i++) {
+ pPalette[i] = i * 0x010101;
+ }
}
}
- }
- if (pBitmap->GetBPP() == 1) {
- uint32_t* pPalette = (uint32_t*)(pbmih + 1);
- if (pBitmap->GetPalette()) {
- pPalette[0] = pBitmap->GetPalette()[0];
- pPalette[1] = pBitmap->GetPalette()[1];
- } else {
- pPalette[0] = 0;
- pPalette[1] = 0xffffff;
+ if (pBitmap->GetBPP() == 1) {
+ uint32_t* pPalette = (uint32_t*)(pbmih + 1);
+ if (pBitmap->GetPalette()) {
+ pPalette[0] = pBitmap->GetPalette()[0];
+ pPalette[1] = pBitmap->GetPalette()[1];
+ } else {
+ pPalette[0] = 0;
+ pPalette[1] = 0xffffff;
+ }
}
}
result.ReleaseBuffer(len);