summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmin Le Grand <Armin.Le.Grand@cib.de>2016-04-13 16:39:42 +0200
committerArmin Le Grand <Armin.Le.Grand@cib.de>2016-04-18 08:23:13 +0000
commitf9578581e61d7c1419e7df84789e25ae0af0aed4 (patch)
treedeb0494e705c01e5e407445412cc9c95689fb6ba
parentfcfe303a68162742b34d71b89078eb680388ca78 (diff)
tdf#40863 only use polygons with area for WinClipRegions
Due to a former fix CustomShapes have extra polygons with a single point in the top-left and bottom-right corner of their BoundRect, a workaround to allow getting their correct BoundRect in slideshow. Unfortunately this makes the win command CreatePolyPolygonRgn fail to create the needed ClipRegions so that the geometry is processed without clipping. Changed to only use polygons as input that have an area. Change-Id: I0eeda5776402777ed00de92f42a55f206575f58b Reviewed-on: https://gerrit.libreoffice.org/24059 Reviewed-by: Noel Grandin <noelgrandin@gmail.com> Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Armin Le Grand <Armin.Le.Grand@cib.de> Reviewed-on: https://gerrit.libreoffice.org/24114
-rw-r--r--vcl/win/source/gdi/gdiimpl.cxx44
1 files changed, 32 insertions, 12 deletions
diff --git a/vcl/win/source/gdi/gdiimpl.cxx b/vcl/win/source/gdi/gdiimpl.cxx
index 89093bb4e288..6ed1f4257d18 100644
--- a/vcl/win/source/gdi/gdiimpl.cxx
+++ b/vcl/win/source/gdi/gdiimpl.cxx
@@ -1148,6 +1148,7 @@ bool WinSalGraphicsImpl::setClipRegion( const vcl::Region& i_rClip )
aPolyPoints.reserve( 1024 );
std::vector< INT > aPolyCounts( nCount, 0 );
basegfx::B2DHomMatrix aExpand;
+ sal_uInt32 nTargetCount(0);
static bool bExpandByOneInXandY(true);
if(bExpandByOneInXandY)
@@ -1164,26 +1165,45 @@ bool WinSalGraphicsImpl::setClipRegion( const vcl::Region& i_rClip )
aPolyPolygon.getB2DPolygon(a),
1));
const sal_uInt32 nPoints(aPoly.count());
- aPolyCounts[a] = nPoints;
- for( sal_uInt32 b = 0; b < nPoints; b++ )
+ // tdf#40863 For CustomShapes there is a hack (see
+ // f64ef72743e55389e446e0d4bc6febd475011023) that adds polygons
+ // with a single point in top-left and bottom-right corner
+ // of the BoundRect to be able to determine the correct BoundRect
+ // in the slideshow. Unfortunately, CreatePolyPolygonRgn below
+ // fails with polygons containing a single pixel, so clipping is
+ // lost. For now, use only polygons with more than two points - the
+ // ones that may have an area.
+ // Note: polygons with one point which are curves may have an area,
+ // but the polygon is already subdivided here, so no need to test
+ // this.
+ if(nPoints > 2)
{
- basegfx::B2DPoint aPt(aPoly.getB2DPoint(b));
+ aPolyCounts[nTargetCount] = nPoints;
+ nTargetCount++;
- if(bExpandByOneInXandY)
+ for( sal_uInt32 b = 0; b < nPoints; b++ )
{
- aPt = aExpand * aPt;
- }
+ basegfx::B2DPoint aPt(aPoly.getB2DPoint(b));
+
+ if(bExpandByOneInXandY)
+ {
+ aPt = aExpand * aPt;
+ }
- POINT aPOINT;
- // #i122149# do correct rounding
- aPOINT.x = basegfx::fround(aPt.getX());
- aPOINT.y = basegfx::fround(aPt.getY());
- aPolyPoints.push_back( aPOINT );
+ POINT aPOINT;
+ // #i122149# do correct rounding
+ aPOINT.x = basegfx::fround(aPt.getX());
+ aPOINT.y = basegfx::fround(aPt.getY());
+ aPolyPoints.push_back( aPOINT );
+ }
}
}
- mrParent.mhRegion = CreatePolyPolygonRgn( &aPolyPoints[0], &aPolyCounts[0], nCount, ALTERNATE );
+ if(nTargetCount)
+ {
+ mrParent.mhRegion = CreatePolyPolygonRgn( &aPolyPoints[0], &aPolyCounts[0], nTargetCount, ALTERNATE );
+ }
}
}
else