]> git.saurik.com Git - wxWidgets.git/blame - include/wx/colour.h
Simplify and correct MSW selection of background brush for children painting.
[wxWidgets.git] / include / wx / colour.h
CommitLineData
99d80019
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: wx/colour.h
40989e46 3// Purpose: wxColourBase definition
99d80019 4// Author: Julian Smart
40989e46 5// Modified by: Francesco Montorsi
99d80019
JS
6// Created:
7// RCS-ID: $Id$
8// Copyright: Julian Smart
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
34138703
JS
12#ifndef _WX_COLOUR_H_BASE_
13#define _WX_COLOUR_H_BASE_
14
e45689df 15#include "wx/defs.h"
40989e46
WS
16#include "wx/gdiobj.h"
17
b5dbe15d 18class WXDLLIMPEXP_FWD_CORE wxColour;
6f5d7825 19
9ef6890f
VZ
20// A macro to define the standard wxColour constructors:
21//
22// It avoids the need to repeat these lines across all colour.h files, since
23// Set() is a virtual function and thus cannot be called by wxColourBase ctors
3d4424f7 24#define DEFINE_STD_WXCOLOUR_CONSTRUCTORS \
9ef6890f
VZ
25 wxColour() { Init(); } \
26 wxColour(ChannelType red, \
27 ChannelType green, \
28 ChannelType blue, \
29 ChannelType alpha = wxALPHA_OPAQUE) \
30 { Init(); Set(red, green, blue, alpha); } \
31 wxColour(unsigned long colRGB) { Init(); Set(colRGB ); } \
32 wxColour(const wxString& colourName) { Init(); Set(colourName); } \
33 wxColour(const char *colourName) { Init(); Set(colourName); } \
34 wxColour(const wchar_t *colourName) { Init(); Set(colourName); }
40989e46
WS
35
36
7d01c54d 37// flags for wxColour -> wxString conversion (see wxColour::GetAsString)
40989e46
WS
38#define wxC2S_NAME 1 // return colour name, when possible
39#define wxC2S_CSS_SYNTAX 2 // return colour in rgb(r,g,b) syntax
40#define wxC2S_HTML_SYNTAX 4 // return colour in #rrggbb syntax
41
42
a69aabc3
SC
43const unsigned char wxALPHA_TRANSPARENT = 0;
44const unsigned char wxALPHA_OPAQUE = 0xff;
40989e46 45
cd300ef7
VZ
46// a valid but fully transparent colour
47#define wxTransparentColour wxColour(0, 0, 0, wxALPHA_TRANSPARENT)
48#define wxTransparentColor wxTransparentColour
49
6f5d7825
RR
50// ----------------------------------------------------------------------------
51// wxVariant support
52// ----------------------------------------------------------------------------
53
54#if wxUSE_VARIANT
55#include "wx/variant.h"
53a2db12 56DECLARE_VARIANT_OBJECT_EXPORTED(wxColour,WXDLLIMPEXP_CORE)
6f5d7825
RR
57#endif
58
40989e46
WS
59//-----------------------------------------------------------------------------
60// wxColourBase: this class has no data members, just some functions to avoid
61// code redundancy in all native wxColour implementations
62//-----------------------------------------------------------------------------
63
7234425b
DE
64/* Transition from wxGDIObject to wxObject is incomplete. If your port does
65 not need the wxGDIObject machinery to handle colors, please add it to the
66 list of ports which do not need it.
67 */
68#if defined( __WXMAC__ ) || defined( __WXMSW__ ) || defined( __WXPM__ ) || defined( __WXCOCOA__ )
c5ad4777
SC
69#define wxCOLOUR_IS_GDIOBJECT 0
70#else
71#define wxCOLOUR_IS_GDIOBJECT 1
72#endif
73
53a2db12 74class WXDLLIMPEXP_CORE wxColourBase : public
c5ad4777
SC
75#if wxCOLOUR_IS_GDIOBJECT
76 wxGDIObject
77#else
78 wxObject
79#endif
40989e46 80{
40989e46 81public:
aea95b1c
VZ
82 // type of a single colour component
83 typedef unsigned char ChannelType;
84
40989e46
WS
85 wxColourBase() {}
86 virtual ~wxColourBase() {}
87
88
89 // Set() functions
90 // ---------------
91
aea95b1c
VZ
92 void Set(ChannelType red,
93 ChannelType green,
94 ChannelType blue,
95 ChannelType alpha = wxALPHA_OPAQUE)
b0edecea 96 { InitRGBA(red, green, blue, alpha); }
40989e46
WS
97
98 // implemented in colourcmn.cpp
40989e46 99 bool Set(const wxString &str)
aea95b1c 100 { return FromString(str); }
40989e46
WS
101
102 void Set(unsigned long colRGB)
103 {
104 // we don't need to know sizeof(long) here because we assume that the three
105 // least significant bytes contain the R, G and B values
8936f975
VZ
106 Set((ChannelType)(0xFF & colRGB),
107 (ChannelType)(0xFF & (colRGB >> 8)),
108 (ChannelType)(0xFF & (colRGB >> 16)));
40989e46
WS
109 }
110
111
112
113 // accessors
114 // ---------
115
aea95b1c
VZ
116 virtual ChannelType Red() const = 0;
117 virtual ChannelType Green() const = 0;
118 virtual ChannelType Blue() const = 0;
119 virtual ChannelType Alpha() const
a69aabc3 120 { return wxALPHA_OPAQUE ; }
40989e46
WS
121
122 // implemented in colourcmn.cpp
123 virtual wxString GetAsString(long flags = wxC2S_NAME | wxC2S_CSS_SYNTAX) const;
124
b0edecea
VZ
125 void SetRGB(wxUint32 colRGB)
126 {
127 Set((ChannelType)(0xFF & colRGB),
128 (ChannelType)(0xFF & (colRGB >> 8)),
129 (ChannelType)(0xFF & (colRGB >> 16)));
130 }
131
132 void SetRGBA(wxUint32 colRGBA)
133 {
134 Set((ChannelType)(0xFF & colRGBA),
135 (ChannelType)(0xFF & (colRGBA >> 8)),
136 (ChannelType)(0xFF & (colRGBA >> 16)),
137 (ChannelType)(0xFF & (colRGBA >> 24)));
138 }
139
140 wxUint32 GetRGB() const
141 { return Red() | (Green() << 8) | (Blue() << 16); }
142
143 wxUint32 GetRGBA() const
144 { return Red() | (Green() << 8) | (Blue() << 16) | (Alpha() << 24); }
145
c5ad4777
SC
146#if !wxCOLOUR_IS_GDIOBJECT
147 virtual bool IsOk() const= 0;
53a2db12 148
c5ad4777
SC
149 // older version, for backwards compatibility only (but not deprecated
150 // because it's still widely used)
151 bool Ok() const { return IsOk(); }
152#endif
40989e46 153
198c264d
JS
154 // manipulation
155 // ------------
cd300ef7 156
198c264d
JS
157 // These methods are static because they are mostly used
158 // within tight loops (where we don't want to instantiate wxColour's)
159
160 static void MakeMono (unsigned char* r, unsigned char* g, unsigned char* b, bool on);
161 static void MakeDisabled(unsigned char* r, unsigned char* g, unsigned char* b, unsigned char brightness = 255);
162 static void MakeGrey (unsigned char* r, unsigned char* g, unsigned char* b); // integer version
cd300ef7 163 static void MakeGrey (unsigned char* r, unsigned char* g, unsigned char* b,
198c264d
JS
164 double weight_r, double weight_g, double weight_b); // floating point version
165 static unsigned char AlphaBlend (unsigned char fg, unsigned char bg, double alpha);
166 static void ChangeLightness(unsigned char* r, unsigned char* g, unsigned char* b, int ialpha);
167
168 wxColour ChangeLightness(int ialpha) const;
169
40989e46
WS
170 // old, deprecated
171 // ---------------
172
7d01c54d
WS
173#if WXWIN_COMPATIBILITY_2_6
174 wxDEPRECATED( static wxColour CreateByName(const wxString& name) );
175 wxDEPRECATED( void InitFromName(const wxString& col) );
176#endif
aea95b1c
VZ
177
178protected:
9ef6890f
VZ
179 // Some ports need Init() and while we don't, provide a stub so that the
180 // ports which don't need it are not forced to define it
181 void Init() { }
182
aea95b1c
VZ
183 virtual void
184 InitRGBA(ChannelType r, ChannelType g, ChannelType b, ChannelType a) = 0;
185
e86d4e59 186 virtual bool FromString(const wxString& s);
8f884a0d 187
c5ad4777 188#if wxCOLOUR_IS_GDIOBJECT
8f884a0d
VZ
189 // wxColour doesn't use reference counted data (at least not in all ports)
190 // so provide stubs for the functions which need to be defined if we do use
191 // them
192 virtual wxGDIRefData *CreateGDIRefData() const
193 {
194 wxFAIL_MSG( "must be overridden if used" );
195
196 return NULL;
197 }
198
199 virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *WXUNUSED(data)) const
200 {
201 wxFAIL_MSG( "must be overridden if used" );
202
203 return NULL;
204 }
c5ad4777 205#endif
40989e46
WS
206};
207
208
8b51786f
VZ
209// wxColour <-> wxString utilities, used by wxConfig, defined in colourcmn.cpp
210WXDLLIMPEXP_CORE wxString wxToString(const wxColourBase& col);
211WXDLLIMPEXP_CORE bool wxFromString(const wxString& str, wxColourBase* col);
212
213
e45689df 214
4055ed82 215#if defined(__WXPALMOS__)
aea95b1c 216 #include "wx/generic/colour.h"
ffecfa5a 217#elif defined(__WXMSW__)
aea95b1c 218 #include "wx/msw/colour.h"
34138703 219#elif defined(__WXMOTIF__)
aea95b1c 220 #include "wx/motif/colour.h"
1be7a35c 221#elif defined(__WXGTK20__)
aea95b1c 222 #include "wx/gtk/colour.h"
1be7a35c 223#elif defined(__WXGTK__)
aea95b1c 224 #include "wx/gtk1/colour.h"
1e6feb95 225#elif defined(__WXMGL__)
aea95b1c 226 #include "wx/generic/colour.h"
b3c86150 227#elif defined(__WXDFB__)
aea95b1c 228 #include "wx/generic/colour.h"
83df96d6 229#elif defined(__WXX11__)
aea95b1c 230 #include "wx/x11/colour.h"
34138703 231#elif defined(__WXMAC__)
ef0e9220 232 #include "wx/osx/colour.h"
e64df9bc 233#elif defined(__WXCOCOA__)
aea95b1c 234 #include "wx/cocoa/colour.h"
1777b9bb 235#elif defined(__WXPM__)
aea95b1c 236 #include "wx/os2/colour.h"
34138703
JS
237#endif
238
e4a81a2e
VZ
239#define wxColor wxColour
240
aea95b1c 241#endif // _WX_COLOUR_H_BASE_