1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #include <com/sun/star/animations/TransitionType.hpp>
21 #include <com/sun/star/animations/TransitionSubType.hpp>
22 #include <com/sun/star/animations/ValuePair.hpp>
23 #include <com/sun/star/awt/FontWeight.hpp>
24 #include <com/sun/star/awt/FontUnderline.hpp>
25 #include <com/sun/star/awt/FontSlant.hpp>
26 #include <com/sun/star/drawing/LineStyle.hpp>
27 #include <com/sun/star/drawing/FillStyle.hpp>
28 #include <com/sun/star/uno/Sequence.hxx>
29 #include <oox/ppt/pptfilterhelpers.hxx>
30 #include <rtl/ustrbuf.hxx>
31 #include <tools/color.hxx>
34 int lcl_gethex(int nChar
)
36 if (nChar
>= '0' && nChar
<= '9')
38 else if (nChar
>= 'a' && nChar
<= 'f')
39 return nChar
- 'a' + 10;
40 else if (nChar
>= 'A' && nChar
<= 'F')
41 return nChar
- 'A' + 10;
47 namespace oox
{ namespace ppt
{
49 const ImplAttributeNameConversion
*getAttributeConversionList()
51 static const ImplAttributeNameConversion aList
[] =
53 { AnimationAttributeEnum::PPT_X
, "ppt_x", "X" },
54 { AnimationAttributeEnum::PPT_Y
, "ppt_y", "Y" },
55 { AnimationAttributeEnum::PPT_W
, "ppt_w", "Width" },
56 { AnimationAttributeEnum::PPT_H
, "ppt_h", "Height" },
57 { AnimationAttributeEnum::PPT_C
, "ppt_c", "DimColor" },
58 { AnimationAttributeEnum::R
, "r", "Rotate" },
59 { AnimationAttributeEnum::XSHEAR
, "xshear", "SkewX" },
60 { AnimationAttributeEnum::FILLCOLOR
, "fillcolor", "FillColor" },
61 { AnimationAttributeEnum::FILLCOLOR
, "fillColor", "FillColor" },
62 { AnimationAttributeEnum::FILLTYPE
, "fill.type", "FillStyle" },
63 { AnimationAttributeEnum::FILLON
, "fill.on", "FillOn" },
64 { AnimationAttributeEnum::STROKECOLOR
, "stroke.color", "LineColor" },
65 { AnimationAttributeEnum::STROKEON
, "stroke.on", "LineStyle" },
66 { AnimationAttributeEnum::STYLECOLOR
, "style.color", "CharColor" },
67 { AnimationAttributeEnum::STYLEROTATION
, "style.rotation", "Rotate" },
68 { AnimationAttributeEnum::FONTWEIGHT
, "style.fontWeight", "CharWeight" },
69 { AnimationAttributeEnum::STYLEUNDERLINE
, "style.textDecorationUnderline","CharUnderline" },
70 { AnimationAttributeEnum::STYLEFONTFAMILY
, "style.fontFamily", "CharFontName" },
71 { AnimationAttributeEnum::STYLEFONTSIZE
, "style.fontSize", "CharHeight" },
72 { AnimationAttributeEnum::STYLEFONTSTYLE
, "style.fontStyle", "CharPosture" },
73 { AnimationAttributeEnum::STYLEVISIBILITY
, "style.visibility", "Visibility" },
74 { AnimationAttributeEnum::STYLEOPACITY
, "style.opacity", "Opacity" },
75 { AnimationAttributeEnum::UNKNOWN
, nullptr, nullptr }
81 const transition
* transition::getList()
83 static const transition aList
[] =
85 { "wipe(up)", css::animations::TransitionType::BARWIPE
, css::animations::TransitionSubType::TOPTOBOTTOM
, true },
86 { "wipe(right)", css::animations::TransitionType::BARWIPE
, css::animations::TransitionSubType::LEFTTORIGHT
, false },
87 { "wipe(left)", css::animations::TransitionType::BARWIPE
, css::animations::TransitionSubType::LEFTTORIGHT
, true },
88 { "wipe(down)", css::animations::TransitionType::BARWIPE
, css::animations::TransitionSubType::TOPTOBOTTOM
, false },
89 { "wheel(1)", css::animations::TransitionType::PINWHEELWIPE
, css::animations::TransitionSubType::ONEBLADE
, true },
90 { "wheel(2)", css::animations::TransitionType::PINWHEELWIPE
, css::animations::TransitionSubType::TWOBLADEVERTICAL
, true },
91 { "wheel(3)", css::animations::TransitionType::PINWHEELWIPE
, css::animations::TransitionSubType::THREEBLADE
, true },
92 { "wheel(4)", css::animations::TransitionType::PINWHEELWIPE
, css::animations::TransitionSubType::FOURBLADE
, true },
93 { "wheel(8)", css::animations::TransitionType::PINWHEELWIPE
, css::animations::TransitionSubType::EIGHTBLADE
, true },
94 { "strips(downLeft)", css::animations::TransitionType::WATERFALLWIPE
, css::animations::TransitionSubType::HORIZONTALRIGHT
, true },
95 { "strips(upLeft)", css::animations::TransitionType::WATERFALLWIPE
, css::animations::TransitionSubType::HORIZONTALLEFT
, false },
96 { "strips(downRight)", css::animations::TransitionType::WATERFALLWIPE
, css::animations::TransitionSubType::HORIZONTALLEFT
, true },
97 { "strips(upRight)", css::animations::TransitionType::WATERFALLWIPE
, css::animations::TransitionSubType::HORIZONTALRIGHT
, false },
98 { "barn(inVertical)", css::animations::TransitionType::BARNDOORWIPE
, css::animations::TransitionSubType::VERTICAL
, false },
99 { "barn(outVertical)", css::animations::TransitionType::BARNDOORWIPE
, css::animations::TransitionSubType::VERTICAL
, true },
100 { "barn(inHorizontal)", css::animations::TransitionType::BARNDOORWIPE
, css::animations::TransitionSubType::HORIZONTAL
, false },
101 { "barn(outHorizontal)", css::animations::TransitionType::BARNDOORWIPE
, css::animations::TransitionSubType::HORIZONTAL
, true },
102 { "randombar(vertical)", css::animations::TransitionType::RANDOMBARWIPE
, css::animations::TransitionSubType::VERTICAL
, true},
103 { "randombar(horizontal)", css::animations::TransitionType::RANDOMBARWIPE
, css::animations::TransitionSubType::HORIZONTAL
, true },
104 { "checkerboard(down)", css::animations::TransitionType::CHECKERBOARDWIPE
, css::animations::TransitionSubType::DOWN
, true},
105 { "checkerboard(across)", css::animations::TransitionType::CHECKERBOARDWIPE
, css::animations::TransitionSubType::ACROSS
, true },
106 { "plus(out)", css::animations::TransitionType::FOURBOXWIPE
, css::animations::TransitionSubType::CORNERSIN
, false },
107 { "plus(in)", css::animations::TransitionType::FOURBOXWIPE
, css::animations::TransitionSubType::CORNERSIN
, true },
108 { "diamond(out)", css::animations::TransitionType::IRISWIPE
, css::animations::TransitionSubType::DIAMOND
, true },
109 { "diamond(in)", css::animations::TransitionType::IRISWIPE
, css::animations::TransitionSubType::DIAMOND
, false },
110 { "circle(out)", css::animations::TransitionType::ELLIPSEWIPE
, css::animations::TransitionSubType::HORIZONTAL
, true },
111 { "circle(in)", css::animations::TransitionType::ELLIPSEWIPE
, css::animations::TransitionSubType::HORIZONTAL
, false },
112 { "box(out)", css::animations::TransitionType::IRISWIPE
, css::animations::TransitionSubType::RECTANGLE
, true },
113 { "box(in)", css::animations::TransitionType::IRISWIPE
, css::animations::TransitionSubType::RECTANGLE
, false },
114 { "wedge", css::animations::TransitionType::FANWIPE
, css::animations::TransitionSubType::CENTERTOP
, true },
115 { "blinds(vertical)", css::animations::TransitionType::BLINDSWIPE
, css::animations::TransitionSubType::VERTICAL
, true },
116 { "blinds(horizontal)", css::animations::TransitionType::BLINDSWIPE
, css::animations::TransitionSubType::HORIZONTAL
, true },
117 { "fade", css::animations::TransitionType::FADE
, css::animations::TransitionSubType::CROSSFADE
, true },
118 { "slide(fromTop)", css::animations::TransitionType::SLIDEWIPE
, css::animations::TransitionSubType::FROMTOP
, true },
119 { "slide(fromRight)", css::animations::TransitionType::SLIDEWIPE
, css::animations::TransitionSubType::FROMRIGHT
, true },
120 { "slide(fromLeft)", css::animations::TransitionType::SLIDEWIPE
, css::animations::TransitionSubType::FROMLEFT
, true },
121 { "slide(fromBottom)", css::animations::TransitionType::SLIDEWIPE
, css::animations::TransitionSubType::FROMBOTTOM
, true },
122 { "dissolve", css::animations::TransitionType::DISSOLVE
, css::animations::TransitionSubType::DEFAULT
, true },
123 { "image", css::animations::TransitionType::DISSOLVE
, css::animations::TransitionSubType::DEFAULT
, true }, // TODO
124 { nullptr, 0, 0, false }
130 const transition
* transition::find( const OUString
& rName
)
132 const transition
* p
= transition::getList();
136 if( rName
.equalsAscii( p
->mpName
) )
145 bool convertMeasure(OUString
& rString
)
149 const sal_Char
* pSource
[] = { "ppt_x", "ppt_y", "ppt_w", "ppt_h", nullptr };
150 const sal_Char
* pDest
[] = { "x", "y", "width", "height", nullptr };
152 /* here we want to substitute all occurrences of
154 * x,y,height and width respectively
156 sal_Int32 nIndex
= 0;
158 const sal_Char
** ps
= pSource
;
159 const sal_Char
** pd
= pDest
;
163 const OUString
aSearch(OUString::createFromAscii(*ps
));
164 while ((nIndex
= rString
.indexOf(aSearch
, nIndex
)) != -1)
166 sal_Int32 nLength
= aSearch
.getLength();
167 if (nIndex
&& (rString
[nIndex
- 1] == '#'))
173 const OUString
aNew(OUString::createFromAscii(*pd
));
174 rString
= rString
.replaceAt(nIndex
, nLength
, aNew
);
175 nIndex
+= aNew
.getLength();
185 bool convertAnimationValue(AnimationAttributeEnum eAttribute
, css::uno::Any
& rValue
)
187 using css::animations::ValuePair
;
191 case AnimationAttributeEnum::PPT_X
:
192 case AnimationAttributeEnum::PPT_Y
:
193 case AnimationAttributeEnum::PPT_W
:
194 case AnimationAttributeEnum::PPT_H
:
198 if (rValue
.getValueType() == cppu::UnoType
<ValuePair
>::get())
200 ValuePair aValuePair
;
201 if (rValue
>>= aValuePair
)
203 if (aValuePair
.First
>>= aString
)
205 if (convertMeasure(aString
))
207 aValuePair
.First
<<= aString
;
212 if (aValuePair
.Second
>>= aString
)
214 if (convertMeasure(aString
))
216 aValuePair
.Second
<<= aString
;
222 else if (rValue
.getValueType() == cppu::UnoType
<OUString
>::get())
224 if (rValue
>>= aString
)
226 bRet
= convertMeasure(aString
);
235 case AnimationAttributeEnum::XSHEAR
:
236 case AnimationAttributeEnum::R
:
239 if (rValue
>>= aString
)
241 rValue
<<= aString
.toDouble();
247 case AnimationAttributeEnum::STYLEROTATION
:
249 if (rValue
.getValueType() == cppu::UnoType
<OUString
>::get())
253 rValue
<<= static_cast<sal_Int16
>(aString
.toDouble());
256 else if (rValue
.getValueType() == cppu::UnoType
<double>::get())
260 rValue
<<= static_cast<sal_Int16
>(fValue
);
266 case AnimationAttributeEnum::FILLCOLOR
:
267 case AnimationAttributeEnum::STROKECOLOR
:
268 case AnimationAttributeEnum::STYLECOLOR
:
269 case AnimationAttributeEnum::PPT_C
:
272 if (rValue
>>= aString
)
274 if (aString
.getLength() >= 7 && aString
[0] == '#')
277 aColor
.SetRed(static_cast<sal_uInt8
>(lcl_gethex(aString
[1]) * 16
278 + lcl_gethex(aString
[2])));
279 aColor
.SetGreen(static_cast<sal_uInt8
>(lcl_gethex(aString
[3]) * 16
280 + lcl_gethex(aString
[4])));
281 aColor
.SetBlue(static_cast<sal_uInt8
>(lcl_gethex(aString
[5]) * 16
282 + lcl_gethex(aString
[6])));
286 else if (aString
.startsWith("rgb("))
288 aString
= aString
.copy(4, aString
.getLength() - 5);
292 static_cast<sal_uInt8
>(aString
.getToken(0, ',', index
).toInt32()));
294 static_cast<sal_uInt8
>(aString
.getToken(0, ',', index
).toInt32()));
296 static_cast<sal_uInt8
>(aString
.getToken(0, ',', index
).toInt32()));
300 else if (aString
.startsWith("hsl("))
303 sal_Int32 nA
= aString
.getToken(0, ',', index
).toInt32();
304 sal_Int32 nB
= aString
.getToken(0, ',', index
).toInt32();
305 sal_Int32 nC
= aString
.getToken(0, ',', index
).toInt32();
306 css::uno::Sequence
<double> aHSL(3);
307 aHSL
[0] = nA
* 360.0 / 255.0;
308 aHSL
[1] = nB
/ 255.0;
309 aHSL
[2] = nC
/ 255.0;
316 case AnimationAttributeEnum::FILLON
:
318 // Slideshow doesn't support FillOn, but we need to convert the value type
319 // so it can be written out again.
321 if (rValue
>>= aString
)
323 rValue
<<= aString
== "true";
329 case AnimationAttributeEnum::FILLTYPE
:
332 if (rValue
>>= aString
)
334 rValue
<<= aString
== "solid" ? css::drawing::FillStyle_SOLID
335 : css::drawing::FillStyle_NONE
;
341 case AnimationAttributeEnum::STROKEON
:
344 if (rValue
>>= aString
)
346 rValue
<<= aString
== "true" ? css::drawing::LineStyle_SOLID
347 : css::drawing::LineStyle_NONE
;
353 case AnimationAttributeEnum::FONTWEIGHT
:
356 if (rValue
>>= aString
)
358 rValue
<<= aString
== "bold" ? css::awt::FontWeight::BOLD
359 : css::awt::FontWeight::NORMAL
;
365 case AnimationAttributeEnum::STYLEFONTSTYLE
:
368 if (rValue
>>= aString
)
371 <<= aString
== "italic" ? css::awt::FontSlant_ITALIC
: css::awt::FontSlant_NONE
;
377 case AnimationAttributeEnum::STYLEUNDERLINE
:
380 if (rValue
>>= aString
)
382 rValue
<<= aString
== "true" ? css::awt::FontUnderline::SINGLE
383 : css::awt::FontUnderline::NONE
;
389 case AnimationAttributeEnum::STYLEOPACITY
:
390 case AnimationAttributeEnum::STYLEFONTSIZE
:
393 if (rValue
>>= aString
)
395 rValue
<<= static_cast<float>(aString
.toDouble());
401 case AnimationAttributeEnum::STYLEVISIBILITY
:
404 if (rValue
>>= aString
)
406 rValue
<<= aString
== "visible";
420 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */