X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/47d67540a017101b3e46abe9ef0f55914d8de37e..35cd9dba7b1e71937fa59949fd7e6f005a2c11d6:/src/gtk/palette.cpp diff --git a/src/gtk/palette.cpp b/src/gtk/palette.cpp index 9f49402c61..6269a1882a 100644 --- a/src/gtk/palette.cpp +++ b/src/gtk/palette.cpp @@ -15,29 +15,47 @@ #include "wx/palette.h" +#include + //----------------------------------------------------------------------------- // wxPalette //----------------------------------------------------------------------------- +struct wxPaletteEntry +{ + unsigned char red, green, blue; +}; + class wxPaletteRefData: public wxObjectRefData { public: - + wxPaletteRefData(void); ~wxPaletteRefData(void); - + + int m_count; + wxPaletteEntry *m_entries; +#if 0 GdkColormap *m_colormap; +#endif }; -wxPaletteRefData::wxPaletteRefData(void) +wxPaletteRefData::wxPaletteRefData() { - m_colormap = (GdkColormap *) NULL; -}; + m_count = 0; + m_entries = NULL; +#if 0 + m_colormap = (GdkColormap *) NULL; +#endif +} -wxPaletteRefData::~wxPaletteRefData(void) +wxPaletteRefData::~wxPaletteRefData() { - if (m_colormap) gdk_colormap_unref( m_colormap ); -}; + delete[] m_entries; +#if 0 + if (m_colormap) gdk_colormap_unref( m_colormap ); +#endif +} //----------------------------------------------------------------------------- @@ -45,71 +63,104 @@ wxPaletteRefData::~wxPaletteRefData(void) IMPLEMENT_DYNAMIC_CLASS(wxPalette,wxGDIObject) -wxPalette::wxPalette(void) +wxPalette::wxPalette() { -}; + m_refData = NULL; +} -wxPalette::wxPalette( int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue ) +wxPalette::wxPalette(int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue) { - m_refData = new wxPaletteRefData(); - Create( n, red, green, blue ); -}; + Create(n, red, green, blue); +} -wxPalette::wxPalette( const wxPalette& palette ) +wxPalette::wxPalette(const wxPalette& palette) { - Ref( palette ); -}; + Ref(palette); +} -wxPalette::wxPalette( const wxPalette* palette ) +wxPalette::~wxPalette() { - UnRef(); - if (palette) Ref( *palette ); -}; +} -wxPalette::~wxPalette(void) +wxPalette& wxPalette::operator = (const wxPalette& palette) { -}; + if (*this == palette) return (*this); + Ref(palette); + return *this; +} -wxPalette& wxPalette::operator = ( const wxPalette& palette ) +bool wxPalette::operator == (const wxPalette& palette) { - if (*this == palette) return (*this); - Ref( palette ); - return *this; -}; + return m_refData == palette.m_refData; +} -bool wxPalette::operator == ( const wxPalette& palette ) +bool wxPalette::operator != (const wxPalette& palette) { - return m_refData == palette.m_refData; -}; - -bool wxPalette::operator != ( const wxPalette& palette ) -{ - return m_refData != palette.m_refData; -}; + return m_refData != palette.m_refData; +} bool wxPalette::Ok(void) const { - return (m_refData); -}; + return (m_refData != NULL); +} -bool wxPalette::Create( int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue) +bool wxPalette::Create(int n, + const unsigned char *red, + const unsigned char *green, + const unsigned char *blue) { - wxFAIL_MSG("not implemented"); - - return FALSE; -}; - -int wxPalette::GetPixel( const unsigned char red, const unsigned char green, const unsigned char blue ) const + UnRef(); + m_refData = new wxPaletteRefData(); + + M_PALETTEDATA->m_count = n; + M_PALETTEDATA->m_entries = new wxPaletteEntry[n]; + + wxPaletteEntry *e = M_PALETTEDATA->m_entries; + for (int i = 0; i < n; i++, e++) + { + e->red = red[i]; + e->green = green[i]; + e->blue = blue[i]; + } + + return TRUE; +} + +int wxPalette::GetPixel( const unsigned char red, + const unsigned char green, + const unsigned char blue ) const { - wxFAIL_MSG("not implemented"); - - return 0; -}; - -bool wxPalette::GetRGB( int pixel, unsigned char *red, unsigned char *green, unsigned char *blue ) const + if (!m_refData) return FALSE; + + int closest = 0; + double d,distance = 1000.0; // max. dist is 256 + + wxPaletteEntry *e = M_PALETTEDATA->m_entries; + for (int i = 0; i < M_PALETTEDATA->m_count; i++, e++) + { + if ((d = 0.299 * abs(red - e->red) + + 0.587 * abs(green - e->green) + + 0.114 * abs(blue - e->blue)) < distance) { + distance = d; + closest = i; + } + } + return closest; +} + +bool wxPalette::GetRGB(int pixel, + unsigned char *red, + unsigned char *green, + unsigned char *blue) const { - wxFAIL_MSG("not implemented"); + if (!m_refData) return FALSE; + if (pixel >= M_PALETTEDATA->m_count) return FALSE; + + wxPaletteEntry& p = M_PALETTEDATA->m_entries[pixel]; + if (red) *red = p.red; + if (green) *green = p.green; + if (blue) *blue = p.blue; + return TRUE; +} - return 0; -};