Line data Source code
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 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "oox/drawingml/drawingmltypes.hxx"
21 : #include <com/sun/star/awt/FontUnderline.hpp>
22 : #include <com/sun/star/awt/FontStrikeout.hpp>
23 : #include <com/sun/star/style/CaseMap.hpp>
24 : #include <com/sun/star/style/ParagraphAdjust.hpp>
25 : #include <osl/diagnose.h>
26 : #include <sax/tools/converter.hxx>
27 : #include "oox/token/tokens.hxx"
28 :
29 : using ::com::sun::star::uno::Reference;
30 : using ::com::sun::star::xml::sax::XFastAttributeList;
31 : using namespace ::com::sun::star;
32 : using namespace ::com::sun::star::drawing;
33 : using namespace ::com::sun::star::geometry;
34 : using namespace ::com::sun::star::style;
35 :
36 : namespace oox {
37 : namespace drawingml {
38 :
39 : /** converts EMUs into 1/100th mmm */
40 9768 : sal_Int32 GetCoordinate( sal_Int32 nValue )
41 : {
42 9768 : return (nValue + 180) / 360;
43 : }
44 :
45 : /** converts an emu string into 1/100th mmm */
46 8640 : sal_Int32 GetCoordinate( const OUString& sValue )
47 : {
48 8640 : sal_Int32 nRet = 0;
49 8640 : if( !::sax::Converter::convertNumber( nRet, sValue ) )
50 0 : nRet = 0;
51 8640 : return GetCoordinate( nRet );
52 : }
53 :
54 : /** converts a ST_Percentage % string into 1/1000th of % */
55 2427 : sal_Int32 GetPercent( const OUString& sValue )
56 : {
57 2427 : sal_Int32 nRet = 0;
58 2427 : if( !::sax::Converter::convertNumber( nRet, sValue ) )
59 47 : nRet = 0;
60 :
61 2427 : return nRet;
62 : }
63 :
64 0 : double GetPositiveFixedPercentage( const OUString& sValue )
65 : {
66 0 : double fPercent = sValue.toFloat() / 100000.;
67 0 : return fPercent;
68 : }
69 :
70 : /** converts the attributes from an CT_TLPoint into an awt Point with 1/1000% */
71 0 : awt::Point GetPointPercent( const Reference< XFastAttributeList >& xAttribs )
72 : {
73 0 : return awt::Point( GetPercent( xAttribs->getOptionalValue( XML_x ) ), GetCoordinate( xAttribs->getOptionalValue( XML_y ) ) );
74 : }
75 :
76 : /** converts the ST_TextFontSize to point */
77 0 : float GetTextSize( const OUString& sValue )
78 : {
79 0 : float fRet = 0;
80 : sal_Int32 nRet;
81 0 : if( ::sax::Converter::convertNumber( nRet, sValue ) )
82 0 : fRet = static_cast< float >( static_cast< double >( nRet ) / 100.0 );
83 0 : return fRet;
84 : }
85 :
86 : /** converts the ST_TextSpacingPoint to 1/100mm */
87 161 : sal_Int32 GetTextSpacingPoint( const OUString& sValue )
88 : {
89 : sal_Int32 nRet;
90 161 : if( ::sax::Converter::convertNumber( nRet, sValue ) )
91 161 : nRet = GetTextSpacingPoint( nRet );
92 161 : return nRet;
93 : }
94 :
95 5497 : sal_Int32 GetTextSpacingPoint( const sal_Int32 nValue )
96 : {
97 5497 : return ( nValue * 254 + 360 ) / 720;
98 : }
99 :
100 5170 : float GetFontHeight( sal_Int32 nHeight )
101 : {
102 : // convert 1/100 points to points
103 5170 : return static_cast< float >( nHeight / 100.0 );
104 : }
105 :
106 4162 : sal_Int16 GetFontUnderline( sal_Int32 nToken )
107 : {
108 : OSL_ASSERT((nToken & sal_Int32(0xFFFF0000))==0);
109 4162 : switch( nToken )
110 : {
111 4155 : case XML_none: return awt::FontUnderline::NONE;
112 0 : case XML_dash: return awt::FontUnderline::DASH;
113 0 : case XML_dashHeavy: return awt::FontUnderline::BOLDDASH;
114 0 : case XML_dashLong: return awt::FontUnderline::LONGDASH;
115 0 : case XML_dashLongHeavy: return awt::FontUnderline::BOLDLONGDASH;
116 1 : case XML_dbl: return awt::FontUnderline::DOUBLE;
117 0 : case XML_dotDash: return awt::FontUnderline::DASHDOT;
118 0 : case XML_dotDashHeavy: return awt::FontUnderline::BOLDDASHDOT;
119 0 : case XML_dotDotDash: return awt::FontUnderline::DASHDOTDOT;
120 0 : case XML_dotDotDashHeavy: return awt::FontUnderline::BOLDDASHDOTDOT;
121 0 : case XML_dotted: return awt::FontUnderline::DOTTED;
122 0 : case XML_dottedHeavy: return awt::FontUnderline::BOLDDOTTED;
123 0 : case XML_heavy: return awt::FontUnderline::BOLD;
124 6 : case XML_sng: return awt::FontUnderline::SINGLE;
125 0 : case XML_wavy: return awt::FontUnderline::WAVE;
126 0 : case XML_wavyDbl: return awt::FontUnderline::DOUBLEWAVE;
127 0 : case XML_wavyHeavy: return awt::FontUnderline::BOLDWAVE;
128 : // case XML_words: // TODO
129 : }
130 0 : return awt::FontUnderline::DONTKNOW;
131 : }
132 :
133 4162 : sal_Int16 GetFontStrikeout( sal_Int32 nToken )
134 : {
135 : OSL_ASSERT((nToken & sal_Int32(0xFFFF0000))==0);
136 4162 : switch( nToken )
137 : {
138 0 : case XML_dblStrike: return awt::FontStrikeout::DOUBLE;
139 4160 : case XML_noStrike: return awt::FontStrikeout::NONE;
140 2 : case XML_sngStrike: return awt::FontStrikeout::SINGLE;
141 : }
142 0 : return awt::FontStrikeout::DONTKNOW;
143 : }
144 :
145 4162 : sal_Int16 GetCaseMap( sal_Int32 nToken )
146 : {
147 4162 : switch( nToken )
148 : {
149 8 : case XML_all: return CaseMap::UPPERCASE;
150 1 : case XML_small: return CaseMap::SMALLCAPS;
151 : }
152 4153 : return CaseMap::NONE;
153 : }
154 :
155 : /** converts a paragraph align to a ParaAdjust */
156 3301 : sal_Int16 GetParaAdjust( sal_Int32 nAlign )
157 : {
158 : OSL_ASSERT((nAlign & sal_Int32(0xFFFF0000))==0);
159 : sal_Int16 nEnum;
160 3301 : switch( nAlign )
161 : {
162 : case XML_ctr:
163 815 : nEnum = ParagraphAdjust_CENTER;
164 815 : break;
165 : case XML_just:
166 : case XML_justLow:
167 286 : nEnum = ParagraphAdjust_BLOCK;
168 286 : break;
169 : case XML_r:
170 105 : nEnum = ParagraphAdjust_RIGHT;
171 105 : break;
172 : case XML_thaiDist:
173 : case XML_dist:
174 0 : nEnum = ParagraphAdjust_STRETCH;
175 0 : break;
176 : case XML_l:
177 : default:
178 2095 : nEnum = ParagraphAdjust_LEFT;
179 2095 : break;
180 : }
181 3301 : return nEnum;
182 : }
183 :
184 1299 : TextVerticalAdjust GetTextVerticalAdjust( sal_Int32 nToken )
185 : {
186 : TextVerticalAdjust aVertAdjust;
187 1299 : switch( nToken )
188 : {
189 : case XML_b:
190 79 : aVertAdjust = TextVerticalAdjust_BOTTOM;
191 79 : break;
192 : case XML_dist:
193 : case XML_just:
194 : case XML_ctr:
195 971 : aVertAdjust = TextVerticalAdjust_CENTER;
196 971 : break;
197 : case XML_t:
198 : default:
199 249 : aVertAdjust = TextVerticalAdjust_TOP;
200 249 : break;
201 : }
202 1299 : return aVertAdjust;
203 : }
204 :
205 704 : const char* GetTextVerticalAdjust( TextVerticalAdjust eAdjust )
206 : {
207 704 : const char* sVerticalAdjust = 0;
208 704 : switch( eAdjust )
209 : {
210 : case TextVerticalAdjust_BOTTOM:
211 25 : sVerticalAdjust = "b";
212 25 : break;
213 : case TextVerticalAdjust_CENTER:
214 571 : sVerticalAdjust = "ctr";
215 571 : break;
216 : case TextVerticalAdjust_TOP:
217 : default:
218 108 : sVerticalAdjust = "t";
219 108 : break;
220 : }
221 704 : return sVerticalAdjust;
222 : }
223 :
224 106 : TabAlign GetTabAlign( sal_Int32 aToken )
225 : {
226 : OSL_ASSERT((aToken & sal_Int32(0xFFFF0000))==0);
227 : TabAlign nEnum;
228 106 : switch( aToken )
229 : {
230 : case XML_ctr:
231 0 : nEnum = TabAlign_CENTER;
232 0 : break;
233 : case XML_dec:
234 0 : nEnum = TabAlign_DECIMAL;
235 0 : break;
236 : case XML_l:
237 106 : nEnum = TabAlign_LEFT;
238 106 : break;
239 : case XML_r:
240 0 : nEnum = TabAlign_RIGHT;
241 0 : break;
242 : default:
243 0 : nEnum = TabAlign_DEFAULT;
244 0 : break;
245 : }
246 106 : return nEnum;
247 : }
248 :
249 14 : const char* GetHatchPattern( const drawing::Hatch& rHatch )
250 : {
251 14 : const char* sPattern = 0;
252 14 : const sal_Int32 nAngle = rHatch.Angle > 1800 ? rHatch.Angle - 1800 : rHatch.Angle;
253 : // Angle ~ 0° (horizontal)
254 18 : if( (nAngle >= 0 && nAngle < 225) || nAngle >= 1575 )
255 : {
256 4 : switch( rHatch.Style )
257 : {
258 : case drawing::HatchStyle_SINGLE:
259 : {
260 2 : if( rHatch.Distance < 75 )
261 1 : sPattern = "ltHorz";
262 : else
263 1 : sPattern = "horz";
264 :
265 2 : break;
266 : }
267 : case drawing::HatchStyle_DOUBLE:
268 : case drawing::HatchStyle_TRIPLE:
269 : {
270 2 : if( rHatch.Distance < 75 )
271 1 : sPattern = "smGrid";
272 : else
273 1 : sPattern = "lgGrid";
274 :
275 2 : break;
276 : }
277 0 : default: break;
278 : }
279 : }
280 : // Angle ~ 45° (upward diagonal)
281 10 : else if( nAngle < 675 )
282 : {
283 4 : switch( rHatch.Style )
284 : {
285 : case drawing::HatchStyle_SINGLE:
286 : {
287 2 : if( rHatch.Distance < 75 )
288 1 : sPattern = "ltUpDiag";
289 : else
290 1 : sPattern = "wdUpDiag";
291 :
292 2 : break;
293 : }
294 : case drawing::HatchStyle_DOUBLE:
295 : case drawing::HatchStyle_TRIPLE:
296 : {
297 2 : if( rHatch.Distance < 75 )
298 1 : sPattern = "smCheck";
299 : else
300 1 : sPattern = "openDmnd";
301 :
302 2 : break;
303 : }
304 0 : default: break;
305 : }
306 : }
307 : // Angle ~ 90° (vertical)
308 6 : else if( nAngle < 1125 )
309 : {
310 4 : switch( rHatch.Style )
311 : {
312 : case drawing::HatchStyle_SINGLE:
313 : {
314 : // dkVert is imported as Distance = 25, ltVert as Distance = 50, export them accordingly.
315 4 : if( rHatch.Distance < 50 )
316 1 : sPattern = "dkVert";
317 3 : else if( rHatch.Distance < 75 )
318 2 : sPattern = "ltVert";
319 : else
320 1 : sPattern = "vert";
321 :
322 4 : break;
323 : }
324 : case drawing::HatchStyle_DOUBLE:
325 : case drawing::HatchStyle_TRIPLE:
326 : {
327 0 : if( rHatch.Distance < 75 )
328 0 : sPattern = "smGrid";
329 : else
330 0 : sPattern = "lgGrid";
331 :
332 0 : break;
333 : }
334 0 : default: break;
335 : }
336 : }
337 : // Angle ~ 135° (downward diagonal)
338 2 : else if( nAngle < 1575 )
339 : {
340 2 : switch( rHatch.Style )
341 : {
342 : case drawing::HatchStyle_SINGLE:
343 : {
344 2 : if( rHatch.Distance < 75 )
345 1 : sPattern = "ltDnDiag";
346 : else
347 1 : sPattern = "wdDnDiag";
348 :
349 2 : break;
350 : }
351 : case drawing::HatchStyle_DOUBLE:
352 : case drawing::HatchStyle_TRIPLE:
353 : {
354 0 : if( rHatch.Distance < 75 )
355 0 : sPattern = "smCheck";
356 : else
357 0 : sPattern = "openDmnd";
358 :
359 0 : break;
360 : }
361 0 : default: break;
362 : }
363 : }
364 14 : return sPattern;
365 : }
366 :
367 : /** converts the attributes from a CT_RelativeRect to an IntegerRectangle2D */
368 3079 : IntegerRectangle2D GetRelativeRect( const Reference< XFastAttributeList >& xAttribs )
369 : {
370 3079 : IntegerRectangle2D r;
371 :
372 3079 : r.X1 = xAttribs->getOptionalValue( XML_l ).toInt32();
373 3079 : r.Y1 = xAttribs->getOptionalValue( XML_t ).toInt32();
374 3079 : r.X2 = xAttribs->getOptionalValue( XML_r ).toInt32();
375 3079 : r.Y2 = xAttribs->getOptionalValue( XML_b ).toInt32();
376 :
377 3079 : return r;
378 : }
379 :
380 : /** converts the attributes from an CT_Size2D into an awt Size with 1/100thmm */
381 166 : awt::Size GetSize2D( const Reference< XFastAttributeList >& xAttribs )
382 : {
383 166 : return awt::Size( GetCoordinate( xAttribs->getOptionalValue( XML_cx ) ), GetCoordinate( xAttribs->getOptionalValue( XML_cy ) ) );
384 : }
385 :
386 0 : IndexRange GetIndexRange( const Reference< XFastAttributeList >& xAttributes )
387 : {
388 : IndexRange range;
389 0 : range.start = xAttributes->getOptionalValue( XML_st ).toInt32();
390 0 : range.end = xAttributes->getOptionalValue( XML_end ).toInt32();
391 0 : return range;
392 : }
393 :
394 : } // namespace drawingml
395 : } // namespace oox
396 :
397 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|