]>
git.saurik.com Git - wxWidgets.git/blob - src/gtk/colour.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   4 // Author:      Robert Roebling 
   6 // Copyright:   (c) 1998 Robert Roebling 
   7 // Licence:     wxWindows licence 
   8 ///////////////////////////////////////////////////////////////////////////// 
  12 #pragma implementation "colour.h" 
  15 #include "wx/gdicmn.h" 
  18 #include <gdk/gdkprivate.h> 
  20 //----------------------------------------------------------------------------- 
  22 //----------------------------------------------------------------------------- 
  24 class wxColourRefData
: public wxObjectRefData
 
  33     GdkColormap 
*m_colormap
; 
  39 wxColourRefData::wxColourRefData() 
  45     m_colormap 
= (GdkColormap 
*) NULL
; 
  49 wxColourRefData::~wxColourRefData() 
  54 void wxColourRefData::FreeColour() 
  56 //  if (m_hasPixel) gdk_colors_free( m_colormap, &m_color, 1, 0 ); 
  59 //----------------------------------------------------------------------------- 
  61 #define M_COLDATA ((wxColourRefData *)m_refData) 
  63 #define SHIFT (8*(sizeof(short int)-sizeof(char))) 
  65 IMPLEMENT_DYNAMIC_CLASS(wxColour
,wxGDIObject
) 
  71 wxColour::wxColour( unsigned char red
, unsigned char green
, unsigned char blue 
) 
  73     m_refData 
= new wxColourRefData(); 
  74     M_COLDATA
->m_color
.red 
= ((unsigned short)red
) << SHIFT
; 
  75     M_COLDATA
->m_color
.green 
= ((unsigned short)green
) << SHIFT
; 
  76     M_COLDATA
->m_color
.blue 
= ((unsigned short)blue
) << SHIFT
; 
  77     M_COLDATA
->m_color
.pixel 
= 0; 
  80 void wxColour::InitFromName( const wxString 
&colourName 
) 
  82     wxNode 
*node 
= (wxNode 
*) NULL
; 
  83     if ( (wxTheColourDatabase
) && (node 
= wxTheColourDatabase
->Find(colourName
)) ) 
  85         wxColour 
*col 
= (wxColour
*)node
->Data(); 
  91         m_refData 
= new wxColourRefData(); 
  92         if (!gdk_color_parse( colourName
.mb_str(), &M_COLDATA
->m_color 
)) 
  94             wxFAIL_MSG( wxT("wxColour: couldn't find colour") ); 
  97             m_refData 
= (wxObjectRefData 
*) NULL
; 
 102 wxColour::wxColour( const wxColour
& col 
) 
 107 wxColour::~wxColour() 
 111 wxColour
& wxColour::operator = ( const wxColour
& col 
) 
 113     if (*this == col
) return (*this); 
 118 bool wxColour::operator == ( const wxColour
& col 
) const 
 120     if (m_refData 
== col
.m_refData
) return TRUE
; 
 122     if (!m_refData
) return FALSE
; 
 123     if (!col
.m_refData
) return FALSE
; 
 125     GdkColor 
*own 
= &(((wxColourRefData
*)m_refData
)->m_color
); 
 126     GdkColor 
*other 
= &(((wxColourRefData
*)col
.m_refData
)->m_color
); 
 127     if (own
->red 
!= other
->red
) return FALSE
; 
 128     if (own
->blue 
!= other
->blue
) return FALSE
; 
 129     if (own
->green 
!= other
->green
) return FALSE
; 
 134 bool wxColour::operator != ( const wxColour
& col
) const 
 136     return m_refData 
!= col
.m_refData
; 
 139 void wxColour::Set( unsigned char red
, unsigned char green
, unsigned char blue 
) 
 142     m_refData 
= new wxColourRefData(); 
 143     M_COLDATA
->m_color
.red 
= ((unsigned short)red
) << SHIFT
; 
 144     M_COLDATA
->m_color
.green 
= ((unsigned short)green
) << SHIFT
; 
 145     M_COLDATA
->m_color
.blue 
= ((unsigned short)blue
) << SHIFT
; 
 146     M_COLDATA
->m_color
.pixel 
= 0; 
 149 unsigned char wxColour::Red() const 
 151     wxCHECK_MSG( Ok(), 0, wxT("invalid colour") ); 
 153     return (unsigned char)(M_COLDATA
->m_color
.red 
>> SHIFT
); 
 156 unsigned char wxColour::Green() const 
 158     wxCHECK_MSG( Ok(), 0, wxT("invalid colour") ); 
 160     return (unsigned char)(M_COLDATA
->m_color
.green 
>> SHIFT
); 
 163 unsigned char wxColour::Blue() const 
 165     wxCHECK_MSG( Ok(), 0, wxT("invalid colour") ); 
 167     return (unsigned char)(M_COLDATA
->m_color
.blue 
>> SHIFT
); 
 170 bool wxColour::Ok() const 
 172     return (m_refData 
!= NULL
); 
 175 void wxColour::CalcPixel( GdkColormap 
*cmap 
) 
 179     if ((M_COLDATA
->m_hasPixel
) && (M_COLDATA
->m_colormap 
== cmap
)) return; 
 181     M_COLDATA
->FreeColour(); 
 183     GdkColormapPrivate 
*private_colormap 
= (GdkColormapPrivate
*) cmap
; 
 184     if ((private_colormap
->visual
->type 
== GDK_VISUAL_GRAYSCALE
) || 
 185         (private_colormap
->visual
->type 
== GDK_VISUAL_PSEUDO_COLOR
)) 
 187         GdkColor 
*colors 
= cmap
->colors
; 
 188         int max 
= 3 * (65536); 
 191         for (int i 
= 0; i 
< cmap
->size
; i
++) 
 193             int rdiff 
= (M_COLDATA
->m_color
.red 
- colors
[i
].red
); 
 194             int gdiff 
= (M_COLDATA
->m_color
.green 
- colors
[i
].green
); 
 195             int bdiff 
= (M_COLDATA
->m_color
.blue 
- colors
[i
].blue
); 
 196             int sum 
= ABS (rdiff
) + ABS (gdiff
) + ABS (bdiff
); 
 197             if (sum 
< max
) { index 
= i
; max 
= sum
; } 
 200         M_COLDATA
->m_hasPixel 
= TRUE
; 
 201         M_COLDATA
->m_color
.pixel 
= index
; 
 205         M_COLDATA
->m_hasPixel 
= gdk_color_alloc( cmap
, &M_COLDATA
->m_color 
); 
 208     M_COLDATA
->m_colormap 
= cmap
; 
 211 int wxColour::GetPixel() const 
 213     wxCHECK_MSG( Ok(), 0, wxT("invalid colour") ); 
 215     return M_COLDATA
->m_color
.pixel
; 
 218 GdkColor 
*wxColour::GetColor() const 
 220     wxCHECK_MSG( Ok(), (GdkColor 
*) NULL
, wxT("invalid colour") ); 
 222     return &M_COLDATA
->m_color
;