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"
- ], 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
Fix printing of bitmaps
-> No idea.
-
-wxImage
- -> 24-bit support
-------------------- Low priority ---------------------
generic/splitter.cpp \
generic/statusbr.cpp \
generic/tabg.cpp \
- generic/textdlgg.cpp
-
+ generic/textdlgg.cpp
+
LIB_C_SRC=\
common/extended.c \
\
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();
+
+ GdkWindow *parent = (GdkWindow*) &gdk_root_parent;
+
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_bpp = depth;
+ M_BMPDATA->m_bpp = gdk_window_get_visual( parent )->depth;
if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
}
wxBitmap::wxBitmap( char **bits )
{
+ wxCHECK_RET( bits != NULL, "invalid bitmap data" )
+
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)
{
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 (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();
gdk_image_put_pixel( data_image, x, y, pixel );
break;
}
- case 24:
- {
- break;
- }
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;
}
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();
+
+ GdkWindow *parent = (GdkWindow*) &gdk_root_parent;
+
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_bpp = depth;
+ M_BMPDATA->m_bpp = gdk_window_get_visual( parent )->depth;
if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
}
wxBitmap::wxBitmap( char **bits )
{
+ wxCHECK_RET( bits != NULL, "invalid bitmap data" )
+
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)
{
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 (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();
gdk_image_put_pixel( data_image, x, y, pixel );
break;
}
- case 24:
- {
- break;
- }
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;
}