1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/gtk/colour.cpp 
   4 // Author:      Robert Roebling 
   6 // Copyright:   (c) 1998 Robert Roebling 
   7 // Licence:     wxWindows licence 
   8 ///////////////////////////////////////////////////////////////////////////// 
  10 // For compilers that support precompilation, includes "wx.h". 
  11 #include "wx/wxprec.h" 
  13 #include "wx/colour.h" 
  14 #include "wx/gdicmn.h" 
  15 #include "wx/gtk/private.h" 
  19 #include <gdk/gdkprivate.h> 
  21 //----------------------------------------------------------------------------- 
  23 //----------------------------------------------------------------------------- 
  25 class wxColourRefData
: public wxObjectRefData
 
  34         m_colormap 
= (GdkColormap 
*) NULL
; 
  38     wxColourRefData(const wxColourRefData
& data
) 
  41         m_color 
= data
.m_color
; 
  42         m_colormap 
= data
.m_colormap
; 
  43         m_hasPixel 
= data
.m_hasPixel
; 
  51     bool operator == (const wxColourRefData
& data
) const 
  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
); 
  62     void AllocColour( GdkColormap
* cmap 
); 
  65     GdkColormap 
*m_colormap
; 
  68     friend class wxColour
; 
  70     // reference counter for systems with <= 8-Bit display 
  71     static gushort colMapAllocCounter
[ 256 ]; 
  74 gushort 
wxColourRefData::colMapAllocCounter
[ 256 ] = 
  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 
  91 void wxColourRefData::FreeColour() 
  95         if ((m_colormap
->visual
->type 
== GDK_VISUAL_GRAYSCALE
) || 
  96             (m_colormap
->visual
->type 
== GDK_VISUAL_PSEUDO_COLOR
)) 
  98             int idx 
= m_color
.pixel
; 
  99             colMapAllocCounter
[ idx 
] = colMapAllocCounter
[ idx 
] - 1; 
 101             if (colMapAllocCounter
[ idx 
] == 0) 
 102                 gdk_colormap_free_colors( m_colormap
, &m_color
, 1 ); 
 107 void wxColourRefData::AllocColour( GdkColormap 
*cmap 
) 
 109     if (m_hasPixel 
&& (m_colormap 
== cmap
)) 
 114     if ( (cmap
->visual
->type 
== GDK_VISUAL_GRAYSCALE
) || 
 115          (cmap
->visual
->type 
== GDK_VISUAL_PSEUDO_COLOR
) ) 
 117         m_hasPixel 
= gdk_colormap_alloc_color( cmap
, &m_color
, FALSE
, TRUE 
); 
 118         int idx 
= m_color
.pixel
; 
 119         colMapAllocCounter
[ idx 
] = colMapAllocCounter
[ idx 
] + 1; 
 123         m_hasPixel 
= gdk_color_alloc( cmap
, &m_color 
); 
 128 //----------------------------------------------------------------------------- 
 130 #define M_COLDATA ((wxColourRefData *)m_refData) 
 132 // GDK's values are in 0..65535 range, our are in 0..255 
 135 IMPLEMENT_DYNAMIC_CLASS(wxColour
,wxGDIObject
) 
 137 wxColour::wxColour( unsigned char red
, unsigned char green
, unsigned char blue 
) 
 139     m_refData 
= new wxColourRefData(); 
 140     M_COLDATA
->m_color
.red 
= ((unsigned short)red
) << SHIFT
; 
 141     M_COLDATA
->m_color
.green 
= ((unsigned short)green
) << SHIFT
; 
 142     M_COLDATA
->m_color
.blue 
= ((unsigned short)blue
) << SHIFT
; 
 143     M_COLDATA
->m_color
.pixel 
= 0; 
 147 wxColour 
wxColour::CreateByName(const wxString
& name
) 
 152     if ( gdk_color_parse( wxGTK_CONV( name 
), &colGDK 
) ) 
 154         wxColourRefData 
*refData 
= new wxColourRefData
; 
 155         refData
->m_color 
= colGDK
; 
 156         col
.m_refData 
= refData
; 
 163 void wxColour::InitFromName( const wxString 
&colourName 
) 
 165     // check the cache first 
 167     if ( wxTheColourDatabase 
) 
 169         col 
= wxTheColourDatabase
->Find(colourName
); 
 174         col 
= CreateByName(colourName
); 
 183         wxFAIL_MSG( wxT("wxColour: couldn't find colour") ); 
 187 wxColour::~wxColour() 
 191 bool wxColour::operator == ( const wxColour
& col 
) const 
 193     if (m_refData 
== col
.m_refData
) 
 196     if (!m_refData 
|| !col
.m_refData
) 
 199     GdkColor 
*own 
= &(((wxColourRefData
*)m_refData
)->m_color
); 
 200     GdkColor 
*other 
= &(((wxColourRefData
*)col
.m_refData
)->m_color
); 
 201     return own
->red 
== other
->red 
&& 
 202                 own
->blue 
== other
->blue 
&& 
 203                      own
->green 
== other
->green
; 
 206 wxObjectRefData 
*wxColour::CreateRefData() const 
 208     return new wxColourRefData
; 
 211 wxObjectRefData 
*wxColour::CloneRefData(const wxObjectRefData 
*data
) const 
 213     return new wxColourRefData(*(wxColourRefData 
*)data
); 
 216 void wxColour::Set( unsigned char red
, unsigned char green
, unsigned char blue 
) 
 220     M_COLDATA
->m_color
.red 
= ((unsigned short)red
) << SHIFT
; 
 221     M_COLDATA
->m_color
.green 
= ((unsigned short)green
) << SHIFT
; 
 222     M_COLDATA
->m_color
.blue 
= ((unsigned short)blue
) << SHIFT
; 
 223     M_COLDATA
->m_color
.pixel 
= 0; 
 225     M_COLDATA
->m_colormap 
= (GdkColormap
*) NULL
; 
 226     M_COLDATA
->m_hasPixel 
= false; 
 229 unsigned char wxColour::Red() const 
 231     wxCHECK_MSG( Ok(), 0, wxT("invalid colour") ); 
 233     return (unsigned char)(M_COLDATA
->m_color
.red 
>> SHIFT
); 
 236 unsigned char wxColour::Green() const 
 238     wxCHECK_MSG( Ok(), 0, wxT("invalid colour") ); 
 240     return (unsigned char)(M_COLDATA
->m_color
.green 
>> SHIFT
); 
 243 unsigned char wxColour::Blue() const 
 245     wxCHECK_MSG( Ok(), 0, wxT("invalid colour") ); 
 247     return (unsigned char)(M_COLDATA
->m_color
.blue 
>> SHIFT
); 
 250 void wxColour::CalcPixel( GdkColormap 
*cmap 
) 
 254     M_COLDATA
->AllocColour( cmap 
); 
 257 int wxColour::GetPixel() const 
 259     wxCHECK_MSG( Ok(), 0, wxT("invalid colour") ); 
 261     return M_COLDATA
->m_color
.pixel
; 
 264 GdkColor 
*wxColour::GetColor() const 
 266     wxCHECK_MSG( Ok(), (GdkColor 
*) NULL
, wxT("invalid colour") ); 
 268     return &M_COLDATA
->m_color
;