]> git.saurik.com Git - wxWidgets.git/blame - src/x11/colour.cpp
fixing target determination for compositing windows, but we don't always get proper...
[wxWidgets.git] / src / x11 / colour.cpp
CommitLineData
83df96d6
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: colour.cpp
3// Purpose: wxColour class
3cd0b8c5 4// Author: Julian Smart, Robert Roebling
83df96d6
JS
5// Modified by:
6// Created: 17/09/98
7// RCS-ID: $Id$
3cd0b8c5 8// Copyright: (c) Julian Smart, Robert Roebling
83df96d6
JS
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
83df96d6 12
14f355c2 13#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
83df96d6
JS
14#pragma implementation "colour.h"
15#endif
16
17#include "wx/gdicmn.h"
887dd52f 18#include "wx/app.h"
83df96d6 19
7266b672 20#include "wx/x11/private.h"
83df96d6 21
3cd0b8c5
RR
22//-----------------------------------------------------------------------------
23// wxColour
24//-----------------------------------------------------------------------------
83df96d6 25
3cd0b8c5 26class wxColourRefData: public wxObjectRefData
83df96d6 27{
3cd0b8c5
RR
28public:
29 wxColourRefData()
30 {
31 m_color.red = 0;
32 m_color.green = 0;
33 m_color.blue = 0;
34 m_color.pixel = 0;
35 m_colormap = (WXColormap *) NULL;
aad6765c 36 m_hasPixel = false;
3cd0b8c5 37 }
d5cf34f4
JS
38 wxColourRefData(const wxColourRefData& data):
39 wxObjectRefData()
40 {
41 m_color = data.m_color;
42 m_colormap = data.m_colormap;
43 m_hasPixel = data.m_hasPixel;
44 }
aad6765c 45
3cd0b8c5
RR
46 ~wxColourRefData()
47 {
48 FreeColour();
49 }
83df96d6 50
3cd0b8c5
RR
51 bool operator == (const wxColourRefData& data) const
52 {
53 return (m_colormap == data.m_colormap &&
54 m_hasPixel == data.m_hasPixel &&
55 m_color.red == data.m_color.red &&
56 m_color.green == data.m_color.green &&
57 m_color.blue == data.m_color.blue &&
58 m_color.pixel == data.m_color.pixel);
59 }
aad6765c 60
3cd0b8c5
RR
61 void FreeColour();
62 void AllocColour( WXColormap cmap );
63
64 XColor m_color;
65 WXColormap m_colormap;
66 bool m_hasPixel;
67
68 friend class wxColour;
69
70 // reference counter for systems with <= 8-Bit display
71 static unsigned short colMapAllocCounter[ 256 ];
72};
73
aad6765c
JS
74unsigned short wxColourRefData::colMapAllocCounter[ 256 ] =
75{
3cd0b8c5
RR
76 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
77 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
78 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
79 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
80 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
81 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
82 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
83 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
84 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
85 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
87 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
88 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
89};
90
91void wxColourRefData::FreeColour()
83df96d6 92{
dc4025af
RR
93 if (!m_colormap)
94 return;
aad6765c 95#if !wxUSE_NANOX
9ce8d6a2
MB
96 if ((wxTheApp->m_visualInfo->m_visualType == GrayScale) ||
97 (wxTheApp->m_visualInfo->m_visualType == PseudoColor))
3cd0b8c5 98 {
dc4025af
RR
99 int idx = m_color.pixel;
100 colMapAllocCounter[ idx ] = colMapAllocCounter[ idx ] - 1;
aad6765c 101
dc4025af
RR
102 if (colMapAllocCounter[ idx ] == 0)
103 {
104 unsigned long pixel = m_color.pixel;
105 XFreeColors( wxGlobalDisplay(), (Colormap) m_colormap, &pixel, 1, 0 );
3cd0b8c5 106 }
3cd0b8c5 107 }
8601b2e1 108#endif
83df96d6
JS
109}
110
3cd0b8c5 111void wxColourRefData::AllocColour( WXColormap cmap )
83df96d6 112{
3cd0b8c5
RR
113 if (m_hasPixel && (m_colormap == cmap))
114 return;
115
116 FreeColour();
117
8601b2e1 118#if !wxUSE_NANOX
9ce8d6a2
MB
119 if ((wxTheApp->m_visualInfo->m_visualType == GrayScale) ||
120 (wxTheApp->m_visualInfo->m_visualType == PseudoColor))
3cd0b8c5 121 {
dc4025af 122 m_hasPixel = XAllocColor( wxGlobalDisplay(), (Colormap) cmap, &m_color );
3cd0b8c5
RR
123 int idx = m_color.pixel;
124 colMapAllocCounter[ idx ] = colMapAllocCounter[ idx ] + 1;
125 }
126 else
8601b2e1 127#endif
3cd0b8c5
RR
128 {
129 m_hasPixel = XAllocColor( wxGlobalDisplay(), (Colormap) cmap, &m_color );
130 }
aad6765c 131
3cd0b8c5 132 m_colormap = cmap;
83df96d6
JS
133}
134
3cd0b8c5
RR
135//-----------------------------------------------------------------------------
136
137#define M_COLDATA ((wxColourRefData *)m_refData)
138
139#define SHIFT (8*(sizeof(short int)-sizeof(char)))
140
141IMPLEMENT_DYNAMIC_CLASS(wxColour,wxGDIObject)
142
143wxColour::wxColour( unsigned char red, unsigned char green, unsigned char blue )
83df96d6 144{
3cd0b8c5 145 m_refData = new wxColourRefData();
0b5c0e1a
JS
146#if wxUSE_NANOX
147 M_COLDATA->m_color.red = ((unsigned short)red) ;
148 M_COLDATA->m_color.green = ((unsigned short)green) ;
149 M_COLDATA->m_color.blue = ((unsigned short)blue) ;
aad6765c 150#else
3cd0b8c5
RR
151 M_COLDATA->m_color.red = ((unsigned short)red) << SHIFT;
152 M_COLDATA->m_color.green = ((unsigned short)green) << SHIFT;
153 M_COLDATA->m_color.blue = ((unsigned short)blue) << SHIFT;
0b5c0e1a 154#endif
3cd0b8c5 155 M_COLDATA->m_color.pixel = 0;
83df96d6
JS
156}
157
564a150b
VZ
158/* static */
159wxColour wxColour::CreateByName(const wxString& name)
83df96d6 160{
564a150b
VZ
161 wxColour col;
162
163 Display *dpy = wxGlobalDisplay();
164 WXColormap colormap = wxTheApp->GetMainColormap( dpy );
165 XColor xcol;
166 if ( XParseColor( dpy, (Colormap)colormap, name.mb_str(), &xcol ) )
83df96d6 167 {
564a150b
VZ
168 wxColourRefData *refData = new wxColourRefData;
169 refData->m_colormap = colormap;
170 refData->m_color = xcol;
171 col.m_refData = refData;
83df96d6 172 }
564a150b
VZ
173
174 return col;
175}
176
177void wxColour::InitFromName( const wxString &colourName )
178{
179 // check the cache first
180 wxColour col;
181 if ( wxTheColourDatabase )
83df96d6 182 {
564a150b
VZ
183 col = wxTheColourDatabase->Find(colourName);
184 }
3cd0b8c5 185
564a150b
VZ
186 if ( !col.Ok() )
187 {
188 col = CreateByName(colourName);
189 }
3cd0b8c5 190
564a150b
VZ
191 if ( col.Ok() )
192 {
193 *this = col;
194 }
195 else
196 {
197 wxFAIL_MSG( wxT("wxColour: couldn't find colour") );
83df96d6
JS
198 }
199}
200
3cd0b8c5 201wxColour::~wxColour()
83df96d6
JS
202{
203}
204
3cd0b8c5 205bool wxColour::operator == ( const wxColour& col ) const
83df96d6 206{
aad6765c 207 if (m_refData == col.m_refData) return true;
3cd0b8c5 208
aad6765c 209 if (!m_refData || !col.m_refData) return false;
3cd0b8c5
RR
210
211 XColor *own = &(((wxColourRefData*)m_refData)->m_color);
212 XColor *other = &(((wxColourRefData*)col.m_refData)->m_color);
3cd0b8c5 213
aad6765c
JS
214 return (own->red == other->red)
215 && (own->green == other->green)
d35dec9b 216 && (own->blue == other->blue) ;
aad6765c 217
83df96d6
JS
218}
219
3cd0b8c5
RR
220wxObjectRefData *wxColour::CreateRefData() const
221{
222 return new wxColourRefData;
223}
83df96d6 224
3cd0b8c5
RR
225wxObjectRefData *wxColour::CloneRefData(const wxObjectRefData *data) const
226{
227 return new wxColourRefData(*(wxColourRefData *)data);
228}
83df96d6 229
3cd0b8c5 230void wxColour::Set( unsigned char red, unsigned char green, unsigned char blue )
83df96d6 231{
3cd0b8c5 232 AllocExclusive();
aad6765c 233
3cd0b8c5 234 m_refData = new wxColourRefData();
0b5c0e1a
JS
235#if wxUSE_NANOX
236 M_COLDATA->m_color.red = ((unsigned short)red) ;
237 M_COLDATA->m_color.green = ((unsigned short)green) ;
238 M_COLDATA->m_color.blue = ((unsigned short)blue) ;
239#else
3cd0b8c5
RR
240 M_COLDATA->m_color.red = ((unsigned short)red) << SHIFT;
241 M_COLDATA->m_color.green = ((unsigned short)green) << SHIFT;
242 M_COLDATA->m_color.blue = ((unsigned short)blue) << SHIFT;
0b5c0e1a 243#endif
3cd0b8c5 244 M_COLDATA->m_color.pixel = 0;
83df96d6
JS
245}
246
3cd0b8c5
RR
247unsigned char wxColour::Red() const
248{
249 wxCHECK_MSG( Ok(), 0, wxT("invalid colour") );
250
0b5c0e1a
JS
251#if wxUSE_NANOX
252 return (unsigned char) M_COLDATA->m_color.red ;
253#else
3cd0b8c5 254 return (unsigned char)(M_COLDATA->m_color.red >> SHIFT);
0b5c0e1a 255#endif
3cd0b8c5
RR
256}
257
258unsigned char wxColour::Green() const
259{
260 wxCHECK_MSG( Ok(), 0, wxT("invalid colour") );
261
0b5c0e1a
JS
262#if wxUSE_NANOX
263 return (unsigned char) M_COLDATA->m_color.green ;
264#else
3cd0b8c5 265 return (unsigned char)(M_COLDATA->m_color.green >> SHIFT);
0b5c0e1a 266#endif
3cd0b8c5
RR
267}
268
269unsigned char wxColour::Blue() const
270{
271 wxCHECK_MSG( Ok(), 0, wxT("invalid colour") );
272
0b5c0e1a
JS
273#if wxUSE_NANOX
274 return (unsigned char) M_COLDATA->m_color.blue ;
275#else
3cd0b8c5 276 return (unsigned char)(M_COLDATA->m_color.blue >> SHIFT);
0b5c0e1a 277#endif
3cd0b8c5
RR
278}
279
280void wxColour::CalcPixel( WXColormap cmap )
281{
887dd52f
RR
282 wxCHECK_RET( Ok(), wxT("invalid colour") );
283
284 wxCHECK_RET( cmap, wxT("invalid colormap") );
3cd0b8c5
RR
285
286 M_COLDATA->AllocColour( cmap );
287}
288
289unsigned long wxColour::GetPixel() const
290{
291 wxCHECK_MSG( Ok(), 0, wxT("invalid colour") );
292
293 return M_COLDATA->m_color.pixel;
294}
295
296WXColor *wxColour::GetColor() const
297{
298 wxCHECK_MSG( Ok(), (WXColor *) NULL, wxT("invalid colour") );
299
300 return (WXColor*) &M_COLDATA->m_color;
83df96d6 301}