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_vcl.hxx" 26 #include <tools/stream.hxx> 27 #include <tools/vcompat.hxx> 28 #include <tools/debug.hxx> 29 #include <vcl/gradient.hxx> 30 31 // ======================================================================= 32 33 DBG_NAME( Gradient ) 34 35 // ----------------------------------------------------------------------- 36 37 Impl_Gradient::Impl_Gradient() : 38 maStartColor( COL_BLACK ), 39 maEndColor( COL_WHITE ) 40 { 41 mnRefCount = 1; 42 meStyle = GRADIENT_LINEAR; 43 mnAngle = 0; 44 mnBorder = 0; 45 mnOfsX = 50; 46 mnOfsY = 50; 47 mnIntensityStart = 100; 48 mnIntensityEnd = 100; 49 mnStepCount = 0; 50 } 51 52 // ----------------------------------------------------------------------- 53 54 Impl_Gradient::Impl_Gradient( const Impl_Gradient& rImplGradient ) : 55 maStartColor( rImplGradient.maStartColor ), 56 maEndColor( rImplGradient.maEndColor ) 57 { 58 mnRefCount = 1; 59 meStyle = rImplGradient.meStyle; 60 mnAngle = rImplGradient.mnAngle; 61 mnBorder = rImplGradient.mnBorder; 62 mnOfsX = rImplGradient.mnOfsX; 63 mnOfsY = rImplGradient.mnOfsY; 64 mnIntensityStart = rImplGradient.mnIntensityStart; 65 mnIntensityEnd = rImplGradient.mnIntensityEnd; 66 mnStepCount = rImplGradient.mnStepCount; 67 } 68 69 // ----------------------------------------------------------------------- 70 71 void Gradient::MakeUnique() 72 { 73 // Falls noch andere Referenzen bestehen, dann kopieren 74 if ( mpImplGradient->mnRefCount != 1 ) 75 { 76 if( mpImplGradient->mnRefCount ) 77 mpImplGradient->mnRefCount--; 78 79 mpImplGradient = new Impl_Gradient( *mpImplGradient ); 80 } 81 } 82 83 // ----------------------------------------------------------------------- 84 85 Gradient::Gradient() 86 { 87 DBG_CTOR( Gradient, NULL ); 88 89 mpImplGradient = new Impl_Gradient; 90 } 91 92 // ----------------------------------------------------------------------- 93 94 Gradient::Gradient( const Gradient& rGradient ) 95 { 96 DBG_CTOR( Gradient, NULL ); 97 DBG_CHKOBJ( &rGradient, Gradient, NULL ); 98 99 // Instance Daten uebernehmen und Referenzcounter erhoehen 100 mpImplGradient = rGradient.mpImplGradient; 101 mpImplGradient->mnRefCount++; 102 } 103 104 // ----------------------------------------------------------------------- 105 106 Gradient::Gradient( GradientStyle eStyle ) 107 { 108 DBG_CTOR( Gradient, NULL ); 109 110 mpImplGradient = new Impl_Gradient; 111 mpImplGradient->meStyle = eStyle; 112 } 113 114 // ----------------------------------------------------------------------- 115 116 Gradient::Gradient( GradientStyle eStyle, 117 const Color& rStartColor, const Color& rEndColor ) 118 { 119 DBG_CTOR( Gradient, NULL ); 120 121 mpImplGradient = new Impl_Gradient; 122 mpImplGradient->meStyle = eStyle; 123 mpImplGradient->maStartColor = rStartColor; 124 mpImplGradient->maEndColor = rEndColor; 125 } 126 127 // ----------------------------------------------------------------------- 128 129 Gradient::~Gradient() 130 { 131 DBG_DTOR( Gradient, NULL ); 132 133 // Wenn es die letzte Referenz ist, loeschen, 134 // sonst Referenzcounter decrementieren 135 if ( mpImplGradient->mnRefCount == 1 ) 136 delete mpImplGradient; 137 else 138 mpImplGradient->mnRefCount--; 139 } 140 141 // ----------------------------------------------------------------------- 142 143 void Gradient::SetStyle( GradientStyle eStyle ) 144 { 145 DBG_CHKTHIS( Gradient, NULL ); 146 147 MakeUnique(); 148 mpImplGradient->meStyle = eStyle; 149 } 150 151 // ----------------------------------------------------------------------- 152 153 void Gradient::SetStartColor( const Color& rColor ) 154 { 155 DBG_CHKTHIS( Gradient, NULL ); 156 157 MakeUnique(); 158 mpImplGradient->maStartColor = rColor; 159 } 160 161 // ----------------------------------------------------------------------- 162 163 void Gradient::SetEndColor( const Color& rColor ) 164 { 165 DBG_CHKTHIS( Gradient, NULL ); 166 167 MakeUnique(); 168 mpImplGradient->maEndColor = rColor; 169 } 170 171 // ----------------------------------------------------------------------- 172 173 void Gradient::SetAngle( sal_uInt16 nAngle ) 174 { 175 DBG_CHKTHIS( Gradient, NULL ); 176 177 MakeUnique(); 178 mpImplGradient->mnAngle = nAngle; 179 } 180 181 // ----------------------------------------------------------------------- 182 183 void Gradient::SetBorder( sal_uInt16 nBorder ) 184 { 185 DBG_CHKTHIS( Gradient, NULL ); 186 187 MakeUnique(); 188 mpImplGradient->mnBorder = nBorder; 189 } 190 191 // ----------------------------------------------------------------------- 192 193 void Gradient::SetOfsX( sal_uInt16 nOfsX ) 194 { 195 DBG_CHKTHIS( Gradient, NULL ); 196 197 MakeUnique(); 198 mpImplGradient->mnOfsX = nOfsX; 199 } 200 201 // ----------------------------------------------------------------------- 202 203 void Gradient::SetOfsY( sal_uInt16 nOfsY ) 204 { 205 DBG_CHKTHIS( Gradient, NULL ); 206 207 MakeUnique(); 208 mpImplGradient->mnOfsY = nOfsY; 209 } 210 211 // ----------------------------------------------------------------------- 212 213 void Gradient::SetStartIntensity( sal_uInt16 nIntens ) 214 { 215 DBG_CHKTHIS( Gradient, NULL ); 216 217 MakeUnique(); 218 mpImplGradient->mnIntensityStart = nIntens; 219 } 220 221 // ----------------------------------------------------------------------- 222 223 void Gradient::SetEndIntensity( sal_uInt16 nIntens ) 224 { 225 DBG_CHKTHIS( Gradient, NULL ); 226 227 MakeUnique(); 228 mpImplGradient->mnIntensityEnd = nIntens; 229 } 230 231 // ----------------------------------------------------------------------- 232 233 void Gradient::SetSteps( sal_uInt16 nSteps ) 234 { 235 DBG_CHKTHIS( Gradient, NULL ); 236 237 MakeUnique(); 238 mpImplGradient->mnStepCount = nSteps; 239 } 240 241 // ----------------------------------------------------------------------- 242 243 Gradient& Gradient::operator=( const Gradient& rGradient ) 244 { 245 DBG_CHKTHIS( Gradient, NULL ); 246 DBG_CHKOBJ( &rGradient, Gradient, NULL ); 247 248 // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann 249 rGradient.mpImplGradient->mnRefCount++; 250 251 // Wenn es die letzte Referenz ist, loeschen, 252 // sonst Referenzcounter decrementieren 253 if ( mpImplGradient->mnRefCount == 1 ) 254 delete mpImplGradient; 255 else 256 mpImplGradient->mnRefCount--; 257 mpImplGradient = rGradient.mpImplGradient; 258 259 return *this; 260 } 261 262 // ----------------------------------------------------------------------- 263 264 sal_Bool Gradient::operator==( const Gradient& rGradient ) const 265 { 266 DBG_CHKTHIS( Gradient, NULL ); 267 DBG_CHKOBJ( &rGradient, Gradient, NULL ); 268 269 if ( mpImplGradient == rGradient.mpImplGradient ) 270 return sal_True; 271 272 if ( (mpImplGradient->meStyle == rGradient.mpImplGradient->meStyle) || 273 (mpImplGradient->mnAngle == rGradient.mpImplGradient->mnAngle) || 274 (mpImplGradient->mnBorder == rGradient.mpImplGradient->mnBorder) || 275 (mpImplGradient->mnOfsX == rGradient.mpImplGradient->mnOfsX) || 276 (mpImplGradient->mnOfsY == rGradient.mpImplGradient->mnOfsY) || 277 (mpImplGradient->mnStepCount == rGradient.mpImplGradient->mnStepCount) || 278 (mpImplGradient->mnIntensityStart == rGradient.mpImplGradient->mnIntensityStart) || 279 (mpImplGradient->mnIntensityEnd == rGradient.mpImplGradient->mnIntensityEnd) || 280 (mpImplGradient->maStartColor == rGradient.mpImplGradient->maStartColor) || 281 (mpImplGradient->maEndColor == rGradient.mpImplGradient->maEndColor) ) 282 return sal_True; 283 else 284 return sal_False; 285 } 286 287 SvStream& operator>>( SvStream& rIStm, Impl_Gradient& rImpl_Gradient ) 288 { 289 VersionCompat aCompat( rIStm, STREAM_READ ); 290 sal_uInt16 nTmp16; 291 292 rIStm >> nTmp16; rImpl_Gradient.meStyle = (GradientStyle) nTmp16; 293 294 rIStm >> rImpl_Gradient.maStartColor >> 295 rImpl_Gradient.maEndColor >> 296 rImpl_Gradient.mnAngle >> 297 rImpl_Gradient.mnBorder >> 298 rImpl_Gradient.mnOfsX >> 299 rImpl_Gradient.mnOfsY >> 300 rImpl_Gradient.mnIntensityStart >> 301 rImpl_Gradient.mnIntensityEnd >> 302 rImpl_Gradient.mnStepCount; 303 304 return rIStm; 305 } 306 307 // ----------------------------------------------------------------------- 308 309 SvStream& operator<<( SvStream& rOStm, const Impl_Gradient& rImpl_Gradient ) 310 { 311 VersionCompat aCompat( rOStm, STREAM_WRITE, 1 ); 312 313 rOStm << (sal_uInt16) rImpl_Gradient.meStyle << 314 rImpl_Gradient.maStartColor << 315 rImpl_Gradient.maEndColor << 316 rImpl_Gradient.mnAngle << 317 rImpl_Gradient.mnBorder << 318 rImpl_Gradient.mnOfsX << 319 rImpl_Gradient.mnOfsY << 320 rImpl_Gradient.mnIntensityStart << 321 rImpl_Gradient.mnIntensityEnd << 322 rImpl_Gradient.mnStepCount; 323 324 return rOStm; 325 } 326 327 // ----------------------------------------------------------------------- 328 329 SvStream& operator>>( SvStream& rIStm, Gradient& rGradient ) 330 { 331 rGradient.MakeUnique(); 332 return( rIStm >> *rGradient.mpImplGradient ); 333 } 334 335 // ----------------------------------------------------------------------- 336 337 SvStream& operator<<( SvStream& rOStm, const Gradient& rGradient ) 338 { 339 return( rOStm << *rGradient.mpImplGradient ); 340 } 341