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 77 XMLTransGradientStyleImport::XMLTransGradientStyleImport( SvXMLImport& rImp ) 78 : rImport(rImp) 79 { 80 } 81 82 XMLTransGradientStyleImport::~XMLTransGradientStyleImport() 83 { 84 } 85 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 228 XMLTransGradientStyleExport::XMLTransGradientStyleExport( SvXMLExport& rExp ) 229 : rExport(rExp) 230 { 231 } 232 233 XMLTransGradientStyleExport::~XMLTransGradientStyleExport() 234 { 235 } 236 237 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