]>
git.saurik.com Git - wxWidgets.git/blob - src/gtk/colour.cpp
1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Robert Roebling
7 // Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "colour.h"
16 #include "wx/gdicmn.h"
19 #include "gdk_imlib.h"
22 //-----------------------------------------------------------------------------
24 //-----------------------------------------------------------------------------
26 class wxColourRefData
: public wxObjectRefData
30 wxColourRefData(void);
31 ~wxColourRefData(void);
32 void FreeColour(void);
35 GdkColormap
*m_colormap
;
41 wxColourRefData::wxColourRefData(void)
51 wxColourRefData::~wxColourRefData(void)
56 void wxColourRefData::FreeColour(void)
58 // if (m_hasPixel) gdk_colors_free( m_colormap, &m_color, 1, 0 );
61 //-----------------------------------------------------------------------------
63 #define M_COLDATA ((wxColourRefData *)m_refData)
65 #define SHIFT (8*(sizeof(short int)-sizeof(char)))
67 IMPLEMENT_DYNAMIC_CLASS(wxColour
,wxGDIObject
)
69 wxColour::wxColour(void)
73 wxColour::wxColour( char red
, char green
, char blue
)
75 m_refData
= new wxColourRefData();
76 M_COLDATA
->m_color
.red
= ((unsigned short)red
) << SHIFT
;
77 M_COLDATA
->m_color
.green
= ((unsigned short)green
) << SHIFT
;
78 M_COLDATA
->m_color
.blue
= ((unsigned short)blue
) << SHIFT
;
79 M_COLDATA
->m_color
.pixel
= 0;
82 wxColour::wxColour( const wxString
&colourName
)
85 if ( (wxTheColourDatabase
) && (node
= wxTheColourDatabase
->Find(colourName
)) )
87 wxColour
*col
= (wxColour
*)node
->Data();
93 m_refData
= new wxColourRefData();
94 if (!gdk_color_parse( colourName
, &M_COLDATA
->m_color
))
102 wxColour::wxColour( const wxColour
& col
)
107 wxColour::wxColour( const wxColour
* col
)
109 if (col
) Ref( *col
);
112 wxColour::~wxColour(void)
116 wxColour
& wxColour::operator = ( const wxColour
& col
)
118 if (*this == col
) return (*this);
123 wxColour
& wxColour::operator = ( const wxString
& colourName
)
127 if ((wxTheColourDatabase
) && (node
= wxTheColourDatabase
->Find(colourName
)) )
129 wxColour
*col
= (wxColour
*)node
->Data();
130 if (col
) Ref( *col
);
134 m_refData
= new wxColourRefData();
135 if (!gdk_color_parse( colourName
, &M_COLDATA
->m_color
))
144 bool wxColour::operator == ( const wxColour
& col
)
146 return m_refData
== col
.m_refData
;
149 bool wxColour::operator != ( const wxColour
& col
)
151 return m_refData
!= col
.m_refData
;
154 void wxColour::Set( const unsigned char red
, const unsigned char green
, const unsigned char blue
)
157 m_refData
= new wxColourRefData();
158 M_COLDATA
->m_color
.red
= ((unsigned short)red
) << SHIFT
;
159 M_COLDATA
->m_color
.green
= ((unsigned short)green
) << SHIFT
;
160 M_COLDATA
->m_color
.blue
= ((unsigned short)blue
) << SHIFT
;
161 M_COLDATA
->m_color
.pixel
= 0;
164 unsigned char wxColour::Red(void) const
167 return (unsigned char)(M_COLDATA
->m_color
.red
>> SHIFT
);
170 unsigned char wxColour::Green(void) const
173 return (unsigned char)(M_COLDATA
->m_color
.green
>> SHIFT
);
176 unsigned char wxColour::Blue(void) const
179 return (unsigned char)(M_COLDATA
->m_color
.blue
>> SHIFT
);
182 bool wxColour::Ok(void) const
187 void wxColour::CalcPixel( GdkColormap
*cmap
)
191 if ((M_COLDATA
->m_hasPixel
) && (M_COLDATA
->m_colormap
== cmap
)) return;
192 M_COLDATA
->FreeColour();
196 int r
= M_COLDATA
->m_color
.red
>> SHIFT
;
197 int g
= M_COLDATA
->m_color
.green
>> SHIFT
;
198 int b
= M_COLDATA
->m_color
.blue
>> SHIFT
;
199 M_COLDATA
->m_hasPixel
= TRUE
;
200 M_COLDATA
->m_color
.pixel
= gdk_imlib_best_color_match( &r
, &g
, &b
);
204 M_COLDATA
->m_hasPixel
= gdk_color_alloc( cmap
, &M_COLDATA
->m_color
);
208 M_COLDATA
->m_colormap
= cmap
;
211 int wxColour::GetPixel(void)
215 return M_COLDATA
->m_color
.pixel
;
218 GdkColor
*wxColour::GetColor(void)
220 if (!Ok()) return NULL
;
222 return &M_COLDATA
->m_color
;