]> git.saurik.com Git - wxWidgets.git/blame - src/x11/colour.cpp
Don't check with CanSetTransparent from within SetTransparent if the former is suppos...
[wxWidgets.git] / src / x11 / colour.cpp
CommitLineData
83df96d6 1/////////////////////////////////////////////////////////////////////////////
edc536d3 2// Name: src/x11/colour.cpp
83df96d6 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
edc536d3 9// Licence: wxWindows licence
83df96d6
JS
10/////////////////////////////////////////////////////////////////////////////
11
40989e46
WS
12// For compilers that support precompilation, includes "wx.h".
13#include "wx/wxprec.h"
14
15#include "wx/colour.h"
16
670f9935
WS
17#ifndef WX_PRECOMP
18 #include "wx/app.h"
dd05139a 19 #include "wx/gdicmn.h"
670f9935
WS
20#endif
21
7266b672 22#include "wx/x11/private.h"
83df96d6 23
3cd0b8c5
RR
24//-----------------------------------------------------------------------------
25// wxColour
26//-----------------------------------------------------------------------------
83df96d6 27
3cd0b8c5 28class wxColourRefData: public wxObjectRefData
83df96d6 29{
3cd0b8c5
RR
30public:
31 wxColourRefData()
32 {
33 m_color.red = 0;
34 m_color.green = 0;
35 m_color.blue = 0;
36 m_color.pixel = 0;
37 m_colormap = (WXColormap *) NULL;
aad6765c 38 m_hasPixel = false;
3cd0b8c5 39 }
d5cf34f4
JS
40 wxColourRefData(const wxColourRefData& data):
41 wxObjectRefData()
42 {
43 m_color = data.m_color;
44 m_colormap = data.m_colormap;
45 m_hasPixel = data.m_hasPixel;
46 }
aad6765c 47
3cd0b8c5
RR
48 ~wxColourRefData()
49 {
50 FreeColour();
51 }
83df96d6 52
3cd0b8c5
RR
53 bool operator == (const wxColourRefData& data) const
54 {
55 return (m_colormap == data.m_colormap &&
56 m_hasPixel == data.m_hasPixel &&
57 m_color.red == data.m_color.red &&
58 m_color.green == data.m_color.green &&
59 m_color.blue == data.m_color.blue &&
60 m_color.pixel == data.m_color.pixel);
61 }
aad6765c 62
3cd0b8c5
RR
63 void FreeColour();
64 void AllocColour( WXColormap cmap );
65
66 XColor m_color;
67 WXColormap m_colormap;
68 bool m_hasPixel;
69
70 friend class wxColour;
71
72 // reference counter for systems with <= 8-Bit display
73 static unsigned short colMapAllocCounter[ 256 ];
74};
75
aad6765c
JS
76unsigned short wxColourRefData::colMapAllocCounter[ 256 ] =
77{
3cd0b8c5
RR
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, 0, 0, 0, 0,
89 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
90 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
91};
92
93void wxColourRefData::FreeColour()
83df96d6 94{
dc4025af
RR
95 if (!m_colormap)
96 return;
aad6765c 97#if !wxUSE_NANOX
ac7f6cf0
VZ
98 if ( wxTheApp &&
99 (wxTheApp->m_visualInfo->m_visualType == GrayScale ||
100 wxTheApp->m_visualInfo->m_visualType == PseudoColor) )
3cd0b8c5 101 {
dc4025af
RR
102 int idx = m_color.pixel;
103 colMapAllocCounter[ idx ] = colMapAllocCounter[ idx ] - 1;
aad6765c 104
dc4025af
RR
105 if (colMapAllocCounter[ idx ] == 0)
106 {
107 unsigned long pixel = m_color.pixel;
108 XFreeColors( wxGlobalDisplay(), (Colormap) m_colormap, &pixel, 1, 0 );
3cd0b8c5 109 }
3cd0b8c5 110 }
8601b2e1 111#endif
83df96d6
JS
112}
113
3cd0b8c5 114void wxColourRefData::AllocColour( WXColormap cmap )
83df96d6 115{
3cd0b8c5
RR
116 if (m_hasPixel && (m_colormap == cmap))
117 return;
118
119 FreeColour();
120
8601b2e1 121#if !wxUSE_NANOX
9ce8d6a2
MB
122 if ((wxTheApp->m_visualInfo->m_visualType == GrayScale) ||
123 (wxTheApp->m_visualInfo->m_visualType == PseudoColor))
3cd0b8c5 124 {
dc4025af 125 m_hasPixel = XAllocColor( wxGlobalDisplay(), (Colormap) cmap, &m_color );
3cd0b8c5
RR
126 int idx = m_color.pixel;
127 colMapAllocCounter[ idx ] = colMapAllocCounter[ idx ] + 1;
128 }
129 else
8601b2e1 130#endif
3cd0b8c5
RR
131 {
132 m_hasPixel = XAllocColor( wxGlobalDisplay(), (Colormap) cmap, &m_color );
133 }
aad6765c 134
3cd0b8c5 135 m_colormap = cmap;
83df96d6
JS
136}
137
3cd0b8c5
RR
138//-----------------------------------------------------------------------------
139
140#define M_COLDATA ((wxColourRefData *)m_refData)
141
142#define SHIFT (8*(sizeof(short int)-sizeof(char)))
143
144IMPLEMENT_DYNAMIC_CLASS(wxColour,wxGDIObject)
145
3cd0b8c5 146wxColour::~wxColour()
83df96d6
JS
147{
148}
149
3cd0b8c5 150bool wxColour::operator == ( const wxColour& col ) const
83df96d6 151{
aad6765c 152 if (m_refData == col.m_refData) return true;
3cd0b8c5 153
aad6765c 154 if (!m_refData || !col.m_refData) return false;
3cd0b8c5
RR
155
156 XColor *own = &(((wxColourRefData*)m_refData)->m_color);
157 XColor *other = &(((wxColourRefData*)col.m_refData)->m_color);
3cd0b8c5 158
aad6765c
JS
159 return (own->red == other->red)
160 && (own->green == other->green)
d35dec9b 161 && (own->blue == other->blue) ;
aad6765c 162
83df96d6
JS
163}
164
3cd0b8c5
RR
165wxObjectRefData *wxColour::CreateRefData() const
166{
167 return new wxColourRefData;
168}
83df96d6 169
3cd0b8c5
RR
170wxObjectRefData *wxColour::CloneRefData(const wxObjectRefData *data) const
171{
172 return new wxColourRefData(*(wxColourRefData *)data);
173}
83df96d6 174
40989e46 175void wxColour::InitWith( unsigned char red, unsigned char green, unsigned char blue )
83df96d6 176{
3cd0b8c5 177 AllocExclusive();
aad6765c 178
0b5c0e1a
JS
179#if wxUSE_NANOX
180 M_COLDATA->m_color.red = ((unsigned short)red) ;
181 M_COLDATA->m_color.green = ((unsigned short)green) ;
182 M_COLDATA->m_color.blue = ((unsigned short)blue) ;
183#else
3cd0b8c5
RR
184 M_COLDATA->m_color.red = ((unsigned short)red) << SHIFT;
185 M_COLDATA->m_color.green = ((unsigned short)green) << SHIFT;
186 M_COLDATA->m_color.blue = ((unsigned short)blue) << SHIFT;
0b5c0e1a 187#endif
3cd0b8c5 188 M_COLDATA->m_color.pixel = 0;
83df96d6
JS
189}
190
3cd0b8c5
RR
191unsigned char wxColour::Red() const
192{
193 wxCHECK_MSG( Ok(), 0, wxT("invalid colour") );
194
0b5c0e1a
JS
195#if wxUSE_NANOX
196 return (unsigned char) M_COLDATA->m_color.red ;
197#else
3cd0b8c5 198 return (unsigned char)(M_COLDATA->m_color.red >> SHIFT);
0b5c0e1a 199#endif
3cd0b8c5
RR
200}
201
202unsigned char wxColour::Green() const
203{
204 wxCHECK_MSG( Ok(), 0, wxT("invalid colour") );
205
0b5c0e1a
JS
206#if wxUSE_NANOX
207 return (unsigned char) M_COLDATA->m_color.green ;
208#else
3cd0b8c5 209 return (unsigned char)(M_COLDATA->m_color.green >> SHIFT);
0b5c0e1a 210#endif
3cd0b8c5
RR
211}
212
213unsigned char wxColour::Blue() const
214{
215 wxCHECK_MSG( Ok(), 0, wxT("invalid colour") );
216
0b5c0e1a
JS
217#if wxUSE_NANOX
218 return (unsigned char) M_COLDATA->m_color.blue ;
219#else
3cd0b8c5 220 return (unsigned char)(M_COLDATA->m_color.blue >> SHIFT);
0b5c0e1a 221#endif
3cd0b8c5
RR
222}
223
224void wxColour::CalcPixel( WXColormap cmap )
225{
887dd52f
RR
226 wxCHECK_RET( Ok(), wxT("invalid colour") );
227
228 wxCHECK_RET( cmap, wxT("invalid colormap") );
3cd0b8c5
RR
229
230 M_COLDATA->AllocColour( cmap );
231}
232
233unsigned long wxColour::GetPixel() const
234{
235 wxCHECK_MSG( Ok(), 0, wxT("invalid colour") );
236
237 return M_COLDATA->m_color.pixel;
238}
239
240WXColor *wxColour::GetColor() const
241{
242 wxCHECK_MSG( Ok(), (WXColor *) NULL, wxT("invalid colour") );
243
244 return (WXColor*) &M_COLDATA->m_color;
83df96d6 245}
40989e46
WS
246
247bool wxColour::FromString(const wxChar *name)
248{
249 Display *dpy = wxGlobalDisplay();
250 WXColormap colormap = wxTheApp->GetMainColormap( dpy );
251 XColor xcol;
7760051f 252 if ( XParseColor( dpy, (Colormap)colormap, name , &xcol ) )
40989e46
WS
253 {
254 UnRef();
255
256 m_refData = new wxColourRefData;
257 M_COLDATA->m_colormap = colormap;
258 M_COLDATA->m_color = xcol;
259 return true;
260 }
261
262 return wxColourBase::FromString(name);
263}