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
23
24 #include "oox/drawingml/drawingmltypes.hxx"
25 #include <com/sun/star/awt/FontUnderline.hpp>
26 #include <com/sun/star/awt/FontStrikeout.hpp>
27 #include <com/sun/star/style/CaseMap.hpp>
28 #include <com/sun/star/style/ParagraphAdjust.hpp>
29 #include <sax/tools/converter.hxx>
30 #include "oox/token/tokens.hxx"
31
32 using ::rtl::OUString;
33 using ::com::sun::star::uno::Reference;
34 using ::com::sun::star::xml::sax::XFastAttributeList;
35 using namespace ::com::sun::star::awt;
36 using namespace ::com::sun::star::drawing;
37 using namespace ::com::sun::star::geometry;
38 using namespace ::com::sun::star::style;
39
40 namespace oox {
41 namespace drawingml {
42
43 // ============================================================================
44
45 /** converts an emu string into 1/100th mmm but constrain as per ST_TextMargin
46 * see 5.1.12.73
47 */
GetTextMargin(const OUString & sValue)48 sal_Int32 GetTextMargin( const OUString& sValue )
49 {
50 sal_Int32 nRet = 0;
51 if( !::sax::Converter::convertNumber( nRet, sValue ) )
52 nRet = 0;
53 else if( nRet < 0 )
54 nRet = 0;
55 else if( nRet > 51206400 )
56 nRet = 51206400;
57
58 nRet /= 360;
59 return nRet;
60 }
61
62 /** converts EMUs into 1/100th mmm */
GetCoordinate(sal_Int32 nValue)63 sal_Int32 GetCoordinate( sal_Int32 nValue )
64 {
65 return (nValue + 180) / 360;
66 }
67
68 /** converts an emu string into 1/100th mmm */
GetCoordinate(const OUString & sValue)69 sal_Int32 GetCoordinate( const OUString& sValue )
70 {
71 sal_Int32 nRet = 0;
72 if( !::sax::Converter::convertNumber( nRet, sValue ) )
73 nRet = 0;
74 return GetCoordinate( nRet );
75 }
76
77 /** converts a ST_Percentage % string into 1/1000th of % */
GetPercent(const OUString & sValue)78 sal_Int32 GetPercent( const OUString& sValue )
79 {
80 sal_Int32 nRet = 0;
81 if( !::sax::Converter::convertNumber( nRet, sValue ) )
82 nRet = 0;
83
84 return nRet;
85 }
86
GetPositiveFixedPercentage(const OUString & sValue)87 double GetPositiveFixedPercentage( const OUString& sValue )
88 {
89 double fPercent = sValue.toFloat() / 100000.;
90 return fPercent;
91 }
92
93 // --------------------------------------------------------------------
94
95 /** converts the attributes from an CT_Point2D into an awt Point with 1/100thmm */
GetPoint2D(const Reference<XFastAttributeList> & xAttribs)96 Point GetPoint2D( const Reference< XFastAttributeList >& xAttribs )
97 {
98 return Point( GetCoordinate( xAttribs->getOptionalValue( XML_x ) ), GetCoordinate( xAttribs->getOptionalValue( XML_y ) ) );
99 }
100
101 /** converts the attributes from an CT_TLPoint into an awt Point with 1/1000% */
GetPointPercent(const Reference<XFastAttributeList> & xAttribs)102 Point GetPointPercent( const Reference< XFastAttributeList >& xAttribs )
103 {
104 return Point( GetPercent( xAttribs->getOptionalValue( XML_x ) ), GetCoordinate( xAttribs->getOptionalValue( XML_y ) ) );
105 }
106
107 // --------------------------------------------------------------------
108
109 /** converts the ST_TextFontSize to point */
GetTextSize(const OUString & sValue)110 float GetTextSize( const OUString& sValue )
111 {
112 float fRet = 0;
113 sal_Int32 nRet;
114 if( ::sax::Converter::convertNumber( nRet, sValue ) )
115 fRet = static_cast< float >( static_cast< double >( nRet ) / 100.0 );
116 return fRet;
117 }
118
119
120 /** converts the ST_TextSpacingPoint to 1/100mm */
GetTextSpacingPoint(const OUString & sValue)121 sal_Int32 GetTextSpacingPoint( const OUString& sValue )
122 {
123 sal_Int32 nRet;
124 if( ::sax::Converter::convertNumber( nRet, sValue ) )
125 nRet = GetTextSpacingPoint( nRet );
126 return nRet;
127 }
128
GetTextSpacingPoint(const sal_Int32 nValue)129 sal_Int32 GetTextSpacingPoint( const sal_Int32 nValue )
130 {
131 return ( nValue * 254 + 360 ) / 720;
132 }
133
GetTextVerticalAdjust(sal_Int32 nToken)134 TextVerticalAdjust GetTextVerticalAdjust( sal_Int32 nToken )
135 {
136 TextVerticalAdjust rVal = TextVerticalAdjust_TOP;
137
138 switch( nToken ) {
139 case XML_b:
140 rVal = TextVerticalAdjust_BOTTOM;
141 break;
142 case XML_ctr:
143 rVal = TextVerticalAdjust_CENTER;
144 break;
145 }
146
147 return rVal;
148 }
149
GetFontHeight(sal_Int32 nHeight)150 float GetFontHeight( sal_Int32 nHeight )
151 {
152 // convert 1/100 points to points
153 return static_cast< float >( nHeight / 100.0 );
154 }
155
GetFontUnderline(sal_Int32 nToken)156 sal_Int16 GetFontUnderline( sal_Int32 nToken )
157 {
158 switch( nToken )
159 {
160 case XML_none: return FontUnderline::NONE;
161 case XML_dash: return FontUnderline::DASH;
162 case XML_dashHeavy: return FontUnderline::BOLDDASH;
163 case XML_dashLong: return FontUnderline::LONGDASH;
164 case XML_dashLongHeavy: return FontUnderline::BOLDLONGDASH;
165 case XML_dbl: return FontUnderline::DOUBLE;
166 case XML_dotDash: return FontUnderline::DASHDOT;
167 case XML_dotDashHeavy: return FontUnderline::BOLDDASHDOT;
168 case XML_dotDotDash: return FontUnderline::DASHDOTDOT;
169 case XML_dotDotDashHeavy: return FontUnderline::BOLDDASHDOTDOT;
170 case XML_dotted: return FontUnderline::DOTTED;
171 case XML_dottedHeavy: return FontUnderline::BOLDDOTTED;
172 case XML_heavy: return FontUnderline::BOLD;
173 case XML_sng: return FontUnderline::SINGLE;
174 case XML_wavy: return FontUnderline::WAVE;
175 case XML_wavyDbl: return FontUnderline::DOUBLEWAVE;
176 case XML_wavyHeavy: return FontUnderline::BOLDWAVE;
177 // case XML_words: // TODO
178 }
179 return FontUnderline::DONTKNOW;
180 }
181
GetFontStrikeout(sal_Int32 nToken)182 sal_Int16 GetFontStrikeout( sal_Int32 nToken )
183 {
184 switch( nToken )
185 {
186 case XML_dblStrike: return FontStrikeout::DOUBLE;
187 case XML_noStrike: return FontStrikeout::NONE;
188 case XML_sngStrike: return FontStrikeout::SINGLE;
189 }
190 return FontStrikeout::DONTKNOW;
191 }
192
GetCaseMap(sal_Int32 nToken)193 sal_Int16 GetCaseMap( sal_Int32 nToken )
194 {
195 switch( nToken )
196 {
197 case XML_all: return CaseMap::UPPERCASE;
198 case XML_small: return CaseMap::SMALLCAPS;
199 }
200 return CaseMap::NONE;
201 }
202
203 /** converts a paragraph align to a ParaAdjust */
GetParaAdjust(sal_Int32 nAlign)204 sal_Int16 GetParaAdjust( sal_Int32 nAlign )
205 {
206 sal_Int16 nEnum;
207 switch( nAlign )
208 {
209 case XML_ctr:
210 nEnum = ParagraphAdjust_CENTER;
211 break;
212 case XML_just:
213 case XML_justLow:
214 nEnum = ParagraphAdjust_BLOCK;
215 break;
216 case XML_r:
217 nEnum = ParagraphAdjust_RIGHT;
218 break;
219 case XML_thaiDist:
220 case XML_dist:
221 nEnum = ParagraphAdjust_STRETCH;
222 break;
223 case XML_l:
224 default:
225 nEnum = ParagraphAdjust_LEFT;
226 break;
227 }
228 return nEnum;
229 }
230
231
GetTabAlign(sal_Int32 aToken)232 TabAlign GetTabAlign( sal_Int32 aToken )
233 {
234 TabAlign nEnum;
235 switch( aToken )
236 {
237 case XML_ctr:
238 nEnum = TabAlign_CENTER;
239 break;
240 case XML_dec:
241 nEnum = TabAlign_DECIMAL;
242 break;
243 case XML_l:
244 nEnum = TabAlign_LEFT;
245 break;
246 case XML_r:
247 nEnum = TabAlign_RIGHT;
248 break;
249 default:
250 nEnum = TabAlign_DEFAULT;
251 break;
252 }
253 return nEnum;
254 }
255
256 // --------------------------------------------------------------------
257
258 /** converts the attributes from a CT_RelativeRect to an IntegerRectangle2D */
GetRelativeRect(const Reference<XFastAttributeList> & xAttribs)259 IntegerRectangle2D GetRelativeRect( const Reference< XFastAttributeList >& xAttribs )
260 {
261 IntegerRectangle2D r;
262
263 r.X1 = xAttribs->getOptionalValue( XML_l ).toInt32();
264 r.Y1 = xAttribs->getOptionalValue( XML_t ).toInt32();
265 r.X2 = xAttribs->getOptionalValue( XML_r ).toInt32();
266 r.Y2 = xAttribs->getOptionalValue( XML_b ).toInt32();
267
268 return r;
269 }
270
271 // ============================================================================
272
273 /** converts the attributes from an CT_Size2D into an awt Size with 1/100thmm */
GetSize2D(const Reference<XFastAttributeList> & xAttribs)274 Size GetSize2D( const Reference< XFastAttributeList >& xAttribs )
275 {
276 return Size( GetCoordinate( xAttribs->getOptionalValue( XML_cx ) ), GetCoordinate( xAttribs->getOptionalValue( XML_cy ) ) );
277 }
278
GetIndexRange(const Reference<XFastAttributeList> & xAttributes)279 IndexRange GetIndexRange( const Reference< XFastAttributeList >& xAttributes )
280 {
281 IndexRange range;
282 range.start = xAttributes->getOptionalValue( XML_st ).toInt32();
283 range.end = xAttributes->getOptionalValue( XML_end ).toInt32();
284 return range;
285 }
286
287 // ============================================================================
288
289 } // namespace drawingml
290 } // namespace oox
291
292