xref: /AOO41X/main/xmloff/source/style/TransGradientStyle.cxx (revision 63bba73cc51e0afb45f8a8d578158724bb5afee8)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_xmloff.hxx"
26 #include "TransGradientStyle.hxx"
27 #include <com/sun/star/awt/Gradient.hpp>
28 #include <xmloff/attrlist.hxx>
29 #include <xmloff/nmspmap.hxx>
30 #include <xmloff/xmluconv.hxx>
31 #include "xmloff/xmlnmspe.hxx"
32 #include <rtl/ustrbuf.hxx>
33 #include <rtl/ustring.hxx>
34 #include <tools/debug.hxx>
35 #include <xmloff/xmltkmap.hxx>
36 #include <xmloff/xmlexp.hxx>
37 #include <xmloff/xmlimp.hxx>
38 
39 
40 using namespace ::com::sun::star;
41 using ::rtl::OUString;
42 using ::rtl::OUStringBuffer;
43 
44 using namespace ::xmloff::token;
45 
46 enum SvXMLTokenMapAttrs
47 {
48     XML_TOK_GRADIENT_NAME,
49     XML_TOK_GRADIENT_DISPLAY_NAME,
50     XML_TOK_GRADIENT_STYLE,
51     XML_TOK_GRADIENT_CX,
52     XML_TOK_GRADIENT_CY,
53     XML_TOK_GRADIENT_START,
54     XML_TOK_GRADIENT_END,
55     XML_TOK_GRADIENT_ANGLE,
56     XML_TOK_GRADIENT_BORDER,
57     XML_TOK_TABSTOP_END=XML_TOK_UNKNOWN
58 };
59 
60 
61 SvXMLEnumMapEntry __READONLY_DATA pXML_GradientStyle_Enum[] =
62 {
63     { XML_GRADIENTSTYLE_LINEAR,         awt::GradientStyle_LINEAR },
64     { XML_GRADIENTSTYLE_AXIAL,          awt::GradientStyle_AXIAL },
65     { XML_GRADIENTSTYLE_RADIAL,         awt::GradientStyle_RADIAL },
66     { XML_GRADIENTSTYLE_ELLIPSOID,      awt::GradientStyle_ELLIPTICAL },
67     { XML_GRADIENTSTYLE_SQUARE,         awt::GradientStyle_SQUARE },
68     { XML_GRADIENTSTYLE_RECTANGULAR,    awt::GradientStyle_RECT },
69     { XML_TOKEN_INVALID,                0 }
70 };
71 
72 
73 //-------------------------------------------------------------
74 // Import
75 //-------------------------------------------------------------
76 
XMLTransGradientStyleImport(SvXMLImport & rImp)77 XMLTransGradientStyleImport::XMLTransGradientStyleImport( SvXMLImport& rImp )
78     : rImport(rImp)
79 {
80 }
81 
~XMLTransGradientStyleImport()82 XMLTransGradientStyleImport::~XMLTransGradientStyleImport()
83 {
84 }
85 
importXML(const uno::Reference<xml::sax::XAttributeList> & xAttrList,uno::Any & rValue,OUString & rStrName)86 sal_Bool XMLTransGradientStyleImport::importXML(
87     const uno::Reference< xml::sax::XAttributeList >& xAttrList,
88     uno::Any& rValue,
89     OUString& rStrName )
90 {
91     sal_Bool bRet           = sal_False;
92     sal_Bool bHasName       = sal_False;
93     sal_Bool bHasStyle      = sal_False;
94     OUString aDisplayName;
95 
96     awt::Gradient aGradient;
97     aGradient.XOffset = 0;
98     aGradient.YOffset = 0;
99     aGradient.StartIntensity = 100;
100     aGradient.EndIntensity = 100;
101     aGradient.Angle = 0;
102     aGradient.Border = 0;
103 
104     {
105         static __FAR_DATA SvXMLTokenMapEntry aTrGradientAttrTokenMap[] =
106 {
107     { XML_NAMESPACE_DRAW, XML_NAME, XML_TOK_GRADIENT_NAME },
108     { XML_NAMESPACE_DRAW, XML_DISPLAY_NAME, XML_TOK_GRADIENT_DISPLAY_NAME },
109     { XML_NAMESPACE_DRAW, XML_STYLE, XML_TOK_GRADIENT_STYLE },
110     { XML_NAMESPACE_DRAW, XML_CX, XML_TOK_GRADIENT_CX },
111     { XML_NAMESPACE_DRAW, XML_CY, XML_TOK_GRADIENT_CY },
112     { XML_NAMESPACE_DRAW, XML_START, XML_TOK_GRADIENT_START },
113     { XML_NAMESPACE_DRAW, XML_END, XML_TOK_GRADIENT_END },
114     { XML_NAMESPACE_DRAW, XML_GRADIENT_ANGLE, XML_TOK_GRADIENT_ANGLE },
115     { XML_NAMESPACE_DRAW, XML_GRADIENT_BORDER, XML_TOK_GRADIENT_BORDER },
116     XML_TOKEN_MAP_END
117 };
118 
119     SvXMLTokenMap aTokenMap( aTrGradientAttrTokenMap );
120     SvXMLNamespaceMap& rNamespaceMap = rImport.GetNamespaceMap();
121 
122     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
123     for( sal_Int16 i=0; i < nAttrCount; i++ )
124     {
125         const OUString& rFullAttrName = xAttrList->getNameByIndex( i );
126         OUString aStrAttrName;
127         sal_uInt16 nPrefix = rNamespaceMap.GetKeyByAttrName( rFullAttrName, &aStrAttrName );
128         const OUString& rStrValue = xAttrList->getValueByIndex( i );
129 
130         sal_Int32 nTmpValue;
131 
132         switch( aTokenMap.Get( nPrefix, aStrAttrName ) )
133         {
134         case XML_TOK_GRADIENT_NAME:
135             {
136                 rStrName = rStrValue;
137                 bHasName = sal_True;
138             }
139             break;
140         case XML_TOK_GRADIENT_DISPLAY_NAME:
141             {
142                 aDisplayName = rStrValue;
143             }
144             break;
145         case XML_TOK_GRADIENT_STYLE:
146             {
147                 sal_uInt16 eValue;
148                 if( SvXMLUnitConverter::convertEnum( eValue, rStrValue, pXML_GradientStyle_Enum ) )
149                 {
150                     aGradient.Style = (awt::GradientStyle) eValue;
151                     bHasStyle = sal_True;
152                 }
153             }
154             break;
155         case XML_TOK_GRADIENT_CX:
156             SvXMLUnitConverter::convertPercent( nTmpValue, rStrValue );
157             aGradient.XOffset = sal::static_int_cast< sal_Int16 >(nTmpValue);
158             break;
159         case XML_TOK_GRADIENT_CY:
160             SvXMLUnitConverter::convertPercent( nTmpValue, rStrValue );
161             aGradient.YOffset = sal::static_int_cast< sal_Int16 >(nTmpValue);
162             break;
163         case XML_TOK_GRADIENT_START:
164             {
165                 sal_Int32 aStartTransparency;
166                 SvXMLUnitConverter::convertPercent( aStartTransparency, rStrValue );
167 
168                 sal_uInt8 n = sal::static_int_cast< sal_uInt8 >(
169                     ( (100 - aStartTransparency) * 255 ) / 100 );
170 
171                 Color aColor( n, n, n );
172                 aGradient.StartColor = (sal_Int32)( aColor.GetColor() );
173             }
174             break;
175         case XML_TOK_GRADIENT_END:
176             {
177                 sal_Int32 aEndTransparency;
178                 SvXMLUnitConverter::convertPercent( aEndTransparency, rStrValue );
179 
180                 sal_uInt8 n = sal::static_int_cast< sal_uInt8 >(
181                     ( (100 - aEndTransparency) * 255 ) / 100 );
182 
183                 Color aColor( n, n, n );
184                 aGradient.EndColor = (sal_Int32)( aColor.GetColor() );
185             }
186             break;
187         case XML_TOK_GRADIENT_ANGLE:
188             {
189                 sal_Int32 nValue;
190                 SvXMLUnitConverter::convertNumber( nValue, rStrValue, 0, 3600 );
191                 aGradient.Angle = sal_Int16( nValue );
192             }
193             break;
194         case XML_TOK_GRADIENT_BORDER:
195             SvXMLUnitConverter::convertPercent( nTmpValue, rStrValue );
196             aGradient.Border = sal::static_int_cast< sal_Int16 >(nTmpValue);
197             break;
198 
199         default:
200             DBG_WARNING( "Unknown token at import transparency gradient style" )
201             ;
202         }
203     }
204 
205     rValue <<= aGradient;
206 
207     if( aDisplayName.getLength() )
208     {
209         rImport.AddStyleDisplayName( XML_STYLE_FAMILY_SD_GRADIENT_ID, rStrName,
210                                      aDisplayName );
211         rStrName = aDisplayName;
212     }
213 
214     bRet = bHasName && bHasStyle;
215 
216     }
217 
218     return bRet;
219 }
220 
221 
222 //-------------------------------------------------------------
223 // Export
224 //-------------------------------------------------------------
225 
226 #ifndef SVX_LIGHT
227 
XMLTransGradientStyleExport(SvXMLExport & rExp)228 XMLTransGradientStyleExport::XMLTransGradientStyleExport( SvXMLExport& rExp )
229     : rExport(rExp)
230 {
231 }
232 
~XMLTransGradientStyleExport()233 XMLTransGradientStyleExport::~XMLTransGradientStyleExport()
234 {
235 }
236 
237 
exportXML(const OUString & rStrName,const uno::Any & rValue)238 sal_Bool XMLTransGradientStyleExport::exportXML(
239     const OUString& rStrName,
240     const uno::Any& rValue )
241 {
242     sal_Bool bRet = sal_False;
243     awt::Gradient aGradient;
244 
245     if( rStrName.getLength() )
246     {
247         if( rValue >>= aGradient )
248         {
249             OUString aStrValue;
250             OUStringBuffer aOut;
251 
252             // Style
253             if( !SvXMLUnitConverter::convertEnum( aOut, aGradient.Style, pXML_GradientStyle_Enum ) )
254             {
255                 bRet = sal_False;
256             }
257             else
258             {
259                 // Name
260                 sal_Bool bEncoded = sal_False;
261                 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME,
262                                       rExport.EncodeStyleName( rStrName,
263                                                                &bEncoded ) );
264                 if( bEncoded )
265                     rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DISPLAY_NAME,
266                                           rStrName );
267 
268                 aStrValue = aOut.makeStringAndClear();
269                 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_STYLE, aStrValue );
270 
271                 // Center x/y
272                 if( aGradient.Style != awt::GradientStyle_LINEAR &&
273                     aGradient.Style != awt::GradientStyle_AXIAL   )
274                 {
275                     SvXMLUnitConverter::convertPercent( aOut, aGradient.XOffset );
276                     aStrValue = aOut.makeStringAndClear();
277                     rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CX, aStrValue );
278 
279                     SvXMLUnitConverter::convertPercent( aOut, aGradient.YOffset );
280                     aStrValue = aOut.makeStringAndClear();
281                     rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CY, aStrValue );
282                 }
283 
284 
285                 Color aColor;
286 
287                 // Transparency start
288                 aColor.SetColor( aGradient.StartColor );
289                 sal_Int32 aStartValue = 100 - (sal_Int32)(((aColor.GetRed() + 1) * 100) / 255);
290                 SvXMLUnitConverter::convertPercent( aOut, aStartValue );
291                 aStrValue = aOut.makeStringAndClear();
292                 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_START, aStrValue );
293 
294                 // Transparency end
295                 aColor.SetColor( aGradient.EndColor );
296                 sal_Int32 aEndValue = 100 - (sal_Int32)(((aColor.GetRed() + 1) * 100) / 255);
297                 SvXMLUnitConverter::convertPercent( aOut, aEndValue );
298                 aStrValue = aOut.makeStringAndClear();
299                 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_END, aStrValue );
300 
301                 // Angle
302                 if( aGradient.Style != awt::GradientStyle_RADIAL )
303                 {
304                     SvXMLUnitConverter::convertNumber( aOut, sal_Int32( aGradient.Angle ) );
305                     aStrValue = aOut.makeStringAndClear();
306                     rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_GRADIENT_ANGLE, aStrValue );
307                 }
308 
309                 // Border
310                 SvXMLUnitConverter::convertPercent( aOut, aGradient.Border );
311                 aStrValue = aOut.makeStringAndClear();
312                 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_GRADIENT_BORDER, aStrValue );
313 
314                 // Do Write
315                 SvXMLElementExport rElem( rExport,
316                                           XML_NAMESPACE_DRAW, XML_OPACITY,
317                                           sal_True, sal_False );
318             }
319         }
320     }
321 
322     return bRet;
323 }
324 
325 #endif // #ifndef SVX_LIGHT
326