#include "wx/palette.h"
+#include <gdk/gdk.h>
+
//-----------------------------------------------------------------------------
// 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
+}
//-----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxPalette,wxGDIObject)
-wxPalette::wxPalette(void)
-{
-};
-
-wxPalette::wxPalette( int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue )
+wxPalette::wxPalette()
{
- m_refData = new wxPaletteRefData();
- Create( n, red, green, blue );
-};
+ m_refData = NULL;
+}
-wxPalette::wxPalette( const wxPalette& palette )
+wxPalette::wxPalette(int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue)
{
- Ref( palette );
-};
+ Create(n, red, green, blue);
+}
-wxPalette::wxPalette( const wxPalette* palette )
+wxPalette::wxPalette(const wxPalette& palette)
{
- UnRef();
- if (palette) Ref( *palette );
-};
+ Ref(palette);
+}
-wxPalette::~wxPalette(void)
+wxPalette::~wxPalette()
{
-};
+}
-wxPalette& wxPalette::operator = ( const wxPalette& palette )
+wxPalette& wxPalette::operator = (const wxPalette& palette)
{
- if (*this == palette) return (*this);
- Ref( palette );
- return *this;
-};
+ if (*this == palette) return (*this);
+ Ref(palette);
+ return *this;
+}
-bool wxPalette::operator == ( const wxPalette& palette )
+bool wxPalette::operator == (const wxPalette& palette)
{
- return m_refData == palette.m_refData;
-};
+ return m_refData == palette.m_refData;
+}
-bool wxPalette::operator != ( const wxPalette& palette )
+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)
{
-};
-
-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
{
-};
-
-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
{
-};
+ 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;
+}
+