diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2021-12-28 10:17:53 +0900 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2022-01-04 05:21:33 +0100 |
commit | 52c903c6a48d62d6ed7841ba2d1021300c8189b3 (patch) | |
tree | 4d9eb2083a89085338629c48848053751f3ac2a6 /vcl/headless/svpgdi.cxx | |
parent | 9cc3672a4d7e9c9a647d388dba493bbb28d96da2 (diff) |
vcl: copyArea and copyBits to SvpGraphicsBackend
Also move the used (sub)functions to the CarioCommon:
copyBitsCairo, copySource, copyWithOperator, renderSource and
renderWithOperator. Also use these functions in some calls
needed by drawBitmap & co.
Change-Id: I51395953545827951b6f255a9833e828aec7ea60
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127842
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'vcl/headless/svpgdi.cxx')
-rw-r--r-- | vcl/headless/svpgdi.cxx | 112 |
1 files changed, 4 insertions, 108 deletions
diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx index 642382ed57b2..4ec12998a163 100644 --- a/vcl/headless/svpgdi.cxx +++ b/vcl/headless/svpgdi.cxx @@ -852,110 +852,6 @@ void SvpSalGraphics::GetResolution( sal_Int32& rDPIX, sal_Int32& rDPIY ) rDPIX = rDPIY = 96; } -void SvpSalGraphics::copyArea( tools::Long nDestX, - tools::Long nDestY, - tools::Long nSrcX, - tools::Long nSrcY, - tools::Long nSrcWidth, - tools::Long nSrcHeight, - bool /*bWindowInvalidate*/ ) -{ - SalTwoRect aTR(nSrcX, nSrcY, nSrcWidth, nSrcHeight, nDestX, nDestY, nSrcWidth, nSrcHeight); - copyBits(aTR, this); -} - -static basegfx::B2DRange renderWithOperator(cairo_t* cr, const SalTwoRect& rTR, - cairo_surface_t* source, cairo_operator_t eOperator = CAIRO_OPERATOR_SOURCE) -{ - cairo_rectangle(cr, rTR.mnDestX, rTR.mnDestY, rTR.mnDestWidth, rTR.mnDestHeight); - - basegfx::B2DRange extents = getClippedFillDamage(cr); - - cairo_clip(cr); - - cairo_translate(cr, rTR.mnDestX, rTR.mnDestY); - double fXScale = 1.0f; - double fYScale = 1.0f; - if (rTR.mnSrcWidth != 0 && rTR.mnSrcHeight != 0) { - fXScale = static_cast<double>(rTR.mnDestWidth)/rTR.mnSrcWidth; - fYScale = static_cast<double>(rTR.mnDestHeight)/rTR.mnSrcHeight; - cairo_scale(cr, fXScale, fYScale); - } - - cairo_save(cr); - cairo_set_source_surface(cr, source, -rTR.mnSrcX, -rTR.mnSrcY); - if ((fXScale != 1.0 && rTR.mnSrcWidth == 1) || (fYScale != 1.0 && rTR.mnSrcHeight == 1)) - { - cairo_pattern_t* sourcepattern = cairo_get_source(cr); - cairo_pattern_set_extend(sourcepattern, CAIRO_EXTEND_REPEAT); - cairo_pattern_set_filter(sourcepattern, CAIRO_FILTER_NEAREST); - } - cairo_set_operator(cr, eOperator); - cairo_paint(cr); - cairo_restore(cr); - - return extents; -} - -static basegfx::B2DRange renderSource(cairo_t* cr, const SalTwoRect& rTR, - cairo_surface_t* source) -{ - return renderWithOperator(cr, rTR, source, CAIRO_OPERATOR_SOURCE); -} - -void SvpSalGraphics::copyWithOperator( const SalTwoRect& rTR, cairo_surface_t* source, - cairo_operator_t eOp ) -{ - cairo_t* cr = m_aCairoCommon.getCairoContext(false, getAntiAlias()); - clipRegion(cr); - - basegfx::B2DRange extents = renderWithOperator(cr, rTR, source, eOp); - - m_aCairoCommon.releaseCairoContext(cr, false, extents); -} - -void SvpSalGraphics::copySource( const SalTwoRect& rTR, cairo_surface_t* source ) -{ - copyWithOperator(rTR, source, CAIRO_OPERATOR_SOURCE); -} - -void SvpSalGraphics::copyBits( const SalTwoRect& rTR, - SalGraphics* pSrcGraphics ) -{ - SalTwoRect aTR(rTR); - - SvpSalGraphics* pSrc = pSrcGraphics ? - static_cast<SvpSalGraphics*>(pSrcGraphics) : this; - - cairo_surface_t* source = pSrc->m_aCairoCommon.m_pSurface; - - cairo_surface_t *pCopy = nullptr; - if (pSrc == this) - { - //self copy is a problem, so dup source in that case - pCopy = cairo_surface_create_similar(source, - cairo_surface_get_content(m_aCairoCommon.m_pSurface), - aTR.mnSrcWidth * m_aCairoCommon.m_fScale, - aTR.mnSrcHeight * m_aCairoCommon.m_fScale); - dl_cairo_surface_set_device_scale(pCopy, m_aCairoCommon.m_fScale, m_aCairoCommon.m_fScale); - cairo_t* cr = cairo_create(pCopy); - cairo_set_source_surface(cr, source, -aTR.mnSrcX, -aTR.mnSrcY); - cairo_rectangle(cr, 0, 0, aTR.mnSrcWidth, aTR.mnSrcHeight); - cairo_fill(cr); - cairo_destroy(cr); - - source = pCopy; - - aTR.mnSrcX = 0; - aTR.mnSrcY = 0; - } - - copySource(aTR, source); - - if (pCopy) - cairo_surface_destroy(pCopy); -} - void SvpSalGraphics::drawBitmap(const SalTwoRect& rTR, const SalBitmap& rSourceBitmap) { // MM02 try to access buffered BitmapHelper @@ -973,16 +869,16 @@ void SvpSalGraphics::drawBitmap(const SalTwoRect& rTR, const SalBitmap& rSourceB #if 0 // LO code is not yet bitmap32-ready. // if m_bSupportsBitmap32 becomes true for Svp revisit this - copyWithOperator(rTR, source, CAIRO_OPERATOR_OVER); + m_aCairoCommon.copyWithOperator(rTR, source, CAIRO_OPERATOR_OVER, getAntiAlias()); #else - copyWithOperator(rTR, source, CAIRO_OPERATOR_SOURCE); + m_aCairoCommon.copyWithOperator(rTR, source, CAIRO_OPERATOR_SOURCE, getAntiAlias()); #endif } void SvpSalGraphics::drawBitmap(const SalTwoRect& rTR, const BitmapBuffer* pBuffer, cairo_operator_t eOp) { cairo_surface_t* source = createCairoSurface( pBuffer ); - copyWithOperator(rTR, source, eOp); + m_aCairoCommon.copyWithOperator(rTR, source, eOp, getAntiAlias()); cairo_surface_destroy(source); } @@ -1098,7 +994,7 @@ std::shared_ptr<SalBitmap> SvpSalGraphics::getBitmap( tools::Long nX, tools::Lon cairo_t* cr = cairo_create(target); SalTwoRect aTR(nX, nY, nWidth, nHeight, 0, 0, nWidth, nHeight); - renderSource(cr, aTR, m_aCairoCommon.m_pSurface); + CairoCommon::renderSource(cr, aTR, m_aCairoCommon.m_pSurface); cairo_destroy(cr); cairo_surface_destroy(target); |