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 "drawingml/shape3dproperties.hxx"
21 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
22 #include <com/sun/star/frame/XFramesSupplier.hpp>
23 #include <com/sun/star/beans/XPropertySet.hpp>
24 #include <com/sun/star/awt/Gradient.hpp>
25 #include <com/sun/star/awt/Size.hpp>
26 #include <com/sun/star/awt/XBitmap.hpp>
27 #include <com/sun/star/awt/XDevice.hpp>
28 #include <com/sun/star/drawing/BitmapMode.hpp>
29 #include <com/sun/star/drawing/FillStyle.hpp>
30 #include <com/sun/star/drawing/RectanglePoint.hpp>
31 #include <com/sun/star/graphic/XGraphicTransformer.hpp>
32 #include "oox/helper/propertymap.hxx"
33 #include "oox/helper/propertyset.hxx"
34 #include "oox/token/tokens.hxx"
36 using namespace ::com::sun::star
;
37 using namespace ::com::sun::star::drawing
;
38 using namespace ::com::sun::star::graphic
;
44 OUString
Shape3DProperties::getCameraPrstName( sal_Int32 nElement
)
48 case XML_legacyObliqueTopLeft
: return OUString( "legacyObliqueTopLeft" );
49 case XML_legacyObliqueTop
: return OUString( "legacyObliqueTop" );
50 case XML_legacyObliqueTopRight
: return OUString( "legacyObliqueTopRight" );
51 case XML_legacyObliqueLeft
: return OUString( "legacyObliqueLeft" );
52 case XML_legacyObliqueFront
: return OUString( "legacyObliqueFront" );
53 case XML_legacyObliqueRight
: return OUString( "legacyObliqueRight" );
54 case XML_legacyObliqueBottomLeft
: return OUString( "legacyObliqueBottomLeft" );
55 case XML_legacyObliqueBottom
: return OUString( "legacyObliqueBottom" );
56 case XML_legacyObliqueBottomRight
: return OUString( "legacyObliqueBottomRight" );
57 case XML_legacyPerspectiveTopLeft
: return OUString( "legacyPerspectiveTopLeft" );
58 case XML_legacyPerspectiveTop
: return OUString( "legacyPerspectiveTop" );
59 case XML_legacyPerspectiveTopRight
: return OUString( "legacyPerspectiveTopRight" );
60 case XML_legacyPerspectiveLeft
: return OUString( "legacyPerspectiveLeft" );
61 case XML_legacyPerspectiveFront
: return OUString( "legacyPerspectiveFront" );
62 case XML_legacyPerspectiveRight
: return OUString( "legacyPerspectiveRight" );
63 case XML_legacyPerspectiveBottomLeft
: return OUString( "legacyPerspectiveBottomLeft" );
64 case XML_legacyPerspectiveBottom
: return OUString( "legacyPerspectiveBottom" );
65 case XML_legacyPerspectiveBottomRight
: return OUString( "legacyPerspectiveBottomRight" );
66 case XML_orthographicFront
: return OUString( "orthographicFront" );
67 case XML_isometricTopUp
: return OUString( "isometricTopUp" );
68 case XML_isometricTopDown
: return OUString( "isometricTopDown" );
69 case XML_isometricBottomUp
: return OUString( "isometricBottomUp" );
70 case XML_isometricBottomDown
: return OUString( "isometricBottomDown" );
71 case XML_isometricLeftUp
: return OUString( "isometricLeftUp" );
72 case XML_isometricLeftDown
: return OUString( "isometricLeftDown" );
73 case XML_isometricRightUp
: return OUString( "isometricRightUp" );
74 case XML_isometricRightDown
: return OUString( "isometricRightDown" );
75 case XML_isometricOffAxis1Left
: return OUString( "isometricOffAxis1Left" );
76 case XML_isometricOffAxis1Right
: return OUString( "isometricOffAxis1Right" );
77 case XML_isometricOffAxis1Top
: return OUString( "isometricOffAxis1Top" );
78 case XML_isometricOffAxis2Left
: return OUString( "isometricOffAxis2Left" );
79 case XML_isometricOffAxis2Right
: return OUString( "isometricOffAxis2Right" );
80 case XML_isometricOffAxis2Top
: return OUString( "isometricOffAxis2Top" );
81 case XML_isometricOffAxis3Left
: return OUString( "isometricOffAxis3Left" );
82 case XML_isometricOffAxis3Right
: return OUString( "isometricOffAxis3Right" );
83 case XML_isometricOffAxis3Bottom
: return OUString( "isometricOffAxis3Bottom" );
84 case XML_isometricOffAxis4Left
: return OUString( "isometricOffAxis4Left" );
85 case XML_isometricOffAxis4Right
: return OUString( "isometricOffAxis4Right" );
86 case XML_isometricOffAxis4Bottom
: return OUString( "isometricOffAxis4Bottom" );
87 case XML_obliqueTopLeft
: return OUString( "obliqueTopLeft" );
88 case XML_obliqueTop
: return OUString( "obliqueTop" );
89 case XML_obliqueTopRight
: return OUString( "obliqueTopRight" );
90 case XML_obliqueLeft
: return OUString( "obliqueLeft" );
91 case XML_obliqueRight
: return OUString( "obliqueRight" );
92 case XML_obliqueBottomLeft
: return OUString( "obliqueBottomLeft" );
93 case XML_obliqueBottom
: return OUString( "obliqueBottom" );
94 case XML_obliqueBottomRight
: return OUString( "obliqueBottomRight" );
95 case XML_perspectiveFront
: return OUString( "perspectiveFront" );
96 case XML_perspectiveLeft
: return OUString( "perspectiveLeft" );
97 case XML_perspectiveRight
: return OUString( "perspectiveRight" );
98 case XML_perspectiveAbove
: return OUString( "perspectiveAbove" );
99 case XML_perspectiveBelow
: return OUString( "perspectiveBelow" );
100 case XML_perspectiveAboveLeftFacing
: return OUString( "perspectiveAboveLeftFacing" );
101 case XML_perspectiveAboveRightFacing
: return OUString( "perspectiveAboveRightFacing" );
102 case XML_perspectiveContrastingLeftFacing
: return OUString( "perspectiveContrastingLeftFacing" );
103 case XML_perspectiveContrastingRightFacing
: return OUString( "perspectiveContrastingRightFacing" );
104 case XML_perspectiveHeroicLeftFacing
: return OUString( "perspectiveHeroicLeftFacing" );
105 case XML_perspectiveHeroicRightFacing
: return OUString( "perspectiveHeroicRightFacing" );
106 case XML_perspectiveHeroicExtremeLeftFacing
: return OUString( "perspectiveHeroicExtremeLeftFacing" );
107 case XML_perspectiveHeroicExtremeRightFacing
: return OUString( "perspectiveHeroicExtremeRightFacing" );
108 case XML_perspectiveRelaxed
: return OUString( "perspectiveRelaxed" );
109 case XML_perspectiveRelaxedModerately
: return OUString( "perspectiveRelaxedModerately" );
111 SAL_WARN( "oox.drawingml", "Shape3DProperties::getCameraPrstName - unexpected prst type" );
115 OUString
Shape3DProperties::getLightRigName( sal_Int32 nElement
)
119 case XML_legacyFlat1
: return OUString( "legacyFlat1" );
120 case XML_legacyFlat2
: return OUString( "legacyFlat2" );
121 case XML_legacyFlat3
: return OUString( "legacyFlat3" );
122 case XML_legacyFlat4
: return OUString( "legacyFlat4" );
123 case XML_legacyNormal1
: return OUString( "legacyNormal1" );
124 case XML_legacyNormal2
: return OUString( "legacyNormal2" );
125 case XML_legacyNormal3
: return OUString( "legacyNormal3" );
126 case XML_legacyNormal4
: return OUString( "legacyNormal4" );
127 case XML_legacyHarsh1
: return OUString( "legacyHarsh1" );
128 case XML_legacyHarsh2
: return OUString( "legacyHarsh2" );
129 case XML_legacyHarsh3
: return OUString( "legacyHarsh3" );
130 case XML_legacyHarsh4
: return OUString( "legacyHarsh4" );
131 case XML_threePt
: return OUString( "threePt" );
132 case XML_balanced
: return OUString( "balanced" );
133 case XML_soft
: return OUString( "soft" );
134 case XML_harsh
: return OUString( "harsh" );
135 case XML_flood
: return OUString( "flood" );
136 case XML_contrasting
: return OUString( "contrasting" );
137 case XML_morning
: return OUString( "morning" );
138 case XML_sunrise
: return OUString( "sunrise" );
139 case XML_sunset
: return OUString( "sunset" );
140 case XML_chilly
: return OUString( "chilly" );
141 case XML_freezing
: return OUString( "freezing" );
142 case XML_flat
: return OUString( "flat" );
143 case XML_twoPt
: return OUString( "twoPt" );
144 case XML_glow
: return OUString( "glow" );
145 case XML_brightRoom
: return OUString( "brightRoom" );
147 SAL_WARN( "oox.drawingml", "Shape3DProperties::getLightRigName - unexpected token" );
151 OUString
Shape3DProperties::getLightRigDirName( sal_Int32 nElement
)
155 case XML_tl
: return OUString( "tl" );
156 case XML_t
: return OUString( "t" );
157 case XML_tr
: return OUString( "tr" );
158 case XML_l
: return OUString( "l" );
159 case XML_r
: return OUString( "r" );
160 case XML_bl
: return OUString( "bl" );
161 case XML_b
: return OUString( "b" );
162 case XML_br
: return OUString( "br" );
164 SAL_WARN( "oox.drawingml", "Shape3DProperties::getLightRigDirName - unexpected token" );
168 OUString
Shape3DProperties::getBevelPresetTypeString( sal_Int32 nType
)
172 case XML_relaxedInset
: return OUString("relaxedInset");
173 case XML_circle
: return OUString("circle");
174 case XML_slope
: return OUString("slope");
175 case XML_cross
: return OUString("cross");
176 case XML_angle
: return OUString("angle");
177 case XML_softRound
: return OUString("softRound");
178 case XML_convex
: return OUString("convex");
179 case XML_coolSlant
: return OUString("coolSlant");
180 case XML_divot
: return OUString("divot");
181 case XML_riblet
: return OUString("riblet");
182 case XML_hardEdge
: return OUString("hardEdge");
183 case XML_artDeco
: return OUString("artDeco");
185 SAL_WARN( "oox.drawingml", "Shape3DProperties::getBevelPresetTypeString - unexpected token" );
189 OUString
Shape3DProperties::getPresetMaterialTypeString( sal_Int32 nType
)
193 case XML_legacyMatte
: return OUString("legacyMatte");
194 case XML_legacyPlastic
: return OUString("legacyPlastic");
195 case XML_legacyMetal
: return OUString("legacyMetal");
196 case XML_legacyWireframe
: return OUString("legacyWireframe");
197 case XML_matte
: return OUString("matte");
198 case XML_plastic
: return OUString("plastic");
199 case XML_metal
: return OUString("metal");
200 case XML_warmMatte
: return OUString("warmMatte");
201 case XML_translucentPowder
: return OUString("translucentPowder");
202 case XML_powder
: return OUString("powder");
203 case XML_dkEdge
: return OUString("dkEdge");
204 case XML_softEdge
: return OUString("softEdge");
205 case XML_clear
: return OUString("clear");
206 case XML_flat
: return OUString("flat");
207 case XML_softmetal
: return OUString("softmetal");
208 case XML_none
: return OUString("none");
210 SAL_WARN( "oox.drawingml", "Shape3DProperties::getPresetMaterialTypeString - unexpected token" );
214 css::uno::Sequence
< css::beans::PropertyValue
> Shape3DProperties::getCameraAttributes()
216 css::uno::Sequence
<css::beans::PropertyValue
> aSeq(6);
218 if( mfFieldOfVision
.has() )
220 aSeq
[nSize
].Name
= "fov";
221 aSeq
[nSize
].Value
<<= mfFieldOfVision
.use();
226 aSeq
[nSize
].Name
= "zoom";
227 aSeq
[nSize
].Value
<<= mfZoom
.use();
232 aSeq
[nSize
].Name
= "prst";
233 aSeq
[nSize
].Value
<<= getCameraPrstName( mnPreset
.use() );
236 if( maCameraRotation
.mnLatitude
.has() )
238 aSeq
[nSize
].Name
= "rotLat";
239 aSeq
[nSize
].Value
<<= maCameraRotation
.mnLatitude
.use();
242 if( maCameraRotation
.mnLongitude
.has() )
244 aSeq
[nSize
].Name
= "rotLon";
245 aSeq
[nSize
].Value
<<= maCameraRotation
.mnLongitude
.use();
248 if( maCameraRotation
.mnRevolution
.has() )
250 aSeq
[nSize
].Name
= "rotRev";
251 aSeq
[nSize
].Value
<<= maCameraRotation
.mnRevolution
.use();
254 aSeq
.realloc( nSize
);
258 css::uno::Sequence
< css::beans::PropertyValue
> Shape3DProperties::getLightRigAttributes()
260 css::uno::Sequence
<css::beans::PropertyValue
> aSeq(5);
262 if( mnLightRigDirection
.has() )
264 aSeq
[nSize
].Name
= "dir";
265 aSeq
[nSize
].Value
<<= getLightRigDirName( mnLightRigDirection
.use() );
268 if( mnLightRigType
.has() )
270 aSeq
[nSize
].Name
= "rig";
271 aSeq
[nSize
].Value
<<= getLightRigName( mnLightRigType
.use() );
274 if( maLightRigRotation
.mnLatitude
.has() )
276 aSeq
[nSize
].Name
= "rotLat";
277 aSeq
[nSize
].Value
<<= maLightRigRotation
.mnLatitude
.use();
280 if( maLightRigRotation
.mnLongitude
.has() )
282 aSeq
[nSize
].Name
= "rotLon";
283 aSeq
[nSize
].Value
<<= maLightRigRotation
.mnLongitude
.use();
286 if( maLightRigRotation
.mnRevolution
.has() )
288 aSeq
[nSize
].Name
= "rotRev";
289 aSeq
[nSize
].Value
<<= maLightRigRotation
.mnRevolution
.use();
292 aSeq
.realloc( nSize
);
296 css::uno::Sequence
< css::beans::PropertyValue
> Shape3DProperties::getBevelAttributes( BevelProperties rProps
)
298 css::uno::Sequence
<css::beans::PropertyValue
> aSeq(3);
300 if( rProps
.mnPreset
.has() )
302 aSeq
[nSize
].Name
= "prst";
303 aSeq
[nSize
].Value
<<= getBevelPresetTypeString( rProps
.mnPreset
.use() );
306 if( rProps
.mnWidth
.has() )
308 aSeq
[nSize
].Name
= "w";
309 aSeq
[nSize
].Value
<<= rProps
.mnWidth
.use();
312 if( rProps
.mnHeight
.has() )
314 aSeq
[nSize
].Name
= "h";
315 aSeq
[nSize
].Value
<<= rProps
.mnHeight
.use();
318 aSeq
.realloc( nSize
);
322 css::uno::Sequence
< css::beans::PropertyValue
> Shape3DProperties::getColorAttributes(
323 const Color
& rColor
, const GraphicHelper
& rGraphicHelper
, sal_Int32 rPhClr
)
325 css::uno::Sequence
<css::beans::PropertyValue
> aSeq(2);
326 const OUString
& sColorScheme
= rColor
.getSchemeName();
327 if( sColorScheme
.isEmpty() )
329 // RGB color and transparency value
330 aSeq
[0].Name
= "rgbClr";
331 aSeq
[0].Value
<<= rColor
.getColor( rGraphicHelper
, rPhClr
);
332 aSeq
[1].Name
= "rgbClrTransparency";
333 aSeq
[1].Value
<<= rColor
.getTransparency();
337 // scheme color with name and transformations
338 aSeq
[0].Name
= "schemeClr";
339 aSeq
[0].Value
<<= sColorScheme
;
340 aSeq
[1].Name
= "schemeClrTransformations";
341 aSeq
[1].Value
<<= rColor
.getTransformations();
346 css::uno::Sequence
< css::beans::PropertyValue
> Shape3DProperties::getShape3DAttributes(
347 const GraphicHelper
& rGraphicHelper
, sal_Int32 rPhClr
)
349 css::uno::Sequence
<css::beans::PropertyValue
> aSeq(8);
351 if( mnExtrusionH
.has() )
353 aSeq
[nSize
].Name
= "extrusionH";
354 aSeq
[nSize
].Value
<<= mnExtrusionH
.use();
357 if( mnContourW
.has() )
359 aSeq
[nSize
].Name
= "contourW";
360 aSeq
[nSize
].Value
<<= mnContourW
.use();
365 aSeq
[nSize
].Name
= "z";
366 aSeq
[nSize
].Value
<<= mnShapeZ
.use();
369 if( mnMaterial
.has() )
371 aSeq
[nSize
].Name
= "prstMaterial";
372 aSeq
[nSize
].Value
<<= getPresetMaterialTypeString( mnMaterial
.use() );
375 if( maTopBevelProperties
.has() )
377 aSeq
[nSize
].Name
= "bevelT";
378 aSeq
[nSize
].Value
<<= getBevelAttributes( maTopBevelProperties
.use() );
381 if( maBottomBevelProperties
.has() )
383 aSeq
[nSize
].Name
= "bevelB";
384 aSeq
[nSize
].Value
<<= getBevelAttributes( maBottomBevelProperties
.use() );
387 if( maExtrusionColor
.isUsed() )
389 aSeq
[nSize
].Name
= "extrusionClr";
390 aSeq
[nSize
].Value
<<= getColorAttributes( maExtrusionColor
, rGraphicHelper
, rPhClr
);
393 if( maContourColor
.isUsed() )
395 aSeq
[nSize
].Name
= "contourClr";
396 aSeq
[nSize
].Value
<<= getColorAttributes( maContourColor
, rGraphicHelper
, rPhClr
);
399 aSeq
.realloc( nSize
);
403 } // namespace drawingml
406 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */