Kaydet (Commit) 6ef84224 authored tarafından Armin Le Grand's avatar Armin Le Grand

#118730# Changed SvgClipPathNode to use MaskPrimitive2D for primitive…

#118730# Changed SvgClipPathNode to use MaskPrimitive2D for primitive representation instead of TransparencePrimitive2D
üst 2926a571
...@@ -46,11 +46,16 @@ namespace drawinglayer ...@@ -46,11 +46,16 @@ namespace drawinglayer
/// the extracted contour /// the extracted contour
basegfx::B2DPolyPolygonVector maExtractedContour; basegfx::B2DPolyPolygonVector maExtractedContour;
/// bitfield
bool mbExtractFillOnly : 1;
/// tooling methods /// tooling methods
void processBasePrimitive2D(const primitive2d::BasePrimitive2D& rCandidate); void processBasePrimitive2D(const primitive2d::BasePrimitive2D& rCandidate);
public: public:
ContourExtractor2D(const geometry::ViewInformation2D& rViewInformation); ContourExtractor2D(
const geometry::ViewInformation2D& rViewInformation,
bool bExtractFillOnly);
virtual ~ContourExtractor2D(); virtual ~ContourExtractor2D();
const basegfx::B2DPolyPolygonVector& getExtractedContour() const { return maExtractedContour; } const basegfx::B2DPolyPolygonVector& getExtractedContour() const { return maExtractedContour; }
......
...@@ -46,9 +46,12 @@ namespace drawinglayer ...@@ -46,9 +46,12 @@ namespace drawinglayer
{ {
namespace processor2d namespace processor2d
{ {
ContourExtractor2D::ContourExtractor2D(const geometry::ViewInformation2D& rViewInformation) ContourExtractor2D::ContourExtractor2D(
const geometry::ViewInformation2D& rViewInformation,
bool bExtractFillOnly)
: BaseProcessor2D(rViewInformation), : BaseProcessor2D(rViewInformation),
maExtractedContour() maExtractedContour(),
mbExtractFillOnly(bExtractFillOnly)
{ {
} }
...@@ -61,6 +64,8 @@ namespace drawinglayer ...@@ -61,6 +64,8 @@ namespace drawinglayer
switch(rCandidate.getPrimitive2DID()) switch(rCandidate.getPrimitive2DID())
{ {
case PRIMITIVE2D_ID_POLYGONHAIRLINEPRIMITIVE2D : case PRIMITIVE2D_ID_POLYGONHAIRLINEPRIMITIVE2D :
{
if(!mbExtractFillOnly)
{ {
// extract hairline in world coordinates // extract hairline in world coordinates
const primitive2d::PolygonHairlinePrimitive2D& rPolygonCandidate(static_cast< const primitive2d::PolygonHairlinePrimitive2D& >(rCandidate)); const primitive2d::PolygonHairlinePrimitive2D& rPolygonCandidate(static_cast< const primitive2d::PolygonHairlinePrimitive2D& >(rCandidate));
...@@ -75,6 +80,7 @@ namespace drawinglayer ...@@ -75,6 +80,7 @@ namespace drawinglayer
} }
maExtractedContour.push_back(basegfx::B2DPolyPolygon(aLocalPolygon)); maExtractedContour.push_back(basegfx::B2DPolyPolygon(aLocalPolygon));
}
break; break;
} }
case PRIMITIVE2D_ID_POLYPOLYGONCOLORPRIMITIVE2D : case PRIMITIVE2D_ID_POLYPOLYGONCOLORPRIMITIVE2D :
......
...@@ -24,9 +24,11 @@ ...@@ -24,9 +24,11 @@
#include <svgio/svgreader/svgclippathnode.hxx> #include <svgio/svgreader/svgclippathnode.hxx>
#include <drawinglayer/primitive2d/transformprimitive2d.hxx> #include <drawinglayer/primitive2d/transformprimitive2d.hxx>
#include <drawinglayer/primitive2d/transparenceprimitive2d.hxx> #include <drawinglayer/primitive2d/maskprimitive2d.hxx>
#include <basegfx/matrix/b2dhommatrixtools.hxx> #include <basegfx/matrix/b2dhommatrixtools.hxx>
#include <drawinglayer/geometry/viewinformation2d.hxx> #include <drawinglayer/geometry/viewinformation2d.hxx>
#include <drawinglayer/processor2d/contourextractor2d.hxx>
#include <basegfx/polygon/b2dpolypolygoncutter.hxx>
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
...@@ -133,39 +135,58 @@ namespace svgio ...@@ -133,39 +135,58 @@ namespace svgio
{ {
if(rContent.hasElements()) if(rContent.hasElements())
{ {
const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
drawinglayer::primitive2d::Primitive2DSequence aClipTarget; drawinglayer::primitive2d::Primitive2DSequence aClipTarget;
basegfx::B2DPolyPolygon aClipPolyPolygon;
// get clipPath definition as primitives // get clipPath definition as primitives
decomposeSvgNode(aClipTarget, true); decomposeSvgNode(aClipTarget, true);
if(aClipTarget.hasElements()) if(aClipTarget.hasElements())
{
// extract filled plygons as base for a mask PolyPolygon
drawinglayer::processor2d::ContourExtractor2D aExtractor(aViewInformation2D, true);
aExtractor.process(aClipTarget);
const basegfx::B2DPolyPolygonVector& rResult(aExtractor.getExtractedContour());
const sal_uInt32 nSize(rResult.size());
if(nSize > 1)
{
// merge to single clipPolyPolygon
aClipPolyPolygon = basegfx::tools::mergeToSinglePolyPolygon(rResult);
}
else
{
aClipPolyPolygon = rResult[0];
}
}
if(aClipPolyPolygon.count())
{ {
if(objectBoundingBox == getClipPathUnits()) if(objectBoundingBox == getClipPathUnits())
{ {
// clip is object-relative, embed in content transformation // clip is object-relative, transform using content transformation
const basegfx::B2DRange aContentRange( const basegfx::B2DRange aContentRange(
drawinglayer::primitive2d::getB2DRangeFromPrimitive2DSequence( drawinglayer::primitive2d::getB2DRangeFromPrimitive2DSequence(
rContent, rContent,
drawinglayer::geometry::ViewInformation2D())); aViewInformation2D));
const drawinglayer::primitive2d::Primitive2DReference xTransform( aClipPolyPolygon.transform(
new drawinglayer::primitive2d::TransformPrimitive2D(
basegfx::tools::createScaleTranslateB2DHomMatrix( basegfx::tools::createScaleTranslateB2DHomMatrix(
aContentRange.getRange(), aContentRange.getRange(),
aContentRange.getMinimum()), aContentRange.getMinimum()));
aClipTarget));
aClipTarget = drawinglayer::primitive2d::Primitive2DSequence(&xTransform, 1);
} }
// redefine target. Use TransparencePrimitive2D with created clip // redefine target. Use MaskPrimitive2D with created clip
// geometry. Using the automatically set mbIsClipPathContent at // geometry. Using the automatically set mbIsClipPathContent at
// SvgStyleAttributes the clip definition is without fill, stroke, // SvgStyleAttributes the clip definition is without fill, stroke,
// and strokeWidth and forced to black, thus being 100% opaque // and strokeWidth and forced to black
const drawinglayer::primitive2d::Primitive2DReference xEmbedTransparence( const drawinglayer::primitive2d::Primitive2DReference xEmbedTransparence(
new drawinglayer::primitive2d::TransparencePrimitive2D( new drawinglayer::primitive2d::MaskPrimitive2D(
rContent, aClipPolyPolygon,
aClipTarget)); rContent));
rContent = drawinglayer::primitive2d::Primitive2DSequence(&xEmbedTransparence, 1); rContent = drawinglayer::primitive2d::Primitive2DSequence(&xEmbedTransparence, 1);
} }
......
...@@ -1200,8 +1200,8 @@ basegfx::B2DPolyPolygon SdrObject::TakeContour() const ...@@ -1200,8 +1200,8 @@ basegfx::B2DPolyPolygon SdrObject::TakeContour() const
// use neutral ViewInformation // use neutral ViewInformation
const drawinglayer::geometry::ViewInformation2D aViewInformation2D; const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
// create extractor, process and get result // create extractor, process and get result (with hairlines as opened polygons)
drawinglayer::processor2d::ContourExtractor2D aExtractor(aViewInformation2D); drawinglayer::processor2d::ContourExtractor2D aExtractor(aViewInformation2D, false);
aExtractor.process(xSequence); aExtractor.process(xSequence);
const basegfx::B2DPolyPolygonVector& rResult(aExtractor.getExtractedContour()); const basegfx::B2DPolyPolygonVector& rResult(aExtractor.getExtractedContour());
const sal_uInt32 nSize(rResult.size()); const sal_uInt32 nSize(rResult.size());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment