vcl/headless/CairoCommon.cxx | 85 ++++++++++++++++++++++++++ vcl/headless/SvpGraphicsBackend.cxx | 18 ++++- vcl/headless/svpgdi.cxx | 115 ------------------------------------ vcl/inc/headless/CairoCommon.hxx | 2 vcl/inc/headless/svpgdi.hxx | 8 -- 5 files changed, 101 insertions(+), 127 deletions(-)
New commits: commit b4164ec443650f77aa472fc0d06e6dba716e2d28 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Tue Dec 28 10:04:04 2021 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Mon Jan 3 10:44:19 2022 +0100 vcl: (re)move drawEPS to SvpGraphicsBackend Change-Id: Ic5936a0d5bfe566d75532ccff52f25bf502019ae Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127827 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx index c676a0fea72c..642382ed57b2 100644 --- a/vcl/headless/svpgdi.cxx +++ b/vcl/headless/svpgdi.cxx @@ -1108,11 +1108,6 @@ std::shared_ptr<SalBitmap> SvpSalGraphics::getBitmap( tools::Long nX, tools::Lon return pBitmap; } -bool SvpSalGraphics::drawEPS( tools::Long, tools::Long, tools::Long, tools::Long, void*, sal_uInt32 ) -{ - return false; -} - namespace { bool isCairoCompatible(const BitmapBuffer* pBuffer) diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx index eeac78d50a07..9db0f86cc65b 100644 --- a/vcl/inc/headless/svpgdi.hxx +++ b/vcl/inc/headless/svpgdi.hxx @@ -138,8 +138,6 @@ public: Color nMaskColor ) override; virtual std::shared_ptr<SalBitmap> getBitmap( tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight ) override; - virtual bool drawEPS( tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight, void* pPtr, sal_uInt32 nSize ) override; - virtual SystemGraphicsData GetGraphicsData() const override; #if ENABLE_CAIRO_CANVAS commit d1c813809a9f21fc670e759828922c2f11d972dc Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Tue Dec 28 10:01:22 2021 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Mon Jan 3 10:44:03 2022 +0100 vcl: move invert to SvpGraphicsBackend and CairoCommon Common invert to CairoCommon, 2 invert members on the interface to SvpGraphicsBackend calling the common invert call. Change-Id: I2fada75cc0d730f0708ae7ca934a51e1d17cef1c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127826 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/vcl/headless/CairoCommon.cxx b/vcl/headless/CairoCommon.cxx index 7161feb7f29f..79baec8ff497 100644 --- a/vcl/headless/CairoCommon.cxx +++ b/vcl/headless/CairoCommon.cxx @@ -25,6 +25,7 @@ #include <basegfx/matrix/b2dhommatrixtools.hxx> #include <basegfx/polygon/b2dpolypolygontools.hxx> #include <basegfx/polygon/b2dpolygontools.hxx> +#include <sal/log.hxx> void dl_cairo_surface_set_device_scale(cairo_surface_t* surface, double x_scale, double y_scale) { @@ -833,4 +834,88 @@ bool CairoCommon::drawPolyLine(cairo_t* cr, basegfx::B2DRange* pExtents, const C return true; } +namespace +{ +cairo_pattern_t* create_stipple() +{ + static unsigned char data[16] = { 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF }; + cairo_surface_t* surface = cairo_image_surface_create_for_data(data, CAIRO_FORMAT_A8, 4, 4, 4); + cairo_pattern_t* pattern = cairo_pattern_create_for_surface(surface); + cairo_surface_destroy(surface); + cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT); + cairo_pattern_set_filter(pattern, CAIRO_FILTER_NEAREST); + return pattern; +} +} + +void CairoCommon::invert(const basegfx::B2DPolygon& rPoly, SalInvert nFlags, bool bAntiAlias) +{ + cairo_t* cr = getCairoContext(false, bAntiAlias); + clipRegion(cr); + + // To make releaseCairoContext work, use empty extents + basegfx::B2DRange extents; + + AddPolygonToPath(cr, rPoly, basegfx::B2DHomMatrix(), !bAntiAlias, false); + + cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); + + if (cairo_version() >= CAIRO_VERSION_ENCODE(1, 10, 0)) + { + cairo_set_operator(cr, CAIRO_OPERATOR_DIFFERENCE); + } + else + { + SAL_WARN("vcl.gdi", "SvpSalGraphics::invert, archaic cairo"); + } + + if (nFlags & SalInvert::TrackFrame) + { + cairo_set_line_width(cr, 2.0); + const double dashLengths[2] = { 4.0, 4.0 }; + cairo_set_dash(cr, dashLengths, 2, 0); + + extents = getClippedStrokeDamage(cr); + //see tdf#106577 under wayland, some pixel droppings seen, maybe we're + //out by one somewhere, or cairo_stroke_extents is confused by + //dashes/line width + if (!extents.isEmpty()) + { + extents.grow(1); + } + + cairo_stroke(cr); + } + else + { + extents = getClippedFillDamage(cr); + + cairo_clip(cr); + + if (nFlags & SalInvert::N50) + { + cairo_pattern_t* pattern = create_stipple(); + cairo_surface_t* surface = cairo_surface_create_similar( + m_pSurface, cairo_surface_get_content(m_pSurface), extents.getWidth() * m_fScale, + extents.getHeight() * m_fScale); + + dl_cairo_surface_set_device_scale(surface, m_fScale, m_fScale); + cairo_t* stipple_cr = cairo_create(surface); + cairo_set_source_rgb(stipple_cr, 1.0, 1.0, 1.0); + cairo_mask(stipple_cr, pattern); + cairo_pattern_destroy(pattern); + cairo_destroy(stipple_cr); + cairo_mask_surface(cr, surface, extents.getMinX(), extents.getMinY()); + cairo_surface_destroy(surface); + } + else + { + cairo_paint(cr); + } + } + + releaseCairoContext(cr, false, extents); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/headless/SvpGraphicsBackend.cxx b/vcl/headless/SvpGraphicsBackend.cxx index d5dd2fe48b27..6a50ca17353c 100644 --- a/vcl/headless/SvpGraphicsBackend.cxx +++ b/vcl/headless/SvpGraphicsBackend.cxx @@ -412,14 +412,24 @@ Color SvpGraphicsBackend::getPixel(tools::Long nX, tools::Long nY) return aColor; } -void SvpGraphicsBackend::invert(tools::Long /*nX*/, tools::Long /*nY*/, tools::Long /*nWidth*/, - tools::Long /*nHeight*/, SalInvert /*nFlags*/) +void SvpGraphicsBackend::invert(tools::Long nX, tools::Long nY, tools::Long nWidth, + tools::Long nHeight, SalInvert nFlags) { + basegfx::B2DPolygon aRect = basegfx::utils::createPolygonFromRect( + basegfx::B2DRectangle(nX, nY, nX + nWidth, nY + nHeight)); + + m_rCairoCommon.invert(aRect, nFlags, getAntiAlias()); } -void SvpGraphicsBackend::invert(sal_uInt32 /*nPoints*/, const Point* /*pPtAry*/, - SalInvert /*nFlags*/) +void SvpGraphicsBackend::invert(sal_uInt32 nPoints, const Point* pPtAry, SalInvert nFlags) { + basegfx::B2DPolygon aPoly; + aPoly.append(basegfx::B2DPoint(pPtAry->getX(), pPtAry->getY()), nPoints); + for (sal_uInt32 i = 1; i < nPoints; ++i) + aPoly.setB2DPoint(i, basegfx::B2DPoint(pPtAry[i].getX(), pPtAry[i].getY())); + aPoly.setClosed(true); + + m_rCairoCommon.invert(aPoly, nFlags, getAntiAlias()); } bool SvpGraphicsBackend::drawEPS(tools::Long /*nX*/, tools::Long /*nY*/, tools::Long /*nWidth*/, diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx index bc6a6231d1c1..c676a0fea72c 100644 --- a/vcl/headless/svpgdi.cxx +++ b/vcl/headless/svpgdi.cxx @@ -1108,116 +1108,6 @@ std::shared_ptr<SalBitmap> SvpSalGraphics::getBitmap( tools::Long nX, tools::Lon return pBitmap; } -namespace -{ - cairo_pattern_t * create_stipple() - { - static unsigned char data[16] = { 0xFF, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, - 0x00, 0x00, 0xFF, 0xFF }; - cairo_surface_t* surface = cairo_image_surface_create_for_data(data, CAIRO_FORMAT_A8, 4, 4, 4); - cairo_pattern_t* pattern = cairo_pattern_create_for_surface(surface); - cairo_surface_destroy(surface); - cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT); - cairo_pattern_set_filter(pattern, CAIRO_FILTER_NEAREST); - return pattern; - } -} - -void SvpSalGraphics::invert(const basegfx::B2DPolygon &rPoly, SalInvert nFlags) -{ - cairo_t* cr = m_aCairoCommon.getCairoContext(false, getAntiAlias()); - clipRegion(cr); - - // To make releaseCairoContext work, use empty extents - basegfx::B2DRange extents; - - AddPolygonToPath( - cr, - rPoly, - basegfx::B2DHomMatrix(), - !getAntiAlias(), - false); - - cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); - - if (cairo_version() >= CAIRO_VERSION_ENCODE(1, 10, 0)) - { - cairo_set_operator(cr, CAIRO_OPERATOR_DIFFERENCE); - } - else - { - SAL_WARN("vcl.gdi", "SvpSalGraphics::invert, archaic cairo"); - } - - if (nFlags & SalInvert::TrackFrame) - { - cairo_set_line_width(cr, 2.0); - const double dashLengths[2] = { 4.0, 4.0 }; - cairo_set_dash(cr, dashLengths, 2, 0); - - extents = getClippedStrokeDamage(cr); - //see tdf#106577 under wayland, some pixel droppings seen, maybe we're - //out by one somewhere, or cairo_stroke_extents is confused by - //dashes/line width - if(!extents.isEmpty()) - { - extents.grow(1); - } - - cairo_stroke(cr); - } - else - { - extents = getClippedFillDamage(cr); - - cairo_clip(cr); - - if (nFlags & SalInvert::N50) - { - cairo_pattern_t *pattern = create_stipple(); - cairo_surface_t* surface = cairo_surface_create_similar(m_aCairoCommon.m_pSurface, - cairo_surface_get_content(m_aCairoCommon.m_pSurface), - extents.getWidth() * m_aCairoCommon.m_fScale, - extents.getHeight() * m_aCairoCommon.m_fScale); - - dl_cairo_surface_set_device_scale(surface, m_aCairoCommon.m_fScale, m_aCairoCommon.m_fScale); - cairo_t* stipple_cr = cairo_create(surface); - cairo_set_source_rgb(stipple_cr, 1.0, 1.0, 1.0); - cairo_mask(stipple_cr, pattern); - cairo_pattern_destroy(pattern); - cairo_destroy(stipple_cr); - cairo_mask_surface(cr, surface, extents.getMinX(), extents.getMinY()); - cairo_surface_destroy(surface); - } - else - { - cairo_paint(cr); - } - } - - m_aCairoCommon.releaseCairoContext(cr, false, extents); -} - -void SvpSalGraphics::invert( tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight, SalInvert nFlags ) -{ - basegfx::B2DPolygon aRect = basegfx::utils::createPolygonFromRect(basegfx::B2DRectangle(nX, nY, nX+nWidth, nY+nHeight)); - - invert(aRect, nFlags); -} - -void SvpSalGraphics::invert(sal_uInt32 nPoints, const Point* pPtAry, SalInvert nFlags) -{ - basegfx::B2DPolygon aPoly; - aPoly.append(basegfx::B2DPoint(pPtAry->getX(), pPtAry->getY()), nPoints); - for (sal_uInt32 i = 1; i < nPoints; ++i) - aPoly.setB2DPoint(i, basegfx::B2DPoint(pPtAry[i].getX(), pPtAry[i].getY())); - aPoly.setClosed(true); - - invert(aPoly, nFlags); -} - bool SvpSalGraphics::drawEPS( tools::Long, tools::Long, tools::Long, tools::Long, void*, sal_uInt32 ) { return false; diff --git a/vcl/inc/headless/CairoCommon.hxx b/vcl/inc/headless/CairoCommon.hxx index 038bd3a42c35..fb7526377801 100644 --- a/vcl/inc/headless/CairoCommon.hxx +++ b/vcl/inc/headless/CairoCommon.hxx @@ -175,6 +175,8 @@ struct VCL_DLLPUBLIC CairoCommon double fLineWidth, const std::vector<double>* pStroke, basegfx::B2DLineJoin eLineJoin, css::drawing::LineCap eLineCap, double fMiterMinimumAngle, bool bPixelSnapHairline); + + void invert(const basegfx::B2DPolygon& rPoly, SalInvert nFlags, bool bAntiAlias); }; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx index ba4dec8d29e8..eeac78d50a07 100644 --- a/vcl/inc/headless/svpgdi.hxx +++ b/vcl/inc/headless/svpgdi.hxx @@ -58,9 +58,6 @@ public: void copyWithOperator(const SalTwoRect& rTR, cairo_surface_t* source, cairo_operator_t eOp = CAIRO_OPERATOR_SOURCE); -private: - void invert(const basegfx::B2DPolygon &rPoly, SalInvert nFlags); - protected: SvpCairoTextRender m_aTextRenderImpl; std::unique_ptr<SvpGraphicsBackend> m_pBackend; @@ -141,9 +138,6 @@ public: Color nMaskColor ) override; virtual std::shared_ptr<SalBitmap> getBitmap( tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight ) override; - virtual void invert( tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight, SalInvert nFlags ) override; - virtual void invert( sal_uInt32 nPoints, const Point* pPtAry, SalInvert nFlags ) override; - virtual bool drawEPS( tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight, void* pPtr, sal_uInt32 nSize ) override; virtual SystemGraphicsData GetGraphicsData() const override;