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