]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/palette.cpp
fixed DoDrawEllipse() bbox calculation (patch 415116)
[wxWidgets.git] / src / gtk / palette.cpp
index 78cdfe5aed1ea14c6bf50275a9c5d2231d5660d8..6269a1882a64e3d663857e79b4b2e079855625b5 100644 (file)
 
 #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 = 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,62 +63,104 @@ wxPaletteRefData::~wxPaletteRefData(void)
 
 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;
+}
+