]>
git.saurik.com Git - wxWidgets.git/blob - src/mgl/palette.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/mgl/palette.cpp 
   3 // Author:      Vaclav Slavik 
   6 // Copyright:   (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com) 
   7 // Licence:     wxWindows licence 
   8 ///////////////////////////////////////////////////////////////////////////// 
  10 // For compilers that support precompilation, includes "wx.h". 
  11 #include "wx/wxprec.h" 
  17 #include "wx/palette.h" 
  21 //----------------------------------------------------------------------------- 
  23 //----------------------------------------------------------------------------- 
  25 class wxPaletteRefData
: public wxObjectRefData
 
  28         wxPaletteRefData(void); 
  29         virtual ~wxPaletteRefData(void); 
  35 wxPaletteRefData::wxPaletteRefData() 
  41 wxPaletteRefData::~wxPaletteRefData() 
  46 //----------------------------------------------------------------------------- 
  48 #define M_PALETTEDATA ((wxPaletteRefData *)m_refData) 
  50 IMPLEMENT_DYNAMIC_CLASS(wxPalette
,wxGDIObject
) 
  52 wxPalette::wxPalette() 
  57 wxPalette::wxPalette(int n
, const unsigned char *red
, const unsigned char *green
, const unsigned char *blue
) 
  59     Create(n
, red
, green
, blue
); 
  62 wxPalette::~wxPalette() 
  66 bool wxPalette::IsOk(void) const 
  68     return (m_refData 
!= NULL
); 
  71 bool wxPalette::Create(int n
, 
  72                        const unsigned char *red
, 
  73                        const unsigned char *green
, 
  74                        const unsigned char *blue
) 
  77     m_refData 
= new wxPaletteRefData(); 
  79     M_PALETTEDATA
->m_count 
= n
; 
  80     M_PALETTEDATA
->m_entries 
= new palette_t
[n
]; 
  82     palette_t 
*e 
= M_PALETTEDATA
->m_entries
; 
  83     for (int i 
= 0; i 
< n
; i
++, e
++) 
  94 int wxPalette::GetPixel(unsigned char red
, 
  96                         unsigned char blue
) const 
  98     if (!m_refData
) return wxNOT_FOUND
; 
 101     double d
, distance 
= 1000.0; // max. dist is 256 
 103     palette_t 
*e 
= M_PALETTEDATA
->m_entries
; 
 104     for (int i 
= 0; i 
< M_PALETTEDATA
->m_count
; i
++, e
++) 
 106         if ((d 
= 0.299 * abs(red 
- e
->red
) + 
 107                  0.587 * abs(green 
- e
->green
) + 
 108                  0.114 * abs(blue 
- e
->blue
)) < distance
) { 
 117 bool wxPalette::GetRGB(int pixel
, 
 119                        unsigned char *green
, 
 120                        unsigned char *blue
) const 
 122     if (!m_refData
) return false; 
 123     if (pixel 
>= M_PALETTEDATA
->m_count
) return false; 
 125     palette_t
& p 
= M_PALETTEDATA
->m_entries
[pixel
]; 
 126     if (red
) *red 
= p
.red
; 
 127     if (green
) *green 
= p
.green
; 
 128     if (blue
) *blue 
= p
.blue
; 
 132 int wxPalette::GetColoursCount() const 
 134     wxCHECK_MSG( Ok(), 0, wxT("invalid palette") ); 
 135     return M_PALETTEDATA
->m_count
; 
 138 palette_t 
*wxPalette::GetMGLpalette_t() const 
 140     wxCHECK_MSG( Ok(), NULL
, wxT("invalid palette") ); 
 141     return M_PALETTEDATA
->m_entries
;