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 }