LibreOffice Module svgio (master) 1
svgvisitor.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 */
10
11#include <sal/config.h>
12
13#include <svgrectnode.hxx>
14#include <svgsvgnode.hxx>
15#include <svgpathnode.hxx>
16#include <svggradientnode.hxx>
17
18#include <svgvisitor.hxx>
19
20namespace svgio::svgreader
21{
23 : mpDrawRoot(std::make_shared<gfx::DrawRoot>())
24 , mpCurrent(mpDrawRoot)
25{
26}
27
29{
30 switch (rNode.getType())
31 {
33 {
34 auto const& rSvgNode = static_cast<svgio::svgreader::SvgSvgNode const&>(rNode);
35
36 basegfx::B2DRange aRange = rSvgNode.getCurrentViewPort();
37
38 static_cast<gfx::DrawRoot*>(mpCurrent.get())->maRectangle = aRange;
39 }
40 break;
42 {
43 auto const& rRectNode = static_cast<svgio::svgreader::SvgRectNode const&>(rNode);
44
45 double x = rRectNode.getX().getNumber();
46 double y = rRectNode.getY().getNumber();
47 double w = rRectNode.getWidth().getNumber();
48 double h = rRectNode.getHeight().getNumber();
49
50 auto pRectangle
51 = std::make_shared<gfx::DrawRectangle>(basegfx::B2DRange(x, y, x + w, y + h));
52 pRectangle->mnRx = rRectNode.getRx().getNumber();
53 pRectangle->mnRy = rRectNode.getRy().getNumber();
54
55 pRectangle->mnStrokeWidth
56 = rRectNode.getSvgStyleAttributes()->getStrokeWidth().getNumber();
57
58 pRectangle->mnOpacity = rRectNode.getSvgStyleAttributes()->getOpacity().getNumber();
59
60 const basegfx::BColor* pFillColor = rRectNode.getSvgStyleAttributes()->getFill();
61 const SvgGradientNode* pFillGradient
63 if (pFillColor)
64 {
65 pRectangle->mpFillColor = std::make_shared<basegfx::BColor>(*pFillColor);
66 }
67 else if (pFillGradient)
68 {
70 pFillGradient->collectGradientEntries(aSvgGradientEntryVector);
71 if (!aSvgGradientEntryVector.empty())
72 {
73 auto aGradientInfo = std::make_shared<gfx::LinearGradientInfo>();
74
75 aGradientInfo->x1 = pFillGradient->getX1().getNumber();
76 aGradientInfo->y1 = pFillGradient->getY1().getNumber();
77 aGradientInfo->x2 = pFillGradient->getX2().getNumber();
78 aGradientInfo->y2 = pFillGradient->getY2().getNumber();
79
80 std::optional<basegfx::B2DHomMatrix> pGradientTransform
81 = pFillGradient->getGradientTransform();
82 if (pGradientTransform)
83 {
84 aGradientInfo->maMatrix = *pGradientTransform;
85 }
86
87 pRectangle->mpFillGradient = aGradientInfo;
88
89 for (auto const& rEntry : aSvgGradientEntryVector)
90 {
92 aStop.maColor = rEntry.getColor();
93 aStop.mfOffset = rEntry.getOffset();
94 aStop.mfOpacity = rEntry.getOpacity();
95 pRectangle->mpFillGradient->maGradientStops.push_back(aStop);
96 }
97 }
98 }
99
100 const basegfx::BColor* pStrokeColor = rRectNode.getSvgStyleAttributes()->getStroke();
101 if (pStrokeColor)
102 pRectangle->mpStrokeColor = std::make_shared<basegfx::BColor>(*pStrokeColor);
103
104 mpCurrent->maChildren.push_back(pRectangle);
105 }
106 break;
108 {
109 auto const& rPathNode = static_cast<svgio::svgreader::SvgPathNode const&>(rNode);
110
111 auto pPath = rPathNode.getPath();
112 if (pPath)
113 {
114 auto pDrawPath = std::make_shared<gfx::DrawPath>(*pPath);
115
116 pDrawPath->mnStrokeWidth
117 = rPathNode.getSvgStyleAttributes()->getStrokeWidth().getNumber();
118
119 pDrawPath->mnOpacity = rPathNode.getSvgStyleAttributes()->getOpacity().getNumber();
120
121 const basegfx::BColor* pFillColor = rPathNode.getSvgStyleAttributes()->getFill();
122 if (pFillColor)
123 pDrawPath->mpFillColor = std::make_shared<basegfx::BColor>(*pFillColor);
124
125 const basegfx::BColor* pStrokeColor
126 = rPathNode.getSvgStyleAttributes()->getStroke();
127 if (pStrokeColor)
128 pDrawPath->mpStrokeColor = std::make_shared<basegfx::BColor>(*pStrokeColor);
129
130 mpCurrent->maChildren.push_back(pDrawPath);
131 }
132 }
133 break;
134
135 default:
136 break;
137 }
138 goToChildren(rNode);
139}
140
142{
143 for (auto& rChild : rNode.getChildren())
144 {
145 rChild->accept(*this);
146 }
147}
148} // end of namespace svgio::svgreader
149
150/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
basegfx::BColor maColor
void visit(svgio::svgreader::SvgNode const &rNode) override
Definition: svgvisitor.cxx:28
void goToChildren(svgio::svgreader::SvgNode const &rNode)
Definition: svgvisitor.cxx:141
std::shared_ptr< gfx::DrawBase > mpCurrent
Definition: svgvisitor.hxx:23
SvgNumber getY2() const
y2 content
SvgNumber getX1() const
x1 content
void collectGradientEntries(drawinglayer::primitive2d::SvgGradientEntryVector &aVector) const
collect gradient stop entries
SvgNumber getX2() const
x2 content
SvgNumber getY1() const
y1 content
virtual const SvgStyleAttributes * getSvgStyleAttributes() const override
std::optional< basegfx::B2DHomMatrix > getGradientTransform() const
transform content, set if found in current context
const std::vector< std::unique_ptr< SvgNode > > & getChildren() const
Definition: svgnode.hxx:159
SVGToken getType() const
basic data read access
Definition: svgnode.hxx:156
double getNumber() const
Definition: SvgNumber.hxx:85
const std::optional< basegfx::B2DPolyPolygon > & getPath() const
path content, set if found in current context
Definition: svgpathnode.hxx:54
const SvgGradientNode * getSvgGradientNodeFill() const
access to evtl. set fill gradient
float y
float x
::std::vector< SvgGradientEntry > SvgGradientEntryVector
std::shared_ptr< T > make_shared(Args &&... args)
sal_Int32 h
sal_Int32 w