]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/palette.cpp
Changed code to get rid of a compiler warning about statement always being FALSE
[wxWidgets.git] / src / gtk / palette.cpp
index c94a33616d8d7fce621505d0a1fe37524a9b3614..6269a1882a64e3d663857e79b4b2e079855625b5 100644 (file)
 
 #include "wx/palette.h"
 
+#include <gdk/gdk.h>
+
 //-----------------------------------------------------------------------------
 // wxPalette
 //-----------------------------------------------------------------------------
 
+struct wxPaletteEntry
+{
+    unsigned char red, green, blue;
+};
+
 class wxPaletteRefData: public wxObjectRefData
 {
   public:
@@ -26,18 +33,29 @@ class wxPaletteRefData: public wxObjectRefData
     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
+}
 
 //-----------------------------------------------------------------------------
 
@@ -47,71 +65,102 @@ IMPLEMENT_DYNAMIC_CLASS(wxPalette,wxGDIObject)
 
 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;
-};