From b75867a61bad7efdce7ab11963a3672ce78a1e35 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Wed, 13 Jan 1999 00:42:44 +0000 Subject: [PATCH] The usual amount of trash over my telephone fixed Horses everywhere git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1390 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- configure | 2 +- configure.in | 2 +- samples/image/image.cpp | 25 ++++- src/common/image.cpp | 203 +++++++++++++++++++++++++++++++++++++++- src/gtk.inc | 1 - src/motif.inc | 34 +------ 6 files changed, 225 insertions(+), 42 deletions(-) diff --git a/configure b/configure index b4490d2518..7c5b786ad3 100755 --- a/configure +++ b/configure @@ -6012,7 +6012,7 @@ for ac_dir in $SEARCH_LIB; GUI_TK_LINK="$CHECK_LINK $GUI_TK_LINK" TOOLKIT=MOTIF TOOLKIT_DEF="__WXMOTIF__ -D__LINUX__ -D__UNIX__" - WX_LINK=-lwx_motif + WX_LINK=-lwx_motif2 MAKEINCLUDE=../motif.inc fi diff --git a/configure.in b/configure.in index 419be3c0b6..836dcafd69 100644 --- a/configure.in +++ b/configure.in @@ -1010,7 +1010,7 @@ if test "$wxUSE_MOTIF" = 1; then GUI_TK_LINK="$CHECK_LINK $GUI_TK_LINK" TOOLKIT=MOTIF TOOLKIT_DEF="__WXMOTIF__ -D__LINUX__ -D__UNIX__" - WX_LINK=-lwx_motif + WX_LINK=-lwx_motif2 MAKEINCLUDE=../motif.inc fi diff --git a/samples/image/image.cpp b/samples/image/image.cpp index d944c5c757..382979d4e2 100644 --- a/samples/image/image.cpp +++ b/samples/image/image.cpp @@ -99,23 +99,32 @@ MyCanvas::MyCanvas( wxWindow *parent, const wxWindowID id, dir = wxString("../"); #endif +//#ifdef __WXMOTIF__ + dir = wxString("../"); +//#endif + +#ifndef __WXMOTIF__ wxImage image( bitmap ); image.SaveFile( dir + wxString("test.png"), wxBITMAP_TYPE_PNG ); - +#else + wxImage image; +#endif + image.LoadFile( dir + wxString("horse.png"), wxBITMAP_TYPE_PNG ); - image.SetRGB( 0, 0, 250, 0, 0 ); - image.SetRGB( 1, 0, 100, 100, 100 ); - image.SetRGB( 2, 0, 250, 250, 250 ); my_horse = new wxBitmap( image.ConvertToBitmap() ); - + +#ifndef __WXMOTIF__ image.LoadFile( dir + wxString("test.png"), wxBITMAP_TYPE_PNG ); my_square = new wxBitmap( image.ConvertToBitmap() ); +#endif } MyCanvas::~MyCanvas() { delete my_horse; +#ifndef __WXMOTIF__ delete my_square; +#endif } void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) @@ -123,6 +132,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) wxPaintDC dc( this ); PrepareDC( dc ); +#ifndef __WXMOTIF__ dc.DrawText( "Loaded image", 30, 100 ); if (my_square->Ok()) dc.DrawBitmap( *my_square, 30, 120 ); @@ -130,7 +140,12 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) dc.SetBrush( wxBrush( "orange", wxSOLID ) ); dc.SetPen( *wxWHITE_PEN ); dc.DrawRectangle( 150, 120, 100, 100 ); +<<<<<<< image.cpp +#endif + +======= +>>>>>>> 1.11 if (my_horse->Ok()) dc.DrawBitmap( *my_horse, 30, 240 ); } diff --git a/src/common/image.cpp b/src/common/image.cpp index ffe9f71cea..414ea15c25 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -28,6 +28,7 @@ #endif #include "wx/filefn.h" #include "wx/wfstream.h" +#include "wx/intl.h" #ifdef __WXMSW__ #include @@ -1584,10 +1585,208 @@ wxImage::wxImage( const wxBitmap &bitmap ) // TODO #ifdef __WXMOTIF__ + +#include +#include "wx/utils.h" + wxBitmap wxImage::ConvertToBitmap() const { - wxFAIL_MSG("Sorry, wxImage::ConvertToBitmap isn't implemented for wxMotif yet."); - return wxNullBitmap; + wxBitmap bitmap; + + wxCHECK_MSG( Ok(), bitmap, "invalid image" ); + + int width = GetWidth(); + int height = GetHeight(); + + bitmap.SetHeight( height ); + bitmap.SetWidth( width ); + + Display *dpy = (Display*) wxGetDisplay(); + Visual* vis = DefaultVisual( dpy, DefaultScreen( dpy ) ); + int bpp = DefaultDepth( dpy, DefaultScreen( dpy ) ); + + // Create image + + XImage *data_image = XCreateImage( dpy, vis, bpp, ZPixmap, 0, 0, width, height, 32, 0 ); + data_image->data = new char[ data_image->bytes_per_line * data_image->height ]; + + bitmap.Create( width, height, bpp ); + +/* + // Create mask + + GdkImage *mask_image = (GdkImage*) NULL; + + if (HasMask()) + { + unsigned char *mask_data = (unsigned char*)malloc( ((width >> 3)+8) * height ); + + mask_image = gdk_image_new_bitmap( gdk_visual_get_system(), mask_data, width, height ); + + wxMask *mask = new wxMask(); + mask->m_bitmap = gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, 1 ); + + bitmap.SetMask( mask ); + } +*/ + +// bitmap.SetDepth( bpp ); + + // Retrieve depth info + + XVisualInfo vinfo_template; + XVisualInfo *vi; + + vinfo_template.visual = vis; + vinfo_template.visualid = XVisualIDFromVisual( vis ); + vinfo_template.depth = bpp; + int nitem = 0; + + vi = XGetVisualInfo( dpy, VisualIDMask|VisualDepthMask, &vinfo_template, &nitem ); + + if (!vi) + { + printf("no visual.\n" ); + return wxNullBitmap; + } + + if ((bpp == 16) && (vi->red_mask != 0xf800)) bpp = 15; + if (bpp < 8) bpp = 8; + + // Render + + enum byte_order { RGB, RBG, BRG, BGR, GRB, GBR }; + byte_order b_o = RGB; + + if (bpp >= 24) + { + 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 = RGB; + 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; + } + +/* + int r_mask = GetMaskRed(); + int g_mask = GetMaskGreen(); + int b_mask = GetMaskBlue(); +*/ + + unsigned char* data = GetData(); + + int index = 0; + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + { + int r = data[index]; + index++; + int g = data[index]; + index++; + int b = data[index]; + index++; + +/* + if (HasMask()) + { + if ((r == r_mask) && (b == b_mask) && (g == g_mask)) + gdk_image_put_pixel( mask_image, x, y, 1 ); + else + gdk_image_put_pixel( mask_image, x, y, 0 ); + } +*/ + + switch (bpp) + { + case 8: + { +/* + int pixel = -1; + 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; } + } + } + + gdk_image_put_pixel( data_image, x, y, pixel ); +*/ + + break; + } + case 15: + { + int pixel = ((r & 0xf8) << 7) | ((g & 0xf8) << 2) | ((b & 0xf8) >> 3); + XPutPixel( data_image, x, y, pixel ); + break; + } + case 16: + { + int pixel = ((r & 0xf8) << 8) | ((g & 0xfc) << 3) | ((b & 0xf8) >> 3); + XPutPixel( data_image, x, y, pixel ); + break; + } + case 32: + case 24: + { + int 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; + } + XPutPixel( data_image, x, y, pixel ); + } + default: break; + } + } // for + } // for + + // Blit picture + + XGCValues gcvalues; + gcvalues.foreground = BlackPixel( dpy, DefaultScreen( dpy ) ); + GC gc = XCreateGC( dpy, RootWindow ( dpy, DefaultScreen(dpy) ), GCForeground, &gcvalues ); + XPutImage( dpy, (Drawable)bitmap.GetPixmap(), gc, data_image, 0, 0, 0, 0, width, height ); + + XDestroyImage( data_image ); + XFreeGC( dpy, gc ); + +/* + // Blit mask + + if (HasMask()) + { + GdkGC *mask_gc = gdk_gc_new( bitmap.GetMask()->GetBitmap() ); + + gdk_draw_image( bitmap.GetMask()->GetBitmap(), mask_gc, mask_image, 0, 0, 0, 0, width, height ); + + gdk_image_destroy( mask_image ); + gdk_gc_unref( mask_gc ); + } +*/ + + return bitmap; } wxImage::wxImage( const wxBitmap &bitmap ) diff --git a/src/gtk.inc b/src/gtk.inc index 07acc7f521..8984fd7809 100644 --- a/src/gtk.inc +++ b/src/gtk.inc @@ -8,7 +8,6 @@ LIB_MINOR=1 # define library sources - LIB_CPP_SRC=\ \ common/cmndata.cpp \ diff --git a/src/motif.inc b/src/motif.inc index 7230b8c036..b5dc556831 100644 --- a/src/motif.inc +++ b/src/motif.inc @@ -24,6 +24,7 @@ LIB_CPP_SRC=\ common/gdicmn.cpp \ common/hash.cpp \ common/helpbase.cpp \ + common/image.cpp \ common/intl.cpp \ common/ipcbase.cpp \ common/layout.cpp \ @@ -156,35 +157,4 @@ LIB_C_SRC=\ \ motif/xmcombo/xmcombo.c \ \ - common/extended.c \ -\ - png/png.c \ - png/pngset.c \ - png/pngget.c \ - png/pngrutil.c \ - png/pngtrans.c \ - png/pngwutil.c \ - png/pngread.c \ - png/pngrio.c \ - png/pngwio.c \ - png/pngwrite.c \ - png/pngrtran.c \ - png/pngwtran.c \ - png/pngmem.c \ - png/pngerror.c \ - png/pngpread.c \ -\ - zlib/adler32.c \ - zlib/compress.c \ - zlib/crc32.c \ - zlib/gzio.c \ - zlib/uncompr.c \ - zlib/deflate.c \ - zlib/trees.c \ - zlib/zutil.c \ - zlib/inflate.c \ - zlib/infblock.c \ - zlib/inftrees.c \ - zlib/infcodes.c \ - zlib/infutil.c \ - zlib/inffast.c \ + common/extended.c \ No newline at end of file -- 2.47.2