]> git.saurik.com Git - wxWidgets.git/blobdiff - src/x11/colour.cpp
Added wxWinCE project files and project file cleaner,
[wxWidgets.git] / src / x11 / colour.cpp
index cf8431a8cc19e7dee3d20340a589b9903a6675ed..95b0c786e700590e38a71176a6297274618ffc45 100644 (file)
@@ -10,7 +10,7 @@
 /////////////////////////////////////////////////////////////////////////////
 
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
 #pragma implementation "colour.h"
 #endif
 
@@ -90,20 +90,19 @@ unsigned short wxColourRefData::colMapAllocCounter[ 256 ] =
 
 void wxColourRefData::FreeColour()
 {
-#if 0        
-    if (m_colormap)
+    if (!m_colormap)
+        return;
+#if !wxUSE_NANOX        
+    if ((wxTheApp->m_visualInfo->m_visualType == GrayScale) ||
+        (wxTheApp->m_visualInfo->m_visualType == PseudoColor))
     {
-        Colormap cm = (Colormap)m_colormap;
-
-        GdkColormapPrivate *private_colormap = (GdkColormapPrivate*) m_colormap;
-        if ((private_colormap->visual->type == GDK_VISUAL_GRAYSCALE) ||
-            (private_colormap->visual->type == GDK_VISUAL_PSEUDO_COLOR))
-        {
-            int idx = m_color.pixel;
-            colMapAllocCounter[ idx ] = colMapAllocCounter[ idx ] - 1;
+        int idx = m_color.pixel;
+        colMapAllocCounter[ idx ] = colMapAllocCounter[ idx ] - 1;
         
-            if (colMapAllocCounter[ idx ] == 0)
-            gdk_colormap_free_colors( m_colormap, &m_color, 1 );
+        if (colMapAllocCounter[ idx ] == 0)
+        {
+            unsigned long pixel = m_color.pixel;
+            XFreeColors( wxGlobalDisplay(), (Colormap) m_colormap, &pixel, 1, 0 );
         }
     }
 #endif
@@ -116,12 +115,11 @@ void wxColourRefData::AllocColour( WXColormap cmap )
 
     FreeColour();
 
-#if 0    
-    GdkColormapPrivate *private_colormap = (GdkColormapPrivate*) cmap;
-    if ((private_colormap->visual->type == GDK_VISUAL_GRAYSCALE) ||
-        (private_colormap->visual->type == GDK_VISUAL_PSEUDO_COLOR))
+#if !wxUSE_NANOX
+    if ((wxTheApp->m_visualInfo->m_visualType == GrayScale) ||
+        (wxTheApp->m_visualInfo->m_visualType == PseudoColor))
     {
-        m_hasPixel = gdk_colormap_alloc_color( cmap, &m_color, FALSE, TRUE );
+        m_hasPixel = XAllocColor( wxGlobalDisplay(), (Colormap) cmap, &m_color );
         int idx = m_color.pixel;
         colMapAllocCounter[ idx ] = colMapAllocCounter[ idx ] + 1;
     }
@@ -130,6 +128,7 @@ void wxColourRefData::AllocColour( WXColormap cmap )
     {
         m_hasPixel = XAllocColor( wxGlobalDisplay(), (Colormap) cmap, &m_color );
     }
+    
     m_colormap = cmap;
 }
 
@@ -156,35 +155,46 @@ wxColour::wxColour( unsigned char red, unsigned char green, unsigned char blue )
     M_COLDATA->m_color.pixel = 0;
 }
 
-void wxColour::InitFromName( const wxString &colourName )
+/* static */
+wxColour wxColour::CreateByName(const wxString& name)
 {
-    wxNode *node = (wxNode *) NULL;
-    if ( (wxTheColourDatabase) && (node = wxTheColourDatabase->Find(colourName)) )
+    wxColour col;
+
+    Display *dpy = wxGlobalDisplay();
+    WXColormap colormap = wxTheApp->GetMainColormap( dpy );
+    XColor xcol;
+    if ( XParseColor( dpy, (Colormap)colormap, name.mb_str(), &xcol ) )
     {
-        wxColour *col = (wxColour*)node->Data();
-        UnRef();
-        if (col) Ref( *col );
+        wxColourRefData *refData = new wxColourRefData;
+        refData->m_colormap = colormap;
+        refData->m_color = xcol;
+        col.m_refData = refData;
     }
-    else
+
+    return col;
+}
+
+void wxColour::InitFromName( const wxString &colourName )
+{
+    // check the cache first
+    wxColour col;
+    if ( wxTheColourDatabase )
     {
-        m_refData = new wxColourRefData();
-        
-        M_COLDATA->m_colormap = wxTheApp->GetMainColormap( wxGlobalDisplay() );
-        
-        if (!XParseColor( wxGlobalDisplay(), (Colormap) M_COLDATA->m_colormap, colourName.mb_str(), &M_COLDATA->m_color ))
-        {
-            // VZ: asserts are good in general but this one is triggered by
-            //     calling wxColourDatabase::FindColour() with an
-            //     unrecognized colour name and this can't be avoided from the
-            //     user code, so don't give it here
-            //
-            //     a better solution would be to changed code in FindColour()
+        col = wxTheColourDatabase->Find(colourName);
+    }
 
-            //wxFAIL_MSG( wxT("wxColour: couldn't find colour") );
+    if ( !col.Ok() )
+    {
+        col = CreateByName(colourName);
+    }
 
-            delete m_refData;
-            m_refData = (wxObjectRefData *) NULL;
-        }
+    if ( col.Ok() )
+    {
+        *this = col;
+    }
+    else
+    {
+        wxFAIL_MSG( wxT("wxColour: couldn't find colour") );
     }
 }