1 ///////////////////////////////////////////////////////////////////////////// 
   4 // Author:      Robert Roebling 
   6 // Copyright:   (c) 1998 Robert Roebling 
   7 // Licence:     wxWindows licence 
   8 ///////////////////////////////////////////////////////////////////////////// 
  11 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) 
  12 #pragma implementation "colour.h" 
  15 // For compilers that support precompilation, includes "wx.h". 
  16 #include "wx/wxprec.h" 
  18 #include "wx/gdicmn.h" 
  19 #include "wx/colour.h" 
  20 #include "wx/gtk/private.h" 
  24 #include <gdk/gdkprivate.h> 
  26 //----------------------------------------------------------------------------- 
  28 //----------------------------------------------------------------------------- 
  30 class wxColourRefData
: public wxObjectRefData
 
  39         m_colormap 
= (GdkColormap 
*) NULL
; 
  43     wxColourRefData(const wxColourRefData
& data
) 
  46         m_color 
= data
.m_color
; 
  47         m_colormap 
= data
.m_colormap
; 
  48         m_hasPixel 
= data
.m_hasPixel
; 
  56     bool operator == (const wxColourRefData
& data
) const 
  58         return (m_colormap 
== data
.m_colormap 
&& 
  59                 m_hasPixel 
== data
.m_hasPixel 
&& 
  60                 m_color
.red 
== data
.m_color
.red 
&& 
  61                 m_color
.green 
== data
.m_color
.green 
&& 
  62                 m_color
.blue 
== data
.m_color
.blue 
&& 
  63                 m_color
.pixel 
== data
.m_color
.pixel
); 
  67     void AllocColour( GdkColormap
* cmap 
); 
  70     GdkColormap 
*m_colormap
; 
  73     friend class wxColour
; 
  75     // reference counter for systems with <= 8-Bit display 
  76     static gushort colMapAllocCounter
[ 256 ]; 
  79 gushort 
wxColourRefData::colMapAllocCounter
[ 256 ] = 
  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, 0, 0, 0, 0, 
  91   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
  92   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
  93   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
  96 void wxColourRefData::FreeColour() 
 101         if ((m_colormap
->visual
->type 
== GDK_VISUAL_GRAYSCALE
) || 
 102             (m_colormap
->visual
->type 
== GDK_VISUAL_PSEUDO_COLOR
)) 
 104         GdkColormapPrivate 
*private_colormap 
= (GdkColormapPrivate
*) m_colormap
; 
 105         if ((private_colormap
->visual
->type 
== GDK_VISUAL_GRAYSCALE
) || 
 106             (private_colormap
->visual
->type 
== GDK_VISUAL_PSEUDO_COLOR
)) 
 109             int idx 
= m_color
.pixel
; 
 110             colMapAllocCounter
[ idx 
] = colMapAllocCounter
[ idx 
] - 1; 
 112             if (colMapAllocCounter
[ idx 
] == 0) 
 113             gdk_colormap_free_colors( m_colormap
, &m_color
, 1 ); 
 118 void wxColourRefData::AllocColour( GdkColormap 
*cmap 
) 
 120     if (m_hasPixel 
&& (m_colormap 
== cmap
)) 
 126     if ( (cmap
->visual
->type 
== GDK_VISUAL_GRAYSCALE
) || 
 127              (cmap
->visual
->type 
== GDK_VISUAL_PSEUDO_COLOR
) ) 
 129     GdkColormapPrivate 
*private_colormap 
= (GdkColormapPrivate
*) cmap
; 
 130     if ((private_colormap
->visual
->type 
== GDK_VISUAL_GRAYSCALE
) || 
 131         (private_colormap
->visual
->type 
== GDK_VISUAL_PSEUDO_COLOR
)) 
 134         m_hasPixel 
= gdk_colormap_alloc_color( cmap
, &m_color
, FALSE
, TRUE 
); 
 135         int idx 
= m_color
.pixel
; 
 136         colMapAllocCounter
[ idx 
] = colMapAllocCounter
[ idx 
] + 1; 
 140         m_hasPixel 
= gdk_color_alloc( cmap
, &m_color 
); 
 145 //----------------------------------------------------------------------------- 
 147 #define M_COLDATA ((wxColourRefData *)m_refData) 
 149 #define SHIFT (8*(sizeof(short int)-sizeof(char))) 
 151 IMPLEMENT_DYNAMIC_CLASS(wxColour
,wxGDIObject
) 
 153 wxColour::wxColour( unsigned char red
, unsigned char green
, unsigned char blue 
) 
 155     m_refData 
= new wxColourRefData(); 
 156     M_COLDATA
->m_color
.red 
= ((unsigned short)red
) << SHIFT
; 
 157     M_COLDATA
->m_color
.green 
= ((unsigned short)green
) << SHIFT
; 
 158     M_COLDATA
->m_color
.blue 
= ((unsigned short)blue
) << SHIFT
; 
 159     M_COLDATA
->m_color
.pixel 
= 0; 
 163 wxColour 
wxColour::CreateByName(const wxString
& name
) 
 168     if ( gdk_color_parse( wxGTK_CONV( name 
), &colGDK 
) ) 
 170         wxColourRefData 
*refData 
= new wxColourRefData
; 
 171         refData
->m_color 
= colGDK
; 
 172         col
.m_refData 
= refData
; 
 179 void wxColour::InitFromName( const wxString 
&colourName 
) 
 181     // check the cache first 
 183     if ( wxTheColourDatabase 
) 
 185         col 
= wxTheColourDatabase
->Find(colourName
); 
 190         col 
= CreateByName(colourName
); 
 199         wxFAIL_MSG( wxT("wxColour: couldn't find colour") ); 
 203 wxColour::~wxColour() 
 207 bool wxColour::operator == ( const wxColour
& col 
) const 
 209     if (m_refData 
== col
.m_refData
) 
 212     if (!m_refData 
|| !col
.m_refData
) 
 215     GdkColor 
*own 
= &(((wxColourRefData
*)m_refData
)->m_color
); 
 216     GdkColor 
*other 
= &(((wxColourRefData
*)col
.m_refData
)->m_color
); 
 217     return own
->red 
== other
->red 
&& 
 218                 own
->blue 
== other
->blue 
&& 
 219                      own
->green 
== other
->green
; 
 222 wxObjectRefData 
*wxColour::CreateRefData() const 
 224     return new wxColourRefData
; 
 227 wxObjectRefData 
*wxColour::CloneRefData(const wxObjectRefData 
*data
) const 
 229     return new wxColourRefData(*(wxColourRefData 
*)data
); 
 232 void wxColour::Set( unsigned char red
, unsigned char green
, unsigned char blue 
) 
 236     M_COLDATA
->m_color
.red 
= ((unsigned short)red
) << SHIFT
; 
 237     M_COLDATA
->m_color
.green 
= ((unsigned short)green
) << SHIFT
; 
 238     M_COLDATA
->m_color
.blue 
= ((unsigned short)blue
) << SHIFT
; 
 239     M_COLDATA
->m_color
.pixel 
= 0; 
 241     M_COLDATA
->m_colormap 
= (GdkColormap
*) NULL
; 
 242     M_COLDATA
->m_hasPixel 
= false; 
 245 unsigned char wxColour::Red() const 
 247     wxCHECK_MSG( Ok(), 0, wxT("invalid colour") ); 
 249     return (unsigned char)(M_COLDATA
->m_color
.red 
>> SHIFT
); 
 252 unsigned char wxColour::Green() const 
 254     wxCHECK_MSG( Ok(), 0, wxT("invalid colour") ); 
 256     return (unsigned char)(M_COLDATA
->m_color
.green 
>> SHIFT
); 
 259 unsigned char wxColour::Blue() const 
 261     wxCHECK_MSG( Ok(), 0, wxT("invalid colour") ); 
 263     return (unsigned char)(M_COLDATA
->m_color
.blue 
>> SHIFT
); 
 266 void wxColour::CalcPixel( GdkColormap 
*cmap 
) 
 270     M_COLDATA
->AllocColour( cmap 
); 
 273 int wxColour::GetPixel() const 
 275     wxCHECK_MSG( Ok(), 0, wxT("invalid colour") ); 
 277     return M_COLDATA
->m_color
.pixel
; 
 280 GdkColor 
*wxColour::GetColor() const 
 282     wxCHECK_MSG( Ok(), (GdkColor 
*) NULL
, wxT("invalid colour") ); 
 284     return &M_COLDATA
->m_color
;