diff options
Diffstat (limited to 'core/fxge/dib')
-rw-r--r-- | core/fxge/dib/cstretchengine.cpp | 121 | ||||
-rw-r--r-- | core/fxge/dib/cstretchengine.h | 48 |
2 files changed, 89 insertions, 80 deletions
diff --git a/core/fxge/dib/cstretchengine.cpp b/core/fxge/dib/cstretchengine.cpp index 2915202daf..b7aa672a46 100644 --- a/core/fxge/dib/cstretchengine.cpp +++ b/core/fxge/dib/cstretchengine.cpp @@ -19,6 +19,10 @@ namespace { const int kMaxDestValue = 16711680; +int GetPitchRoundUpTo4Bytes(int bits_per_pixel) { + return (bits_per_pixel + 31) / 32 * 4; +} + } // namespace CStretchEngine::CWeightTable::CWeightTable() @@ -223,17 +227,19 @@ CStretchEngine::CStretchEngine(ScanlineComposerIface* pDestBitmap, int dest_height, const FX_RECT& clip_rect, const RetainPtr<CFX_DIBSource>& pSrcBitmap, - int flags) { - m_State = 0; - m_DestFormat = dest_format; - m_DestBpp = dest_format & 0xff; - m_SrcBpp = pSrcBitmap->GetFormat() & 0xff; - m_bHasAlpha = pSrcBitmap->GetFormat() & 0x200; - m_pSrcPalette = pSrcBitmap->GetPalette(); - m_pDestBitmap = pDestBitmap; - m_DestWidth = dest_width; - m_DestHeight = dest_height; - m_DestClip = clip_rect; + int flags) + : m_DestFormat(dest_format), + m_DestBpp(dest_format & 0xff), + m_SrcBpp(pSrcBitmap->GetFormat() & 0xff), + m_bHasAlpha(pSrcBitmap->GetFormat() & 0x200), + m_pSource(pSrcBitmap), + m_pSrcPalette(pSrcBitmap->GetPalette()), + m_SrcWidth(pSrcBitmap->GetWidth()), + m_SrcHeight(pSrcBitmap->GetHeight()), + m_pDestBitmap(pDestBitmap), + m_DestWidth(dest_width), + m_DestHeight(dest_height), + m_DestClip(clip_rect) { uint32_t size = clip_rect.Width(); if (size && m_DestBpp > static_cast<int>(INT_MAX / size)) return; @@ -242,17 +248,12 @@ CStretchEngine::CStretchEngine(ScanlineComposerIface* pDestBitmap, if (size > INT_MAX - 31) return; - size += 31; - size = size / 32 * 4; + size = GetPitchRoundUpTo4Bytes(size); m_DestScanline.resize(size); if (dest_format == FXDIB_Rgb32) std::fill(m_DestScanline.begin(), m_DestScanline.end(), 255); - m_InterPitch = (m_DestClip.Width() * m_DestBpp + 31) / 32 * 4; - m_ExtraMaskPitch = (m_DestClip.Width() * 8 + 31) / 32 * 4; - m_pSource = pSrcBitmap; - m_SrcWidth = pSrcBitmap->GetWidth(); - m_SrcHeight = pSrcBitmap->GetHeight(); - m_SrcPitch = (m_SrcWidth * m_SrcBpp + 31) / 32 * 4; + m_InterPitch = GetPitchRoundUpTo4Bytes(m_DestClip.Width() * m_DestBpp); + m_ExtraMaskPitch = GetPitchRoundUpTo4Bytes(m_DestClip.Width() * 8); if ((flags & FXDIB_NOSMOOTH) == 0) { bool bInterpol = flags & FXDIB_INTERPOL || flags & FXDIB_BICUBIC_INTERPOL; if (!bInterpol && abs(dest_width) != 0 && @@ -284,39 +285,36 @@ CStretchEngine::CStretchEngine(ScanlineComposerIface* pDestBitmap, m_SrcClip.bottom = static_cast<int>(ceil(src_bottom)); FX_RECT src_rect(0, 0, m_SrcWidth, m_SrcHeight); m_SrcClip.Intersect(src_rect); - if (m_SrcBpp == 1) { - if (m_DestBpp == 8) - m_TransMethod = 1; - else - m_TransMethod = 2; - } else if (m_SrcBpp == 8) { - if (m_DestBpp == 8) { - if (!m_bHasAlpha) - m_TransMethod = 3; - else - m_TransMethod = 4; - } else { - if (!m_bHasAlpha) - m_TransMethod = 5; - else - m_TransMethod = 6; - } - } else { - if (!m_bHasAlpha) - m_TransMethod = 7; - else - m_TransMethod = 8; + + switch (m_SrcBpp) { + case 1: + m_TransMethod = m_DestBpp == 8 ? TransformMethod::k1BppTo8Bpp + : TransformMethod::k1BppToManyBpp; + break; + case 8: + if (m_DestBpp == 8) { + m_TransMethod = m_bHasAlpha ? TransformMethod::k8BppTo8BppWithAlpha + : TransformMethod::k8BppTo8Bpp; + } else { + m_TransMethod = m_bHasAlpha ? TransformMethod::k8BppToManyBppWithAlpha + : TransformMethod::k8BppToManyBpp; + } + break; + default: + m_TransMethod = m_bHasAlpha ? TransformMethod::kManyBpptoManyBppWithAlpha + : TransformMethod::kManyBpptoManyBpp; + break; } } CStretchEngine::~CStretchEngine() {} bool CStretchEngine::Continue(PauseIndicatorIface* pPause) { - while (m_State == 1) { + while (m_State == State::kHorizontal) { if (ContinueStretchHorz(pPause)) return true; - m_State = 2; + m_State = State::kVertical; StretchVert(); } return false; @@ -334,8 +332,7 @@ bool CStretchEngine::StartStretchHorz() { m_InterBuf.resize(m_SrcClip.Height() * m_InterPitch); if (m_pSource && m_bHasAlpha && m_pSource->m_pAlphaMask) { m_ExtraAlphaBuf.resize(m_SrcClip.Height(), m_ExtraMaskPitch); - uint32_t size = (m_DestClip.Width() * 8 + 31) / 32 * 4; - m_DestMaskScanline.resize(size); + m_DestMaskScanline.resize(m_ExtraMaskPitch); } bool ret = m_WeightTable.Calc(m_DestWidth, m_DestClip.left, m_DestClip.right, @@ -344,7 +341,7 @@ bool CStretchEngine::StartStretchHorz() { return false; m_CurRow = m_SrcClip.top; - m_State = 1; + m_State = State::kHorizontal; return true; } @@ -377,8 +374,8 @@ bool CStretchEngine::ContinueStretchHorz(PauseIndicatorIface* pPause) { } // TODO(npm): reduce duplicated code here switch (m_TransMethod) { - case 1: - case 2: { + case TransformMethod::k1BppTo8Bpp: + case TransformMethod::k1BppToManyBpp: { for (int col = m_DestClip.left; col < m_DestClip.right; ++col) { PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col); int dest_a = 0; @@ -397,7 +394,7 @@ bool CStretchEngine::ContinueStretchHorz(PauseIndicatorIface* pPause) { } break; } - case 3: { + case TransformMethod::k8BppTo8Bpp: { for (int col = m_DestClip.left; col < m_DestClip.right; ++col) { PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col); int dest_a = 0; @@ -415,7 +412,7 @@ bool CStretchEngine::ContinueStretchHorz(PauseIndicatorIface* pPause) { } break; } - case 4: { + case TransformMethod::k8BppTo8BppWithAlpha: { for (int col = m_DestClip.left; col < m_DestClip.right; ++col) { PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col); int dest_a = 0; @@ -439,7 +436,7 @@ bool CStretchEngine::ContinueStretchHorz(PauseIndicatorIface* pPause) { } break; } - case 5: { + case TransformMethod::k8BppToManyBpp: { for (int col = m_DestClip.left; col < m_DestClip.right; ++col) { PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col); int dest_r_y = 0; @@ -473,7 +470,7 @@ bool CStretchEngine::ContinueStretchHorz(PauseIndicatorIface* pPause) { } break; } - case 6: { + case TransformMethod::k8BppToManyBppWithAlpha: { for (int col = m_DestClip.left; col < m_DestClip.right; ++col) { PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col); int dest_a = 0; @@ -512,7 +509,7 @@ bool CStretchEngine::ContinueStretchHorz(PauseIndicatorIface* pPause) { } break; } - case 7: { + case TransformMethod::kManyBpptoManyBpp: { for (int col = m_DestClip.left; col < m_DestClip.right; ++col) { PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col); int dest_r_y = 0; @@ -541,7 +538,7 @@ bool CStretchEngine::ContinueStretchHorz(PauseIndicatorIface* pPause) { } break; } - case 8: { + case TransformMethod::kManyBpptoManyBppWithAlpha: { for (int col = m_DestClip.left; col < m_DestClip.right; ++col) { PixelWeight* pWeights = m_WeightTable.GetPixelWeight(col); int dest_a = 0; @@ -604,9 +601,9 @@ void CStretchEngine::StretchVert() { unsigned char* dest_scan_mask = m_DestMaskScanline.data(); PixelWeight* pWeights = table.GetPixelWeight(row); switch (m_TransMethod) { - case 1: - case 2: - case 3: { + case TransformMethod::k1BppTo8Bpp: + 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; @@ -627,7 +624,7 @@ void CStretchEngine::StretchVert() { } break; } - case 4: { + 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; @@ -656,8 +653,8 @@ void CStretchEngine::StretchVert() { } break; } - case 5: - case 7: { + 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; @@ -688,8 +685,8 @@ void CStretchEngine::StretchVert() { } break; } - case 6: - case 8: { + 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; diff --git a/core/fxge/dib/cstretchengine.h b/core/fxge/dib/cstretchengine.h index 91530cc01f..fa298f5376 100644 --- a/core/fxge/dib/cstretchengine.h +++ b/core/fxge/dib/cstretchengine.h @@ -57,31 +57,43 @@ class CStretchEngine { size_t m_dwWeightTablesSize; }; - FXDIB_Format m_DestFormat; - int m_DestBpp; - int m_SrcBpp; - int m_bHasAlpha; - UnownedPtr<ScanlineComposerIface> m_pDestBitmap; - int m_DestWidth; - int m_DestHeight; - FX_RECT m_DestClip; + enum class State : uint8_t { kInitial, kHorizontal, kVertical }; + + enum class TransformMethod : uint8_t { + k1BppTo8Bpp, + k1BppToManyBpp, + k8BppTo8Bpp, + k8BppTo8BppWithAlpha, + k8BppToManyBpp, + k8BppToManyBppWithAlpha, + kManyBpptoManyBpp, + kManyBpptoManyBppWithAlpha + }; + + const FXDIB_Format m_DestFormat; + const int m_DestBpp; + const int m_SrcBpp; + const int m_bHasAlpha; + RetainPtr<CFX_DIBSource> const m_pSource; + const uint32_t* m_pSrcPalette; + const int m_SrcWidth; + const int m_SrcHeight; + UnownedPtr<ScanlineComposerIface> const m_pDestBitmap; + const int m_DestWidth; + const int m_DestHeight; + const FX_RECT m_DestClip; std::vector<uint8_t> m_DestScanline; std::vector<uint8_t> m_DestMaskScanline; + std::vector<uint8_t> m_InterBuf; + std::vector<uint8_t> m_ExtraAlphaBuf; FX_RECT m_SrcClip; - RetainPtr<CFX_DIBSource> m_pSource; - uint32_t* m_pSrcPalette; - int m_SrcWidth; - int m_SrcHeight; - int m_SrcPitch; int m_InterPitch; int m_ExtraMaskPitch; - std::vector<uint8_t> m_InterBuf; - std::vector<uint8_t> m_ExtraAlphaBuf; - int m_TransMethod; int m_Flags; - CWeightTable m_WeightTable; + TransformMethod m_TransMethod; + State m_State = State::kInitial; int m_CurRow; - int m_State; + CWeightTable m_WeightTable; }; #endif // CORE_FXGE_DIB_CSTRETCHENGINE_H_ |