#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()
{
- m_colormap = (GdkColormap *) NULL;
-};
+ m_count = 0;
+ m_entries = NULL;
+#if 0
+ m_colormap = (GdkColormap *) NULL;
+#endif
+}
wxPaletteRefData::~wxPaletteRefData()
{
- if (m_colormap) gdk_colormap_unref( m_colormap );
-};
+ delete[] m_entries;
+#if 0
+ if (m_colormap) gdk_colormap_unref( m_colormap );
+#endif
+}
//-----------------------------------------------------------------------------
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()
{
-};
+}
-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 WXUNUSED(n),
- const unsigned char *WXUNUSED(red),
- const unsigned char *WXUNUSED(green),
- const unsigned char *WXUNUSED(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 WXUNUSED(red),
- const unsigned char WXUNUSED(green),
- const unsigned char WXUNUSED(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 WXUNUSED(pixel),
- unsigned char *WXUNUSED(red),
- unsigned char *WXUNUSED(green),
- unsigned char *WXUNUSED(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;
-};