summaryrefslogtreecommitdiffstats
path: root/svgio/source/svgreader/svgsymbolnode.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svgio/source/svgreader/svgsymbolnode.cxx')
-rw-r--r--svgio/source/svgreader/svgsymbolnode.cxx92
1 files changed, 91 insertions, 1 deletions
diff --git a/svgio/source/svgreader/svgsymbolnode.cxx b/svgio/source/svgreader/svgsymbolnode.cxx
index 6e18d4bca0..2f226b841e 100644
--- a/svgio/source/svgreader/svgsymbolnode.cxx
+++ b/svgio/source/svgreader/svgsymbolnode.cxx
@@ -18,6 +18,8 @@
*/
#include <svgsymbolnode.hxx>
+#include <basegfx/matrix/b2dhommatrix.hxx>
+#include <drawinglayer/primitive2d/transformprimitive2d.hxx>
namespace svgio::svgreader
{
@@ -54,9 +56,60 @@ namespace svgio::svgreader
readLocalCssStyle(aContent);
break;
}
+ case SVGToken::X:
+ {
+ SvgNumber aNum;
+
+ if(readSingleNumber(aContent, aNum))
+ {
+ maX = aNum;
+ }
+ break;
+ }
+ case SVGToken::Y:
+ {
+ SvgNumber aNum;
+
+ if(readSingleNumber(aContent, aNum))
+ {
+ maY = aNum;
+ }
+ break;
+ }
+ case SVGToken::Width:
+ {
+ SvgNumber aNum;
+
+ if(readSingleNumber(aContent, aNum))
+ {
+ if(aNum.isPositive())
+ {
+ maWidth = aNum;
+ }
+ }
+ break;
+ }
+ case SVGToken::Height:
+ {
+ SvgNumber aNum;
+
+ if(readSingleNumber(aContent, aNum))
+ {
+ if(aNum.isPositive())
+ {
+ maHeight = aNum;
+ }
+ }
+ break;
+ }
case SVGToken::ViewBox:
{
- readViewBox(aContent, *this);
+ const basegfx::B2DRange aRange(readViewBox(aContent, *this));
+
+ if(!aRange.isEmpty())
+ {
+ setViewBox(&aRange);
+ }
break;
}
case SVGToken::PreserveAspectRatio:
@@ -71,6 +124,43 @@ namespace svgio::svgreader
}
}
+ void SvgSymbolNode::decomposeSvgNode(drawinglayer::primitive2d::Primitive2DContainer& rTarget, bool bReferenced) const
+ {
+ // decompose children
+ SvgNode::decomposeSvgNode(rTarget, bReferenced);
+
+ if (rTarget.empty())
+ return;
+
+ if(getViewBox())
+ {
+ // create mapping
+ // #i122610 SVG 1.1 defines in section 5.1.2 that if the attribute preserveAspectRatio is not specified,
+ // then the effect is as if a value of 'xMidYMid meet' were specified.
+ SvgAspectRatio aRatioDefault(SvgAlign::xMidYMid, true);
+ const SvgAspectRatio& rRatio = getSvgAspectRatio().isSet()? getSvgAspectRatio() : aRatioDefault;
+
+ const double fX(maX.solve(*this, NumberType::xcoordinate));
+ const double fY(maY.solve(*this, NumberType::ycoordinate));
+ const double fWidth(maWidth.solve(*this, NumberType::xcoordinate));
+ const double fHeight(maHeight.solve(*this, NumberType::ycoordinate));
+ const basegfx::B2DRange aRange(fX, fY, fX + fWidth, fY + fHeight);
+
+ // let mapping be created from SvgAspectRatio
+ const basegfx::B2DHomMatrix aEmbeddingTransform(
+ rRatio.createMapping(aRange, *getViewBox()));
+
+ // prepare embedding in transformation
+ // create embedding group element with transformation
+ const drawinglayer::primitive2d::Primitive2DReference xRef(
+ new drawinglayer::primitive2d::TransformPrimitive2D(
+ aEmbeddingTransform,
+ drawinglayer::primitive2d::Primitive2DContainer(rTarget)));
+
+ rTarget.push_back(xRef);
+ }
+ }
+
} // end of namespace svgio::svgreader
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */