summaryrefslogtreecommitdiff
path: root/svgio/source/svgreader/svgclippathnode.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svgio/source/svgreader/svgclippathnode.cxx')
-rw-r--r--svgio/source/svgreader/svgclippathnode.cxx230
1 files changed, 115 insertions, 115 deletions
diff --git a/svgio/source/svgreader/svgclippathnode.cxx b/svgio/source/svgreader/svgclippathnode.cxx
index bda50ab3777f..090a795da3ac 100644
--- a/svgio/source/svgreader/svgclippathnode.cxx
+++ b/svgio/source/svgreader/svgclippathnode.cxx
@@ -103,23 +103,23 @@ namespace svgio
// decompose children
SvgNode::decomposeSvgNode(aNewTarget, bReferenced);
- if(!aNewTarget.empty())
+ if(aNewTarget.empty())
+ return;
+
+ if(getTransform())
{
- if(getTransform())
- {
- // create embedding group element with transformation
- const drawinglayer::primitive2d::Primitive2DReference xRef(
- new drawinglayer::primitive2d::TransformPrimitive2D(
- *getTransform(),
- aNewTarget));
+ // create embedding group element with transformation
+ const drawinglayer::primitive2d::Primitive2DReference xRef(
+ new drawinglayer::primitive2d::TransformPrimitive2D(
+ *getTransform(),
+ aNewTarget));
- rTarget.push_back(xRef);
- }
- else
- {
- // append to current target
- rTarget.append(aNewTarget);
- }
+ rTarget.push_back(xRef);
+ }
+ else
+ {
+ // append to current target
+ rTarget.append(aNewTarget);
}
}
@@ -127,132 +127,132 @@ namespace svgio
drawinglayer::primitive2d::Primitive2DContainer& rContent,
const basegfx::B2DHomMatrix* pTransform) const
{
- if(!rContent.empty() && Display_none != getDisplay())
- {
- const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
- drawinglayer::primitive2d::Primitive2DContainer aClipTarget;
- basegfx::B2DPolyPolygon aClipPolyPolygon;
+ if(!(!rContent.empty() && Display_none != getDisplay()))
+ return;
- // get clipPath definition as primitives
- decomposeSvgNode(aClipTarget, true);
+ const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
+ drawinglayer::primitive2d::Primitive2DContainer aClipTarget;
+ basegfx::B2DPolyPolygon aClipPolyPolygon;
- if(!aClipTarget.empty())
- {
- // extract filled polygons as base for a mask PolyPolygon
- drawinglayer::processor2d::ContourExtractor2D aExtractor(aViewInformation2D, true);
+ // get clipPath definition as primitives
+ decomposeSvgNode(aClipTarget, true);
- aExtractor.process(aClipTarget);
+ if(!aClipTarget.empty())
+ {
+ // extract filled polygons as base for a mask PolyPolygon
+ drawinglayer::processor2d::ContourExtractor2D aExtractor(aViewInformation2D, true);
- const basegfx::B2DPolyPolygonVector& rResult(aExtractor.getExtractedContour());
- const sal_uInt32 nSize(rResult.size());
+ aExtractor.process(aClipTarget);
- if(nSize > 1)
- {
- // merge to single clipPolyPolygon
- aClipPolyPolygon = basegfx::utils::mergeToSinglePolyPolygon(rResult);
- }
- else
- {
- aClipPolyPolygon = rResult[0];
- }
+ const basegfx::B2DPolyPolygonVector& rResult(aExtractor.getExtractedContour());
+ const sal_uInt32 nSize(rResult.size());
+
+ if(nSize > 1)
+ {
+ // merge to single clipPolyPolygon
+ aClipPolyPolygon = basegfx::utils::mergeToSinglePolyPolygon(rResult);
+ }
+ else
+ {
+ aClipPolyPolygon = rResult[0];
}
+ }
- if(aClipPolyPolygon.count())
+ if(aClipPolyPolygon.count())
+ {
+ if(objectBoundingBox == getClipPathUnits())
{
- if(objectBoundingBox == getClipPathUnits())
- {
- // clip is object-relative, transform using content transformation
- const basegfx::B2DRange aContentRange(rContent.getB2DRange(aViewInformation2D));
+ // clip is object-relative, transform using content transformation
+ const basegfx::B2DRange aContentRange(rContent.getB2DRange(aViewInformation2D));
- aClipPolyPolygon.transform(
- basegfx::utils::createScaleTranslateB2DHomMatrix(
- aContentRange.getRange(),
- aContentRange.getMinimum()));
- }
- else // userSpaceOnUse
+ aClipPolyPolygon.transform(
+ basegfx::utils::createScaleTranslateB2DHomMatrix(
+ aContentRange.getRange(),
+ aContentRange.getMinimum()));
+ }
+ else // userSpaceOnUse
+ {
+ // #i124852#
+ if(pTransform)
{
- // #i124852#
- if(pTransform)
- {
- aClipPolyPolygon.transform(*pTransform);
- }
+ aClipPolyPolygon.transform(*pTransform);
}
+ }
- // #i124313# try to avoid creating an embedding to a MaskPrimitive2D if
- // possible; MaskPrimitive2D processing is potentially expensive
- bool bCreateEmbedding(true);
- bool bAddContent(true);
-
- if(basegfx::utils::isRectangle(aClipPolyPolygon))
- {
- // ClipRegion is a rectangle, thus it is not expensive to tell
- // if the content is completely inside or outside of it; get ranges
- const basegfx::B2DRange aClipRange(aClipPolyPolygon.getB2DRange());
- const basegfx::B2DRange aContentRange(
- rContent.getB2DRange(
- aViewInformation2D));
+ // #i124313# try to avoid creating an embedding to a MaskPrimitive2D if
+ // possible; MaskPrimitive2D processing is potentially expensive
+ bool bCreateEmbedding(true);
+ bool bAddContent(true);
- if(aClipRange.isInside(aContentRange))
- {
- // completely contained, no need to clip at all, so no need for embedding
- bCreateEmbedding = false;
- }
- else if(aClipRange.overlaps(aContentRange))
- {
- // overlap; embedding needed. ClipRegion can be minimized by using
- // the intersection of the ClipRange and the ContentRange. Minimizing
- // the ClipRegion potentially enhances further processing since
- // usually clip operations are expensive.
- basegfx::B2DRange aCommonRange(aContentRange);
+ if(basegfx::utils::isRectangle(aClipPolyPolygon))
+ {
+ // ClipRegion is a rectangle, thus it is not expensive to tell
+ // if the content is completely inside or outside of it; get ranges
+ const basegfx::B2DRange aClipRange(aClipPolyPolygon.getB2DRange());
+ const basegfx::B2DRange aContentRange(
+ rContent.getB2DRange(
+ aViewInformation2D));
- aCommonRange.intersect(aClipRange);
- aClipPolyPolygon = basegfx::B2DPolyPolygon(basegfx::utils::createPolygonFromRect(aCommonRange));
- }
- else
- {
- // not inside and no overlap -> completely outside
- // no need for embedding, no need for content at all
- bCreateEmbedding = false;
- bAddContent = false;
- }
- }
- else
+ if(aClipRange.isInside(aContentRange))
{
- // ClipRegion is not a simple rectangle, it would be possible but expensive to
- // tell if the content needs clipping or not. It is also dependent of
- // the content's decomposition. To do this, a processor would be needed that
- // is capable if processing the given sequence of primitives and decide
- // if all is inside or all is outside. Such a ClipProcessor could be written,
- // but for now just create the embedding
+ // completely contained, no need to clip at all, so no need for embedding
+ bCreateEmbedding = false;
}
-
- if(bCreateEmbedding)
+ else if(aClipRange.overlaps(aContentRange))
{
- // 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
- const drawinglayer::primitive2d::Primitive2DReference xEmbedTransparence(
- new drawinglayer::primitive2d::MaskPrimitive2D(
- aClipPolyPolygon,
- rContent));
+ // overlap; embedding needed. ClipRegion can be minimized by using
+ // the intersection of the ClipRange and the ContentRange. Minimizing
+ // the ClipRegion potentially enhances further processing since
+ // usually clip operations are expensive.
+ basegfx::B2DRange aCommonRange(aContentRange);
- rContent = drawinglayer::primitive2d::Primitive2DContainer { xEmbedTransparence };
+ aCommonRange.intersect(aClipRange);
+ aClipPolyPolygon = basegfx::B2DPolyPolygon(basegfx::utils::createPolygonFromRect(aCommonRange));
}
else
{
- if(!bAddContent)
- {
- rContent.clear();
- }
+ // not inside and no overlap -> completely outside
+ // no need for embedding, no need for content at all
+ bCreateEmbedding = false;
+ bAddContent = false;
}
}
else
{
- // An empty clipping path will completely clip away the element that had
- // the clip-path property applied. (Svg spec)
- rContent.clear();
+ // ClipRegion is not a simple rectangle, it would be possible but expensive to
+ // tell if the content needs clipping or not. It is also dependent of
+ // the content's decomposition. To do this, a processor would be needed that
+ // is capable if processing the given sequence of primitives and decide
+ // if all is inside or all is outside. Such a ClipProcessor could be written,
+ // but for now just create the embedding
}
+
+ if(bCreateEmbedding)
+ {
+ // 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
+ const drawinglayer::primitive2d::Primitive2DReference xEmbedTransparence(
+ new drawinglayer::primitive2d::MaskPrimitive2D(
+ aClipPolyPolygon,
+ rContent));
+
+ rContent = drawinglayer::primitive2d::Primitive2DContainer { xEmbedTransparence };
+ }
+ else
+ {
+ if(!bAddContent)
+ {
+ rContent.clear();
+ }
+ }
+ }
+ else
+ {
+ // An empty clipping path will completely clip away the element that had
+ // the clip-path property applied. (Svg spec)
+ rContent.clear();
}
}