File indexing completed on 2024-04-28 05:32:10

0001 /*
0002     this file is part of the oxygen gtk engine
0003     SPDX-FileCopyrightText: 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0004 
0005     inspired notably from kdelibs/kdeui/colors/kcolorscheme.h
0006     SPDX-FileCopyrightText: 2007 Matthew Woehlke <mw_triad@users.sourceforge.net>
0007 
0008     SPDX-License-Identifier: LGPL-2.0-or-later
0009 */
0010 
0011 #include "oxygencoloreffect.h"
0012 #include "oxygencolorutils.h"
0013 #include "oxygenoptionmap.h"
0014 
0015 namespace Oxygen
0016 {
0017 
0018     //__________________________________________________________________________________________
0019     ColorUtils::Effect::Effect( Palette::Group group, const OptionMap& options ):
0020         _intensityEffect( IntensityNoEffect ),
0021         _intensityEffectAmount(0),
0022         _colorEffect( ColorNoEffect ),
0023         _colorEffectAmount(0),
0024         _contrastEffect( ContrastNoEffect ),
0025         _contrastEffectAmount(0),
0026         _enabled( false )
0027     {
0028 
0029         // select section
0030         std::string section;
0031         switch( group )
0032         {
0033             case Palette::Inactive:
0034             section = "[ColorEffects:Inactive]";
0035             break;
0036 
0037             case Palette::Disabled:
0038             section = "[ColorEffects:Disabled]";
0039             break;
0040 
0041             default: return;
0042         }
0043 
0044         const bool disabled( group == Palette::Disabled );
0045 
0046         // intensity settings
0047         switch( options.getOption( section, "IntensityEffect" ).toInt( disabled ? IntensityDarken : IntensityNoEffect ) )
0048         {
0049             case 1: _intensityEffect = IntensityShade; break;
0050             case 2: _intensityEffect = IntensityDarken; break;
0051             case 3: _intensityEffect = IntensityLighten; break;
0052             default: _intensityEffect = IntensityNoEffect; break;
0053 
0054         }
0055 
0056         _intensityEffectAmount = options.getOption( section, "IntensityAmount" ).toVariant<double>( disabled ? 0.1 : 0.0 );
0057 
0058         // contrast effect
0059         switch( options.getOption( section, "ContrastEffect" ).toInt( disabled ? ContrastFade : ContrastTint ) )
0060         {
0061             case 1: _contrastEffect = ContrastFade; break;
0062             case 2: _contrastEffect = ContrastTint; break;
0063             default: _contrastEffect = ContrastNoEffect; break;
0064         }
0065 
0066         _contrastEffectAmount = options.getOption( section, "ContrastAmount" ).toVariant<double>( disabled ? 0.65 : 0.10 );
0067 
0068         // color effect
0069         switch( options.getOption( section, "ColorEffect" ).toInt( disabled ? ColorNoEffect: ColorFade ) )
0070         {
0071             case 1: _colorEffect = ColorDesaturate; break;
0072             case 2: _colorEffect = ColorFade; break;
0073             case 3: _colorEffect = ColorTint; break;
0074             default: _colorEffect = ColorNoEffect; break;
0075         }
0076 
0077         _colorEffectAmount = options.getOption( section, "ColorAmount" ).toVariant<double>( disabled ? 0:0.025 );
0078 
0079         // color
0080         _color = Rgba::fromKdeOption( options.getValue( section, "Color" ) );
0081 
0082         if( !_color.isValid() )
0083         { _color = disabled ? Rgba( 56.0/255, 56.0/255, 56.0/255 ) : Rgba( 112.0/255, 111.0/255, 110.0/255 ); }
0084 
0085         // enable state
0086         _enabled = ( options.getOption( section, "Enable" ).toVariant<std::string>("true") == "true" );
0087     }
0088 
0089     //__________________________________________________________________________________________
0090     ColorUtils::Rgba ColorUtils::Effect::color( const ColorUtils::Rgba& background ) const
0091     {
0092 
0093         // do nothing if disabled
0094         if( !_enabled ) return background;
0095 
0096         // apply intensity effect
0097         Rgba out( background );
0098         switch( _intensityEffect )
0099         {
0100             case IntensityShade:
0101             out = shade( out, _intensityEffectAmount );
0102             break;
0103 
0104             case IntensityDarken:
0105             out = darken( out, _intensityEffectAmount );
0106             break;
0107 
0108             case IntensityLighten:
0109             out = lighten( out, _intensityEffectAmount );
0110             break;
0111 
0112             default: break;
0113         }
0114 
0115         // apply color effect
0116         switch( _colorEffect )
0117         {
0118             case ColorDesaturate:
0119             out = darken( out, 0.0, 1.0 - _colorEffectAmount );
0120             break;
0121 
0122             case ColorFade:
0123             out = mix( out, _color, _colorEffectAmount );
0124             break;
0125 
0126             case ColorTint:
0127             out = tint( out, _color, _colorEffectAmount );
0128             break;
0129 
0130             default:
0131             break;
0132         }
0133 
0134         return out;
0135 
0136     }
0137 
0138     //__________________________________________________________________________________________
0139     ColorUtils::Rgba ColorUtils::Effect::color( const ColorUtils::Rgba& foreground, const ColorUtils::Rgba& background ) const
0140     {
0141 
0142         if( !_enabled ) return foreground;
0143         Rgba out( foreground );
0144         switch( _contrastEffect )
0145         {
0146             case ContrastFade:
0147             out = mix( out, background, _contrastEffectAmount );
0148             break;
0149 
0150             case ContrastTint:
0151             out = tint( out, background, _contrastEffectAmount );
0152             break;
0153 
0154             default:
0155             break;
0156 
0157         }
0158 
0159         return out;
0160 
0161     }
0162 
0163     namespace ColorUtils
0164     {
0165         //__________________________________________________________________________________________
0166         std::ostream& operator << (std::ostream& out, const Effect& effect )
0167         {
0168             out << "Color=" << effect._color << std::endl;
0169             out << "ColorAmount=" << effect._colorEffectAmount << std::endl;
0170             out << "ColorEffect=" << effect._colorEffect << std::endl;
0171             out << "ContrastAmount=" << effect._contrastEffectAmount << std::endl;
0172             out << "ContrastEffect=" << effect._contrastEffect << std::endl;
0173             out << "IntensityAmount=" << effect._intensityEffectAmount << std::endl;
0174             out << "IntensityEffect=" << effect._intensityEffect << std::endl;
0175             return out;
0176         }
0177     }
0178 
0179 }