Index: core/fxge/dib/fx_dib_main.cpp |
diff --git a/core/fxge/dib/fx_dib_main.cpp b/core/fxge/dib/fx_dib_main.cpp |
index 83899553a2bacdb98046b996d124557c33197495..310c62fcc568bc2e97af23cb34aad3e456a2cec0 100644 |
--- a/core/fxge/dib/fx_dib_main.cpp |
+++ b/core/fxge/dib/fx_dib_main.cpp |
@@ -13,6 +13,7 @@ |
#include <utility> |
#include "core/fxcodec/fx_codec.h" |
+#include "core/fxcrt/cfx_maybe_owned.h" |
#include "core/fxge/cfx_gemodule.h" |
#include "core/fxge/dib/dib_int.h" |
#include "core/fxge/ge/cfx_cliprgn.h" |
@@ -174,15 +175,14 @@ void CFX_DIBitmap::TakeOver(CFX_DIBitmap* pSrcBitmap) { |
m_Pitch = pSrcBitmap->m_Pitch; |
} |
-CFX_DIBitmap* CFX_DIBSource::Clone(const FX_RECT* pClip) const { |
+std::unique_ptr<CFX_DIBitmap> CFX_DIBSource::Clone(const FX_RECT* pClip) const { |
FX_RECT rect(0, 0, m_Width, m_Height); |
if (pClip) { |
rect.Intersect(*pClip); |
- if (rect.IsEmpty()) { |
+ if (rect.IsEmpty()) |
return nullptr; |
- } |
} |
- std::unique_ptr<CFX_DIBitmap> pNewBitmap(new CFX_DIBitmap); |
+ auto pNewBitmap = pdfium::MakeUnique<CFX_DIBitmap>(); |
if (!pNewBitmap->Create(rect.Width(), rect.Height(), GetFormat())) |
return nullptr; |
@@ -202,22 +202,22 @@ CFX_DIBitmap* CFX_DIBSource::Clone(const FX_RECT* pClip) const { |
} |
} else { |
int copy_len = (pNewBitmap->GetWidth() * pNewBitmap->GetBPP() + 7) / 8; |
- if (m_Pitch < (uint32_t)copy_len) { |
+ if (m_Pitch < (uint32_t)copy_len) |
copy_len = m_Pitch; |
- } |
+ |
for (int row = rect.top; row < rect.bottom; row++) { |
const uint8_t* src_scan = GetScanline(row) + rect.left * m_bpp / 8; |
uint8_t* dest_scan = (uint8_t*)pNewBitmap->GetScanline(row - rect.top); |
FXSYS_memcpy(dest_scan, src_scan, copy_len); |
} |
} |
- return pNewBitmap.release(); |
+ return pNewBitmap; |
} |
void CFX_DIBSource::BuildPalette() { |
- if (m_pPalette) { |
+ if (m_pPalette) |
return; |
- } |
+ |
if (GetBPP() == 1) { |
m_pPalette.reset(FX_Alloc(uint32_t, 2)); |
if (IsCmykImage()) { |
@@ -230,13 +230,11 @@ void CFX_DIBSource::BuildPalette() { |
} else if (GetBPP() == 8) { |
m_pPalette.reset(FX_Alloc(uint32_t, 256)); |
if (IsCmykImage()) { |
- for (int i = 0; i < 256; i++) { |
+ for (int i = 0; i < 256; i++) |
m_pPalette.get()[i] = 0xff - i; |
- } |
} else { |
- for (int i = 0; i < 256; i++) { |
+ for (int i = 0; i < 256; i++) |
m_pPalette.get()[i] = 0xff000000 | (i * 0x10101); |
- } |
} |
} |
} |
@@ -663,127 +661,92 @@ bool CFX_DIBSource::CopyAlphaMask(const CFX_DIBSource* pAlphaMask, |
const int g_ChannelOffset[] = {0, 2, 1, 0, 0, 1, 2, 3, 3}; |
bool CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, |
- const CFX_DIBSource* pSrcBitmap, |
+ CFX_DIBSource* pSrcBitmap, |
FXDIB_Channel srcChannel) { |
- if (!m_pBuffer) { |
+ if (!m_pBuffer) |
return false; |
- } |
- CFX_DIBSource* pSrcClone = (CFX_DIBSource*)pSrcBitmap; |
- CFX_DIBitmap* pDst = this; |
- int destOffset, srcOffset; |
+ |
+ CFX_MaybeOwned<CFX_DIBSource> pSrcClone(pSrcBitmap); |
+ int srcOffset; |
if (srcChannel == FXDIB_Alpha) { |
- if (!pSrcBitmap->HasAlpha() && !pSrcBitmap->IsAlphaMask()) { |
+ if (!pSrcBitmap->HasAlpha() && !pSrcBitmap->IsAlphaMask()) |
return false; |
- } |
+ |
if (pSrcBitmap->GetBPP() == 1) { |
pSrcClone = pSrcBitmap->CloneConvert(FXDIB_8bppMask); |
- if (!pSrcClone) { |
+ if (!pSrcClone) |
return false; |
- } |
- } |
- if (pSrcBitmap->GetFormat() == FXDIB_Argb) { |
- srcOffset = 3; |
- } else { |
- srcOffset = 0; |
} |
+ srcOffset = pSrcBitmap->GetFormat() == FXDIB_Argb ? 3 : 0; |
} else { |
- if (pSrcBitmap->IsAlphaMask()) { |
+ if (pSrcBitmap->IsAlphaMask()) |
return false; |
- } |
+ |
if (pSrcBitmap->GetBPP() < 24) { |
if (pSrcBitmap->IsCmykImage()) { |
- pSrcClone = pSrcBitmap->CloneConvert( |
- (FXDIB_Format)((pSrcBitmap->GetFormat() & 0xff00) | 0x20)); |
+ pSrcClone = pSrcBitmap->CloneConvert(static_cast<FXDIB_Format>( |
+ (pSrcBitmap->GetFormat() & 0xff00) | 0x20)); |
} else { |
- pSrcClone = pSrcBitmap->CloneConvert( |
- (FXDIB_Format)((pSrcBitmap->GetFormat() & 0xff00) | 0x18)); |
+ pSrcClone = pSrcBitmap->CloneConvert(static_cast<FXDIB_Format>( |
+ (pSrcBitmap->GetFormat() & 0xff00) | 0x18)); |
} |
- if (!pSrcClone) { |
+ if (!pSrcClone) |
return false; |
- } |
} |
srcOffset = g_ChannelOffset[srcChannel]; |
} |
+ int destOffset = 0; |
if (destChannel == FXDIB_Alpha) { |
if (IsAlphaMask()) { |
- if (!ConvertFormat(FXDIB_8bppMask)) { |
- if (pSrcClone != pSrcBitmap) { |
- delete pSrcClone; |
- } |
+ if (!ConvertFormat(FXDIB_8bppMask)) |
return false; |
- } |
- destOffset = 0; |
} else { |
- destOffset = 0; |
- if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) { |
- if (pSrcClone != pSrcBitmap) { |
- delete pSrcClone; |
- } |
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) |
return false; |
- } |
- if (GetFormat() == FXDIB_Argb) { |
+ |
+ if (GetFormat() == FXDIB_Argb) |
destOffset = 3; |
- } |
} |
} else { |
- if (IsAlphaMask()) { |
- if (pSrcClone != pSrcBitmap) { |
- delete pSrcClone; |
- } |
+ if (IsAlphaMask()) |
return false; |
- } |
+ |
if (GetBPP() < 24) { |
if (HasAlpha()) { |
- if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) { |
- if (pSrcClone != pSrcBitmap) { |
- delete pSrcClone; |
- } |
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) |
return false; |
- } |
#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ |
} else if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb32)) { |
#else |
} else if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb)) { |
#endif |
- if (pSrcClone != pSrcBitmap) { |
- delete pSrcClone; |
- } |
return false; |
} |
} |
destOffset = g_ChannelOffset[destChannel]; |
} |
if (srcChannel == FXDIB_Alpha && pSrcClone->m_pAlphaMask) { |
- CFX_DIBitmap* pAlphaMask = pSrcClone->m_pAlphaMask; |
+ CFX_MaybeOwned<CFX_DIBSource> pAlphaMask(pSrcClone->m_pAlphaMask); |
if (pSrcClone->GetWidth() != m_Width || |
pSrcClone->GetHeight() != m_Height) { |
if (pAlphaMask) { |
pAlphaMask = pAlphaMask->StretchTo(m_Width, m_Height); |
- if (!pAlphaMask) { |
- if (pSrcClone != pSrcBitmap) { |
- delete pSrcClone; |
- } |
+ if (!pAlphaMask) |
return false; |
- } |
} |
} |
- if (pSrcClone != pSrcBitmap) { |
- pSrcClone->m_pAlphaMask = nullptr; |
- delete pSrcClone; |
- } |
- pSrcClone = pAlphaMask; |
+ pSrcClone = std::move(pAlphaMask); |
srcOffset = 0; |
} else if (pSrcClone->GetWidth() != m_Width || |
pSrcClone->GetHeight() != m_Height) { |
- CFX_DIBitmap* pSrcMatched = pSrcClone->StretchTo(m_Width, m_Height); |
- if (pSrcClone != pSrcBitmap) { |
- delete pSrcClone; |
- } |
- if (!pSrcMatched) { |
+ std::unique_ptr<CFX_DIBitmap> pSrcMatched = |
+ pSrcClone->StretchTo(m_Width, m_Height); |
+ if (!pSrcMatched) |
return false; |
- } |
- pSrcClone = pSrcMatched; |
+ |
+ pSrcClone = std::move(pSrcMatched); |
} |
+ CFX_DIBitmap* pDst = this; |
if (destChannel == FXDIB_Alpha && m_pAlphaMask) { |
pDst = m_pAlphaMask; |
destOffset = 0; |
@@ -799,9 +762,6 @@ bool CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, |
src_pos += srcBytes; |
} |
} |
- if (pSrcClone != pSrcBitmap && pSrcClone != pSrcBitmap->m_pAlphaMask) { |
- delete pSrcClone; |
- } |
return true; |
} |
@@ -864,40 +824,36 @@ bool CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, int value) { |
return true; |
} |
-bool CFX_DIBitmap::MultiplyAlpha(const CFX_DIBSource* pSrcBitmap) { |
- if (!m_pBuffer) { |
+bool CFX_DIBitmap::MultiplyAlpha(CFX_DIBSource* pSrcBitmap) { |
+ if (!m_pBuffer) |
return false; |
- } |
+ |
ASSERT(pSrcBitmap->IsAlphaMask()); |
- if (!pSrcBitmap->IsAlphaMask()) { |
+ if (!pSrcBitmap->IsAlphaMask()) |
return false; |
- } |
- if (!IsAlphaMask() && !HasAlpha()) { |
+ |
+ if (!IsAlphaMask() && !HasAlpha()) |
return LoadChannel(FXDIB_Alpha, pSrcBitmap, FXDIB_Alpha); |
- } |
- CFX_DIBitmap* pSrcClone = (CFX_DIBitmap*)pSrcBitmap; |
+ |
+ CFX_MaybeOwned<CFX_DIBitmap> pSrcClone( |
+ static_cast<CFX_DIBitmap*>(pSrcBitmap)); |
if (pSrcBitmap->GetWidth() != m_Width || |
pSrcBitmap->GetHeight() != m_Height) { |
pSrcClone = pSrcBitmap->StretchTo(m_Width, m_Height); |
- if (!pSrcClone) { |
+ if (!pSrcClone) |
return false; |
- } |
} |
if (IsAlphaMask()) { |
- if (!ConvertFormat(FXDIB_8bppMask)) { |
- if (pSrcClone != pSrcBitmap) { |
- delete pSrcClone; |
- } |
+ if (!ConvertFormat(FXDIB_8bppMask)) |
return false; |
- } |
+ |
for (int row = 0; row < m_Height; row++) { |
uint8_t* dest_scan = m_pBuffer + m_Pitch * row; |
uint8_t* src_scan = pSrcClone->m_pBuffer + pSrcClone->m_Pitch * row; |
if (pSrcClone->GetBPP() == 1) { |
for (int col = 0; col < m_Width; col++) { |
- if (!((1 << (7 - col % 8)) & src_scan[col / 8])) { |
+ if (!((1 << (7 - col % 8)) & src_scan[col / 8])) |
dest_scan[col] = 0; |
- } |
} |
} else { |
for (int col = 0; col < m_Width; col++) { |
@@ -908,12 +864,9 @@ bool CFX_DIBitmap::MultiplyAlpha(const CFX_DIBSource* pSrcBitmap) { |
} |
} else { |
if (GetFormat() == FXDIB_Argb) { |
- if (pSrcClone->GetBPP() == 1) { |
- if (pSrcClone != pSrcBitmap) { |
- delete pSrcClone; |
- } |
+ if (pSrcClone->GetBPP() == 1) |
return false; |
- } |
+ |
for (int row = 0; row < m_Height; row++) { |
uint8_t* dest_scan = m_pBuffer + m_Pitch * row + 3; |
uint8_t* src_scan = pSrcClone->m_pBuffer + pSrcClone->m_Pitch * row; |
@@ -923,12 +876,9 @@ bool CFX_DIBitmap::MultiplyAlpha(const CFX_DIBSource* pSrcBitmap) { |
} |
} |
} else { |
- m_pAlphaMask->MultiplyAlpha(pSrcClone); |
+ m_pAlphaMask->MultiplyAlpha(pSrcClone.Get()); |
} |
} |
- if (pSrcClone != pSrcBitmap) { |
- delete pSrcClone; |
- } |
return true; |
} |
@@ -1476,7 +1426,7 @@ CFX_DIBExtractor::CFX_DIBExtractor(const CFX_DIBSource* pSrc) { |
m_pBitmap->CopyPalette(pSrc->GetPalette()); |
m_pBitmap->CopyAlphaMask(pSrc->m_pAlphaMask); |
} else { |
- m_pBitmap.reset(pSrc->Clone()); |
+ m_pBitmap = pSrc->Clone(); |
} |
} |