]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/gtk/colour.cpp
Initial implementation of wxWebProtocolHandler and wxWebFileProtocolHandler for the...
[wxWidgets.git] / src / gtk / colour.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/gtk/colour.cpp
3// Purpose:
4// Author: Robert Roebling
5// Id: $Id$
6// Copyright: (c) 1998 Robert Roebling
7// Licence: wxWindows licence
8/////////////////////////////////////////////////////////////////////////////
9
10// For compilers that support precompilation, includes "wx.h".
11#include "wx/wxprec.h"
12
13#include "wx/colour.h"
14
15#include "wx/gtk/private.h"
16
17#include <gdk/gdk.h>
18
19//-----------------------------------------------------------------------------
20// wxColour
21//-----------------------------------------------------------------------------
22
23class wxColourRefData : public wxGDIRefData
24{
25public:
26 wxColourRefData(guint16 red, guint16 green, guint16 blue, wxByte alpha = 0xff)
27 {
28 m_color.red =
29 m_red = red;
30 m_color.green =
31 m_green = green;
32 m_color.blue =
33 m_blue = blue;
34 m_alpha = alpha;
35 m_color.pixel = 0;
36 m_colormap = NULL;
37 }
38
39 virtual ~wxColourRefData()
40 {
41 FreeColour();
42 }
43
44 void FreeColour();
45 void AllocColour( GdkColormap* cmap );
46
47 GdkColor m_color;
48 GdkColormap *m_colormap;
49 // gdk_colormap_alloc_color may change the RGB values in m_color, so we need separate copies
50 guint16 m_red;
51 guint16 m_green;
52 guint16 m_blue;
53 wxByte m_alpha;
54
55 wxDECLARE_NO_COPY_CLASS(wxColourRefData);
56};
57
58void wxColourRefData::FreeColour()
59{
60 if (m_colormap)
61 {
62 gdk_colormap_free_colors(m_colormap, &m_color, 1);
63 m_colormap = NULL;
64 m_color.pixel = 0;
65 }
66}
67
68void wxColourRefData::AllocColour( GdkColormap *cmap )
69{
70 if (m_colormap != cmap)
71 {
72 FreeColour();
73
74 m_color.red = m_red;
75 m_color.green = m_green;
76 m_color.blue = m_blue;
77 if (gdk_colormap_alloc_color(cmap, &m_color, FALSE, TRUE))
78 {
79 m_colormap = cmap;
80 }
81 }
82}
83
84//-----------------------------------------------------------------------------
85
86#define M_COLDATA static_cast<wxColourRefData*>(m_refData)
87
88// GDK's values are in 0..65535 range, ours are in 0..255
89#define SHIFT 8
90
91wxColour::wxColour(const GdkColor& gdkColor)
92{
93 m_refData = new wxColourRefData(gdkColor.red, gdkColor.green, gdkColor.blue);
94}
95
96wxColour::~wxColour()
97{
98}
99
100bool wxColour::operator == ( const wxColour& col ) const
101{
102 if (m_refData == col.m_refData)
103 return true;
104
105 if (!m_refData || !col.m_refData)
106 return false;
107
108 wxColourRefData* refData = M_COLDATA;
109 wxColourRefData* that_refData = static_cast<wxColourRefData*>(col.m_refData);
110 return refData->m_red == that_refData->m_red &&
111 refData->m_green == that_refData->m_green &&
112 refData->m_blue == that_refData->m_blue &&
113 refData->m_alpha == that_refData->m_alpha;
114}
115
116void wxColour::InitRGBA(unsigned char red, unsigned char green, unsigned char blue,
117 unsigned char alpha)
118{
119 UnRef();
120
121 m_refData = new wxColourRefData(
122 (guint16(red) << SHIFT) + red,
123 (guint16(green) << SHIFT) + green,
124 (guint16(blue) << SHIFT) + blue,
125 alpha);
126}
127
128unsigned char wxColour::Red() const
129{
130 wxCHECK_MSG( IsOk(), 0, wxT("invalid colour") );
131
132 return wxByte(M_COLDATA->m_red >> SHIFT);
133}
134
135unsigned char wxColour::Green() const
136{
137 wxCHECK_MSG( IsOk(), 0, wxT("invalid colour") );
138
139 return wxByte(M_COLDATA->m_green >> SHIFT);
140}
141
142unsigned char wxColour::Blue() const
143{
144 wxCHECK_MSG( IsOk(), 0, wxT("invalid colour") );
145
146 return wxByte(M_COLDATA->m_blue >> SHIFT);
147}
148
149unsigned char wxColour::Alpha() const
150{
151 wxCHECK_MSG( IsOk(), 0, wxT("invalid colour") );
152
153 return M_COLDATA->m_alpha;
154}
155
156void wxColour::CalcPixel( GdkColormap *cmap )
157{
158 if (!IsOk()) return;
159
160 M_COLDATA->AllocColour( cmap );
161}
162
163int wxColour::GetPixel() const
164{
165 wxCHECK_MSG( IsOk(), 0, wxT("invalid colour") );
166
167 return M_COLDATA->m_color.pixel;
168}
169
170const GdkColor *wxColour::GetColor() const
171{
172 wxCHECK_MSG( IsOk(), NULL, wxT("invalid colour") );
173
174 return &M_COLDATA->m_color;
175}
176
177bool wxColour::FromString(const wxString& str)
178{
179 GdkColor colGDK;
180 if ( gdk_color_parse( wxGTK_CONV_SYS( str ), &colGDK ) )
181 {
182 *this = wxColour(colGDK);
183 return true;
184 }
185
186 return wxColourBase::FromString(str);
187}