]> git.saurik.com Git - wxWidgets.git/blame - src/x11/colour.cpp
fixed memory leak in RestoreState
[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
d3c7fc99 48 virtual ~wxColourRefData()
3cd0b8c5
RR
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
aea95b1c
VZ
175void wxColour::InitRGBA(unsigned char red, unsigned char green, unsigned char blue,
176 unsigned char WXUNUSED(alpha))
83df96d6 177{
3cd0b8c5 178 AllocExclusive();
aad6765c 179
0b5c0e1a
JS
180#if wxUSE_NANOX
181 M_COLDATA->m_color.red = ((unsigned short)red) ;
182 M_COLDATA->m_color.green = ((unsigned short)green) ;
183 M_COLDATA->m_color.blue = ((unsigned short)blue) ;
184#else
3cd0b8c5
RR
185 M_COLDATA->m_color.red = ((unsigned short)red) << SHIFT;
186 M_COLDATA->m_color.green = ((unsigned short)green) << SHIFT;
187 M_COLDATA->m_color.blue = ((unsigned short)blue) << SHIFT;
0b5c0e1a 188#endif
3cd0b8c5 189 M_COLDATA->m_color.pixel = 0;
83df96d6
JS
190}
191
3cd0b8c5
RR
192unsigned char wxColour::Red() const
193{
194 wxCHECK_MSG( Ok(), 0, wxT("invalid colour") );
195
0b5c0e1a
JS
196#if wxUSE_NANOX
197 return (unsigned char) M_COLDATA->m_color.red ;
198#else
3cd0b8c5 199 return (unsigned char)(M_COLDATA->m_color.red >> SHIFT);
0b5c0e1a 200#endif
3cd0b8c5
RR
201}
202
203unsigned char wxColour::Green() const
204{
205 wxCHECK_MSG( Ok(), 0, wxT("invalid colour") );
206
0b5c0e1a
JS
207#if wxUSE_NANOX
208 return (unsigned char) M_COLDATA->m_color.green ;
209#else
3cd0b8c5 210 return (unsigned char)(M_COLDATA->m_color.green >> SHIFT);
0b5c0e1a 211#endif
3cd0b8c5
RR
212}
213
214unsigned char wxColour::Blue() const
215{
216 wxCHECK_MSG( Ok(), 0, wxT("invalid colour") );
217
0b5c0e1a
JS
218#if wxUSE_NANOX
219 return (unsigned char) M_COLDATA->m_color.blue ;
220#else
3cd0b8c5 221 return (unsigned char)(M_COLDATA->m_color.blue >> SHIFT);
0b5c0e1a 222#endif
3cd0b8c5
RR
223}
224
225void wxColour::CalcPixel( WXColormap cmap )
226{
887dd52f
RR
227 wxCHECK_RET( Ok(), wxT("invalid colour") );
228
229 wxCHECK_RET( cmap, wxT("invalid colormap") );
3cd0b8c5
RR
230
231 M_COLDATA->AllocColour( cmap );
232}
233
234unsigned long wxColour::GetPixel() const
235{
236 wxCHECK_MSG( Ok(), 0, wxT("invalid colour") );
237
238 return M_COLDATA->m_color.pixel;
239}
240
241WXColor *wxColour::GetColor() const
242{
243 wxCHECK_MSG( Ok(), (WXColor *) NULL, wxT("invalid colour") );
244
245 return (WXColor*) &M_COLDATA->m_color;
83df96d6 246}
40989e46 247
e86d4e59 248bool wxColour::FromString(const wxString& name)
40989e46
WS
249{
250 Display *dpy = wxGlobalDisplay();
251 WXColormap colormap = wxTheApp->GetMainColormap( dpy );
252 XColor xcol;
e86d4e59 253 if ( XParseColor( dpy, (Colormap)colormap, name.mbc_str(), &xcol ) )
40989e46
WS
254 {
255 UnRef();
256
257 m_refData = new wxColourRefData;
258 M_COLDATA->m_colormap = colormap;
259 M_COLDATA->m_color = xcol;
260 return true;
261 }
262
263 return wxColourBase::FromString(name);
264}