]> git.saurik.com Git - wxWidgets.git/commitdiff
Some work for wxX11 on 8-bit visuals.
authorRobert Roebling <robert@roebling.de>
Fri, 29 Mar 2002 22:58:15 +0000 (22:58 +0000)
committerRobert Roebling <robert@roebling.de>
Fri, 29 Mar 2002 22:58:15 +0000 (22:58 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14867 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/x11/app.h
src/x11/app.cpp
src/x11/bitmap.cpp
src/x11/colour.cpp

index aec0f3e3675af7a35a2b3b29adddd5dd29f80cfd..4eab1ecb67522c0383c2fbfd51fef1d717a7526a 100644 (file)
@@ -44,7 +44,7 @@ class WXDLLEXPORT wxApp : public wxAppBase
         
 public:
     wxApp();
-    ~wxApp() {}
+    ~wxApp();
     
     // override base class (pure) virtuals
     // -----------------------------------
@@ -94,19 +94,38 @@ public:
     // This handler is called when a property change event occurs
     virtual bool HandlePropertyChange(WXEvent *event);
     
-    // We need this before create the app
-    static   WXDisplay* GetDisplay() { return ms_display; }
-    static   WXDisplay* ms_display;
-
     // Values that can be passed on the command line.
     // Returns -1, -1 if none specified.
     const wxSize& GetInitialSize() const { return m_initialSize; }
     bool GetShowIconic() const { return m_showIconic; }
     
+    // We need this before creating the app
+    static   WXDisplay* GetDisplay() { return ms_display; }
+    static   WXDisplay* ms_display;
+
 public:
     static long           sm_lastMessageTime;
     bool                  m_showIconic;    
     wxSize                m_initialSize;
+    
+    // Someone find a better place for these
+    int                   m_visualType;   // TrueColor, DirectColor etc.
+    int                   m_visualDepth;
+    int                   m_visualColormapSize;
+    void                 *m_visualColormap;
+    int                   m_visualScreen;
+    unsigned long         m_visualRedMask;
+    unsigned long         m_visualGreenMask;
+    unsigned long         m_visualBlueMask;
+    int                   m_visualRedShift;
+    int                   m_visualGreenShift;
+    int                   m_visualBlueShift;
+    int                   m_visualRedPrec;
+    int                   m_visualGreenPrec;
+    int                   m_visualBluePrec;
+    
+    unsigned char        *m_colorCube;
+    
 protected:
     bool                  m_keepGoing;
     
index 2de877dd5cc5d4dee34ad2354aaa8511500e46f5..fdbabd8a8575a4dc4ed156b42d91cbb0ffa4cf2f 100644 (file)
@@ -30,6 +30,8 @@
 #include "wx/univ/theme.h"
 #include "wx/univ/renderer.h"
 
+#define ABS(a)    (((a) < 0) ? -(a) : (a))
+
 #if wxUSE_THREADS
     #include "wx/thread.h"
 #endif
@@ -396,6 +398,18 @@ wxApp::wxApp()
     m_mainLoop = NULL;
     m_showIconic = FALSE;
     m_initialSize = wxDefaultSize;
+    
+    m_visualColormap = NULL;
+    m_colorCube = NULL;
+}
+
+wxApp::~wxApp()
+{
+    if (m_colorCube)
+        free( m_colorCube );
+        
+    if (m_visualColormap)
+        delete [] (XColor*)m_visualColormap;
 }
 
 bool wxApp::Initialized()
@@ -940,6 +954,24 @@ void wxApp::DeletePendingObjects()
     }
 }
 
+static void wxCalcPrecAndShift( unsigned long mask, int *shift, int *prec )
+{
+  *shift = 0;
+  *prec = 0;
+
+  while (!(mask & 0x1))
+    {
+      (*shift)++;
+      mask >>= 1;
+    }
+
+  while (mask & 0x1)
+    {
+      (*prec)++;
+      mask >>= 1;
+    }
+}
+
 // Create display, and other initialization
 bool wxApp::OnInitGui()
 {
@@ -949,12 +981,106 @@ bool wxApp::OnInitGui()
     delete wxLog::SetActiveTarget(new wxLogStderr);
 
     if (!wxAppBase::OnInitGui())
-    return FALSE;
+        return FALSE;
 
     GetMainColormap( wxApp::GetDisplay() );
 
     m_maxRequestSize = XMaxRequestSize( (Display*) wxApp::GetDisplay() );
 
+    // Get info about the current visual. It is enough
+    // to do this once here unless we support different
+    // visuals, displays and screens. Given that wxX11
+    // mostly for embedded things, that is no real
+    // limitation.
+    Display *xdisplay = (Display*) wxApp::GetDisplay();
+    int xscreen = DefaultScreen(xdisplay);
+    Visual* xvisual = DefaultVisual(xdisplay,xscreen);
+    int xdepth = DefaultDepth(xdisplay, xscreen);
+
+    XVisualInfo vinfo_template;
+    vinfo_template.visual = xvisual;
+    vinfo_template.visualid = XVisualIDFromVisual( xvisual );
+    vinfo_template.depth = xdepth;
+        
+    int nitem = 0;
+    XVisualInfo *vi = XGetVisualInfo( xdisplay, VisualIDMask|VisualDepthMask, &vinfo_template, &nitem );
+    wxASSERT_MSG( vi, wxT("No visual info") );
+    
+    m_visualType = vi->visual->c_class;
+    m_visualScreen = vi->screen;
+    
+    m_visualRedMask = vi->red_mask;
+    m_visualGreenMask = vi->green_mask;
+    m_visualBlueMask = vi->blue_mask;
+    
+    if (m_visualType != GrayScale && m_visualType != PseudoColor)
+    {
+        wxCalcPrecAndShift( m_visualRedMask, &m_visualRedShift, &m_visualRedPrec );
+        wxCalcPrecAndShift( m_visualGreenMask, &m_visualGreenShift, &m_visualGreenPrec );
+        wxCalcPrecAndShift( m_visualBlueMask, &m_visualBlueShift, &m_visualBluePrec );
+    }
+    
+    m_visualDepth = xdepth;
+    if (xdepth == 16)
+        xdepth = m_visualRedPrec + m_visualGreenPrec + m_visualBluePrec;
+        
+    m_visualColormapSize = vi->colormap_size;
+        
+    XFree( vi );
+    
+    if (m_visualDepth > 8)
+        return TRUE;
+    
+    m_visualColormap = new XColor[m_visualColormapSize];
+    XColor* colors = (XColor*) m_visualColormap;
+    
+    for (int i = 0; i < m_visualColormapSize; i++)
+           colors[i].pixel = i;
+
+    XQueryColors( xdisplay, DefaultColormap(xdisplay,xscreen), colors, m_visualColormapSize );
+        
+    m_colorCube = (unsigned char*)malloc(32 * 32 * 32);
+
+    for (int r = 0; r < 32; r++)
+    {
+        for (int g = 0; g < 32; g++)
+        {
+            for (int b = 0; b < 32; b++)
+            {
+                int rr = (r << 3) | (r >> 2);
+                int gg = (g << 3) | (g >> 2);
+                int bb = (b << 3) | (b >> 2);
+
+                int index = -1;
+
+                if (colors)
+                {
+                    int max = 3 * 65536;
+
+                    for (int i = 0; i < m_visualColormapSize; i++)
+                    {
+                        int rdiff = ((rr << 8) - colors[i].red);
+                        int gdiff = ((gg << 8) - colors[i].green);
+                        int bdiff = ((bb << 8) - colors[i].blue);
+                        int sum = ABS (rdiff) + ABS (gdiff) + ABS (bdiff);
+                        if (sum < max)
+                        {
+                            index = i; max = sum;
+                        }
+                    }
+                }
+                else
+                {
+                    // assume 8-bit true or static colors. this really exists
+                    index = (r >> (5 - m_visualRedPrec)) << m_visualRedShift;
+                    index |= (g >> (5 - m_visualGreenPrec)) << m_visualGreenShift;
+                    index |= (b >> (5 - m_visualBluePrec)) << m_visualBlueShift;
+                }
+                m_colorCube[ (r*1024) + (g*32) + b ] = index;
+            }
+        }
+    }
+    
     return TRUE;
 }
 
index 31fd1858f0c766e61d22a855df0eb3cbaf08795f..a365ddf028ff18cfd46e7f8d40af37dcc0a3e348 100644 (file)
@@ -97,11 +97,8 @@ bool wxMask::Create( const wxBitmap& bitmap,
     m_display = bitmap.GetDisplay();
     
     Display *xdisplay = (Display*) m_display;
-
     int xscreen = DefaultScreen( xdisplay );
     Window xroot = RootWindow( xdisplay, xscreen );
-    Visual* xvisual = DefaultVisual( xdisplay, xscreen );
-    int bpp = DefaultDepth( xdisplay, xscreen );
     
     m_bitmap = (WXPixmap) XCreatePixmap( xdisplay, xroot, image.GetWidth(), image.GetHeight(), 1 );
     GC gc = XCreateGC( xdisplay, (Pixmap) m_bitmap, 0, NULL );
@@ -117,18 +114,8 @@ bool wxMask::Create( const wxBitmap& bitmap,
     unsigned char green = colour.Green();
     unsigned char blue = colour.Blue();
 
-    XVisualInfo vinfo_template;
-    XVisualInfo *vi;
-
-    vinfo_template.visual = xvisual;
-    vinfo_template.visualid = XVisualIDFromVisual( xvisual );
-    vinfo_template.depth = bpp;
-    int nitem = 0;
-
-    vi = XGetVisualInfo( xdisplay, VisualIDMask|VisualDepthMask, &vinfo_template, &nitem );
-    wxASSERT_MSG( vi, wxT("No visual info") );
+    int bpp = wxTheApp->m_visualDepth;
     
-    if ((bpp == 16) && (vi->red_mask != 0xf800)) bpp = 15;
     if (bpp == 15)
     {
         red = red & 0xf8;
@@ -540,7 +527,7 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
     Window xroot = RootWindow( xdisplay, xscreen );
     Visual* xvisual = DefaultVisual( xdisplay, xscreen );
     
-    int bpp = DefaultDepth( xdisplay, xscreen );
+    int bpp = wxTheApp->m_visualDepth;
     
     int width = image.GetWidth();
     int height = image.GetHeight();
@@ -590,20 +577,6 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
             SetMask( mask );
         }
 
-        // Retrieve info
-
-        XVisualInfo vinfo_template;
-        XVisualInfo *vi;
-
-        vinfo_template.visual = xvisual;
-        vinfo_template.visualid = XVisualIDFromVisual( xvisual );
-        vinfo_template.depth = bpp;
-        int nitem = 0;
-
-        vi = XGetVisualInfo( xdisplay, VisualIDMask|VisualDepthMask, &vinfo_template, &nitem );
-        wxASSERT_MSG( vi, wxT("No visual info") );
-
-        if ((bpp == 16) && (vi->red_mask != 0xf800)) bpp = 15;
         if (bpp < 8) bpp = 8;
 
         // Render
@@ -613,22 +586,22 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
 
         if (bpp > 8)
         {
-            if ((vi->red_mask > vi->green_mask) && (vi->green_mask > vi->blue_mask))      b_o = RGB;
-            else if ((vi->red_mask > vi->blue_mask) && (vi->blue_mask > vi->green_mask))  b_o = RBG;
-            else if ((vi->blue_mask > vi->red_mask) && (vi->red_mask > vi->green_mask))   b_o = BRG;
-            else if ((vi->blue_mask > vi->green_mask) && (vi->green_mask > vi->red_mask)) b_o = BGR;
-            else if ((vi->green_mask > vi->red_mask) && (vi->red_mask > vi->blue_mask))   b_o = GRB;
-            else if ((vi->green_mask > vi->blue_mask) && (vi->blue_mask > vi->red_mask))  b_o = GBR;
+            if ((wxTheApp->m_visualRedMask > wxTheApp->m_visualGreenMask) && (wxTheApp->m_visualGreenMask > wxTheApp->m_visualBlueMask))      b_o = RGB;
+            else if ((wxTheApp->m_visualRedMask > wxTheApp->m_visualBlueMask) && (wxTheApp->m_visualBlueMask > wxTheApp->m_visualGreenMask))  b_o = RBG;
+            else if ((wxTheApp->m_visualBlueMask > wxTheApp->m_visualRedMask) && (wxTheApp->m_visualRedMask > wxTheApp->m_visualGreenMask))   b_o = BRG;
+            else if ((wxTheApp->m_visualBlueMask > wxTheApp->m_visualGreenMask) && (wxTheApp->m_visualGreenMask > wxTheApp->m_visualRedMask)) b_o = BGR;
+            else if ((wxTheApp->m_visualGreenMask > wxTheApp->m_visualRedMask) && (wxTheApp->m_visualRedMask > wxTheApp->m_visualBlueMask))   b_o = GRB;
+            else if ((wxTheApp->m_visualGreenMask > wxTheApp->m_visualBlueMask) && (wxTheApp->m_visualBlueMask > wxTheApp->m_visualRedMask))  b_o = GBR;
         }
 
-        XFree( vi );
-
         int r_mask = image.GetMaskRed();
         int g_mask = image.GetMaskGreen();
         int b_mask = image.GetMaskBlue();
 
         unsigned char* data = image.GetData();
         wxASSERT_MSG( data, "No image data" );
+        
+        unsigned char *colorCube = wxTheApp->m_colorCube;
 
         bool hasMask = image.HasMask();
 
@@ -657,27 +630,7 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
                     case 8:
                     {
                         int pixel = 0;
-#if 0                        
-                        if (wxTheApp->m_colorCube)
-                        {
-                            pixel = wxTheApp->m_colorCube[ ((r & 0xf8) << 7) + ((g & 0xf8) << 2) + ((b & 0xf8) >> 3) ];
-                        }
-                        else
-                        {
-                            GdkColormap *cmap = gtk_widget_get_default_colormap();
-                            GdkColor *colors = cmap->colors;
-                            int max = 3 * (65536);
-    
-                            for (int i = 0; i < cmap->size; i++)
-                            {
-                                int rdiff = (r << 8) - colors[i].red;
-                                int gdiff = (g << 8) - colors[i].green;
-                                int bdiff = (b << 8) - colors[i].blue;
-                                int sum = ABS (rdiff) + ABS (gdiff) + ABS (bdiff);
-                                if (sum < max) { pixel = i; max = sum; }
-                            }
-                        }
-#endif    
+                        pixel = colorCube[ ((r & 0xf8) << 7) + ((g & 0xf8) << 2) + ((b & 0xf8) >> 3) ];
                         XPutPixel( data_image, x, y, pixel );
                         break;
                     }
@@ -752,10 +705,6 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
 
         GC gc = XCreateGC( xdisplay, (Pixmap) M_BMPDATA->m_pixmap, 0, NULL );
         XPutImage( xdisplay, (Pixmap) M_BMPDATA->m_pixmap, gc, data_image, 0, 0, 0, 0, width, height );
-#ifdef __WXDEBUG__
-       XSync(wxGlobalDisplay(), False);
-#endif
-
         XDestroyImage( data_image );
         XFreeGC( xdisplay, gc );
 
@@ -776,24 +725,6 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
     // wxUSE_NANOX
 }
 
-static void wxCalcPrecAndShift( unsigned long mask, int *shift, int *prec )
-{
-  *shift = 0;
-  *prec = 0;
-
-  while (!(mask & 0x1))
-    {
-      (*shift)++;
-      mask >>= 1;
-    }
-
-  while (mask & 0x1)
-    {
-      (*prec)++;
-      mask >>= 1;
-    }
-}
-
 wxImage wxBitmap::ConvertToImage() const
 {
     wxImage image;
@@ -803,10 +734,7 @@ wxImage wxBitmap::ConvertToImage() const
     Display *xdisplay = (Display*) M_BMPDATA->m_display;
     wxASSERT_MSG( xdisplay, wxT("No display") );
     
-    int xscreen = DefaultScreen( xdisplay );
-    Visual* xvisual = DefaultVisual( xdisplay, xscreen );
-    
-    int bpp = DefaultDepth( xdisplay, xscreen );
+    int bpp = wxTheApp->m_visualDepth;
 
 #if wxUSE_NANOX
     wxGetImageFromDrawable((Pixmap) GetPixmap(), 0, 0, GetWidth(), GetHeight(), image);
@@ -865,48 +793,22 @@ wxImage wxBitmap::ConvertToImage() const
 
     if (GetPixmap())
     {
-        // Retrieve info
-
-        XVisualInfo vinfo_template;
-        XVisualInfo *vi;
-
-        vinfo_template.visual = xvisual;
-        vinfo_template.visualid = XVisualIDFromVisual( xvisual );
-        vinfo_template.depth = bpp;
-        int nitem = 0;
-
-        vi = XGetVisualInfo( xdisplay, VisualIDMask|VisualDepthMask, &vinfo_template, &nitem );
-        wxASSERT_MSG( vi, wxT("No visual info") );
-        
-        int red_prec,green_prec,blue_prec;
-        int red_shift,green_shift,blue_shift;
-        wxCalcPrecAndShift( vi->red_mask, &red_shift, &red_prec );
-        wxCalcPrecAndShift( vi->green_mask, &green_shift, &green_prec );
-        wxCalcPrecAndShift( vi->blue_mask, &blue_shift, &blue_prec );
-        if (bpp == 16) bpp = red_prec + green_prec + blue_prec;
-        
-        red_shift_right = red_shift;
-        red_shift_left = 8-red_prec;
-        green_shift_right = green_shift;
-        green_shift_left = 8-green_prec;
-        blue_shift_right = blue_shift;
-        blue_shift_left = 8-blue_prec;
+        red_shift_right = wxTheApp->m_visualRedShift;
+        red_shift_left = 8-wxTheApp->m_visualRedPrec;
+        green_shift_right = wxTheApp->m_visualGreenShift;
+        green_shift_left = 8-wxTheApp->m_visualGreenPrec;
+        blue_shift_right = wxTheApp->m_visualBlueShift;
+        blue_shift_left = 8-wxTheApp->m_visualBluePrec;
         
-#if 0
-        use_shift = (vi->visual->c_class == TrueColor) || (vi->visual->c_class == DirectColor);
-#else
-        use_shift = TRUE;
-#endif
-        
-        XFree( vi );
+        use_shift = (wxTheApp->m_visualType == GrayScale) || (wxTheApp->m_visualType != PseudoColor);
     }
+    
     if (GetBitmap())
     {
         bpp = 1;
     }
 
-
-//    GdkColormap *cmap = gtk_widget_get_default_colormap();
+    XColor *colors = (XColor*) wxTheApp->m_visualColormap;
 
     int width = GetWidth();
     int height = GetHeight();
@@ -937,14 +839,12 @@ wxImage wxBitmap::ConvertToImage() const
                 data[pos+1] = (pixel >> green_shift_right) << green_shift_left;
                 data[pos+2] = (pixel >> blue_shift_right)  << blue_shift_left;
             }
-#if 0
-            else if (cmap->colors)
+            else if (colors)
             {
-                data[pos] =   cmap->colors[pixel].red   >> 8;
-                data[pos+1] = cmap->colors[pixel].green >> 8;
-                data[pos+2] = cmap->colors[pixel].blue  >> 8;
+                data[pos] =   colors[pixel].red   >> 8;
+                data[pos+1] = colors[pixel].green >> 8;
+                data[pos+2] = colors[pixel].blue  >> 8;
             }
-#endif
             else
             {
                 wxFAIL_MSG( wxT("Image conversion failed. Unknown visual type.") );
index cf8431a8cc19e7dee3d20340a589b9903a6675ed..058c00d84dddbe030d27c67fa3a0fd44f7d1ed6b 100644 (file)
@@ -90,23 +90,21 @@ unsigned short wxColourRefData::colMapAllocCounter[ 256 ] =
 
 void wxColourRefData::FreeColour()
 {
-#if 0        
-    if (m_colormap)
+    if (!m_colormap)
+        return;
+        
+    if ((wxTheApp->m_visualType == GrayScale) ||
+        (wxTheApp->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
 }
 
 void wxColourRefData::AllocColour( WXColormap cmap )
@@ -116,20 +114,18 @@ 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 ((wxTheApp->m_visualType == GrayScale) ||
+        (wxTheApp->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;
     }
     else
-#endif
     {
         m_hasPixel = XAllocColor( wxGlobalDisplay(), (Colormap) cmap, &m_color );
     }
+    
     m_colormap = cmap;
 }