Chromium Code Reviews| 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 bda5ee53031dd02b1cb4199fd18d12ce804cebb6..c0e37636fb00fe9f2ce0c144d839639443e9aea0 100644 |
| --- a/core/fxge/dib/fx_dib_main.cpp |
| +++ b/core/fxge/dib/fx_dib_main.cpp |
| @@ -18,32 +18,33 @@ void CmykDecode(uint32_t cmyk, int& c, int& m, int& y, int& k) { |
| y = FXSYS_GetYValue(cmyk); |
| k = FXSYS_GetKValue(cmyk); |
| } |
| + |
| void ArgbDecode(uint32_t argb, int& a, int& r, int& g, int& b) { |
| a = FXARGB_A(argb); |
| r = FXARGB_R(argb); |
| g = FXARGB_G(argb); |
| b = FXARGB_B(argb); |
| } |
| + |
| void ArgbDecode(uint32_t argb, int& a, FX_COLORREF& rgb) { |
| a = FXARGB_A(argb); |
| rgb = FXSYS_RGB(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb)); |
| } |
| + |
| uint32_t ArgbEncode(int a, FX_COLORREF rgb) { |
| return FXARGB_MAKE(a, FXSYS_GetRValue(rgb), FXSYS_GetGValue(rgb), |
| FXSYS_GetBValue(rgb)); |
| } |
| -CFX_DIBSource::CFX_DIBSource() { |
| - m_bpp = 0; |
| - m_AlphaFlag = 0; |
| - m_Width = m_Height = 0; |
| - m_Pitch = 0; |
| - m_pPalette = nullptr; |
| - m_pAlphaMask = nullptr; |
| -} |
| +CFX_DIBSource::CFX_DIBSource() |
| + : m_pAlphaMask(nullptr), |
| + m_Width(0), |
| + m_Height(0), |
| + m_bpp(0), |
| + m_AlphaFlag(0), |
| + m_Pitch(0) {} |
| CFX_DIBSource::~CFX_DIBSource() { |
| - FX_Free(m_pPalette); |
| delete m_pAlphaMask; |
| } |
| @@ -150,13 +151,11 @@ void CFX_DIBitmap::TakeOver(CFX_DIBitmap* pSrcBitmap) { |
| if (!m_bExtBuf) |
| FX_Free(m_pBuffer); |
| - FX_Free(m_pPalette); |
| delete m_pAlphaMask; |
| m_pBuffer = pSrcBitmap->m_pBuffer; |
| - m_pPalette = pSrcBitmap->m_pPalette; |
| + m_pPalette = std::move(pSrcBitmap->m_pPalette); |
| m_pAlphaMask = pSrcBitmap->m_pAlphaMask; |
| pSrcBitmap->m_pBuffer = nullptr; |
| - pSrcBitmap->m_pPalette = nullptr; |
| pSrcBitmap->m_pAlphaMask = nullptr; |
| m_bpp = pSrcBitmap->m_bpp; |
| m_bExtBuf = pSrcBitmap->m_bExtBuf; |
| @@ -174,12 +173,11 @@ CFX_DIBitmap* CFX_DIBSource::Clone(const FX_RECT* pClip) const { |
| return nullptr; |
| } |
| } |
| - CFX_DIBitmap* pNewBitmap = new CFX_DIBitmap; |
| - if (!pNewBitmap->Create(rect.Width(), rect.Height(), GetFormat())) { |
| - delete pNewBitmap; |
| + std::unique_ptr<CFX_DIBitmap> pNewBitmap(new CFX_DIBitmap); |
| + if (!pNewBitmap->Create(rect.Width(), rect.Height(), GetFormat())) |
| return nullptr; |
| - } |
| - pNewBitmap->CopyPalette(m_pPalette); |
| + |
| + pNewBitmap->CopyPalette(m_pPalette.get()); |
| pNewBitmap->CopyAlphaMask(m_pAlphaMask, pClip); |
| if (GetBPP() == 1 && rect.left % 8 != 0) { |
| int left_shift = rect.left % 32; |
| @@ -204,34 +202,36 @@ CFX_DIBitmap* CFX_DIBSource::Clone(const FX_RECT* pClip) const { |
| FXSYS_memcpy(dest_scan, src_scan, copy_len); |
| } |
| } |
| - return pNewBitmap; |
| + return pNewBitmap.release(); |
| } |
| + |
| void CFX_DIBSource::BuildPalette() { |
| if (m_pPalette) { |
| return; |
| } |
| if (GetBPP() == 1) { |
| - m_pPalette = FX_Alloc(uint32_t, 2); |
| + m_pPalette.reset(FX_Alloc(uint32_t, 2)); |
| if (IsCmykImage()) { |
| - m_pPalette[0] = 0xff; |
| - m_pPalette[1] = 0; |
| + m_pPalette.get()[0] = 0xff; |
| + m_pPalette.get()[1] = 0; |
| } else { |
| - m_pPalette[0] = 0xff000000; |
| - m_pPalette[1] = 0xffffffff; |
| + m_pPalette.get()[0] = 0xff000000; |
| + m_pPalette.get()[1] = 0xffffffff; |
| } |
| } else if (GetBPP() == 8) { |
| - m_pPalette = FX_Alloc(uint32_t, 256); |
| + m_pPalette.reset(FX_Alloc(uint32_t, 256)); |
| if (IsCmykImage()) { |
| for (int i = 0; i < 256; i++) { |
| - m_pPalette[i] = 0xff - i; |
| + m_pPalette.get()[i] = 0xff - i; |
| } |
| } else { |
| for (int i = 0; i < 256; i++) { |
| - m_pPalette[i] = 0xff000000 | (i * 0x10101); |
| + m_pPalette.get()[i] = 0xff000000 | (i * 0x10101); |
| } |
| } |
| } |
| } |
| + |
| FX_BOOL CFX_DIBSource::BuildAlphaMask() { |
| if (m_pAlphaMask) { |
| return TRUE; |
| @@ -246,10 +246,11 @@ FX_BOOL CFX_DIBSource::BuildAlphaMask() { |
| m_pAlphaMask->GetHeight() * m_pAlphaMask->GetPitch()); |
| return TRUE; |
| } |
| + |
| uint32_t CFX_DIBSource::GetPaletteEntry(int index) const { |
| ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask()); |
| if (m_pPalette) { |
| - return m_pPalette[index]; |
| + return m_pPalette.get()[index]; |
| } |
| if (IsCmykImage()) { |
| if (GetBPP() == 1) { |
| @@ -262,13 +263,15 @@ uint32_t CFX_DIBSource::GetPaletteEntry(int index) const { |
| } |
| return index * 0x10101 | 0xff000000; |
| } |
| + |
| void CFX_DIBSource::SetPaletteEntry(int index, uint32_t color) { |
| ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask()); |
| if (!m_pPalette) { |
| BuildPalette(); |
| } |
| - m_pPalette[index] = color; |
| + m_pPalette.get()[index] = color; |
| } |
| + |
| int CFX_DIBSource::FindPalette(uint32_t color) const { |
| ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask()); |
| if (!m_pPalette) { |
| @@ -285,11 +288,12 @@ int CFX_DIBSource::FindPalette(uint32_t color) const { |
| } |
| int palsize = (1 << GetBPP()); |
| for (int i = 0; i < palsize; i++) |
| - if (m_pPalette[i] == color) { |
| + if (m_pPalette.get()[i] == color) { |
| return i; |
| } |
| return -1; |
| } |
| + |
| void CFX_DIBitmap::Clear(uint32_t color) { |
| if (!m_pBuffer) { |
| return; |
| @@ -351,6 +355,7 @@ void CFX_DIBitmap::Clear(uint32_t color) { |
| break; |
| } |
| } |
| + |
| void CFX_DIBSource::GetOverlapRect(int& dest_left, |
| int& dest_top, |
| int& width, |
| @@ -441,9 +446,9 @@ FX_BOOL CFX_DIBitmap::TransferBitmap(int dest_left, |
| uint8_t* dest_buf = |
| m_pBuffer + dest_top * m_Pitch + dest_left * GetBPP() / 8; |
| - uint32_t* d_plt = nullptr; |
| + std::unique_ptr<uint32_t, FxFreeDeleter> d_plt; |
| if (!ConvertBuffer(dest_format, dest_buf, m_Pitch, width, height, |
| - pSrcBitmap, src_left, src_top, d_plt)) { |
| + pSrcBitmap, src_left, src_top, &d_plt)) { |
| return FALSE; |
| } |
| } |
| @@ -559,33 +564,34 @@ FX_BOOL CFX_DIBitmap::TransferMask(int dest_left, |
| } |
| return TRUE; |
| } |
| -void CFX_DIBSource::CopyPalette(const uint32_t* pSrc, uint32_t size) { |
| + |
| +void CFX_DIBSource::CopyPalette(const uint32_t* pSrc) { |
| + static const uint32_t kPaletteSize = 256; |
| + |
| if (!pSrc || GetBPP() > 8) { |
| - FX_Free(m_pPalette); |
| - m_pPalette = nullptr; |
| + m_pPalette.reset(); |
| } else { |
| uint32_t pal_size = 1 << GetBPP(); |
| - if (!m_pPalette) { |
| - m_pPalette = FX_Alloc(uint32_t, pal_size); |
| - } |
| - if (pal_size > size) { |
| - pal_size = size; |
| - } |
| - FXSYS_memcpy(m_pPalette, pSrc, pal_size * sizeof(uint32_t)); |
| + if (!m_pPalette) |
| + m_pPalette.reset(FX_Alloc(uint32_t, pal_size)); |
| + if (pal_size > kPaletteSize) |
|
Lei Zhang
2016/07/18 23:55:10
pal_size = std::min(pal_size, kPalletSize);
Wei Li
2016/07/19 21:21:29
Done.
|
| + pal_size = kPaletteSize; |
| + FXSYS_memcpy(m_pPalette.get(), pSrc, pal_size * sizeof(uint32_t)); |
| } |
| } |
| + |
| void CFX_DIBSource::GetPalette(uint32_t* pal, int alpha) const { |
| ASSERT(GetBPP() <= 8 && !IsCmykImage()); |
| if (GetBPP() == 1) { |
| - pal[0] = |
| - ((m_pPalette ? m_pPalette[0] : 0xff000000) & 0xffffff) | (alpha << 24); |
| - pal[1] = |
| - ((m_pPalette ? m_pPalette[1] : 0xffffffff) & 0xffffff) | (alpha << 24); |
| + pal[0] = ((m_pPalette ? m_pPalette.get()[0] : 0xff000000) & 0xffffff) | |
| + (alpha << 24); |
| + pal[1] = ((m_pPalette ? m_pPalette.get()[1] : 0xffffffff) & 0xffffff) | |
| + (alpha << 24); |
| return; |
| } |
| if (m_pPalette) { |
| for (int i = 0; i < 256; i++) { |
| - pal[i] = (m_pPalette[i] & 0x00ffffff) | (alpha << 24); |
| + pal[i] = (m_pPalette.get()[i] & 0x00ffffff) | (alpha << 24); |
| } |
| } else { |
| for (int i = 0; i < 256; i++) { |
| @@ -644,6 +650,7 @@ FX_BOOL CFX_DIBSource::CopyAlphaMask(const CFX_DIBSource* pAlphaMask, |
| } |
| return TRUE; |
| } |
| + |
| const int g_ChannelOffset[] = {0, 2, 1, 0, 0, 1, 2, 3, 3}; |
| FX_BOOL CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, |
| const CFX_DIBSource* pSrcBitmap, |
| @@ -923,9 +930,9 @@ FX_BOOL CFX_DIBitmap::GetGrayData(void* pIccTransform) { |
| } |
| uint8_t gray[2]; |
| for (int i = 0; i < 2; i++) { |
| - int r = (uint8_t)(m_pPalette[i] >> 16); |
| - int g = (uint8_t)(m_pPalette[i] >> 8); |
| - int b = (uint8_t)m_pPalette[i]; |
| + int r = (uint8_t)(m_pPalette.get()[i] >> 16); |
|
Lei Zhang
2016/07/18 23:55:10
get rid of the C-style cast while we are here?
Wei Li
2016/07/19 21:21:29
Done.
|
| + int g = (uint8_t)(m_pPalette.get()[i] >> 8); |
| + int b = (uint8_t)m_pPalette.get()[i]; |
| gray[i] = (uint8_t)FXRGB2GRAY(r, g, b); |
| } |
| CFX_DIBitmap* pMask = new CFX_DIBitmap; |
| @@ -954,9 +961,9 @@ FX_BOOL CFX_DIBitmap::GetGrayData(void* pIccTransform) { |
| } |
| uint8_t gray[256]; |
| for (int i = 0; i < 256; i++) { |
| - int r = (uint8_t)(m_pPalette[i] >> 16); |
| - int g = (uint8_t)(m_pPalette[i] >> 8); |
| - int b = (uint8_t)m_pPalette[i]; |
| + int r = (uint8_t)(m_pPalette.get()[i] >> 16); |
|
Lei Zhang
2016/07/18 23:55:10
Ditto
Wei Li
2016/07/19 21:21:29
Done.
|
| + int g = (uint8_t)(m_pPalette.get()[i] >> 8); |
| + int b = (uint8_t)m_pPalette.get()[i]; |
| gray[i] = (uint8_t)FXRGB2GRAY(r, g, b); |
| } |
| CFX_DIBitmap* pMask = new CFX_DIBitmap; |
| @@ -1064,6 +1071,7 @@ FX_BOOL CFX_DIBitmap::MultiplyAlpha(int alpha) { |
| } |
| return TRUE; |
| } |
| + |
| uint32_t CFX_DIBitmap::GetPixel(int x, int y) const { |
| if (!m_pBuffer) { |
| return 0; |
| @@ -1078,14 +1086,15 @@ uint32_t CFX_DIBitmap::GetPixel(int x, int y) const { |
| } |
| case FXDIB_1bppRgb: { |
| if ((*pos) & (1 << (7 - x % 8))) { |
| - return m_pPalette ? m_pPalette[1] : 0xffffffff; |
| + return m_pPalette ? m_pPalette.get()[1] : 0xffffffff; |
| } |
| - return m_pPalette ? m_pPalette[0] : 0xff000000; |
| + return m_pPalette ? m_pPalette.get()[0] : 0xff000000; |
| } |
| case FXDIB_8bppMask: |
| return (*pos) << 24; |
| case FXDIB_8bppRgb: |
| - return m_pPalette ? m_pPalette[*pos] : (0xff000000 | ((*pos) * 0x10101)); |
| + return m_pPalette ? m_pPalette.get()[*pos] |
| + : (0xff000000 | ((*pos) * 0x10101)); |
| case FXDIB_Rgb: |
| case FXDIB_Rgba: |
| case FXDIB_Rgb32: |
| @@ -1097,6 +1106,7 @@ uint32_t CFX_DIBitmap::GetPixel(int x, int y) const { |
| } |
| return 0; |
| } |
| + |
| void CFX_DIBitmap::SetPixel(int x, int y, uint32_t color) { |
| if (!m_pBuffer) { |
| return; |
| @@ -1115,7 +1125,7 @@ void CFX_DIBitmap::SetPixel(int x, int y, uint32_t color) { |
| break; |
| case FXDIB_1bppRgb: |
| if (m_pPalette) { |
| - if (color == m_pPalette[1]) { |
| + if (color == m_pPalette.get()[1]) { |
| *pos |= 1 << (7 - x % 8); |
| } else { |
| *pos &= ~(1 << (7 - x % 8)); |
| @@ -1134,7 +1144,7 @@ void CFX_DIBitmap::SetPixel(int x, int y, uint32_t color) { |
| case FXDIB_8bppRgb: { |
| if (m_pPalette) { |
| for (int i = 0; i < 256; i++) { |
| - if (m_pPalette[i] == color) { |
| + if (m_pPalette.get()[i] == color) { |
| *pos = (uint8_t)i; |
| return; |
| } |
| @@ -1166,6 +1176,7 @@ void CFX_DIBitmap::SetPixel(int x, int y, uint32_t color) { |
| break; |
| } |
| } |
| + |
| void CFX_DIBitmap::DownSampleScanline(int line, |
| uint8_t* dest_scan, |
| int dest_bpp, |
| @@ -1200,13 +1211,13 @@ void CFX_DIBitmap::DownSampleScanline(int line, |
| if (m_pPalette) { |
| if (!IsCmykImage()) { |
| dest_pos *= 3; |
| - FX_ARGB argb = m_pPalette[scanline[src_x]]; |
| + FX_ARGB argb = m_pPalette.get()[scanline[src_x]]; |
| dest_scan[dest_pos] = FXARGB_B(argb); |
| dest_scan[dest_pos + 1] = FXARGB_G(argb); |
| dest_scan[dest_pos + 2] = FXARGB_R(argb); |
| } else { |
| dest_pos *= 4; |
| - FX_CMYK cmyk = m_pPalette[scanline[src_x]]; |
| + FX_CMYK cmyk = m_pPalette.get()[scanline[src_x]]; |
| dest_scan[dest_pos] = FXSYS_GetCValue(cmyk); |
| dest_scan[dest_pos + 1] = FXSYS_GetMValue(cmyk); |
| dest_scan[dest_pos + 2] = FXSYS_GetYValue(cmyk); |
| @@ -1288,22 +1299,23 @@ FX_BOOL CFX_DIBitmap::ConvertColorScale(uint32_t forecolor, |
| if (isCmykImage) { |
| for (int i = 0; i < size; i++) { |
| uint8_t b, g, r; |
| - AdobeCMYK_to_sRGB1(FXSYS_GetCValue(m_pPalette[i]), |
| - FXSYS_GetMValue(m_pPalette[i]), |
| - FXSYS_GetYValue(m_pPalette[i]), |
| - FXSYS_GetKValue(m_pPalette[i]), r, g, b); |
| + AdobeCMYK_to_sRGB1(FXSYS_GetCValue(m_pPalette.get()[i]), |
| + FXSYS_GetMValue(m_pPalette.get()[i]), |
| + FXSYS_GetYValue(m_pPalette.get()[i]), |
| + FXSYS_GetKValue(m_pPalette.get()[i]), r, g, b); |
| int gray = 255 - FXRGB2GRAY(r, g, b); |
| - m_pPalette[i] = CmykEncode( |
| + m_pPalette.get()[i] = CmykEncode( |
| bc + (fc - bc) * gray / 255, bm + (fm - bm) * gray / 255, |
| by + (fy - by) * gray / 255, bk + (fk - bk) * gray / 255); |
| } |
| } else { |
| for (int i = 0; i < size; i++) { |
| - int gray = FXRGB2GRAY(FXARGB_R(m_pPalette[i]), FXARGB_G(m_pPalette[i]), |
| - FXARGB_B(m_pPalette[i])); |
| - m_pPalette[i] = FXARGB_MAKE(0xff, br + (fr - br) * gray / 255, |
| - bg + (fg - bg) * gray / 255, |
| - bb + (fb - bb) * gray / 255); |
| + int gray = FXRGB2GRAY(FXARGB_R(m_pPalette.get()[i]), |
| + FXARGB_G(m_pPalette.get()[i]), |
| + FXARGB_B(m_pPalette.get()[i])); |
| + m_pPalette.get()[i] = FXARGB_MAKE(0xff, br + (fr - br) * gray / 255, |
| + bg + (fg - bg) * gray / 255, |
| + bb + (fb - bb) * gray / 255); |
| } |
| } |
| return TRUE; |
| @@ -1374,7 +1386,7 @@ CFX_DIBitmap* CFX_DIBSource::FlipImage(FX_BOOL bXFlip, FX_BOOL bYFlip) const { |
| delete pFlipped; |
| return nullptr; |
| } |
| - pFlipped->CopyPalette(m_pPalette); |
| + pFlipped->CopyPalette(m_pPalette.get()); |
| uint8_t* pDestBuffer = pFlipped->GetBuffer(); |
| int Bpp = m_bpp / 8; |
| for (int row = 0; row < m_Height; row++) { |
| @@ -1458,16 +1470,19 @@ CFX_DIBExtractor::CFX_DIBExtractor(const CFX_DIBSource* pSrc) { |
| CFX_DIBExtractor::~CFX_DIBExtractor() { |
| delete m_pBitmap; |
| } |
| + |
| CFX_FilteredDIB::CFX_FilteredDIB() { |
| m_pScanline = nullptr; |
| m_pSrc = nullptr; |
| } |
| + |
| CFX_FilteredDIB::~CFX_FilteredDIB() { |
| if (m_bAutoDropSrc) { |
| delete m_pSrc; |
| } |
| FX_Free(m_pScanline); |
| } |
| + |
| void CFX_FilteredDIB::LoadSrc(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc) { |
| m_pSrc = pSrc; |
| m_bAutoDropSrc = bAutoDropSrc; |
| @@ -1477,13 +1492,15 @@ void CFX_FilteredDIB::LoadSrc(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc) { |
| m_bpp = (uint8_t)format; |
| m_AlphaFlag = (uint8_t)(format >> 8); |
| m_Pitch = (m_Width * (format & 0xff) + 31) / 32 * 4; |
| - m_pPalette = GetDestPalette(); |
| + m_pPalette.reset(GetDestPalette()); |
| m_pScanline = FX_Alloc(uint8_t, m_Pitch); |
| } |
| + |
| const uint8_t* CFX_FilteredDIB::GetScanline(int line) const { |
| TranslateScanline(m_pScanline, m_pSrc->GetScanline(line)); |
| return m_pScanline; |
| } |
| + |
| void CFX_FilteredDIB::DownSampleScanline(int line, |
| uint8_t* dest_scan, |
| int dest_bpp, |
| @@ -1495,6 +1512,7 @@ void CFX_FilteredDIB::DownSampleScanline(int line, |
| clip_left, clip_width); |
| TranslateDownSamples(dest_scan, dest_scan, clip_width, dest_bpp); |
| } |
| + |
| CFX_ImageRenderer::CFX_ImageRenderer() { |
| m_Status = 0; |
| m_pTransformer = nullptr; |