]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mgl/palette.cpp
added more files (unchanged) from wxUniv branch
[wxWidgets.git] / src / mgl / palette.cpp
diff --git a/src/mgl/palette.cpp b/src/mgl/palette.cpp
new file mode 100644 (file)
index 0000000..4b0b2cb
--- /dev/null
@@ -0,0 +1,169 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        palette.cpp
+// Author:      Vaclav Slavik
+// Created:     2001/03/11
+// Id:          $Id$
+// Copyright:   (c) 2001 Vaclav Slavik
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+
+#ifdef __GNUG__
+#pragma implementation "palette.h"
+#endif
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#include "wx/palette.h"
+#include <mgraph.h>
+
+
+//-----------------------------------------------------------------------------
+// wxPalette
+//-----------------------------------------------------------------------------
+
+class wxPaletteRefData: public wxObjectRefData
+{
+    public:
+        wxPaletteRefData(void);
+        ~wxPaletteRefData(void);
+    
+        int m_count;
+        palette_t *m_entries;
+};
+
+wxPaletteRefData::wxPaletteRefData()
+{
+    m_count = 0;
+    m_entries = NULL;
+}
+
+wxPaletteRefData::~wxPaletteRefData()
+{
+    delete[] m_entries;
+}
+
+//-----------------------------------------------------------------------------
+
+#define M_PALETTEDATA ((wxPaletteRefData *)m_refData)
+
+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)
+{
+    Create(n, red, green, blue);
+}
+
+wxPalette::wxPalette(const wxPalette& palette)
+{
+    Ref(palette);
+}
+
+wxPalette::~wxPalette()
+{
+}
+
+wxPalette& wxPalette::operator = (const wxPalette& palette)
+{
+    if (*this == palette) return (*this);
+    Ref(palette);
+    return *this;
+}
+
+bool wxPalette::operator == (const wxPalette& palette) const
+{
+    return m_refData == palette.m_refData;
+}
+
+bool wxPalette::operator != (const wxPalette& palette) const
+{
+    return m_refData != palette.m_refData;
+}
+
+bool wxPalette::Ok(void) const
+{
+    return (m_refData != NULL);
+}
+
+bool wxPalette::Create(int n,
+                       const unsigned char *red,
+                       const unsigned char *green, 
+                       const unsigned char *blue)
+{
+    UnRef();
+    m_refData = new wxPaletteRefData();
+    
+    M_PALETTEDATA->m_count = n;    
+    M_PALETTEDATA->m_entries = new palette_t[n];
+
+    palette_t *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];
+        e->alpha = 0;
+    }
+
+    return TRUE;
+}
+
+int wxPalette::GetPixel(const unsigned char red,
+                        const unsigned char green,
+                        const unsigned char blue) const
+{
+    if (!m_refData) return FALSE;
+
+       int closest = 0;
+       double d,distance = 1000.0; // max. dist is 256
+
+    palette_t *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;
+    
+    palette_t& p = M_PALETTEDATA->m_entries[pixel];
+    if (red) *red = p.red;
+    if (green) *green = p.green;
+    if (blue) *blue = p.blue;
+    return TRUE;
+}
+
+int wxPalette::GetColoursCount() const
+{
+    wxCHECK_MSG( Ok(), 0, wxT("invalid palette") );   
+    return M_PALETTEDATA->m_count;
+}
+
+palette_t *wxPalette::GetMGLpalette_t() const
+{
+    wxCHECK_MSG( Ok(), NULL, wxT("invalid palette") );   
+    return M_PALETTEDATA->m_entries;
+}
+