]> git.saurik.com Git - wxWidgets.git/commitdiff
24-bit rendering from wxImage into wxBitmap
authorRobert Roebling <robert@roebling.de>
Thu, 29 Oct 1998 22:57:46 +0000 (22:57 +0000)
committerRobert Roebling <robert@roebling.de>
Thu, 29 Oct 1998 22:57:46 +0000 (22:57 +0000)
 I think requiring GTK 1.0.4 is enough (not 1.0.6)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@935 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

configure.in
docs/gtk/todo.txt
src/gtk.inc
src/gtk/bitmap.cpp
src/gtk1/bitmap.cpp

index 21ba45a90ecf0b5f38520486e05da5bf8c82a8f4..5146813a4ecec295dd2e0f9f39ff01a93dee92a6 100644 (file)
@@ -1000,10 +1000,10 @@ GUI_TK_LINK=
 MAKEINCLUDE=
 
 if test "$wxUSE_GTK" = 1; then
 MAKEINCLUDE=
 
 if test "$wxUSE_GTK" = 1; then
-  AM_PATH_GTK(1.0.6, [
+  AM_PATH_GTK(1.0.4, [
        GUI_TK_INCLUDE="$GTK_CFLAGS"
        GUI_TK_LIBRARY="$GTK_LIBS"
        GUI_TK_INCLUDE="$GTK_CFLAGS"
        GUI_TK_LIBRARY="$GTK_LIBS"
-  ], AC_MSG_ERROR(Is gtk-config in path and GTK+ is version 1.0.6?))
+  ], AC_MSG_ERROR(Is gtk-config in path and GTK+ is version 1.0.4?))
   TOOLKIT=GTK
   TOOLKIT_DEF=__WXGTK__
   MAKEINCLUDE=../gtk.inc
   TOOLKIT=GTK
   TOOLKIT_DEF=__WXGTK__
   MAKEINCLUDE=../gtk.inc
index 998a2c254e6cfa45ae6bda97ae8f6c8022d4126b..4065f62bc2b57759c711562cb31ece6d207e70ed 100644 (file)
@@ -15,9 +15,6 @@ wxHelpController
   
 Fix printing of bitmaps
   -> No idea.
   
 Fix printing of bitmaps
   -> No idea.
-
-wxImage
-  -> 24-bit support
   
 -------------------- Low priority ---------------------
     
   
 -------------------- Low priority ---------------------
     
index 9aa61d874d031cc7796972921f6110d9f65e3631..194ced95cdf80c6afc39727bfc6730a47b0055f2 100644 (file)
@@ -129,8 +129,8 @@ LIB_CPP_SRC=\
  generic/splitter.cpp \
  generic/statusbr.cpp \
  generic/tabg.cpp \
  generic/splitter.cpp \
  generic/statusbr.cpp \
  generic/tabg.cpp \
- generic/textdlgg.cpp 
+ generic/textdlgg.cpp
+  
 LIB_C_SRC=\
  common/extended.c \
 \
 LIB_C_SRC=\
  common/extended.c \
 \
index 4706c2e7d7457c5b2ba7df30138ed0658c09e6f1..acd2e490fa085cdccb6610e245899aac33313871 100644 (file)
@@ -101,25 +101,32 @@ wxBitmap::wxBitmap(void)
   
 wxBitmap::wxBitmap( int width, int height, int depth )
 {
   
 wxBitmap::wxBitmap( int width, int height, int depth )
 {
+  wxCHECK_RET( (width > 0) && (height > 0), "invalid bitmap size" )
+  wxCHECK_RET( (depth > 0) || (depth == -1), "invalid bitmap depth" )
+
   m_refData = new wxBitmapRefData();
   m_refData = new wxBitmapRefData();
+  
+  GdkWindow *parent = (GdkWindow*) &gdk_root_parent;
+  
   M_BMPDATA->m_mask = (wxMask *) NULL;
   M_BMPDATA->m_mask = (wxMask *) NULL;
-  M_BMPDATA->m_pixmap = 
-    gdk_pixmap_new( (GdkWindow*) &gdk_root_parent, width, height, depth );
+  M_BMPDATA->m_pixmap = gdk_pixmap_new( parent, width, height, depth );
   M_BMPDATA->m_width = width;
   M_BMPDATA->m_height = height;
   M_BMPDATA->m_width = width;
   M_BMPDATA->m_height = height;
-  M_BMPDATA->m_bpp = depth;
+  M_BMPDATA->m_bpp = gdk_window_get_visual( parent )->depth;
    
   if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
 }
 
 wxBitmap::wxBitmap( char **bits )
 {
    
   if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
 }
 
 wxBitmap::wxBitmap( char **bits )
 {
+  wxCHECK_RET( bits != NULL, "invalid bitmap data" )
+  
   m_refData = new wxBitmapRefData();
 
   m_refData = new wxBitmapRefData();
 
-  GdkBitmap *mask = NULL;
+  GdkBitmap *mask = (GdkBitmap*) NULL;
+  GdkWindow *parent = (GdkWindow*) &gdk_root_parent;
   
   
-  M_BMPDATA->m_pixmap = 
-    gdk_pixmap_create_from_xpm_d( (GdkWindow*) &gdk_root_parent, &mask, NULL, (gchar **) bits );
+  M_BMPDATA->m_pixmap = gdk_pixmap_create_from_xpm_d( parent, &mask, NULL, (gchar **) bits );
     
   if (mask)
   {
     
   if (mask)
   {
@@ -129,7 +136,7 @@ wxBitmap::wxBitmap( char **bits )
   
   gdk_window_get_size( M_BMPDATA->m_pixmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) );
   
   
   gdk_window_get_size( M_BMPDATA->m_pixmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) );
   
-  M_BMPDATA->m_bpp = 24; // ?
+  M_BMPDATA->m_bpp = gdk_window_get_visual( parent )->depth;  // ?
    
   if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
 }
    
   if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
 }
@@ -374,6 +381,20 @@ wxBitmap::wxBitmap( const wxImage &image )
   if (M_BMPDATA->m_bpp > 8) render_depth = M_BMPDATA->m_bpp;
   
   // Render
   if (M_BMPDATA->m_bpp > 8) render_depth = M_BMPDATA->m_bpp;
   
   // Render
+
+  enum byte_order { RGB, RBG, BRG, BGR, GRB, GBR };
+  byte_order b_o;
+  
+  if (render_depth >= 24)
+  {
+    GdkVisual *visual = gdk_visual_get_system();
+    if ((visual->red_mask > visual->green_mask) && (visual->green_mask > visual->blue_mask))      b_o = RGB;
+    else if ((visual->red_mask > visual->blue_mask) && (visual->blue_mask > visual->green_mask))  b_o = RGB;
+    else if ((visual->blue_mask > visual->red_mask) && (visual->red_mask > visual->green_mask))   b_o = BRG;
+    else if ((visual->blue_mask > visual->green_mask) && (visual->green_mask > visual->red_mask)) b_o = BGR;
+    else if ((visual->green_mask > visual->red_mask) && (visual->red_mask > visual->blue_mask))   b_o = GRB;
+    else if ((visual->green_mask > visual->blue_mask) && (visual->blue_mask > visual->red_mask))  b_o = GBR;
+  }
   
   int r_mask = image.GetMaskRed();
   int g_mask = image.GetMaskGreen();
   
   int r_mask = image.GetMaskRed();
   int g_mask = image.GetMaskGreen();
@@ -434,13 +455,20 @@ wxBitmap::wxBitmap( const wxImage &image )
            gdk_image_put_pixel( data_image, x, y, pixel );
            break;
          }
            gdk_image_put_pixel( data_image, x, y, pixel );
            break;
          }
-         case 24:
-         {
-           break;
-         }
          case 32:
          case 32:
+         case 24:
          {
          {
-           break;
+           guint32 pixel = 0;
+           switch (b_o)
+           {
+             case RGB: pixel = (r << 16) | (g << 8) | b; break;
+             case RBG: pixel = (r << 16) | (b << 8) | g; break;
+             case BRG: pixel = (b << 16) | (r << 8) | g; break;
+             case BGR: pixel = (b << 16) | (g << 8) | r; break;
+             case GRB: pixel = (g << 16) | (r << 8) | b; break;
+             case GBR: pixel = (g << 16) | (b << 8) | r; break;
+           }
+           gdk_image_put_pixel( data_image, x, y, pixel );
          }
          default: break;
        }
          }
          default: break;
        }
index 4706c2e7d7457c5b2ba7df30138ed0658c09e6f1..acd2e490fa085cdccb6610e245899aac33313871 100644 (file)
@@ -101,25 +101,32 @@ wxBitmap::wxBitmap(void)
   
 wxBitmap::wxBitmap( int width, int height, int depth )
 {
   
 wxBitmap::wxBitmap( int width, int height, int depth )
 {
+  wxCHECK_RET( (width > 0) && (height > 0), "invalid bitmap size" )
+  wxCHECK_RET( (depth > 0) || (depth == -1), "invalid bitmap depth" )
+
   m_refData = new wxBitmapRefData();
   m_refData = new wxBitmapRefData();
+  
+  GdkWindow *parent = (GdkWindow*) &gdk_root_parent;
+  
   M_BMPDATA->m_mask = (wxMask *) NULL;
   M_BMPDATA->m_mask = (wxMask *) NULL;
-  M_BMPDATA->m_pixmap = 
-    gdk_pixmap_new( (GdkWindow*) &gdk_root_parent, width, height, depth );
+  M_BMPDATA->m_pixmap = gdk_pixmap_new( parent, width, height, depth );
   M_BMPDATA->m_width = width;
   M_BMPDATA->m_height = height;
   M_BMPDATA->m_width = width;
   M_BMPDATA->m_height = height;
-  M_BMPDATA->m_bpp = depth;
+  M_BMPDATA->m_bpp = gdk_window_get_visual( parent )->depth;
    
   if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
 }
 
 wxBitmap::wxBitmap( char **bits )
 {
    
   if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
 }
 
 wxBitmap::wxBitmap( char **bits )
 {
+  wxCHECK_RET( bits != NULL, "invalid bitmap data" )
+  
   m_refData = new wxBitmapRefData();
 
   m_refData = new wxBitmapRefData();
 
-  GdkBitmap *mask = NULL;
+  GdkBitmap *mask = (GdkBitmap*) NULL;
+  GdkWindow *parent = (GdkWindow*) &gdk_root_parent;
   
   
-  M_BMPDATA->m_pixmap = 
-    gdk_pixmap_create_from_xpm_d( (GdkWindow*) &gdk_root_parent, &mask, NULL, (gchar **) bits );
+  M_BMPDATA->m_pixmap = gdk_pixmap_create_from_xpm_d( parent, &mask, NULL, (gchar **) bits );
     
   if (mask)
   {
     
   if (mask)
   {
@@ -129,7 +136,7 @@ wxBitmap::wxBitmap( char **bits )
   
   gdk_window_get_size( M_BMPDATA->m_pixmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) );
   
   
   gdk_window_get_size( M_BMPDATA->m_pixmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) );
   
-  M_BMPDATA->m_bpp = 24; // ?
+  M_BMPDATA->m_bpp = gdk_window_get_visual( parent )->depth;  // ?
    
   if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
 }
    
   if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
 }
@@ -374,6 +381,20 @@ wxBitmap::wxBitmap( const wxImage &image )
   if (M_BMPDATA->m_bpp > 8) render_depth = M_BMPDATA->m_bpp;
   
   // Render
   if (M_BMPDATA->m_bpp > 8) render_depth = M_BMPDATA->m_bpp;
   
   // Render
+
+  enum byte_order { RGB, RBG, BRG, BGR, GRB, GBR };
+  byte_order b_o;
+  
+  if (render_depth >= 24)
+  {
+    GdkVisual *visual = gdk_visual_get_system();
+    if ((visual->red_mask > visual->green_mask) && (visual->green_mask > visual->blue_mask))      b_o = RGB;
+    else if ((visual->red_mask > visual->blue_mask) && (visual->blue_mask > visual->green_mask))  b_o = RGB;
+    else if ((visual->blue_mask > visual->red_mask) && (visual->red_mask > visual->green_mask))   b_o = BRG;
+    else if ((visual->blue_mask > visual->green_mask) && (visual->green_mask > visual->red_mask)) b_o = BGR;
+    else if ((visual->green_mask > visual->red_mask) && (visual->red_mask > visual->blue_mask))   b_o = GRB;
+    else if ((visual->green_mask > visual->blue_mask) && (visual->blue_mask > visual->red_mask))  b_o = GBR;
+  }
   
   int r_mask = image.GetMaskRed();
   int g_mask = image.GetMaskGreen();
   
   int r_mask = image.GetMaskRed();
   int g_mask = image.GetMaskGreen();
@@ -434,13 +455,20 @@ wxBitmap::wxBitmap( const wxImage &image )
            gdk_image_put_pixel( data_image, x, y, pixel );
            break;
          }
            gdk_image_put_pixel( data_image, x, y, pixel );
            break;
          }
-         case 24:
-         {
-           break;
-         }
          case 32:
          case 32:
+         case 24:
          {
          {
-           break;
+           guint32 pixel = 0;
+           switch (b_o)
+           {
+             case RGB: pixel = (r << 16) | (g << 8) | b; break;
+             case RBG: pixel = (r << 16) | (b << 8) | g; break;
+             case BRG: pixel = (b << 16) | (r << 8) | g; break;
+             case BGR: pixel = (b << 16) | (g << 8) | r; break;
+             case GRB: pixel = (g << 16) | (r << 8) | b; break;
+             case GBR: pixel = (g << 16) | (b << 8) | r; break;
+           }
+           gdk_image_put_pixel( data_image, x, y, pixel );
          }
          default: break;
        }
          }
          default: break;
        }