LCOV - code coverage report
Current view: top level - vcl/source/gdi - gradient.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 108 185 58.4 %
Date: 2014-11-03 Functions: 18 24 75.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       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/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      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 .
      18             :  */
      19             : 
      20             : #include <tools/stream.hxx>
      21             : #include <tools/vcompat.hxx>
      22             : #include <tools/debug.hxx>
      23             : #include <tools/gen.hxx>
      24             : #include <vcl/gradient.hxx>
      25             : 
      26      295630 : Impl_Gradient::Impl_Gradient() :
      27             :     maStartColor( COL_BLACK ),
      28      295630 :     maEndColor( COL_WHITE )
      29             : {
      30      295630 :     mnRefCount          = 1;
      31      295630 :     meStyle             = GradientStyle_LINEAR;
      32      295630 :     mnAngle             = 0;
      33      295630 :     mnBorder            = 0;
      34      295630 :     mnOfsX              = 50;
      35      295630 :     mnOfsY              = 50;
      36      295630 :     mnIntensityStart    = 100;
      37      295630 :     mnIntensityEnd      = 100;
      38      295630 :     mnStepCount         = 0;
      39      295630 : }
      40             : 
      41      138190 : Impl_Gradient::Impl_Gradient( const Impl_Gradient& rImplGradient ) :
      42             :     maStartColor( rImplGradient.maStartColor ),
      43      138190 :     maEndColor( rImplGradient.maEndColor )
      44             : {
      45      138190 :     mnRefCount          = 1;
      46      138190 :     meStyle             = rImplGradient.meStyle;
      47      138190 :     mnAngle             = rImplGradient.mnAngle;
      48      138190 :     mnBorder            = rImplGradient.mnBorder;
      49      138190 :     mnOfsX              = rImplGradient.mnOfsX;
      50      138190 :     mnOfsY              = rImplGradient.mnOfsY;
      51      138190 :     mnIntensityStart    = rImplGradient.mnIntensityStart;
      52      138190 :     mnIntensityEnd      = rImplGradient.mnIntensityEnd;
      53      138190 :     mnStepCount         = rImplGradient.mnStepCount;
      54      138190 : }
      55             : 
      56     1320550 : void Gradient::MakeUnique()
      57             : {
      58             :     // If there are still other references, copy
      59     1320550 :     if ( mpImplGradient->mnRefCount != 1 )
      60             :     {
      61      138190 :         if( mpImplGradient->mnRefCount )
      62      138190 :             mpImplGradient->mnRefCount--;
      63             : 
      64      138190 :         mpImplGradient = new Impl_Gradient( *mpImplGradient );
      65             :     }
      66     1320550 : }
      67             : 
      68      295278 : Gradient::Gradient()
      69             : {
      70             : 
      71      295278 :     mpImplGradient = new Impl_Gradient;
      72      295278 : }
      73             : 
      74      428153 : Gradient::Gradient( const Gradient& rGradient )
      75             : {
      76             : 
      77             :     // Take over instance data and increment refcount
      78      428153 :     mpImplGradient = rGradient.mpImplGradient;
      79      428153 :     mpImplGradient->mnRefCount++;
      80      428153 : }
      81             : 
      82         352 : Gradient::Gradient( GradientStyle eStyle,
      83             :                     const Color& rStartColor, const Color& rEndColor )
      84             : {
      85             : 
      86         352 :     mpImplGradient                  = new Impl_Gradient;
      87         352 :     mpImplGradient->meStyle         = eStyle;
      88         352 :     mpImplGradient->maStartColor    = rStartColor;
      89         352 :     mpImplGradient->maEndColor      = rEndColor;
      90         352 : }
      91             : 
      92      723643 : Gradient::~Gradient()
      93             : {
      94             : 
      95             :     // If it's the last reference, delete it, otherwise
      96             :     // decrement refcount
      97      723643 :     if ( mpImplGradient->mnRefCount == 1 )
      98      433680 :         delete mpImplGradient;
      99             :     else
     100      289963 :         mpImplGradient->mnRefCount--;
     101      723643 : }
     102             : 
     103      295278 : void Gradient::SetStyle( GradientStyle eStyle )
     104             : {
     105             : 
     106      295278 :     MakeUnique();
     107      295278 :     mpImplGradient->meStyle = eStyle;
     108      295278 : }
     109             : 
     110      295278 : void Gradient::SetStartColor( const Color& rColor )
     111             : {
     112             : 
     113      295278 :     MakeUnique();
     114      295278 :     mpImplGradient->maStartColor = rColor;
     115      295278 : }
     116             : 
     117      295278 : void Gradient::SetEndColor( const Color& rColor )
     118             : {
     119             : 
     120      295278 :     MakeUnique();
     121      295278 :     mpImplGradient->maEndColor = rColor;
     122      295278 : }
     123             : 
     124      295446 : void Gradient::SetAngle( sal_uInt16 nAngle )
     125             : {
     126             : 
     127      295446 :     MakeUnique();
     128      295446 :     mpImplGradient->mnAngle = nAngle;
     129      295446 : }
     130             : 
     131         180 : void Gradient::SetBorder( sal_uInt16 nBorder )
     132             : {
     133             : 
     134         180 :     MakeUnique();
     135         180 :     mpImplGradient->mnBorder = nBorder;
     136         180 : }
     137             : 
     138         180 : void Gradient::SetOfsX( sal_uInt16 nOfsX )
     139             : {
     140             : 
     141         180 :     MakeUnique();
     142         180 :     mpImplGradient->mnOfsX = nOfsX;
     143         180 : }
     144             : 
     145         180 : void Gradient::SetOfsY( sal_uInt16 nOfsY )
     146             : {
     147             : 
     148         180 :     MakeUnique();
     149         180 :     mpImplGradient->mnOfsY = nOfsY;
     150         180 : }
     151             : 
     152         180 : void Gradient::SetStartIntensity( sal_uInt16 nIntens )
     153             : {
     154             : 
     155         180 :     MakeUnique();
     156         180 :     mpImplGradient->mnIntensityStart = nIntens;
     157         180 : }
     158             : 
     159         180 : void Gradient::SetEndIntensity( sal_uInt16 nIntens )
     160             : {
     161             : 
     162         180 :     MakeUnique();
     163         180 :     mpImplGradient->mnIntensityEnd = nIntens;
     164         180 : }
     165             : 
     166      138370 : void Gradient::SetSteps( sal_uInt16 nSteps )
     167             : {
     168             : 
     169      138370 :     MakeUnique();
     170      138370 :     mpImplGradient->mnStepCount = nSteps;
     171      138370 : }
     172             : 
     173      138190 : void Gradient::GetBoundRect( const Rectangle& rRect, Rectangle& rBoundRect, Point& rCenter ) const
     174             : {
     175      138190 :     Rectangle aRect( rRect );
     176      138190 :     sal_uInt16 nAngle = GetAngle() % 3600;
     177             : 
     178      138190 :     if( GetStyle() == GradientStyle_LINEAR || GetStyle() == GradientStyle_AXIAL )
     179             :     {
     180      138190 :         const double    fAngle = nAngle * F_PI1800;
     181      138190 :         const double    fWidth = aRect.GetWidth();
     182      138190 :         const double    fHeight = aRect.GetHeight();
     183      138190 :         double  fDX     = fWidth  * fabs( cos( fAngle ) ) +
     184      138190 :                           fHeight * fabs( sin( fAngle ) );
     185      138190 :         double  fDY     = fHeight * fabs( cos( fAngle ) ) +
     186      138190 :                           fWidth  * fabs( sin( fAngle ) );
     187      138190 :                 fDX     = (fDX - fWidth)  * 0.5 + 0.5;
     188      138190 :                 fDY     = (fDY - fHeight) * 0.5 + 0.5;
     189      138190 :         aRect.Left()   -= (long) fDX;
     190      138190 :         aRect.Right()  += (long) fDX;
     191      138190 :         aRect.Top()    -= (long) fDY;
     192      138190 :         aRect.Bottom() += (long) fDY;
     193             : 
     194      138190 :         rBoundRect = aRect;
     195      138190 :         rCenter = rRect.Center();
     196             :     }
     197             :     else
     198             :     {
     199           0 :         if( GetStyle() == GradientStyle_SQUARE || GetStyle() == GradientStyle_RECT )
     200             :         {
     201           0 :             const double    fAngle = nAngle * F_PI1800;
     202           0 :             const double    fWidth = aRect.GetWidth();
     203           0 :             const double    fHeight = aRect.GetHeight();
     204           0 :             double          fDX = fWidth  * fabs( cos( fAngle ) ) + fHeight * fabs( sin( fAngle ) );
     205           0 :             double          fDY = fHeight * fabs( cos( fAngle ) ) + fWidth  * fabs( sin( fAngle ) );
     206             : 
     207           0 :             fDX = ( fDX - fWidth  ) * 0.5 + 0.5;
     208           0 :             fDY = ( fDY - fHeight ) * 0.5 + 0.5;
     209             : 
     210           0 :             aRect.Left()   -= (long) fDX;
     211           0 :             aRect.Right()  += (long) fDX;
     212           0 :             aRect.Top()    -= (long) fDY;
     213           0 :             aRect.Bottom() += (long) fDY;
     214             :         }
     215             : 
     216           0 :         Size aSize( aRect.GetSize() );
     217             : 
     218           0 :         if( GetStyle() == GradientStyle_RADIAL )
     219             :         {
     220             :             // Calculation of radii for circle
     221           0 :             aSize.Width() = (long)(0.5 + sqrt((double)aSize.Width()*(double)aSize.Width() + (double)aSize.Height()*(double)aSize.Height()));
     222           0 :             aSize.Height() = aSize.Width();
     223             :         }
     224           0 :         else if( GetStyle() == GradientStyle_ELLIPTICAL )
     225             :         {
     226             :             // Calculation of radii for ellipse
     227           0 :             aSize.Width() = (long)( 0.5 + (double) aSize.Width()  * 1.4142 );
     228           0 :             aSize.Height() = (long)( 0.5 + (double) aSize.Height() * 1.4142 );
     229             :         }
     230             : 
     231             :         // Calculate new centers
     232           0 :         long    nZWidth = aRect.GetWidth() * (long) GetOfsX() / 100;
     233           0 :         long    nZHeight = aRect.GetHeight() * (long) GetOfsY() / 100;
     234           0 :         long    nBorderX = (long) GetBorder() * aSize.Width()  / 100;
     235           0 :         long    nBorderY = (long) GetBorder() * aSize.Height() / 100;
     236           0 :         rCenter = Point( aRect.Left() + nZWidth, aRect.Top() + nZHeight );
     237             : 
     238             :         // Respect borders
     239           0 :         aSize.Width() -= nBorderX;
     240           0 :         aSize.Height() -= nBorderY;
     241             : 
     242             :         // Recalculate output rectangle
     243           0 :         aRect.Left() = rCenter.X() - ( aSize.Width() >> 1 );
     244           0 :         aRect.Top() = rCenter.Y() - ( aSize.Height() >> 1 );
     245             : 
     246           0 :         aRect.SetSize( aSize );
     247           0 :         rBoundRect = aRect;
     248             :     }
     249      138190 : }
     250             : 
     251           0 : Gradient& Gradient::operator=( const Gradient& rGradient )
     252             : {
     253             : 
     254             :     // Increment refcount first so that we can reference ourselves
     255           0 :     rGradient.mpImplGradient->mnRefCount++;
     256             : 
     257             :     // If it's the last reference, delete it, otherwise decrement
     258           0 :     if ( mpImplGradient->mnRefCount == 1 )
     259           0 :         delete mpImplGradient;
     260             :     else
     261           0 :         mpImplGradient->mnRefCount--;
     262           0 :     mpImplGradient = rGradient.mpImplGradient;
     263             : 
     264           0 :     return *this;
     265             : }
     266             : 
     267           0 : bool Gradient::operator==( const Gradient& rGradient ) const
     268             : {
     269             : 
     270           0 :     if ( mpImplGradient == rGradient.mpImplGradient )
     271           0 :         return true;
     272             : 
     273           0 :     if ( (mpImplGradient->meStyle           == rGradient.mpImplGradient->meStyle)           &&
     274           0 :          (mpImplGradient->mnAngle           == rGradient.mpImplGradient->mnAngle)           &&
     275           0 :          (mpImplGradient->mnBorder          == rGradient.mpImplGradient->mnBorder)          &&
     276           0 :          (mpImplGradient->mnOfsX            == rGradient.mpImplGradient->mnOfsX)            &&
     277           0 :          (mpImplGradient->mnOfsY            == rGradient.mpImplGradient->mnOfsY)            &&
     278           0 :          (mpImplGradient->mnStepCount       == rGradient.mpImplGradient->mnStepCount)       &&
     279           0 :          (mpImplGradient->mnIntensityStart  == rGradient.mpImplGradient->mnIntensityStart)  &&
     280           0 :          (mpImplGradient->mnIntensityEnd    == rGradient.mpImplGradient->mnIntensityEnd)    &&
     281           0 :          (mpImplGradient->maStartColor      == rGradient.mpImplGradient->maStartColor)      &&
     282           0 :          (mpImplGradient->maEndColor        == rGradient.mpImplGradient->maEndColor) )
     283           0 :          return true;
     284             :     else
     285           0 :         return false;
     286             : }
     287             : 
     288           0 : SvStream& ReadImpl_Gradient( SvStream& rIStm, Impl_Gradient& rImpl_Gradient )
     289             : {
     290           0 :     VersionCompat   aCompat( rIStm, STREAM_READ );
     291             :     sal_uInt16          nTmp16;
     292             : 
     293           0 :     rIStm.ReadUInt16( nTmp16 ); rImpl_Gradient.meStyle = (GradientStyle) nTmp16;
     294             : 
     295           0 :     ReadColor( rIStm, rImpl_Gradient.maStartColor );
     296           0 :     ReadColor( rIStm, rImpl_Gradient.maEndColor );
     297           0 :     rIStm.ReadUInt16( rImpl_Gradient.mnAngle ).             ReadUInt16( rImpl_Gradient.mnBorder ).             ReadUInt16( rImpl_Gradient.mnOfsX ).             ReadUInt16( rImpl_Gradient.mnOfsY ).             ReadUInt16( rImpl_Gradient.mnIntensityStart ).             ReadUInt16( rImpl_Gradient.mnIntensityEnd ).             ReadUInt16( rImpl_Gradient.mnStepCount );
     298             : 
     299           0 :     return rIStm;
     300             : }
     301             : 
     302           0 : SvStream& WriteImpl_Gradient( SvStream& rOStm, const Impl_Gradient& rImpl_Gradient )
     303             : {
     304           0 :     VersionCompat aCompat( rOStm, STREAM_WRITE, 1 );
     305             : 
     306           0 :     rOStm.WriteUInt16( rImpl_Gradient.meStyle );
     307           0 :     WriteColor( rOStm, rImpl_Gradient.maStartColor );
     308           0 :     WriteColor( rOStm, rImpl_Gradient.maEndColor );
     309           0 :     rOStm.WriteUInt16( rImpl_Gradient.mnAngle )
     310           0 :          .WriteUInt16( rImpl_Gradient.mnBorder )
     311           0 :          .WriteUInt16( rImpl_Gradient.mnOfsX )
     312           0 :          .WriteUInt16( rImpl_Gradient.mnOfsY )
     313           0 :          .WriteUInt16( rImpl_Gradient.mnIntensityStart )
     314           0 :          .WriteUInt16( rImpl_Gradient.mnIntensityEnd )
     315           0 :          .WriteUInt16( rImpl_Gradient.mnStepCount );
     316             : 
     317           0 :     return rOStm;
     318             : }
     319             : 
     320           0 : SvStream& ReadGradient( SvStream& rIStm, Gradient& rGradient )
     321             : {
     322           0 :     rGradient.MakeUnique();
     323           0 :     return ReadImpl_Gradient( rIStm, *rGradient.mpImplGradient );
     324             : }
     325             : 
     326           0 : SvStream& WriteGradient( SvStream& rOStm, const Gradient& rGradient )
     327             : {
     328           0 :     return WriteImpl_Gradient( rOStm, *rGradient.mpImplGradient );
     329             : }
     330             : 
     331             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10