1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 #ifndef INCLUDED_SVGIO_SVGREADER_SVGTOOLS_HXX
23 #define INCLUDED_SVGIO_SVGREADER_SVGTOOLS_HXX
24 
25 #include <svgio/svgiodllapi.h>
26 #include <drawinglayer/primitive2d/baseprimitive2d.hxx>
27 #include <basegfx/color/bcolor.hxx>
28 #include <basegfx/polygon/b2dpolypolygon.hxx>
29 #include <svgio/svgreader/svgpaint.hxx>
30 #include <vector>
31 
32 //////////////////////////////////////////////////////////////////////////////
33 
34 namespace svgio
35 {
36     namespace svgreader
37     {
38 #ifdef DBG_UTIL
39         // error helper
40         void myAssert(const rtl::OUString& rMessage);
41 #endif
42 
43 // recommended value for this devise dependend unit, see CSS2 section 4.3.2 Lenghts
44 #define F_SVG_PIXEL_PER_INCH  90.0
45 
46         // common non-token strings
47         struct commonStrings
48         {
49             static const rtl::OUString aStrUserSpaceOnUse;
50             static const rtl::OUString aStrObjectBoundingBox;
51             static const rtl::OUString aStrNonzero;
52             static const rtl::OUString aStrEvenOdd;
53         };
54 
55         enum SvgUnits
56         {
57             userSpaceOnUse,
58             objectBoundingBox
59         };
60 
61         enum NumberType
62         {
63             xcoordinate,
64             ycoordinate,
65             length
66         };
67 
68         class InfoProvider
69         {
70         public:
71             virtual const basegfx::B2DRange getCurrentViewPort() const = 0;
72             virtual double getCurrentFontSize() const = 0;
73             virtual double getCurrentXHeight() const = 0;
74         };
75 
76         enum SvgUnit
77         {
78             Unit_em = 0,    // relative to current font size
79             Unit_ex,        // relative to current x-height
80 
81             Unit_px,        // 'user unit'
82             Unit_pt,        // points, 1.25 px
83             Unit_pc,        // 15.0 px
84             Unit_cm,        // 35.43307 px
85             Unit_mm,        // 3.543307 px
86             Unit_in,        // 90 px
87 
88             Unit_percent    // relative to range
89         };
90 
91         class SvgNumber
92         {
93         private:
94             double      mfNumber;
95             SvgUnit     meUnit;
96 
97             /// bitfield
98             bool        mbSet : 1;
99 
100         public:
SvgNumber()101             SvgNumber()
102             :   mfNumber(0.0),
103                 meUnit(Unit_px),
104                 mbSet(false)
105             {
106             }
107 
SvgNumber(double fNum,SvgUnit aSvgUnit=Unit_px,bool bSet=true)108             SvgNumber(double fNum, SvgUnit aSvgUnit = Unit_px, bool bSet = true)
109             :   mfNumber(fNum),
110                 meUnit(aSvgUnit),
111                 mbSet(bSet)
112             {
113             }
114 
getNumber() const115             double getNumber() const
116             {
117                 return mfNumber;
118             }
119 
getUnit() const120             SvgUnit getUnit() const
121             {
122                 return meUnit;
123             }
124 
isSet() const125             bool isSet() const
126             {
127                 return mbSet;
128             }
129 
130             bool isPositive() const;
131 
132             // Only usable in cases, when the unit is not Unit_percent, otherwise use method solve
133             double solveNonPercentage(const InfoProvider& rInfoProvider) const;
134 
135             double solve(const InfoProvider& rInfoProvider, NumberType aNumberType = length) const;
136 
137 
138         };
139 
140         typedef ::std::vector< SvgNumber > SvgNumberVector;
141 
142         enum SvgAlign
143         {
144             Align_none,
145             Align_xMinYMin,
146             Align_xMidYMin,
147             Align_xMaxYMin,
148             Align_xMinYMid,
149             Align_xMidYMid, // default
150             Align_xMaxYMid,
151             Align_xMinYMax,
152             Align_xMidYMax,
153             Align_xMaxYMax
154         };
155 
156         class SvgAspectRatio
157         {
158         private:
159             SvgAlign    maSvgAlign;
160 
161             /// bitfield
162             bool        mbDefer : 1; // default is false
163             bool        mbMeetOrSlice : 1; // true = meet (default), false = slice
164             bool        mbSet : 1;
165 
166         public:
SvgAspectRatio()167             SvgAspectRatio()
168             :   maSvgAlign(Align_xMidYMid),
169                 mbDefer(false),
170                 mbMeetOrSlice(true),
171                 mbSet(false)
172             {
173             }
174 
SvgAspectRatio(SvgAlign aSvgAlign,bool bDefer,bool bMeetOrSlice)175             SvgAspectRatio(SvgAlign aSvgAlign, bool bDefer, bool bMeetOrSlice)
176             :   maSvgAlign(aSvgAlign),
177                 mbDefer(bDefer),
178                 mbMeetOrSlice(bMeetOrSlice),
179                 mbSet(true)
180             {
181             }
182 
183             /// data read access
getSvgAlign() const184             SvgAlign getSvgAlign() const { return maSvgAlign; }
isDefer() const185             bool isDefer() const { return mbDefer; }
isMeetOrSlice() const186             bool isMeetOrSlice() const { return mbMeetOrSlice; }
isSet() const187             bool isSet() const { return mbSet; }
188 
189             /// tooling
190             static basegfx::B2DHomMatrix createLinearMapping(const basegfx::B2DRange& rTarget, const basegfx::B2DRange& rSource);
191             basegfx::B2DHomMatrix createMapping(const basegfx::B2DRange& rTarget, const basegfx::B2DRange& rSource) const;
192         };
193 
194         void skip_char(const rtl::OUString& rCandidate, const sal_Unicode& rChar, sal_Int32& nPos, const sal_Int32 nLen);
195         void skip_char(const rtl::OUString& rCandidate, const sal_Unicode& rCharA, const sal_Unicode& rCharB, sal_Int32& nPos, const sal_Int32 nLen);
196         void copySign(const rtl::OUString& rCandidate, sal_Int32& nPos, rtl::OUStringBuffer& rTarget, const sal_Int32 nLen);
197         void copyNumber(const rtl::OUString& rCandidate, sal_Int32& nPos, rtl::OUStringBuffer& rTarget, const sal_Int32 nLen);
198         void copyHex(const rtl::OUString& rCandidate, sal_Int32& nPos, rtl::OUStringBuffer& rTarget, const sal_Int32 nLen);
199         void copyString(const rtl::OUString& rCandidate, sal_Int32& nPos, rtl::OUStringBuffer& rTarget, const sal_Int32 nLen);
200         void copyToLimiter(const rtl::OUString& rCandidate, const sal_Unicode& rLimiter, sal_Int32& nPos, rtl::OUStringBuffer& rTarget, const sal_Int32 nLen);
201         bool readNumber(const rtl::OUString& rCandidate, sal_Int32& nPos, double& fNum, const sal_Int32 nLen);
202         SvgUnit readUnit(const rtl::OUString& rCandidate, sal_Int32& nPos, const sal_Int32 nLen);
203         bool readNumberAndUnit(const rtl::OUString& rCandidate, sal_Int32& nPos, SvgNumber& aNum, const sal_Int32 nLen);
204         bool readAngle(const rtl::OUString& rCandidate, sal_Int32& nPos, double& fAngle, const sal_Int32 nLen);
205         sal_Int32 read_hex(const sal_Unicode& rChar);
206         bool match_colorKeyword(
207             basegfx::BColor& rColor,
208             const rtl::OUString& rName,
209             bool bCaseIndependent);
210         bool read_color(
211             const rtl::OUString& rCandidate,
212             basegfx::BColor& rColor,
213             bool bCaseIndependent);
214         basegfx::B2DRange readViewBox(const rtl::OUString& rCandidate, InfoProvider& rInfoProvider);
215         basegfx::B2DHomMatrix readTransform(const rtl::OUString& rCandidate, InfoProvider& rInfoProvider);
216         bool readSingleNumber(const rtl::OUString& rCandidate, SvgNumber& aNum);
217         bool readLocalUrl(const rtl::OUString& rCandidate, rtl::OUString& rURL);
218         bool readSvgPaint(
219             const rtl::OUString& rCandidate,
220             SvgPaint& rSvgPaint,
221             rtl::OUString& rURL,
222             bool bCaseIndependent);
223 
224         bool readSvgNumberVector(const rtl::OUString& rCandidate, SvgNumberVector& rSvgNumberVector);
225         ::std::vector< double > solveSvgNumberVector(const SvgNumberVector& rInput, const InfoProvider& rInfoProvider, NumberType aNumberType = length);
226 
227         SvgAspectRatio readSvgAspectRatio(const rtl::OUString& rCandidate);
228 
229         typedef ::std::vector< rtl::OUString > SvgStringVector;
230         bool readSvgStringVector(const rtl::OUString& rCandidate, SvgStringVector& rSvgStringVector);
231 
232         void readImageLink(const rtl::OUString& rCandidate, rtl::OUString& rXLink, rtl::OUString& rUrl, rtl::OUString& rMimeType, rtl::OUString& rData);
233 
234         rtl::OUString convert(const rtl::OUString& rCandidate, const sal_Unicode& rPattern, const sal_Unicode& rNew, bool bRemove);
235         rtl::OUString consolidateContiguosSpace(const rtl::OUString& rCandidate);
236         rtl::OUString whiteSpaceHandlingDefault(const rtl::OUString& rCandidate);
237         rtl::OUString whiteSpaceHandlingPreserve(const rtl::OUString& rCandidate);
238 
239         // #125325# removes block comment of the general form '/* ... */', returns
240         // an adapted string or the original if no comments included
241         rtl::OUString removeBlockComments(const rtl::OUString& rCandidate);
242 
243     } // end of namespace svgreader
244 } // end of namespace svgio
245 
246 //////////////////////////////////////////////////////////////////////////////
247 
248 #endif //INCLUDED_SVGIO_SVGREADER_SVGTOOLS_HXX
249 
250 // eof
251