xref: /trunk/main/svgio/source/svgreader/svggradientnode.cxx (revision 5036a087cd2df0e03c83d6e345f9bedc29690476)
1ddde725dSArmin Le Grand /**************************************************************
2ddde725dSArmin Le Grand  *
3ddde725dSArmin Le Grand  * Licensed to the Apache Software Foundation (ASF) under one
4ddde725dSArmin Le Grand  * or more contributor license agreements.  See the NOTICE file
5ddde725dSArmin Le Grand  * distributed with this work for additional information
6ddde725dSArmin Le Grand  * regarding copyright ownership.  The ASF licenses this file
7ddde725dSArmin Le Grand  * to you under the Apache License, Version 2.0 (the
8ddde725dSArmin Le Grand  * "License"); you may not use this file except in compliance
9ddde725dSArmin Le Grand  * with the License.  You may obtain a copy of the License at
10ddde725dSArmin Le Grand  *
11ddde725dSArmin Le Grand  *   http://www.apache.org/licenses/LICENSE-2.0
12ddde725dSArmin Le Grand  *
13ddde725dSArmin Le Grand  * Unless required by applicable law or agreed to in writing,
14ddde725dSArmin Le Grand  * software distributed under the License is distributed on an
15ddde725dSArmin Le Grand  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16ddde725dSArmin Le Grand  * KIND, either express or implied.  See the License for the
17ddde725dSArmin Le Grand  * specific language governing permissions and limitations
18ddde725dSArmin Le Grand  * under the License.
19ddde725dSArmin Le Grand  *
20ddde725dSArmin Le Grand  *************************************************************/
21ddde725dSArmin Le Grand 
22ddde725dSArmin Le Grand // MARKER(update_precomp.py): autogen include statement, do not remove
23ddde725dSArmin Le Grand #include "precompiled_svgio.hxx"
24ddde725dSArmin Le Grand 
25ddde725dSArmin Le Grand #include <svgio/svgreader/svggradientnode.hxx>
26ddde725dSArmin Le Grand #include <svgio/svgreader/svgdocument.hxx>
27ddde725dSArmin Le Grand #include <svgio/svgreader/svggradientstopnode.hxx>
28ddde725dSArmin Le Grand 
29ddde725dSArmin Le Grand //////////////////////////////////////////////////////////////////////////////
30ddde725dSArmin Le Grand 
31ddde725dSArmin Le Grand namespace svgio
32ddde725dSArmin Le Grand {
33ddde725dSArmin Le Grand     namespace svgreader
34ddde725dSArmin Le Grand     {
tryToFindLink()35ddde725dSArmin Le Grand         void SvgGradientNode::tryToFindLink()
36ddde725dSArmin Le Grand         {
37ddde725dSArmin Le Grand             if(!mpXLink && maXLink.getLength())
38ddde725dSArmin Le Grand             {
39ddde725dSArmin Le Grand                 mpXLink = dynamic_cast< const SvgGradientNode* >(getDocument().findSvgNodeById(maXLink));
40ddde725dSArmin Le Grand             }
41ddde725dSArmin Le Grand         }
42ddde725dSArmin Le Grand 
SvgGradientNode(SVGToken aType,SvgDocument & rDocument,SvgNode * pParent)43ddde725dSArmin Le Grand         SvgGradientNode::SvgGradientNode(
44ddde725dSArmin Le Grand             SVGToken aType,
45ddde725dSArmin Le Grand             SvgDocument& rDocument,
46ddde725dSArmin Le Grand             SvgNode* pParent)
47ddde725dSArmin Le Grand         :   SvgNode(aType, rDocument, pParent),
48ddde725dSArmin Le Grand             maSvgStyleAttributes(*this),
49ddde725dSArmin Le Grand             maX1(),
50ddde725dSArmin Le Grand             maY1(),
51ddde725dSArmin Le Grand             maX2(),
52ddde725dSArmin Le Grand             maY2(),
53ddde725dSArmin Le Grand             maCx(),
54ddde725dSArmin Le Grand             maCy(),
55ddde725dSArmin Le Grand             maR(),
56ddde725dSArmin Le Grand             maFx(),
57ddde725dSArmin Le Grand             maFy(),
58ddde725dSArmin Le Grand             maGradientUnits(objectBoundingBox),
59ddde725dSArmin Le Grand             maSpreadMethod(drawinglayer::primitive2d::Spread_pad),
60ddde725dSArmin Le Grand             mpaGradientTransform(0),
61ddde725dSArmin Le Grand             maXLink(),
62ddde725dSArmin Le Grand             mpXLink(0)
63ddde725dSArmin Le Grand         {
64*5036a087Smseidel             OSL_ENSURE(aType == SVGTokenLinearGradient || aType == SVGTokenRadialGradient, "SvgGradientNode should only be used for Linear and Radial gradient (!)");
65ddde725dSArmin Le Grand         }
66ddde725dSArmin Le Grand 
~SvgGradientNode()67ddde725dSArmin Le Grand         SvgGradientNode::~SvgGradientNode()
68ddde725dSArmin Le Grand         {
69ddde725dSArmin Le Grand             if(mpaGradientTransform) delete mpaGradientTransform;
70ddde725dSArmin Le Grand             // do NOT delete mpXLink, it's only referenced, not owned
71ddde725dSArmin Le Grand         }
72ddde725dSArmin Le Grand 
getSvgStyleAttributes() const73ddde725dSArmin Le Grand         const SvgStyleAttributes* SvgGradientNode::getSvgStyleAttributes() const
74ddde725dSArmin Le Grand         {
759d01bcdeSArmin Le Grand             static rtl::OUString aClassStrA(rtl::OUString::createFromAscii("linearGradient"));
769d01bcdeSArmin Le Grand             static rtl::OUString aClassStrB(rtl::OUString::createFromAscii("radialGradient"));
779d01bcdeSArmin Le Grand 
789d01bcdeSArmin Le Grand             return checkForCssStyle(
799d01bcdeSArmin Le Grand                 SVGTokenLinearGradient == getType() ? aClassStrA : aClassStrB,
809d01bcdeSArmin Le Grand                 maSvgStyleAttributes);
81ddde725dSArmin Le Grand         }
82ddde725dSArmin Le Grand 
parseAttribute(const rtl::OUString & rTokenName,SVGToken aSVGToken,const rtl::OUString & aContent)83ddde725dSArmin Le Grand         void SvgGradientNode::parseAttribute(const rtl::OUString& rTokenName, SVGToken aSVGToken, const rtl::OUString& aContent)
84ddde725dSArmin Le Grand         {
85ddde725dSArmin Le Grand             // call parent
86ddde725dSArmin Le Grand             SvgNode::parseAttribute(rTokenName, aSVGToken, aContent);
87ddde725dSArmin Le Grand 
88ddde725dSArmin Le Grand             // read style attributes
8952cb04b8SArmin Le Grand             maSvgStyleAttributes.parseStyleAttribute(rTokenName, aSVGToken, aContent, false);
90ddde725dSArmin Le Grand 
91ddde725dSArmin Le Grand             // parse own
92ddde725dSArmin Le Grand             switch(aSVGToken)
93ddde725dSArmin Le Grand             {
94ddde725dSArmin Le Grand                 case SVGTokenStyle:
95ddde725dSArmin Le Grand                 {
969d01bcdeSArmin Le Grand                     readLocalCssStyle(aContent);
97ddde725dSArmin Le Grand                     break;
98ddde725dSArmin Le Grand                 }
99ddde725dSArmin Le Grand                 case SVGTokenX1:
100ddde725dSArmin Le Grand                 {
101ddde725dSArmin Le Grand                     SvgNumber aNum;
102ddde725dSArmin Le Grand 
103ddde725dSArmin Le Grand                     if(readSingleNumber(aContent, aNum))
104ddde725dSArmin Le Grand                     {
105ddde725dSArmin Le Grand                         setX1(aNum);
106ddde725dSArmin Le Grand                     }
107ddde725dSArmin Le Grand                     break;
108ddde725dSArmin Le Grand                 }
109ddde725dSArmin Le Grand                 case SVGTokenY1:
110ddde725dSArmin Le Grand                 {
111ddde725dSArmin Le Grand                     SvgNumber aNum;
112ddde725dSArmin Le Grand 
113ddde725dSArmin Le Grand                     if(readSingleNumber(aContent, aNum))
114ddde725dSArmin Le Grand                     {
115ddde725dSArmin Le Grand                         setY1(aNum);
116ddde725dSArmin Le Grand                     }
117ddde725dSArmin Le Grand                     break;
118ddde725dSArmin Le Grand                 }
119ddde725dSArmin Le Grand                 case SVGTokenX2:
120ddde725dSArmin Le Grand                 {
121ddde725dSArmin Le Grand                     SvgNumber aNum;
122ddde725dSArmin Le Grand 
123ddde725dSArmin Le Grand                     if(readSingleNumber(aContent, aNum))
124ddde725dSArmin Le Grand                     {
125ddde725dSArmin Le Grand                         setX2(aNum);
126ddde725dSArmin Le Grand                     }
127ddde725dSArmin Le Grand                     break;
128ddde725dSArmin Le Grand                 }
129ddde725dSArmin Le Grand                 case SVGTokenY2:
130ddde725dSArmin Le Grand                 {
131ddde725dSArmin Le Grand                     SvgNumber aNum;
132ddde725dSArmin Le Grand 
133ddde725dSArmin Le Grand                     if(readSingleNumber(aContent, aNum))
134ddde725dSArmin Le Grand                     {
135ddde725dSArmin Le Grand                         setY2(aNum);
136ddde725dSArmin Le Grand                     }
137ddde725dSArmin Le Grand                     break;
138ddde725dSArmin Le Grand                 }
139ddde725dSArmin Le Grand                 case SVGTokenCx:
140ddde725dSArmin Le Grand                 {
141ddde725dSArmin Le Grand                     SvgNumber aNum;
142ddde725dSArmin Le Grand 
143ddde725dSArmin Le Grand                     if(readSingleNumber(aContent, aNum))
144ddde725dSArmin Le Grand                     {
145ddde725dSArmin Le Grand                         setCx(aNum);
146ddde725dSArmin Le Grand                     }
147ddde725dSArmin Le Grand                     break;
148ddde725dSArmin Le Grand                 }
149ddde725dSArmin Le Grand                 case SVGTokenCy:
150ddde725dSArmin Le Grand                 {
151ddde725dSArmin Le Grand                     SvgNumber aNum;
152ddde725dSArmin Le Grand 
153ddde725dSArmin Le Grand                     if(readSingleNumber(aContent, aNum))
154ddde725dSArmin Le Grand                     {
155ddde725dSArmin Le Grand                         setCy(aNum);
156ddde725dSArmin Le Grand                     }
157ddde725dSArmin Le Grand                     break;
158ddde725dSArmin Le Grand                 }
159ddde725dSArmin Le Grand                 case SVGTokenFx:
160ddde725dSArmin Le Grand                 {
161ddde725dSArmin Le Grand                     SvgNumber aNum;
162ddde725dSArmin Le Grand 
163ddde725dSArmin Le Grand                     if(readSingleNumber(aContent, aNum))
164ddde725dSArmin Le Grand                     {
165ddde725dSArmin Le Grand                         setFx(aNum);
166ddde725dSArmin Le Grand                     }
167ddde725dSArmin Le Grand                     break;
168ddde725dSArmin Le Grand                 }
169ddde725dSArmin Le Grand                 case SVGTokenFy:
170ddde725dSArmin Le Grand                 {
171ddde725dSArmin Le Grand                     SvgNumber aNum;
172ddde725dSArmin Le Grand 
173ddde725dSArmin Le Grand                     if(readSingleNumber(aContent, aNum))
174ddde725dSArmin Le Grand                     {
175ddde725dSArmin Le Grand                         setFy(aNum);
176ddde725dSArmin Le Grand                     }
177ddde725dSArmin Le Grand                     break;
178ddde725dSArmin Le Grand                 }
179ddde725dSArmin Le Grand                 case SVGTokenR:
180ddde725dSArmin Le Grand                 {
181ddde725dSArmin Le Grand                     SvgNumber aNum;
182ddde725dSArmin Le Grand 
183ddde725dSArmin Le Grand                     if(readSingleNumber(aContent, aNum))
184ddde725dSArmin Le Grand                     {
185ddde725dSArmin Le Grand                         if(aNum.isPositive())
186ddde725dSArmin Le Grand                         {
187ddde725dSArmin Le Grand                             setR(aNum);
188ddde725dSArmin Le Grand                         }
189ddde725dSArmin Le Grand                     }
190ddde725dSArmin Le Grand                     break;
191ddde725dSArmin Le Grand                 }
192ddde725dSArmin Le Grand                 case SVGTokenGradientUnits:
193ddde725dSArmin Le Grand                 {
194ddde725dSArmin Le Grand                     if(aContent.getLength())
195ddde725dSArmin Le Grand                     {
196ddde725dSArmin Le Grand                         if(aContent.match(commonStrings::aStrUserSpaceOnUse, 0))
197ddde725dSArmin Le Grand                         {
198ddde725dSArmin Le Grand                             setGradientUnits(userSpaceOnUse);
199ddde725dSArmin Le Grand                         }
200ddde725dSArmin Le Grand                         else if(aContent.match(commonStrings::aStrObjectBoundingBox, 0))
201ddde725dSArmin Le Grand                         {
202ddde725dSArmin Le Grand                             setGradientUnits(objectBoundingBox);
203ddde725dSArmin Le Grand                         }
204ddde725dSArmin Le Grand                     }
205ddde725dSArmin Le Grand                     break;
206ddde725dSArmin Le Grand                 }
207ddde725dSArmin Le Grand                 case SVGTokenSpreadMethod:
208ddde725dSArmin Le Grand                 {
209ddde725dSArmin Le Grand                     if(aContent.getLength())
210ddde725dSArmin Le Grand                     {
211ddde725dSArmin Le Grand                         static rtl::OUString aStrPad(rtl::OUString::createFromAscii("pad"));
212ddde725dSArmin Le Grand                         static rtl::OUString aStrReflect(rtl::OUString::createFromAscii("reflect"));
213ddde725dSArmin Le Grand                         static rtl::OUString aStrRepeat(rtl::OUString::createFromAscii("repeat"));
214ddde725dSArmin Le Grand 
215ddde725dSArmin Le Grand                         if(aContent.match(aStrPad, 0))
216ddde725dSArmin Le Grand                         {
217ddde725dSArmin Le Grand                             setSpreadMethod(drawinglayer::primitive2d::Spread_pad);
218ddde725dSArmin Le Grand                         }
219ddde725dSArmin Le Grand                         else if(aContent.match(aStrReflect, 0))
220ddde725dSArmin Le Grand                         {
221ddde725dSArmin Le Grand                             setSpreadMethod(drawinglayer::primitive2d::Spread_reflect);
222ddde725dSArmin Le Grand                         }
223ddde725dSArmin Le Grand                         else if(aContent.match(aStrRepeat, 0))
224ddde725dSArmin Le Grand                         {
225ddde725dSArmin Le Grand                             setSpreadMethod(drawinglayer::primitive2d::Spread_repeat);
226ddde725dSArmin Le Grand                         }
227ddde725dSArmin Le Grand                     }
228ddde725dSArmin Le Grand                     break;
229ddde725dSArmin Le Grand                 }
230ddde725dSArmin Le Grand                 case SVGTokenGradientTransform:
231ddde725dSArmin Le Grand                 {
232ddde725dSArmin Le Grand                     const basegfx::B2DHomMatrix aMatrix(readTransform(aContent, *this));
233ddde725dSArmin Le Grand 
234ddde725dSArmin Le Grand                     if(!aMatrix.isIdentity())
235ddde725dSArmin Le Grand                     {
236ddde725dSArmin Le Grand                         setGradientTransform(&aMatrix);
237ddde725dSArmin Le Grand                     }
238ddde725dSArmin Le Grand                     break;
239ddde725dSArmin Le Grand                 }
240ddde725dSArmin Le Grand                 case SVGTokenXlinkHref:
241ddde725dSArmin Le Grand                 {
242ddde725dSArmin Le Grand                     const sal_Int32 nLen(aContent.getLength());
243ddde725dSArmin Le Grand 
244ddde725dSArmin Le Grand                     if(nLen && sal_Unicode('#') == aContent[0])
245ddde725dSArmin Le Grand                     {
246ddde725dSArmin Le Grand                         maXLink = aContent.copy(1);
247ddde725dSArmin Le Grand                         tryToFindLink();
248ddde725dSArmin Le Grand                     }
249ddde725dSArmin Le Grand                     break;
250ddde725dSArmin Le Grand                 }
251e2bf1e9dSArmin Le Grand                 default:
252e2bf1e9dSArmin Le Grand                 {
253e2bf1e9dSArmin Le Grand                     break;
254e2bf1e9dSArmin Le Grand                 }
255ddde725dSArmin Le Grand             }
256ddde725dSArmin Le Grand         }
257ddde725dSArmin Le Grand 
collectGradientEntries(drawinglayer::primitive2d::SvgGradientEntryVector & aVector) const258ddde725dSArmin Le Grand         void SvgGradientNode::collectGradientEntries(drawinglayer::primitive2d::SvgGradientEntryVector& aVector) const
259ddde725dSArmin Le Grand         {
260ddde725dSArmin Le Grand             if(getChildren().empty())
261ddde725dSArmin Le Grand             {
262ddde725dSArmin Le Grand                 const_cast< SvgGradientNode* >(this)->tryToFindLink();
263ddde725dSArmin Le Grand 
264ddde725dSArmin Le Grand                 if(mpXLink)
265ddde725dSArmin Le Grand                 {
266ddde725dSArmin Le Grand                     mpXLink->collectGradientEntries(aVector);
267ddde725dSArmin Le Grand                 }
268ddde725dSArmin Le Grand             }
269ddde725dSArmin Le Grand             else
270ddde725dSArmin Le Grand             {
271ddde725dSArmin Le Grand                 const sal_uInt32 nCount(getChildren().size());
272ddde725dSArmin Le Grand 
273ddde725dSArmin Le Grand                 for(sal_uInt32 a(0); a < nCount; a++)
274ddde725dSArmin Le Grand                 {
275ddde725dSArmin Le Grand                     const SvgGradientStopNode* pCandidate = dynamic_cast< const SvgGradientStopNode* >(getChildren()[a]);
276ddde725dSArmin Le Grand 
277ddde725dSArmin Le Grand                     if(pCandidate)
278ddde725dSArmin Le Grand                     {
279ddde725dSArmin Le Grand                         const SvgStyleAttributes* pStyle = pCandidate->getSvgStyleAttributes();
280ddde725dSArmin Le Grand 
281ddde725dSArmin Le Grand                         if(pStyle)
282ddde725dSArmin Le Grand                         {
283ddde725dSArmin Le Grand                             const SvgNumber aOffset(pCandidate->getOffset());
284ddde725dSArmin Le Grand                             double fOffset(0.0);
285ddde725dSArmin Le Grand 
286ddde725dSArmin Le Grand                             if(Unit_percent == aOffset.getUnit())
287ddde725dSArmin Le Grand                             {
288ddde725dSArmin Le Grand                                 // percent is not relative to distances in ColorStop context, solve locally
289ddde725dSArmin Le Grand                                 fOffset = aOffset.getNumber() * 0.01;
290ddde725dSArmin Le Grand                             }
291ddde725dSArmin Le Grand                             else
292ddde725dSArmin Le Grand                             {
293ddde725dSArmin Le Grand                                 fOffset = aOffset.solve(*this);
294ddde725dSArmin Le Grand                             }
295ddde725dSArmin Le Grand 
296ddde725dSArmin Le Grand                             if(fOffset < 0.0)
297ddde725dSArmin Le Grand                             {
298*5036a087Smseidel                                 OSL_ENSURE(false, "SvgGradientStopNode with offset out of range (!)");
299ddde725dSArmin Le Grand                                 fOffset = 0.0;
300ddde725dSArmin Le Grand                             }
301ddde725dSArmin Le Grand                             else if(fOffset > 1.0)
302ddde725dSArmin Le Grand                             {
303*5036a087Smseidel                                 OSL_ENSURE(false, "SvgGradientStopNode with offset out of range (!)");
304ddde725dSArmin Le Grand                                 fOffset = 1.0;
305ddde725dSArmin Le Grand                             }
306ddde725dSArmin Le Grand 
307ddde725dSArmin Le Grand                             aVector.push_back(
308ddde725dSArmin Le Grand                                 drawinglayer::primitive2d::SvgGradientEntry(
309ddde725dSArmin Le Grand                                     fOffset,
310ddde725dSArmin Le Grand                                     pStyle->getStopColor(),
311ddde725dSArmin Le Grand                                     pStyle->getStopOpacity().solve(*this)));
312ddde725dSArmin Le Grand                         }
313ddde725dSArmin Le Grand                         else
314ddde725dSArmin Le Grand                         {
315*5036a087Smseidel                             OSL_ENSURE(false, "SvgGradientStopNode without Style (!)");
316ddde725dSArmin Le Grand                         }
317ddde725dSArmin Le Grand                     }
318ddde725dSArmin Le Grand                 }
319ddde725dSArmin Le Grand             }
320ddde725dSArmin Le Grand         }
321ddde725dSArmin Le Grand 
getX1() const322ddde725dSArmin Le Grand         const SvgNumber SvgGradientNode::getX1() const
323ddde725dSArmin Le Grand         {
324ddde725dSArmin Le Grand             if(maX1.isSet())
325ddde725dSArmin Le Grand             {
326ddde725dSArmin Le Grand                 return maX1;
327ddde725dSArmin Le Grand             }
328ddde725dSArmin Le Grand 
329ddde725dSArmin Le Grand             const_cast< SvgGradientNode* >(this)->tryToFindLink();
330ddde725dSArmin Le Grand 
331ddde725dSArmin Le Grand             if(mpXLink)
332ddde725dSArmin Le Grand             {
333ddde725dSArmin Le Grand                 return mpXLink->getX1();
334ddde725dSArmin Le Grand             }
335ddde725dSArmin Le Grand 
336ddde725dSArmin Le Grand             // default is 0%
337ddde725dSArmin Le Grand             return SvgNumber(0.0, Unit_percent);
338ddde725dSArmin Le Grand         }
339ddde725dSArmin Le Grand 
getY1() const340ddde725dSArmin Le Grand         const SvgNumber SvgGradientNode::getY1() const
341ddde725dSArmin Le Grand         {
342ddde725dSArmin Le Grand             if(maY1.isSet())
343ddde725dSArmin Le Grand             {
344ddde725dSArmin Le Grand                 return maY1;
345ddde725dSArmin Le Grand             }
346ddde725dSArmin Le Grand 
347ddde725dSArmin Le Grand             const_cast< SvgGradientNode* >(this)->tryToFindLink();
348ddde725dSArmin Le Grand 
349ddde725dSArmin Le Grand             if(mpXLink)
350ddde725dSArmin Le Grand             {
351ddde725dSArmin Le Grand                 return mpXLink->getY1();
352ddde725dSArmin Le Grand             }
353ddde725dSArmin Le Grand 
354ddde725dSArmin Le Grand             // default is 0%
355ddde725dSArmin Le Grand             return SvgNumber(0.0, Unit_percent);
356ddde725dSArmin Le Grand         }
357ddde725dSArmin Le Grand 
getX2() const358ddde725dSArmin Le Grand         const SvgNumber SvgGradientNode::getX2() const
359ddde725dSArmin Le Grand         {
360ddde725dSArmin Le Grand             if(maX2.isSet())
361ddde725dSArmin Le Grand             {
362ddde725dSArmin Le Grand                 return maX2;
363ddde725dSArmin Le Grand             }
364ddde725dSArmin Le Grand 
365ddde725dSArmin Le Grand             const_cast< SvgGradientNode* >(this)->tryToFindLink();
366ddde725dSArmin Le Grand 
367ddde725dSArmin Le Grand             if(mpXLink)
368ddde725dSArmin Le Grand             {
369ddde725dSArmin Le Grand                 return mpXLink->getX2();
370ddde725dSArmin Le Grand             }
371ddde725dSArmin Le Grand 
372ddde725dSArmin Le Grand             // default is 100%
373ddde725dSArmin Le Grand             return SvgNumber(100.0, Unit_percent);
374ddde725dSArmin Le Grand         }
375ddde725dSArmin Le Grand 
getY2() const376ddde725dSArmin Le Grand         const SvgNumber SvgGradientNode::getY2() const
377ddde725dSArmin Le Grand         {
378ddde725dSArmin Le Grand             if(maY2.isSet())
379ddde725dSArmin Le Grand             {
380ddde725dSArmin Le Grand                 return maY2;
381ddde725dSArmin Le Grand             }
382ddde725dSArmin Le Grand 
383ddde725dSArmin Le Grand             const_cast< SvgGradientNode* >(this)->tryToFindLink();
384ddde725dSArmin Le Grand 
385ddde725dSArmin Le Grand             if(mpXLink)
386ddde725dSArmin Le Grand             {
387ddde725dSArmin Le Grand                 return mpXLink->getY2();
388ddde725dSArmin Le Grand             }
389ddde725dSArmin Le Grand 
390ddde725dSArmin Le Grand             // default is 0%
391ddde725dSArmin Le Grand             return SvgNumber(0.0, Unit_percent);
392ddde725dSArmin Le Grand         }
393ddde725dSArmin Le Grand 
getCx() const394ddde725dSArmin Le Grand         const SvgNumber SvgGradientNode::getCx() const
395ddde725dSArmin Le Grand         {
396ddde725dSArmin Le Grand             if(maCx.isSet())
397ddde725dSArmin Le Grand             {
398ddde725dSArmin Le Grand                 return maCx;
399ddde725dSArmin Le Grand             }
400ddde725dSArmin Le Grand 
401ddde725dSArmin Le Grand             const_cast< SvgGradientNode* >(this)->tryToFindLink();
402ddde725dSArmin Le Grand 
403ddde725dSArmin Le Grand             if(mpXLink)
404ddde725dSArmin Le Grand             {
405ddde725dSArmin Le Grand                 return mpXLink->getCx();
406ddde725dSArmin Le Grand             }
407ddde725dSArmin Le Grand 
408ddde725dSArmin Le Grand             // default is 50%
409ddde725dSArmin Le Grand             return SvgNumber(50.0, Unit_percent);
410ddde725dSArmin Le Grand         }
411ddde725dSArmin Le Grand 
getCy() const412ddde725dSArmin Le Grand         const SvgNumber SvgGradientNode::getCy() const
413ddde725dSArmin Le Grand         {
414ddde725dSArmin Le Grand             if(maCy.isSet())
415ddde725dSArmin Le Grand             {
416ddde725dSArmin Le Grand                 return maCy;
417ddde725dSArmin Le Grand             }
418ddde725dSArmin Le Grand 
419ddde725dSArmin Le Grand             const_cast< SvgGradientNode* >(this)->tryToFindLink();
420ddde725dSArmin Le Grand 
421ddde725dSArmin Le Grand             if(mpXLink)
422ddde725dSArmin Le Grand             {
423ddde725dSArmin Le Grand                 return mpXLink->getCy();
424ddde725dSArmin Le Grand             }
425ddde725dSArmin Le Grand 
426ddde725dSArmin Le Grand             // default is 50%
427ddde725dSArmin Le Grand             return SvgNumber(50.0, Unit_percent);
428ddde725dSArmin Le Grand         }
429ddde725dSArmin Le Grand 
getR() const430ddde725dSArmin Le Grand         const SvgNumber SvgGradientNode::getR() const
431ddde725dSArmin Le Grand         {
432ddde725dSArmin Le Grand             if(maR.isSet())
433ddde725dSArmin Le Grand             {
434ddde725dSArmin Le Grand                 return maR;
435ddde725dSArmin Le Grand             }
436ddde725dSArmin Le Grand 
437ddde725dSArmin Le Grand             const_cast< SvgGradientNode* >(this)->tryToFindLink();
438ddde725dSArmin Le Grand 
439ddde725dSArmin Le Grand             if(mpXLink)
440ddde725dSArmin Le Grand             {
441ddde725dSArmin Le Grand                 return mpXLink->getR();
442ddde725dSArmin Le Grand             }
443ddde725dSArmin Le Grand 
444ddde725dSArmin Le Grand             // default is 50%
445ddde725dSArmin Le Grand             return SvgNumber(50.0, Unit_percent);
446ddde725dSArmin Le Grand         }
447ddde725dSArmin Le Grand 
getFx() const448ddde725dSArmin Le Grand         const SvgNumber* SvgGradientNode::getFx() const
449ddde725dSArmin Le Grand         {
450ddde725dSArmin Le Grand             if(maFx.isSet())
451ddde725dSArmin Le Grand             {
452ddde725dSArmin Le Grand                 return &maFx;
453ddde725dSArmin Le Grand             }
454ddde725dSArmin Le Grand 
455ddde725dSArmin Le Grand             const_cast< SvgGradientNode* >(this)->tryToFindLink();
456ddde725dSArmin Le Grand 
457ddde725dSArmin Le Grand             if(mpXLink)
458ddde725dSArmin Le Grand             {
459ddde725dSArmin Le Grand                 return mpXLink->getFx();
460ddde725dSArmin Le Grand             }
461ddde725dSArmin Le Grand 
462ddde725dSArmin Le Grand             return 0;
463ddde725dSArmin Le Grand         }
464ddde725dSArmin Le Grand 
getFy() const465ddde725dSArmin Le Grand         const SvgNumber* SvgGradientNode::getFy() const
466ddde725dSArmin Le Grand         {
467ddde725dSArmin Le Grand             if(maFy.isSet())
468ddde725dSArmin Le Grand             {
469ddde725dSArmin Le Grand                 return &maFy;
470ddde725dSArmin Le Grand             }
471ddde725dSArmin Le Grand 
472ddde725dSArmin Le Grand             const_cast< SvgGradientNode* >(this)->tryToFindLink();
473ddde725dSArmin Le Grand 
474ddde725dSArmin Le Grand             if(mpXLink)
475ddde725dSArmin Le Grand             {
476ddde725dSArmin Le Grand                 return mpXLink->getFy();
477ddde725dSArmin Le Grand             }
478ddde725dSArmin Le Grand 
479ddde725dSArmin Le Grand             return 0;
480ddde725dSArmin Le Grand         }
481ddde725dSArmin Le Grand 
getGradientTransform() const482ddde725dSArmin Le Grand         const basegfx::B2DHomMatrix* SvgGradientNode::getGradientTransform() const
483ddde725dSArmin Le Grand         {
484ddde725dSArmin Le Grand             if(mpaGradientTransform)
485ddde725dSArmin Le Grand             {
486ddde725dSArmin Le Grand                 return mpaGradientTransform;
487ddde725dSArmin Le Grand             }
488ddde725dSArmin Le Grand 
489ddde725dSArmin Le Grand             const_cast< SvgGradientNode* >(this)->tryToFindLink();
490ddde725dSArmin Le Grand 
491ddde725dSArmin Le Grand             if(mpXLink)
492ddde725dSArmin Le Grand             {
493ddde725dSArmin Le Grand                 return mpXLink->getGradientTransform();
494ddde725dSArmin Le Grand             }
495ddde725dSArmin Le Grand 
496ddde725dSArmin Le Grand             return 0;
497ddde725dSArmin Le Grand         }
498ddde725dSArmin Le Grand 
setGradientTransform(const basegfx::B2DHomMatrix * pMatrix)499ddde725dSArmin Le Grand         void SvgGradientNode::setGradientTransform(const basegfx::B2DHomMatrix* pMatrix)
500ddde725dSArmin Le Grand         {
501ddde725dSArmin Le Grand             if(mpaGradientTransform)
502ddde725dSArmin Le Grand             {
503ddde725dSArmin Le Grand                 delete mpaGradientTransform;
504ddde725dSArmin Le Grand                 mpaGradientTransform = 0;
505ddde725dSArmin Le Grand             }
506ddde725dSArmin Le Grand 
507ddde725dSArmin Le Grand             if(pMatrix)
508ddde725dSArmin Le Grand             {
509ddde725dSArmin Le Grand                 mpaGradientTransform = new basegfx::B2DHomMatrix(*pMatrix);
510ddde725dSArmin Le Grand             }
511ddde725dSArmin Le Grand         }
512ddde725dSArmin Le Grand 
513ddde725dSArmin Le Grand     } // end of namespace svgreader
514ddde725dSArmin Le Grand } // end of namespace svgio
515ddde725dSArmin Le Grand 
516*5036a087Smseidel /* vim: set noet sw=4 ts=4: */
517