Author: alg Date: Thu Jul 24 11:28:28 2014 New Revision: 1613069 URL: http://svn.apache.org/r1613069 Log: i125300 enhanced handling of multiple ClipRegions in MetafileProcessor
Modified: openoffice/branches/AOO410/main/drawinglayer/ (props changed) openoffice/branches/AOO410/main/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx Propchange: openoffice/branches/AOO410/main/drawinglayer/ ------------------------------------------------------------------------------ --- svn:mergeinfo (added) +++ svn:mergeinfo Thu Jul 24 11:28:28 2014 @@ -0,0 +1,5 @@ +/openoffice/branches/AOO400/main/drawinglayer:1503684 +/openoffice/branches/ia2/main/drawinglayer:1417739-1541842 +/openoffice/branches/ooxml-osba/main/drawinglayer:1546391,1546395,1546574,1546934,1547030,1547392,1551920,1551954,1551958,1552283 +/openoffice/branches/rejuvenate01/main/drawinglayer:1480411,1534063,1534098,1536312,1549902,1560617 +/openoffice/trunk/main/drawinglayer:1571617,1571677,1572569,1572577,1574058,1574101,1575922,1576216,1576748,1578786,1579934,1580657,1580779,1581746,1581840,1582359,1582365,1582709,1583336,1583418,1583589,1583988,1585261,1586242,1586249,1586583,1587468,1589050,1592692,1592716,1594206,1595847,1595851,1595858,1596218,1596491,1596494,1597076,1597102,1597109,1599169,1599173-1599174,1600581,1600587,1600590,1600630,1600861,1600863,1600883,1602434,1602823,1602850,1603416,1603897,1612866 Modified: openoffice/branches/AOO410/main/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/AOO410/main/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx?rev=1613069&r1=1613068&r2=1613069&view=diff ============================================================================== --- openoffice/branches/AOO410/main/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx (original) +++ openoffice/branches/AOO410/main/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx Thu Jul 24 11:28:28 2014 @@ -1724,20 +1724,55 @@ namespace drawinglayer // prepare new mask polygon and rescue current one aMask.transform(maCurrentTransformation); const basegfx::B2DPolyPolygon aLastClipPolyPolygon(maClipPolyPolygon); - + if(maClipPolyPolygon.count()) { - // there is already a clip polygon set; build clipped union of - // current mask polygon and new one - maClipPolyPolygon = basegfx::tools::clipPolyPolygonOnPolyPolygon( - aMask, - maClipPolyPolygon, - true, // #i106516# we want the inside of aMask, not the outside - false); + // due to the cost of PolyPolygon clipping and numerical reasons try first if the current + // and the new ClipRegion are ranges. If yes, processing can be simplified + if(basegfx::tools::isRectangle(aMask) + && basegfx::tools::isRectangle(maClipPolyPolygon)) + { + // both ClipPolygons are rectangles + if(aMask.getB2DRange().equal(maClipPolyPolygon.getB2DRange())) + { + // equal -> no change in ClipRegion needed, leave + // maClipPolyPolygon unchanged + } + else + { + // not equal -> create new ClipRegion from the two ranges + basegfx::B2DRange aClipRange(aMask.getB2DRange()); + + aClipRange.intersect(maClipPolyPolygon.getB2DRange()); + + if(aClipRange.isEmpty()) + { + // no common ClipRegion -> set empty ClipRegion, no content to show + maClipPolyPolygon.clear(); + } + else + { + // use common ClipRegion as new ClipRegion + maClipPolyPolygon = basegfx::B2DPolyPolygon( + basegfx::tools::createPolygonFromRect(aClipRange)); + } + } + } + else + { + // The current ClipRegion or the new one is not a rectangle; + // there is already a clip polygon set; build clipped union of + // current mask polygon and new one + maClipPolyPolygon = basegfx::tools::clipPolyPolygonOnPolyPolygon( + aMask, + maClipPolyPolygon, + true, // #i106516# we want the inside of aMask, not the outside + false); + } } else { - // use mask directly + // use new mask directly as ClipRegion maClipPolyPolygon = aMask; } @@ -1746,8 +1781,13 @@ namespace drawinglayer // set VCL clip region; subdivide before conversion to tools polygon. Subdivision necessary (!) // Removed subdivision and fixed in Region::ImplPolyPolyRegionToBandRegionFunc() in VCL where // the ClipRegion is built from the Polygon. A AdaptiveSubdivide on the source polygon was missing there - mpOutputDevice->Push(PUSH_CLIPREGION); - mpOutputDevice->SetClipRegion(Region(maClipPolyPolygon)); + const bool bNewClipRegion(maClipPolyPolygon != aLastClipPolyPolygon); + + if(bNewClipRegion) + { + mpOutputDevice->Push(PUSH_CLIPREGION); + mpOutputDevice->SetClipRegion(Region(maClipPolyPolygon)); + } // recursively paint content // #121267# Only need to process sub-content when clip polygon is *not* empty. @@ -1755,7 +1795,10 @@ namespace drawinglayer process(rMaskCandidate.getChildren()); // restore VCL clip region - mpOutputDevice->Pop(); + if(bNewClipRegion) + { + mpOutputDevice->Pop(); + } } // restore to rescued clip polygon