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
/// the extracted contour
basegfx::B2DPolyPolygonVector maExtractedContour;
/// bitfield
bool mbExtractFillOnly : 1;
/// tooling methods
void processBasePrimitive2D(const primitive2d::BasePrimitive2D& rCandidate);
public:
ContourExtractor2D(const geometry::ViewInformation2D& rViewInformation);
ContourExtractor2D(
const geometry::ViewInformation2D& rViewInformation,
bool bExtractFillOnly);
virtual ~ContourExtractor2D();
const basegfx::B2DPolyPolygonVector& getExtractedContour() const { return maExtractedContour; }
......
......@@ -46,9 +46,12 @@ namespace drawinglayer
{
namespace processor2d
{
ContourExtractor2D::ContourExtractor2D(const geometry::ViewInformation2D& rViewInformation)
ContourExtractor2D::ContourExtractor2D(
const geometry::ViewInformation2D& rViewInformation,
bool bExtractFillOnly)
: BaseProcessor2D(rViewInformation),
maExtractedContour()
maExtractedContour(),
mbExtractFillOnly(bExtractFillOnly)
{
}
......@@ -62,19 +65,22 @@ namespace drawinglayer
{
case PRIMITIVE2D_ID_POLYGONHAIRLINEPRIMITIVE2D :
{
// extract hairline in world coordinates
const primitive2d::PolygonHairlinePrimitive2D& rPolygonCandidate(static_cast< const primitive2d::PolygonHairlinePrimitive2D& >(rCandidate));
basegfx::B2DPolygon aLocalPolygon(rPolygonCandidate.getB2DPolygon());
aLocalPolygon.transform(getViewInformation2D().getObjectTransformation());
if(aLocalPolygon.isClosed())
if(!mbExtractFillOnly)
{
// line polygons need to be represented as open polygons to differentiate them
// from filled polygons
basegfx::tools::openWithGeometryChange(aLocalPolygon);
// extract hairline in world coordinates
const primitive2d::PolygonHairlinePrimitive2D& rPolygonCandidate(static_cast< const primitive2d::PolygonHairlinePrimitive2D& >(rCandidate));
basegfx::B2DPolygon aLocalPolygon(rPolygonCandidate.getB2DPolygon());
aLocalPolygon.transform(getViewInformation2D().getObjectTransformation());
if(aLocalPolygon.isClosed())
{
// line polygons need to be represented as open polygons to differentiate them
// from filled polygons
basegfx::tools::openWithGeometryChange(aLocalPolygon);
}
maExtractedContour.push_back(basegfx::B2DPolyPolygon(aLocalPolygon));
}
maExtractedContour.push_back(basegfx::B2DPolyPolygon(aLocalPolygon));
break;
}
case PRIMITIVE2D_ID_POLYPOLYGONCOLORPRIMITIVE2D :
......
......@@ -24,9 +24,11 @@
#include <svgio/svgreader/svgclippathnode.hxx>
#include <drawinglayer/primitive2d/transformprimitive2d.hxx>
#include <drawinglayer/primitive2d/transparenceprimitive2d.hxx>
#include <drawinglayer/primitive2d/maskprimitive2d.hxx>
#include <basegfx/matrix/b2dhommatrixtools.hxx>
#include <drawinglayer/geometry/viewinformation2d.hxx>
#include <drawinglayer/processor2d/contourextractor2d.hxx>
#include <basegfx/polygon/b2dpolypolygoncutter.hxx>
//////////////////////////////////////////////////////////////////////////////
......@@ -133,39 +135,58 @@ namespace svgio
{
if(rContent.hasElements())
{
const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
drawinglayer::primitive2d::Primitive2DSequence aClipTarget;
basegfx::B2DPolyPolygon aClipPolyPolygon;
// get clipPath definition as primitives
decomposeSvgNode(aClipTarget, true);
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())
{
// clip is object-relative, embed in content transformation
// clip is object-relative, transform using content transformation
const basegfx::B2DRange aContentRange(
drawinglayer::primitive2d::getB2DRangeFromPrimitive2DSequence(
rContent,
drawinglayer::geometry::ViewInformation2D()));
const drawinglayer::primitive2d::Primitive2DReference xTransform(
new drawinglayer::primitive2d::TransformPrimitive2D(
basegfx::tools::createScaleTranslateB2DHomMatrix(
aContentRange.getRange(),
aContentRange.getMinimum()),
aClipTarget));
aViewInformation2D));
aClipTarget = drawinglayer::primitive2d::Primitive2DSequence(&xTransform, 1);
aClipPolyPolygon.transform(
basegfx::tools::createScaleTranslateB2DHomMatrix(
aContentRange.getRange(),
aContentRange.getMinimum()));
}
// redefine target. Use TransparencePrimitive2D with created clip
// redefine target. Use MaskPrimitive2D with created clip
// geometry. Using the automatically set mbIsClipPathContent at
// 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(
new drawinglayer::primitive2d::TransparencePrimitive2D(
rContent,
aClipTarget));
new drawinglayer::primitive2d::MaskPrimitive2D(
aClipPolyPolygon,
rContent));
rContent = drawinglayer::primitive2d::Primitive2DSequence(&xEmbedTransparence, 1);
}
......
......@@ -1200,8 +1200,8 @@ basegfx::B2DPolyPolygon SdrObject::TakeContour() const
// use neutral ViewInformation
const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
// create extractor, process and get result
drawinglayer::processor2d::ContourExtractor2D aExtractor(aViewInformation2D);
// create extractor, process and get result (with hairlines as opened polygons)
drawinglayer::processor2d::ContourExtractor2D aExtractor(aViewInformation2D, false);
aExtractor.process(xSequence);
const basegfx::B2DPolyPolygonVector& rResult(aExtractor.getExtractedContour());
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