vcl/headless/SvpGraphicsBackend.cxx | 84 ++++++++++++++++++++++++++++++++--- vcl/headless/svpgdi.cxx | 86 ------------------------------------ vcl/inc/headless/svpgdi.hxx | 9 --- 3 files changed, 77 insertions(+), 102 deletions(-)
New commits: commit 507ca0eb16707917eab3608674243ed0eeacda72 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Thu Dec 30 00:20:44 2021 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Wed Jan 5 04:36:27 2022 +0100 vcl: move drawAlphaBitmap to SvpGraphicsBackend Change-Id: I182d775318a9b43a5955a5868e78a4b09c4a74c6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127981 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/vcl/headless/SvpGraphicsBackend.cxx b/vcl/headless/SvpGraphicsBackend.cxx index c67f19d5665d..2ac40e8e7b20 100644 --- a/vcl/headless/SvpGraphicsBackend.cxx +++ b/vcl/headless/SvpGraphicsBackend.cxx @@ -394,7 +394,7 @@ void SvpGraphicsBackend::drawBitmap(const SalTwoRect& rPosAry, const SalBitmap& return; } -#if 0 // LO code is not yet bitmap32-ready. \ +#if 0 // LO code is not yet bitmap32-ready. // if m_bSupportsBitmap32 becomes true for Svp revisit this m_rCairoCommon.copyWithOperator(rPosAry, source, CAIRO_OPERATOR_OVER, getAntiAlias()); #else @@ -636,13 +636,83 @@ bool SvpGraphicsBackend::drawAlphaBitmap(const SalTwoRect& rTR, const SalBitmap& return true; } -bool SvpGraphicsBackend::drawTransformedBitmap(const basegfx::B2DPoint& /*rNull*/, - const basegfx::B2DPoint& /*rX*/, - const basegfx::B2DPoint& /*rY*/, - const SalBitmap& /*rSourceBitmap*/, - const SalBitmap* /*pAlphaBitmap*/, double /*fAlpha*/) +bool SvpGraphicsBackend::drawTransformedBitmap(const basegfx::B2DPoint& rNull, + const basegfx::B2DPoint& rX, + const basegfx::B2DPoint& rY, + const SalBitmap& rSourceBitmap, + const SalBitmap* pAlphaBitmap, double fAlpha) { - return false; + if (pAlphaBitmap && pAlphaBitmap->GetBitCount() != 8 && pAlphaBitmap->GetBitCount() != 1) + { + SAL_WARN("vcl.gdi", "unsupported SvpSalGraphics::drawTransformedBitmap alpha depth case: " + << pAlphaBitmap->GetBitCount()); + return false; + } + + if (fAlpha != 1.0) + return false; + + // MM02 try to access buffered BitmapHelper + std::shared_ptr<BitmapHelper> aSurface; + tryToUseSourceBuffer(rSourceBitmap, aSurface); + const tools::Long nDestWidth(basegfx::fround(basegfx::B2DVector(rX - rNull).getLength())); + const tools::Long nDestHeight(basegfx::fround(basegfx::B2DVector(rY - rNull).getLength())); + cairo_surface_t* source(aSurface->getSurface(nDestWidth, nDestHeight)); + + if (!source) + { + SAL_WARN("vcl.gdi", "unsupported SvpSalGraphics::drawTransformedBitmap case"); + return false; + } + + // MM02 try to access buffered MaskHelper + std::shared_ptr<MaskHelper> aMask; + if (nullptr != pAlphaBitmap) + { + tryToUseMaskBuffer(*pAlphaBitmap, aMask); + } + + // access cairo_surface_t from MaskHelper + cairo_surface_t* mask(nullptr); + if (aMask) + { + mask = aMask->getSurface(nDestWidth, nDestHeight); + } + + if (nullptr != pAlphaBitmap && nullptr == mask) + { + SAL_WARN("vcl.gdi", "unsupported SvpSalGraphics::drawTransformedBitmap case"); + return false; + } + + const Size aSize = rSourceBitmap.GetSize(); + cairo_t* cr = m_rCairoCommon.getCairoContext(false, getAntiAlias()); + m_rCairoCommon.clipRegion(cr); + + // setup the image transformation + // using the rNull,rX,rY points as destinations for the (0,0),(0,Width),(Height,0) source points + const basegfx::B2DVector aXRel = rX - rNull; + const basegfx::B2DVector aYRel = rY - rNull; + cairo_matrix_t matrix; + cairo_matrix_init(&matrix, aXRel.getX() / aSize.Width(), aXRel.getY() / aSize.Width(), + aYRel.getX() / aSize.Height(), aYRel.getY() / aSize.Height(), rNull.getX(), + rNull.getY()); + + cairo_transform(cr, &matrix); + + cairo_rectangle(cr, 0, 0, aSize.Width(), aSize.Height()); + basegfx::B2DRange extents = getClippedFillDamage(cr); + cairo_clip(cr); + + cairo_set_source_surface(cr, source, 0, 0); + if (mask) + cairo_mask_surface(cr, mask, 0, 0); + else + cairo_paint(cr); + + m_rCairoCommon.releaseCairoContext(cr, false, extents); + + return true; } bool SvpGraphicsBackend::hasFastDrawTransformedBitmap() const { return false; } diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx index 556f85f568e3..b9c4cabee2bc 100644 --- a/vcl/headless/svpgdi.cxx +++ b/vcl/headless/svpgdi.cxx @@ -57,92 +57,6 @@ # endif #endif -bool SvpSalGraphics::drawTransformedBitmap( - const basegfx::B2DPoint& rNull, - const basegfx::B2DPoint& rX, - const basegfx::B2DPoint& rY, - const SalBitmap& rSourceBitmap, - const SalBitmap* pAlphaBitmap, - double fAlpha) -{ - if (pAlphaBitmap && pAlphaBitmap->GetBitCount() != 8 && pAlphaBitmap->GetBitCount() != 1) - { - SAL_WARN("vcl.gdi", "unsupported SvpSalGraphics::drawTransformedBitmap alpha depth case: " << pAlphaBitmap->GetBitCount()); - return false; - } - - if( fAlpha != 1.0 ) - return false; - - // MM02 try to access buffered BitmapHelper - std::shared_ptr<BitmapHelper> aSurface; - tryToUseSourceBuffer(rSourceBitmap, aSurface); - const tools::Long nDestWidth(basegfx::fround(basegfx::B2DVector(rX - rNull).getLength())); - const tools::Long nDestHeight(basegfx::fround(basegfx::B2DVector(rY - rNull).getLength())); - cairo_surface_t* source( - aSurface->getSurface( - nDestWidth, - nDestHeight)); - - if(!source) - { - SAL_WARN("vcl.gdi", "unsupported SvpSalGraphics::drawTransformedBitmap case"); - return false; - } - - // MM02 try to access buffered MaskHelper - std::shared_ptr<MaskHelper> aMask; - if(nullptr != pAlphaBitmap) - { - tryToUseMaskBuffer(*pAlphaBitmap, aMask); - } - - // access cairo_surface_t from MaskHelper - cairo_surface_t* mask(nullptr); - if(aMask) - { - mask = aMask->getSurface( - nDestWidth, - nDestHeight); - } - - if(nullptr != pAlphaBitmap && nullptr == mask) - { - SAL_WARN("vcl.gdi", "unsupported SvpSalGraphics::drawTransformedBitmap case"); - return false; - } - - const Size aSize = rSourceBitmap.GetSize(); - cairo_t* cr = m_aCairoCommon.getCairoContext(false, getAntiAlias()); - clipRegion(cr); - - // setup the image transformation - // using the rNull,rX,rY points as destinations for the (0,0),(0,Width),(Height,0) source points - const basegfx::B2DVector aXRel = rX - rNull; - const basegfx::B2DVector aYRel = rY - rNull; - cairo_matrix_t matrix; - cairo_matrix_init(&matrix, - aXRel.getX()/aSize.Width(), aXRel.getY()/aSize.Width(), - aYRel.getX()/aSize.Height(), aYRel.getY()/aSize.Height(), - rNull.getX(), rNull.getY()); - - cairo_transform(cr, &matrix); - - cairo_rectangle(cr, 0, 0, aSize.Width(), aSize.Height()); - basegfx::B2DRange extents = getClippedFillDamage(cr); - cairo_clip(cr); - - cairo_set_source_surface(cr, source, 0, 0); - if (mask) - cairo_mask_surface(cr, mask, 0, 0); - else - cairo_paint(cr); - - m_aCairoCommon.releaseCairoContext(cr, false, extents); - - return true; -} - SvpSalGraphics::SvpSalGraphics() : m_aTextRenderImpl(*this) , m_pBackend(new SvpGraphicsBackend(m_aCairoCommon)) diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx index d2196c78a230..eb15f1563a62 100644 --- a/vcl/inc/headless/svpgdi.hxx +++ b/vcl/inc/headless/svpgdi.hxx @@ -58,15 +58,6 @@ protected: SvpCairoTextRender m_aTextRenderImpl; std::unique_ptr<SvpGraphicsBackend> m_pBackend; -protected: - virtual bool drawTransformedBitmap( - const basegfx::B2DPoint& rNull, - const basegfx::B2DPoint& rX, - const basegfx::B2DPoint& rY, - const SalBitmap& rSourceBitmap, - const SalBitmap* pAlphaBitmap, - double fAlpha) override; - cairo_t* createTmpCompatibleCairoContext() const; public: