vcl/headless/CairoCommon.cxx | 56 ++++++++++++++++++++++++++++++++ vcl/headless/svpgdi.cxx | 67 ++------------------------------------- vcl/inc/headless/CairoCommon.hxx | 5 ++ vcl/inc/headless/svpgdi.hxx | 1 4 files changed, 65 insertions(+), 64 deletions(-)
New commits: commit 5b185397198171bf8adaa99439931d12f42eff51 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Tue Dec 28 14:00:02 2021 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Tue Jan 4 06:55:57 2022 +0100 vcl: move createCairoSurface to CairoCommon Intermediate step beore moving bitmap related members. Change-Id: Ia3321ddd1ca3adb11e2b4610c3fb6b0be5ee6515 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127845 Tested-by: Tomaž Vajngerl <qui...@gmail.com> Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/vcl/headless/CairoCommon.cxx b/vcl/headless/CairoCommon.cxx index 234bfe29fcce..af4ee260c1c6 100644 --- a/vcl/headless/CairoCommon.cxx +++ b/vcl/headless/CairoCommon.cxx @@ -1010,4 +1010,60 @@ void CairoCommon::invert(const basegfx::B2DPolygon& rPoly, SalInvert nFlags, boo releaseCairoContext(cr, false, extents); } +cairo_format_t getCairoFormat(const BitmapBuffer& rBuffer) +{ + cairo_format_t nFormat; +#ifdef HAVE_CAIRO_FORMAT_RGB24_888 + assert(rBuffer.mnBitCount == 32 || rBuffer.mnBitCount == 24 || rBuffer.mnBitCount == 1); +#else + assert(rBuffer.mnBitCount == 32 || rBuffer.mnBitCount == 1); +#endif + + if (rBuffer.mnBitCount == 32) + nFormat = CAIRO_FORMAT_ARGB32; +#ifdef HAVE_CAIRO_FORMAT_RGB24_888 + else if (rBuffer.mnBitCount == 24) + nFormat = CAIRO_FORMAT_RGB24_888; +#endif + else + nFormat = CAIRO_FORMAT_A1; + return nFormat; +} + +namespace +{ +bool isCairoCompatible(const BitmapBuffer* pBuffer) +{ + if (!pBuffer) + return false; + + // We use Cairo that supports 24-bit RGB. +#ifdef HAVE_CAIRO_FORMAT_RGB24_888 + if (pBuffer->mnBitCount != 32 && pBuffer->mnBitCount != 24 && pBuffer->mnBitCount != 1) +#else + if (pBuffer->mnBitCount != 32 && pBuffer->mnBitCount != 1) +#endif + return false; + + cairo_format_t nFormat = getCairoFormat(*pBuffer); + return (cairo_format_stride_for_width(nFormat, pBuffer->mnWidth) == pBuffer->mnScanlineSize); +} +} + +cairo_surface_t* CairoCommon::createCairoSurface(const BitmapBuffer* pBuffer) +{ + if (!isCairoCompatible(pBuffer)) + return nullptr; + + cairo_format_t nFormat = getCairoFormat(*pBuffer); + cairo_surface_t* target = cairo_image_surface_create_for_data( + pBuffer->mpBits, nFormat, pBuffer->mnWidth, pBuffer->mnHeight, pBuffer->mnScanlineSize); + if (cairo_surface_status(target) != CAIRO_STATUS_SUCCESS) + { + cairo_surface_destroy(target); + return nullptr; + } + return target; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx index 46016e0e3349..5b685178940b 100644 --- a/vcl/headless/svpgdi.cxx +++ b/vcl/headless/svpgdi.cxx @@ -59,26 +59,6 @@ namespace { - cairo_format_t getCairoFormat(const BitmapBuffer& rBuffer) - { - cairo_format_t nFormat; -#ifdef HAVE_CAIRO_FORMAT_RGB24_888 - assert(rBuffer.mnBitCount == 32 || rBuffer.mnBitCount == 24 || rBuffer.mnBitCount == 1); -#else - assert(rBuffer.mnBitCount == 32 || rBuffer.mnBitCount == 1); -#endif - - if (rBuffer.mnBitCount == 32) - nFormat = CAIRO_FORMAT_ARGB32; -#ifdef HAVE_CAIRO_FORMAT_RGB24_888 - else if (rBuffer.mnBitCount == 24) - nFormat = CAIRO_FORMAT_RGB24_888; -#endif - else - nFormat = CAIRO_FORMAT_A1; - return nFormat; - } - void Toggle1BitTransparency(const BitmapBuffer& rBuf) { assert(rBuf.maPalette.GetBestIndex(BitmapColor(COL_BLACK)) == 0); @@ -347,11 +327,11 @@ namespace aTmpBmp.Create(std::move(pTmp)); assert(aTmpBmp.GetBitCount() == 32); - implSetSurface(SvpSalGraphics::createCairoSurface(aTmpBmp.GetBuffer())); + implSetSurface(CairoCommon::createCairoSurface(aTmpBmp.GetBuffer())); } else { - implSetSurface(SvpSalGraphics::createCairoSurface(rSrcBmp.GetBuffer())); + implSetSurface(CairoCommon::createCairoSurface(rSrcBmp.GetBuffer())); } } void mark_dirty() @@ -807,7 +787,7 @@ void SvpSalGraphics::drawBitmap(const SalTwoRect& rTR, const SalBitmap& rSourceB void SvpSalGraphics::drawBitmap(const SalTwoRect& rTR, const BitmapBuffer* pBuffer, cairo_operator_t eOp) { - cairo_surface_t* source = createCairoSurface( pBuffer ); + cairo_surface_t* source = CairoCommon::createCairoSurface(pBuffer); m_aCairoCommon.copyWithOperator(rTR, source, eOp, getAntiAlias()); cairo_surface_destroy(source); } @@ -915,7 +895,7 @@ std::shared_ptr<SalBitmap> SvpSalGraphics::getBitmap( tools::Long nX, tools::Lon return nullptr; } - cairo_surface_t* target = SvpSalGraphics::createCairoSurface(pBitmap->GetBuffer()); + cairo_surface_t* target = CairoCommon::createCairoSurface(pBitmap->GetBuffer()); if (!target) { SAL_WARN("vcl.gdi", "SvpSalGraphics::getBitmap, cannot create cairo surface"); @@ -934,45 +914,6 @@ std::shared_ptr<SalBitmap> SvpSalGraphics::getBitmap( tools::Long nX, tools::Lon return pBitmap; } -namespace -{ - bool isCairoCompatible(const BitmapBuffer* pBuffer) - { - if (!pBuffer) - return false; - - // We use Cairo that supports 24-bit RGB. -#ifdef HAVE_CAIRO_FORMAT_RGB24_888 - if (pBuffer->mnBitCount != 32 && pBuffer->mnBitCount != 24 && pBuffer->mnBitCount != 1) -#else - if (pBuffer->mnBitCount != 32 && pBuffer->mnBitCount != 1) -#endif - return false; - - cairo_format_t nFormat = getCairoFormat(*pBuffer); - return (cairo_format_stride_for_width(nFormat, pBuffer->mnWidth) == pBuffer->mnScanlineSize); - } -} - -cairo_surface_t* SvpSalGraphics::createCairoSurface(const BitmapBuffer *pBuffer) -{ - if (!isCairoCompatible(pBuffer)) - return nullptr; - - cairo_format_t nFormat = getCairoFormat(*pBuffer); - cairo_surface_t *target = - cairo_image_surface_create_for_data(pBuffer->mpBits, - nFormat, - pBuffer->mnWidth, pBuffer->mnHeight, - pBuffer->mnScanlineSize); - if (cairo_surface_status(target) != CAIRO_STATUS_SUCCESS) - { - cairo_surface_destroy(target); - return nullptr; - } - return target; -} - #if ENABLE_CAIRO_CANVAS bool SvpSalGraphics::SupportsCairo() const { diff --git a/vcl/inc/headless/CairoCommon.hxx b/vcl/inc/headless/CairoCommon.hxx index cdf66c012cde..02dfcfa3ff0b 100644 --- a/vcl/inc/headless/CairoCommon.hxx +++ b/vcl/inc/headless/CairoCommon.hxx @@ -27,6 +27,7 @@ #include <vcl/dllapi.h> #include <vcl/region.hxx> #include <vcl/salgtype.hxx> +#include <vcl/BitmapBuffer.hxx> #include <com/sun/star/drawing/LineCap.hpp> @@ -119,6 +120,8 @@ VCL_DLLPUBLIC basegfx::B2DPoint impPixelSnap(const basegfx::B2DPolygon& rPolygon VCL_DLLPUBLIC void add_polygon_path(cairo_t* cr, const basegfx::B2DPolyPolygon& rPolyPolygon, const basegfx::B2DHomMatrix& rObjectToDevice, bool bPixelSnap); +VCL_DLLPUBLIC cairo_format_t getCairoFormat(const BitmapBuffer& rBuffer); + enum class PaintMode { Over, @@ -187,6 +190,8 @@ struct VCL_DLLPUBLIC CairoCommon void copyBitsCairo(const SalTwoRect& rTR, cairo_surface_t* pSourceSurface, bool bAntiAlias); void invert(const basegfx::B2DPolygon& rPoly, SalInvert nFlags, bool bAntiAlias); + + static cairo_surface_t* createCairoSurface(const BitmapBuffer* pBuffer); }; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx index 61decc908563..0f747fe99af2 100644 --- a/vcl/inc/headless/svpgdi.hxx +++ b/vcl/inc/headless/svpgdi.hxx @@ -137,7 +137,6 @@ public: return m_aCairoCommon.releaseCairoContext(cr, bXorModeAllowed, rExtents); } - static cairo_surface_t* createCairoSurface(const BitmapBuffer *pBuffer); void clipRegion(cairo_t* cr) { m_aCairoCommon.clipRegion(cr);