summaryrefslogtreecommitdiff
path: root/vcl/headless/svpgdi.cxx
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2021-11-27 21:29:15 +0100
committerTomaž Vajngerl <quikee@gmail.com>2022-01-01 03:50:45 +0100
commita2da849163cbbba5ab4272999b9fb081240f1786 (patch)
tree9417ad343bca96706f77902fd67a9004f2f7c3e4 /vcl/headless/svpgdi.cxx
parentcf6f1aae98e23227e4a9a17d72801abf38c6259f (diff)
vcl: move drawRect and drawPolyPolygon to SvpGraphicsBackend
Also move add_polygon_path and SystemDependentData_CairoPath class to CairoCommon. SystemDependentData_CairoPath is temporary made public until other dependencies are moved too. Change-Id: I381407fc7c168c8982fcfd8c886cf622f95591fd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127711 Tested-by: Tomaž Vajngerl <quikee@gmail.com> Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'vcl/headless/svpgdi.cxx')
-rw-r--r--vcl/headless/svpgdi.cxx247
1 files changed, 2 insertions, 245 deletions
diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx
index 9e50652928d9..65f9e13aafd5 100644
--- a/vcl/headless/svpgdi.cxx
+++ b/vcl/headless/svpgdi.cxx
@@ -852,45 +852,6 @@ void SvpSalGraphics::GetResolution( sal_Int32& rDPIX, sal_Int32& rDPIY )
rDPIX = rDPIY = 96;
}
-void SvpSalGraphics::drawRect( tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight )
-{
- // because of the -1 hack we have to do fill and draw separately
- Color aOrigFillColor = m_aCairoCommon.m_aFillColor;
- Color aOrigLineColor = m_aCairoCommon.m_aLineColor;
- m_aCairoCommon.m_aFillColor = SALCOLOR_NONE;
- m_aCairoCommon.m_aLineColor = SALCOLOR_NONE;
-
- if (aOrigFillColor != SALCOLOR_NONE)
- {
- basegfx::B2DPolygon aRect = basegfx::utils::createPolygonFromRect(basegfx::B2DRectangle(nX, nY, nX+nWidth, nY+nHeight));
- m_aCairoCommon.m_aFillColor = aOrigFillColor;
-
- drawPolyPolygon(
- basegfx::B2DHomMatrix(),
- basegfx::B2DPolyPolygon(aRect),
- 0.0);
-
- m_aCairoCommon.m_aFillColor = SALCOLOR_NONE;
- }
-
- if (aOrigLineColor != SALCOLOR_NONE)
- {
- // need same -1 hack as X11SalGraphicsImpl::drawRect
- basegfx::B2DPolygon aRect = basegfx::utils::createPolygonFromRect(basegfx::B2DRectangle( nX, nY, nX+nWidth-1, nY+nHeight-1));
- m_aCairoCommon.m_aLineColor = aOrigLineColor;
-
- drawPolyPolygon(
- basegfx::B2DHomMatrix(),
- basegfx::B2DPolyPolygon(aRect),
- 0.0);
-
- m_aCairoCommon.m_aLineColor = SALCOLOR_NONE;
- }
-
- m_aCairoCommon.m_aFillColor = aOrigFillColor;
- m_aCairoCommon.m_aLineColor = aOrigLineColor;
-}
-
void SvpSalGraphics::drawPolyLine(sal_uInt32 nPoints, const Point* pPtAry)
{
basegfx::B2DPolygon aPoly;
@@ -918,7 +879,7 @@ void SvpSalGraphics::drawPolygon(sal_uInt32 nPoints, const Point* pPtAry)
for (sal_uInt32 i = 1; i < nPoints; ++i)
aPoly.setB2DPoint(i, basegfx::B2DPoint(pPtAry[i].getX(), pPtAry[i].getY()));
- drawPolyPolygon(
+ GetImpl()->drawPolyPolygon(
basegfx::B2DHomMatrix(),
basegfx::B2DPolyPolygon(aPoly),
0.0);
@@ -944,100 +905,12 @@ void SvpSalGraphics::drawPolyPolygon(sal_uInt32 nPoly,
}
}
- drawPolyPolygon(
+ GetImpl()->drawPolyPolygon(
basegfx::B2DHomMatrix(),
aPolyPoly,
0.0);
}
-namespace {
-
-class SystemDependentData_CairoPath : public basegfx::SystemDependentData
-{
-private:
- // the path data itself
- cairo_path_t* mpCairoPath;
-
- // all other values the path data is based on and
- // need to be compared with to check for data validity
- bool mbNoJoin;
- bool mbAntiAlias;
- std::vector< double > maStroke;
-
-public:
- SystemDependentData_CairoPath(
- basegfx::SystemDependentDataManager& rSystemDependentDataManager,
- size_t nSizeMeasure,
- cairo_t* cr,
- bool bNoJoin,
- bool bAntiAlias,
- const std::vector< double >* pStroke); // MM01
- virtual ~SystemDependentData_CairoPath() override;
-
- // read access
- cairo_path_t* getCairoPath() { return mpCairoPath; }
- bool getNoJoin() const { return mbNoJoin; }
- bool getAntiAlias() const { return mbAntiAlias; }
- const std::vector< double >& getStroke() const { return maStroke; }
-
- virtual sal_Int64 estimateUsageInBytes() const override;
-};
-
-}
-
-SystemDependentData_CairoPath::SystemDependentData_CairoPath(
- basegfx::SystemDependentDataManager& rSystemDependentDataManager,
- size_t nSizeMeasure,
- cairo_t* cr,
- bool bNoJoin,
- bool bAntiAlias,
- const std::vector< double >* pStroke)
-: basegfx::SystemDependentData(rSystemDependentDataManager),
- mpCairoPath(nullptr),
- mbNoJoin(bNoJoin),
- mbAntiAlias(bAntiAlias)
-{
- // tdf#129845 only create a copy of the path when nSizeMeasure is
- // bigger than some decent threshold
- if(nSizeMeasure > 50)
- {
- mpCairoPath = cairo_copy_path(cr);
-
- if(nullptr != pStroke)
- {
- maStroke = *pStroke;
- }
- }
-}
-
-SystemDependentData_CairoPath::~SystemDependentData_CairoPath()
-{
- if(nullptr != mpCairoPath)
- {
- cairo_path_destroy(mpCairoPath);
- mpCairoPath = nullptr;
- }
-}
-
-sal_Int64 SystemDependentData_CairoPath::estimateUsageInBytes() const
-{
- // tdf#129845 by using the default return value of zero when no path
- // was created, SystemDependentData::calculateCombinedHoldCyclesInSeconds
- // will do the right thing and not buffer this entry at all
- sal_Int64 nRetval(0);
-
- if(nullptr != mpCairoPath)
- {
- // per node
- // - num_data incarnations of
- // - sizeof(cairo_path_data_t) which is a union of defines and point data
- // thus may 2 x sizeof(double)
- nRetval = mpCairoPath->num_data * sizeof(cairo_path_data_t);
- }
-
- return nRetval;
-}
-
bool SvpSalGraphics::drawPolyLine(
const basegfx::B2DHomMatrix& rObjectToDevice,
const basegfx::B2DPolygon& rPolyLine,
@@ -1380,122 +1253,6 @@ bool SvpSalGraphics::drawPolyPolygonBezier( sal_uInt32,
return false;
}
-namespace
-{
- void add_polygon_path(cairo_t* cr, const basegfx::B2DPolyPolygon& rPolyPolygon, const basegfx::B2DHomMatrix& rObjectToDevice, bool bPixelSnap)
- {
- // try to access buffered data
- std::shared_ptr<SystemDependentData_CairoPath> pSystemDependentData_CairoPath(
- rPolyPolygon.getSystemDependentData<SystemDependentData_CairoPath>());
-
- if(pSystemDependentData_CairoPath)
- {
- // re-use data
- cairo_append_path(cr, pSystemDependentData_CairoPath->getCairoPath());
- }
- else
- {
- // create data
- size_t nSizeMeasure(0);
-
- for (const auto & rPoly : rPolyPolygon)
- {
- // PixelOffset used: Was dependent of 'm_aLineColor != SALCOLOR_NONE'
- // Adapt setupPolyPolygon-users to set a linear transformation to achieve PixelOffset
- nSizeMeasure += AddPolygonToPath(
- cr,
- rPoly,
- rObjectToDevice,
- bPixelSnap,
- false);
- }
-
- // copy and add to buffering mechanism
- // for decisions how/what to buffer, see Note in WinSalGraphicsImpl::drawPolyPolygon
- pSystemDependentData_CairoPath = rPolyPolygon.addOrReplaceSystemDependentData<SystemDependentData_CairoPath>(
- ImplGetSystemDependentDataManager(),
- nSizeMeasure,
- cr,
- false,
- false,
- nullptr);
- }
- }
-}
-
-bool SvpSalGraphics::drawPolyPolygon(
- const basegfx::B2DHomMatrix& rObjectToDevice,
- const basegfx::B2DPolyPolygon& rPolyPolygon,
- double fTransparency)
-{
- const bool bHasFill(m_aCairoCommon.m_aFillColor != SALCOLOR_NONE);
- const bool bHasLine(m_aCairoCommon.m_aLineColor != SALCOLOR_NONE);
-
- if(0 == rPolyPolygon.count() || !(bHasFill || bHasLine) || fTransparency < 0.0 || fTransparency >= 1.0)
- {
- return true;
- }
-
- cairo_t* cr = m_aCairoCommon.getCairoContext(true, getAntiAlias());
- clipRegion(cr);
-
- // Set full (Object-to-Device) transformation - if used
- if(!rObjectToDevice.isIdentity())
- {
- cairo_matrix_t aMatrix;
-
- cairo_matrix_init(
- &aMatrix,
- rObjectToDevice.get( 0, 0 ),
- rObjectToDevice.get( 1, 0 ),
- rObjectToDevice.get( 0, 1 ),
- rObjectToDevice.get( 1, 1 ),
- rObjectToDevice.get( 0, 2 ),
- rObjectToDevice.get( 1, 2 ));
- cairo_set_matrix(cr, &aMatrix);
- }
-
- // To make releaseCairoContext work, use empty extents
- basegfx::B2DRange extents;
-
- if (bHasFill)
- {
- add_polygon_path(cr, rPolyPolygon, rObjectToDevice, !getAntiAlias());
-
- m_aCairoCommon.applyColor(cr, m_aCairoCommon.m_aFillColor, fTransparency);
- // Get FillDamage (will be extended for LineDamage below)
- extents = getClippedFillDamage(cr);
-
- cairo_fill(cr);
- }
-
- if (bHasLine)
- {
- // PixelOffset used: Set PixelOffset as linear transformation
- cairo_matrix_t aMatrix;
- cairo_matrix_init_translate(&aMatrix, 0.5, 0.5);
- cairo_set_matrix(cr, &aMatrix);
-
- add_polygon_path(cr, rPolyPolygon, rObjectToDevice, !getAntiAlias());
-
- m_aCairoCommon.applyColor(cr, m_aCairoCommon.m_aLineColor, fTransparency);
-
- // expand with possible StrokeDamage
- basegfx::B2DRange stroke_extents = getClippedStrokeDamage(cr);
- stroke_extents.transform(basegfx::utils::createTranslateB2DHomMatrix(0.5, 0.5));
- extents.expand(stroke_extents);
-
- cairo_stroke(cr);
- }
-
- // if transformation has been applied, transform also extents (ranges)
- // of damage so they can be correctly redrawn
- extents.transform(rObjectToDevice);
- m_aCairoCommon.releaseCairoContext(cr, true, extents);
-
- return true;
-}
-
bool SvpSalGraphics::drawGradient(const tools::PolyPolygon& rPolyPolygon, const Gradient& rGradient)
{
if (rGradient.GetStyle() != GradientStyle::Linear