vcl/headless/CairoCommon.cxx | 35 ++++++++++++++++++++++++++ vcl/headless/svpgdi.cxx | 51 ++++----------------------------------- vcl/inc/headless/CairoCommon.hxx | 4 +++ vcl/inc/headless/svpgdi.hxx | 8 +++--- vcl/unx/generic/gdi/salgdi.cxx | 6 +++- 5 files changed, 54 insertions(+), 50 deletions(-)
New commits: commit 9d895ff47126b4fd95b95c8138bc8fdb8abbf1cc Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Tue Nov 16 22:15:58 2021 +0100 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Thu Dec 30 16:19:48 2021 +0100 vcl: move applyColor and clipRegion to CairoCommon Change-Id: I0a207b10017923c4336d49ebc8abd53c78d809ac Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127708 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 f4aea95a1bdd..37a77d866456 100644 --- a/vcl/headless/CairoCommon.cxx +++ b/vcl/headless/CairoCommon.cxx @@ -223,4 +223,39 @@ cairo_t* CairoCommon::createTmpCompatibleCairoContext() const return cairo_create(target); } +void CairoCommon::applyColor(cairo_t* cr, Color aColor, double fTransparency) +{ + if (cairo_surface_get_content(m_pSurface) == CAIRO_CONTENT_COLOR_ALPHA) + { + cairo_set_source_rgba(cr, aColor.GetRed() / 255.0, aColor.GetGreen() / 255.0, + aColor.GetBlue() / 255.0, 1.0 - fTransparency); + } + else + { + double fSet = aColor == COL_BLACK ? 1.0 : 0.0; + cairo_set_source_rgba(cr, 1, 1, 1, fSet); + cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); + } +} + +void CairoCommon::clipRegion(cairo_t* cr, const vcl::Region& rClipRegion) +{ + RectangleVector aRectangles; + if (!rClipRegion.IsEmpty()) + { + rClipRegion.GetRegionRectangles(aRectangles); + } + if (!aRectangles.empty()) + { + for (auto const& rectangle : aRectangles) + { + cairo_rectangle(cr, rectangle.Left(), rectangle.Top(), rectangle.GetWidth(), + rectangle.GetHeight()); + } + cairo_clip(cr); + } +} + +void CairoCommon::clipRegion(cairo_t* cr) { CairoCommon::clipRegion(cr, m_aClipRegion); } + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx index b119a0b749e4..d6c7fd16c17e 100644 --- a/vcl/headless/svpgdi.cxx +++ b/vcl/headless/svpgdi.cxx @@ -835,28 +835,6 @@ bool SvpSalGraphics::hasFastDrawTransformedBitmap() const return false; } -void SvpSalGraphics::clipRegion(cairo_t* cr, const vcl::Region& rClipRegion) -{ - RectangleVector aRectangles; - if (!rClipRegion.IsEmpty()) - { - rClipRegion.GetRegionRectangles(aRectangles); - } - if (!aRectangles.empty()) - { - for (auto const& rectangle : aRectangles) - { - cairo_rectangle(cr, rectangle.Left(), rectangle.Top(), rectangle.GetWidth(), rectangle.GetHeight()); - } - cairo_clip(cr); - } -} - -void SvpSalGraphics::clipRegion(cairo_t* cr) -{ - SvpSalGraphics::clipRegion(cr, m_aCairoCommon.m_aClipRegion); -} - bool SvpSalGraphics::drawAlphaRect(tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight, sal_uInt8 nTransparency) { const bool bHasFill(m_aCairoCommon.m_aFillColor != SALCOLOR_NONE); @@ -879,7 +857,7 @@ bool SvpSalGraphics::drawAlphaRect(tools::Long nX, tools::Long nY, tools::Long n { cairo_rectangle(cr, nX, nY, nWidth, nHeight); - applyColor(cr, m_aCairoCommon.m_aFillColor, fTransparency); + m_aCairoCommon.applyColor(cr, m_aCairoCommon.m_aFillColor, fTransparency); // set FillDamage extents = getClippedFillDamage(cr); @@ -897,7 +875,7 @@ bool SvpSalGraphics::drawAlphaRect(tools::Long nX, tools::Long nY, tools::Long n cairo_rectangle(cr, nX, nY, nWidth, nHeight); - applyColor(cr, m_aCairoCommon.m_aLineColor, fTransparency); + m_aCairoCommon.applyColor(cr, m_aCairoCommon.m_aLineColor, fTransparency); // expand with possible StrokeDamage basegfx::B2DRange stroke_extents = getClippedStrokeDamage(cr); @@ -952,7 +930,7 @@ void SvpSalGraphics::drawPixel( tools::Long nX, tools::Long nY, Color aColor ) clipRegion(cr); cairo_rectangle(cr, nX, nY, 1, 1); - applyColor(cr, aColor, 0.0); + m_aCairoCommon.applyColor(cr, aColor, 0.0); cairo_fill(cr); basegfx::B2DRange extents = getClippedFillDamage(cr); @@ -1271,7 +1249,7 @@ void SvpSalGraphics::drawLine( tools::Long nX1, tools::Long nY1, tools::Long nX2 !getAntiAlias(), false); - applyColor(cr, m_aCairoCommon.m_aLineColor); + m_aCairoCommon.applyColor(cr, m_aCairoCommon.m_aLineColor); basegfx::B2DRange extents = getClippedStrokeDamage(cr); extents.transform(basegfx::utils::createTranslateB2DHomMatrix(0.5, 0.5)); @@ -1793,7 +1771,7 @@ bool SvpSalGraphics::drawPolyPolygon( { add_polygon_path(cr, rPolyPolygon, rObjectToDevice, !getAntiAlias()); - applyColor(cr, m_aCairoCommon.m_aFillColor, fTransparency); + m_aCairoCommon.applyColor(cr, m_aCairoCommon.m_aFillColor, fTransparency); // Get FillDamage (will be extended for LineDamage below) extents = getClippedFillDamage(cr); @@ -1809,7 +1787,7 @@ bool SvpSalGraphics::drawPolyPolygon( add_polygon_path(cr, rPolyPolygon, rObjectToDevice, !getAntiAlias()); - applyColor(cr, m_aCairoCommon.m_aLineColor, fTransparency); + m_aCairoCommon.applyColor(cr, m_aCairoCommon.m_aLineColor, fTransparency); // expand with possible StrokeDamage basegfx::B2DRange stroke_extents = getClippedStrokeDamage(cr); @@ -1940,23 +1918,6 @@ bool SvpSalGraphics::implDrawGradient(basegfx::B2DPolyPolygon const & rPolyPolyg return true; } -void SvpSalGraphics::applyColor(cairo_t *cr, Color aColor, double fTransparency) -{ - if (cairo_surface_get_content(m_aCairoCommon.m_pSurface) == CAIRO_CONTENT_COLOR_ALPHA) - { - cairo_set_source_rgba(cr, aColor.GetRed()/255.0, - aColor.GetGreen()/255.0, - aColor.GetBlue()/255.0, - 1.0 - fTransparency); - } - else - { - double fSet = aColor == COL_BLACK ? 1.0 : 0.0; - cairo_set_source_rgba(cr, 1, 1, 1, fSet); - cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); - } -} - void SvpSalGraphics::copyArea( tools::Long nDestX, tools::Long nDestY, tools::Long nSrcX, diff --git a/vcl/inc/headless/CairoCommon.hxx b/vcl/inc/headless/CairoCommon.hxx index c817a85de8ca..6911c545e7a1 100644 --- a/vcl/inc/headless/CairoCommon.hxx +++ b/vcl/inc/headless/CairoCommon.hxx @@ -110,6 +110,10 @@ struct VCL_DLLPUBLIC CairoCommon void releaseCairoContext(cairo_t* cr, bool bXorModeAllowed, const basegfx::B2DRange& rExtents) const; cairo_t* createTmpCompatibleCairoContext() const; + + void applyColor(cairo_t* cr, Color rColor, double fTransparency = 0.0); + void clipRegion(cairo_t* cr); + static void clipRegion(cairo_t* cr, const vcl::Region& rClipRegion); }; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx index 73ec3b175082..8f58ebd89276 100644 --- a/vcl/inc/headless/svpgdi.hxx +++ b/vcl/inc/headless/svpgdi.hxx @@ -54,8 +54,6 @@ public: return CairoCommon::getDamageKey(); } - static void clipRegion(cairo_t* cr, const vcl::Region& rClipRegion); - // need this static version of ::drawPolyLine for usage from // vcl/unx/generic/gdi/salgdi.cxx. It gets wrapped by // ::drawPolyLine with some added parameters (see there) @@ -80,7 +78,6 @@ public: private: void invert(const basegfx::B2DPolygon &rPoly, SalInvert nFlags); - void applyColor(cairo_t *cr, Color rColor, double fTransparency = 0.0); protected: SvpCairoTextRender m_aTextRenderImpl; @@ -227,7 +224,10 @@ public: } static cairo_surface_t* createCairoSurface(const BitmapBuffer *pBuffer); - void clipRegion(cairo_t* cr); + void clipRegion(cairo_t* cr) + { + m_aCairoCommon.clipRegion(cr); + } }; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/generic/gdi/salgdi.cxx b/vcl/unx/generic/gdi/salgdi.cxx index d65313843155..3b2946e2f18c 100644 --- a/vcl/unx/generic/gdi/salgdi.cxx +++ b/vcl/unx/generic/gdi/salgdi.cxx @@ -57,6 +57,10 @@ #include "cairo_xlib_cairo.hxx" #include <cairo-xlib.h> +#if ENABLE_CAIRO_CANVAS +#include <headless/CairoCommon.hxx> +#endif + X11SalGraphics::X11SalGraphics(): m_pFrame(nullptr), m_pVDev(nullptr), @@ -692,7 +696,7 @@ bool X11SalGraphics::drawPolyPolygon( #if ENABLE_CAIRO_CANVAS void X11SalGraphics::clipRegion(cairo_t* cr) { - SvpSalGraphics::clipRegion(cr, maClipRegion); + CairoCommon::clipRegion(cr, maClipRegion); } #endif // ENABLE_CAIRO_CANVAS