3ec6ae3a81f2808655dd5b9153a20f68626eaca9
[ardour.git] / libs / gtkmm2ext / gtkmm2ext / colors.h
1 /*
2     Copyright (C) 2011-2013 Paul Davis
3     Author: Carl Hetherington <cth@carlh.net>
4
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20 #ifndef _GTKMM2EXT_COLORS_H_
21 #define _GTKMM2EXT_COLORS_H_
22
23 #include <cairomm/context.h>
24
25 #include "gtkmm2ext/visibility.h"
26
27 namespace Gtkmm2ext
28 {
29
30 typedef uint32_t Color;
31
32 /* conventient way to use Gtkmm2ext::Color with libcairo */
33 extern LIBGTKMM2EXT_API void set_source_rgba (Cairo::RefPtr<Cairo::Context>, Gtkmm2ext::Color);
34 extern LIBGTKMM2EXT_API void set_source_rgb_a (Cairo::RefPtr<Cairo::Context>, Gtkmm2ext::Color, float alpha);  //override the color's alpha
35
36 extern LIBGTKMM2EXT_API void set_source_rgba (cairo_t*, Gtkmm2ext::Color);
37 extern LIBGTKMM2EXT_API void set_source_rgb_a (cairo_t*, Gtkmm2ext::Color, float alpha);  //override the color's alpha
38
39
40 struct LIBGTKMM2EXT_API HSV;
41 struct LIBGTKMM2EXT_API HSVA;
42
43 extern LIBGTKMM2EXT_API Color change_alpha (Color, double alpha);
44
45 extern LIBGTKMM2EXT_API Color hsva_to_color (double h, double s, double v, double a = 1.0);
46 extern LIBGTKMM2EXT_API void  color_to_hsva (Color color, double& h, double& s, double& v, double& a);
47 extern LIBGTKMM2EXT_API Color color_at_alpha (Color, double a);
48 extern LIBGTKMM2EXT_API void  color_to_hsv (Color color, double& h, double& s, double& v);
49 extern LIBGTKMM2EXT_API void  color_to_rgba (Color, double& r, double& g, double& b, double& a);
50 extern LIBGTKMM2EXT_API Color rgba_to_color (double r, double g, double b, double a);
51
52 uint32_t LIBGTKMM2EXT_API contrasting_text_color (uint32_t c);
53
54 struct LIBGTKMM2EXT_API HSV;
55
56 class LIBGTKMM2EXT_API SVAModifier
57 {
58 public:
59         enum Type {
60                 Add,
61                 Multiply,
62                 Assign
63         };
64
65         SVAModifier (std::string const &);
66         SVAModifier (Type t, double ss, double vv, double aa) : type (t), _s (ss) , _v (vv) , _a (aa) {}
67         SVAModifier () : type (Add), _s (0), _v (0), _a (0) {} /* no-op modifier */
68
69         double s() const { return _s; }
70         double v() const { return _v; }
71         double a() const { return _a; }
72
73         HSV operator () (HSV& hsv) const;
74         std::string to_string () const;
75         void from_string (std::string const &);
76
77 private:
78         Type type;
79         double _s;
80         double _v;
81         double _a;
82 };
83
84 struct LIBGTKMM2EXT_API HSV
85 {
86         HSV ();
87         HSV (double h, double s, double v, double a = 1.0);
88         HSV (Color);
89
90         double h;
91         double s;
92         double v;
93         double a;
94
95         std::string to_string() const;
96         bool is_gray() const;
97
98         Color color() const { return hsva_to_color (h,s, v, a); }
99         operator Color() const { return color(); }
100
101         HSV mod (SVAModifier const & svam);
102
103         HSV operator+ (const HSV&) const;
104         HSV operator- (const HSV&) const;
105
106         HSV& operator=(Color);
107         HSV& operator=(const std::string&);
108
109         bool operator== (const HSV& other);
110
111         double distance (const HSV& other) const;
112         HSV delta (const HSV& other) const;
113
114         HSV darker (double factor = 1.3) const { return shade (factor); }
115         HSV lighter (double factor = 0.7) const { return shade (factor); }
116
117         HSV shade (double factor) const;
118         HSV mix (const HSV& other, double amt) const;
119
120         HSV opposite() const;
121         HSV complement() const { return opposite(); }
122
123         HSV bw_text () const;
124         HSV text() const;
125         HSV selected () const;
126         HSV outline() const;
127
128         void print (std::ostream&) const;
129
130 protected:
131         void clamp ();
132 };
133
134 } /* namespace */
135
136 std::ostream& operator<<(std::ostream& o, const Gtkmm2ext::HSV& hsv);
137
138 #endif