1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/gtk1/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/gtk1/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         GdkColormapPrivate 
*private_colormap 
= (GdkColormapPrivate
*) m_colormap
; 
  96         if ((private_colormap
->visual
->type 
== GDK_VISUAL_GRAYSCALE
) || 
  97             (private_colormap
->visual
->type 
== GDK_VISUAL_PSEUDO_COLOR
)) 
  99             int idx 
= m_color
.pixel
; 
 100             colMapAllocCounter
[ idx 
] = colMapAllocCounter
[ idx 
] - 1; 
 102             if (colMapAllocCounter
[ idx 
] == 0) 
 103                 gdk_colormap_free_colors( m_colormap
, &m_color
, 1 ); 
 108 void wxColourRefData::AllocColour( GdkColormap 
*cmap 
) 
 110     if (m_hasPixel 
&& (m_colormap 
== cmap
)) 
 115     GdkColormapPrivate 
*private_colormap 
= (GdkColormapPrivate
*) cmap
; 
 116     if ((private_colormap
->visual
->type 
== GDK_VISUAL_GRAYSCALE
) || 
 117         (private_colormap
->visual
->type 
== GDK_VISUAL_PSEUDO_COLOR
)) 
 119         m_hasPixel 
= gdk_colormap_alloc_color( cmap
, &m_color
, FALSE
, TRUE 
); 
 120         int idx 
= m_color
.pixel
; 
 121         colMapAllocCounter
[ idx 
] = colMapAllocCounter
[ idx 
] + 1; 
 125         m_hasPixel 
= gdk_color_alloc( cmap
, &m_color 
); 
 130 //----------------------------------------------------------------------------- 
 132 #define M_COLDATA ((wxColourRefData *)m_refData) 
 134 // GDK's values are in 0..65535 range, our are in 0..255 
 137 IMPLEMENT_DYNAMIC_CLASS(wxColour
,wxGDIObject
) 
 139 wxColour::wxColour( unsigned char red
, unsigned char green
, unsigned char blue 
) 
 141     m_refData 
= new wxColourRefData(); 
 142     M_COLDATA
->m_color
.red 
= ((unsigned short)red
) << SHIFT
; 
 143     M_COLDATA
->m_color
.green 
= ((unsigned short)green
) << SHIFT
; 
 144     M_COLDATA
->m_color
.blue 
= ((unsigned short)blue
) << SHIFT
; 
 145     M_COLDATA
->m_color
.pixel 
= 0; 
 149 wxColour 
wxColour::CreateByName(const wxString
& name
) 
 154     if ( gdk_color_parse( wxGTK_CONV( name 
), &colGDK 
) ) 
 156         wxColourRefData 
*refData 
= new wxColourRefData
; 
 157         refData
->m_color 
= colGDK
; 
 158         col
.m_refData 
= refData
; 
 165 void wxColour::InitFromName( const wxString 
&colourName 
) 
 167     // check the cache first 
 169     if ( wxTheColourDatabase 
) 
 171         col 
= wxTheColourDatabase
->Find(colourName
); 
 176         col 
= CreateByName(colourName
); 
 185         wxFAIL_MSG( wxT("wxColour: couldn't find colour") ); 
 189 wxColour::~wxColour() 
 193 bool wxColour::operator == ( const wxColour
& col 
) const 
 195     if (m_refData 
== col
.m_refData
) 
 198     if (!m_refData 
|| !col
.m_refData
) 
 201     GdkColor 
*own 
= &(((wxColourRefData
*)m_refData
)->m_color
); 
 202     GdkColor 
*other 
= &(((wxColourRefData
*)col
.m_refData
)->m_color
); 
 203     return own
->red 
== other
->red 
&& 
 204                 own
->blue 
== other
->blue 
&& 
 205                      own
->green 
== other
->green
; 
 208 wxObjectRefData 
*wxColour::CreateRefData() const 
 210     return new wxColourRefData
; 
 213 wxObjectRefData 
*wxColour::CloneRefData(const wxObjectRefData 
*data
) const 
 215     return new wxColourRefData(*(wxColourRefData 
*)data
); 
 218 void wxColour::Set( unsigned char red
, unsigned char green
, unsigned char blue 
) 
 222     M_COLDATA
->m_color
.red 
= ((unsigned short)red
) << SHIFT
; 
 223     M_COLDATA
->m_color
.green 
= ((unsigned short)green
) << SHIFT
; 
 224     M_COLDATA
->m_color
.blue 
= ((unsigned short)blue
) << SHIFT
; 
 225     M_COLDATA
->m_color
.pixel 
= 0; 
 227     M_COLDATA
->m_colormap 
= (GdkColormap
*) NULL
; 
 228     M_COLDATA
->m_hasPixel 
= false; 
 231 unsigned char wxColour::Red() const 
 233     wxCHECK_MSG( Ok(), 0, wxT("invalid colour") ); 
 235     return (unsigned char)(M_COLDATA
->m_color
.red 
>> SHIFT
); 
 238 unsigned char wxColour::Green() const 
 240     wxCHECK_MSG( Ok(), 0, wxT("invalid colour") ); 
 242     return (unsigned char)(M_COLDATA
->m_color
.green 
>> SHIFT
); 
 245 unsigned char wxColour::Blue() const 
 247     wxCHECK_MSG( Ok(), 0, wxT("invalid colour") ); 
 249     return (unsigned char)(M_COLDATA
->m_color
.blue 
>> SHIFT
); 
 252 void wxColour::CalcPixel( GdkColormap 
*cmap 
) 
 256     M_COLDATA
->AllocColour( cmap 
); 
 259 int wxColour::GetPixel() const 
 261     wxCHECK_MSG( Ok(), 0, wxT("invalid colour") ); 
 263     return M_COLDATA
->m_color
.pixel
; 
 266 GdkColor 
*wxColour::GetColor() const 
 268     wxCHECK_MSG( Ok(), (GdkColor 
*) NULL
, wxT("invalid colour") ); 
 270     return &M_COLDATA
->m_color
;