summaryrefslogtreecommitdiff
path: root/vcl/headless/svpgdi.cxx
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@collabora.com>2020-01-06 20:49:40 +0000
committerMichael Meeks <michael.meeks@collabora.com>2020-01-07 10:05:59 +0100
commitcebeafbf0f9efde6e17604cf2557b8490e7f5347 (patch)
treed88359970cf7e76b96f82480bc316e3c60f178cc /vcl/headless/svpgdi.cxx
parentbf540873f5e258452fed5006f65a403c95e7872a (diff)
tdf#129845 vcl: avoid expensive system caching of trivial lines & polygons
Interestingly the cache map lookup is rather expensive; why: polyline output for some trivial impress edits: count # of polylines 2 2134 3 141 4 41 9 4 polypolygon output for some trivial impress edits: count # of polypolygons geometry. 3 54 all single polygon 4 583 ~all single 9 52 ~ all paired with a 4 node polygon 13 2 both single 32 22 all single Change-Id: I15c0053a84399eaf153b2119b2c28d1f168f16b1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86314 Tested-by: Jenkins Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Diffstat (limited to 'vcl/headless/svpgdi.cxx')
-rw-r--r--vcl/headless/svpgdi.cxx97
1 files changed, 64 insertions, 33 deletions
diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx
index 1bd55104c491..c792bb98a6b8 100644
--- a/vcl/headless/svpgdi.cxx
+++ b/vcl/headless/svpgdi.cxx
@@ -119,6 +119,18 @@ namespace
aDamageRect.intersect(getClipBox(cr));
return aDamageRect;
}
+
+ // The caching logic is surprsingly expensive - so avoid it sometimes.
+ inline bool isTrivial(const basegfx::B2DPolyPolygon& rPolyPolygon)
+ {
+ return rPolyPolygon.count() == 1 && rPolyPolygon.begin()->count() <= 4;
+ }
+
+ // The caching logic is surprsingly expensive - so avoid it sometimes.
+ inline bool isTrivial(const basegfx::B2DPolygon& rPolyLine)
+ {
+ return rPolyLine.count() <= 4;
+ }
}
bool SvpSalGraphics::blendBitmap( const SalTwoRect&, const SalBitmap& /*rBitmap*/ )
@@ -1279,29 +1291,37 @@ bool SvpSalGraphics::drawPolyLine(
cairo_set_line_width(cr, aLineWidths.getX());
cairo_set_miter_limit(cr, fMiterLimit);
- // try to access buffered data
- std::shared_ptr<SystemDependentData_CairoPath> pSystemDependentData_CairoPath(
- rPolyLine.getSystemDependentData<SystemDependentData_CairoPath>());
+ bool bDone = false;
+ bool bIsTrivial = isTrivial(rPolyLine);
- if(pSystemDependentData_CairoPath)
+ if (!bIsTrivial)
{
- // check data validity
- if(nullptr == pSystemDependentData_CairoPath->getCairoPath()
- || pSystemDependentData_CairoPath->getNoJoin() != bNoJoin
- || pSystemDependentData_CairoPath->getAntiAliasB2DDraw() != bAntiAliasB2DDraw
- || bPixelSnapHairline /*tdf#124700*/ )
+ // try to access buffered data
+ std::shared_ptr<SystemDependentData_CairoPath> pSystemDependentData_CairoPath(
+ rPolyLine.getSystemDependentData<SystemDependentData_CairoPath>());
+
+ if(pSystemDependentData_CairoPath)
{
- // data invalid, forget
- pSystemDependentData_CairoPath.reset();
+ // check data validity
+ if(nullptr == pSystemDependentData_CairoPath->getCairoPath()
+ || pSystemDependentData_CairoPath->getNoJoin() != bNoJoin
+ || pSystemDependentData_CairoPath->getAntiAliasB2DDraw() != bAntiAliasB2DDraw
+ || bPixelSnapHairline /*tdf#124700*/ )
+ {
+ // data invalid, forget
+ pSystemDependentData_CairoPath.reset();
+ }
}
- }
- if(pSystemDependentData_CairoPath)
- {
- // re-use data
- cairo_append_path(cr, pSystemDependentData_CairoPath->getCairoPath());
+ if(pSystemDependentData_CairoPath)
+ {
+ // re-use data
+ cairo_append_path(cr, pSystemDependentData_CairoPath->getCairoPath());
+ bDone = true;
+ }
}
- else
+
+ if (!bDone)
{
// create data
if (!bNoJoin)
@@ -1344,9 +1364,9 @@ bool SvpSalGraphics::drawPolyLine(
}
// copy and add to buffering mechanism
- if (!bPixelSnapHairline /*tdf#124700*/)
+ if (!bIsTrivial && !bPixelSnapHairline /*tdf#124700*/)
{
- pSystemDependentData_CairoPath = rPolyLine.addOrReplaceSystemDependentData<SystemDependentData_CairoPath>(
+ rPolyLine.addOrReplaceSystemDependentData<SystemDependentData_CairoPath>(
ImplGetSystemDependentDataManager(),
cairo_copy_path(cr),
bNoJoin,
@@ -1397,16 +1417,24 @@ 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>());
+ bool bDone = false;
+ bool bIsTrivial = isTrivial(rPolyPolygon);
- if(pSystemDependentData_CairoPath)
+ if (!bIsTrivial)
{
- // re-use data
- cairo_append_path(cr, pSystemDependentData_CairoPath->getCairoPath());
+ // 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());
+ bDone = true;
+ }
}
- else
+
+ if (!bDone)
{
// create data
for (const auto & rPoly : rPolyPolygon)
@@ -1421,13 +1449,16 @@ namespace
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(),
- cairo_copy_path(cr),
- false,
- false);
+ if (!bIsTrivial)
+ {
+ // copy and add to buffering mechanism
+ // for decisions how/what to buffer, see Note in WinSalGraphicsImpl::drawPolyPolygon
+ rPolyPolygon.addOrReplaceSystemDependentData<SystemDependentData_CairoPath>(
+ ImplGetSystemDependentDataManager(),
+ cairo_copy_path(cr),
+ false,
+ false);
+ }
}
}
}