From aae0472bf3086707216125e4caa8650caeeeaf97 Mon Sep 17 00:00:00 2001 From: Mattia Barbon Date: Wed, 9 Apr 2003 16:44:27 +0000 Subject: [PATCH] Use the wxBitmap implementation from wxX11 in wxMotif; solves various bugs related to wxMask handling (and effectively adds a lot of wxMask functionality previously missing). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@20101 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- distrib/msw/tmake/filelist.txt | 6 +- include/wx/bitmap.h | 2 +- include/wx/motif/private.h | 11 +- samples/controls/controls.cpp | 2 +- src/motif/bitmap.cpp | 1445 -------------------------------- src/motif/bmpbuttn.cpp | 6 +- src/motif/bmpmotif.cpp | 4 +- src/motif/dcclient.cpp | 26 +- src/motif/dcmemory.cpp | 2 +- src/motif/descrip.mms | 3 - src/motif/files.lst | 6 +- src/motif/frame.cpp | 6 +- src/motif/statbmp.cpp | 2 +- src/motif/toolbar.cpp | 8 +- src/motif/utils.cpp | 27 + src/x11/descrip.mms | 10 +- 16 files changed, 80 insertions(+), 1486 deletions(-) delete mode 100644 src/motif/bitmap.cpp diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt index 53b07a1994..a0f30e9fa2 100644 --- a/distrib/msw/tmake/filelist.txt +++ b/distrib/msw/tmake/filelist.txt @@ -616,7 +616,6 @@ window.mm Cocoa gsockmot.c Motif Socket accel.cpp Motif app.cpp Motif -bitmap.cpp Motif bmpbuttn.cpp Motif bmpmotif.cpp Motif button.cpp Motif @@ -672,7 +671,7 @@ window.cpp Motif gsockx11.c X11 Socket nanox.c X11 app.cpp X11 -bitmap.cpp X11 +bitmap.cpp X11 Motif brush.cpp X11 Motif clipbrd.cpp X11 colour.cpp X11 @@ -1236,7 +1235,6 @@ window.h CocoaH accel.h MotifH app.h MotifH -bitmap.h MotifH bmpbuttn.h MotifH bmpmotif.h MotifH button.h MotifH @@ -1291,7 +1289,7 @@ toplevel.h MotifH window.h MotifH app.h X11H -bitmap.h X11H +bitmap.h X11H Motif brush.h X11H Motif clipbrd.h X11H colour.h X11H diff --git a/include/wx/bitmap.h b/include/wx/bitmap.h index 348574746c..78f51feb4f 100644 --- a/include/wx/bitmap.h +++ b/include/wx/bitmap.h @@ -167,7 +167,7 @@ protected: #if defined(__WXMSW__) #include "wx/msw/bitmap.h" #elif defined(__WXMOTIF__) -#include "wx/motif/bitmap.h" +#include "wx/x11/bitmap.h" #elif defined(__WXGTK__) #include "wx/gtk/bitmap.h" #elif defined(__WXX11__) diff --git a/include/wx/motif/private.h b/include/wx/motif/private.h index 2f6270776c..601172e600 100644 --- a/include/wx/motif/private.h +++ b/include/wx/motif/private.h @@ -18,6 +18,8 @@ class WXDLLEXPORT wxFont; class WXDLLEXPORT wxWindow; class WXDLLEXPORT wxSize; +class WXDLLEXPORT wxBitmap; +class WXDLLEXPORT wxColour; #include "wx/x11/privx.h" @@ -57,6 +59,13 @@ extern void wxDeleteWindowFromTable(Widget w); extern wxWindow *wxGetWindowFromTable(Widget w); extern bool wxAddWindowToTable(Widget w, wxWindow *win); +// ---------------------------------------------------------------------------- +// wxBitmap related functions +// ---------------------------------------------------------------------------- + +// Creates a bitmap with transparent areas drawn in the given colour. +wxBitmap wxCreateMaskedBitmap(const wxBitmap& bitmap, wxColour& colour); + // ---------------------------------------------------------------------------- // key events related functions // ---------------------------------------------------------------------------- @@ -95,7 +104,7 @@ extern XColor itemColors[5] ; #define wxBOTS_INDEX 4 // ---------------------------------------------------------------------------- -// utility classes +// XmString/wxString conversion utilities // ---------------------------------------------------------------------------- wxString wxXmStringToString( const XmString& xmString ); diff --git a/samples/controls/controls.cpp b/samples/controls/controls.cpp index 1fd8a2a504..0d8ecf7f94 100644 --- a/samples/controls/controls.cpp +++ b/samples/controls/controls.cpp @@ -812,7 +812,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) (void)new wxBitmapButton(panel, ID_BITMAP_BTN, bitmap, wxPoint(100, 20)); -#ifdef __WXMSW__ +#if defined(__WXMSW__) || defined(__WXMOTIF__) // test for masked bitmap display bitmap = wxBitmap(_T("test2.bmp"), wxBITMAP_TYPE_BMP); if (bitmap.Ok()) diff --git a/src/motif/bitmap.cpp b/src/motif/bitmap.cpp deleted file mode 100644 index 21a9b7ae91..0000000000 --- a/src/motif/bitmap.cpp +++ /dev/null @@ -1,1445 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: bitmap.cpp -// Purpose: wxBitmap -// Author: Julian Smart -// Modified by: -// Created: 17/09/98 -// RCS-ID: $Id$ -// Copyright: (c) Julian Smart -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ -#pragma implementation "bitmap.h" -#endif - -#ifdef __VMS -#define XtParent XTPARENT -#endif - -#include "wx/defs.h" -#include "wx/utils.h" -#include "wx/palette.h" -#include "wx/bitmap.h" -#include "wx/icon.h" -#include "wx/log.h" -#include "wx/dcmemory.h" -#include "wx/image.h" -#include "wx/app.h" - -#if 0 -#ifdef __VMS__ -#pragma message disable nosimpint -#endif -#include -#ifdef __VMS__ -#pragma message enable nosimpint -#endif -#endif - -#include -#include - -#if wxHAVE_LIB_XPM - #include -#endif -#include - - -IMPLEMENT_DYNAMIC_CLASS(wxBitmap, wxGDIObject) -IMPLEMENT_DYNAMIC_CLASS(wxMask, wxObject) - -wxBitmapRefData::wxBitmapRefData() -{ - m_ok = FALSE; - m_width = 0; - m_height = 0; - m_depth = 0; - // XXX m_quality = 0; - // m_numColors = 0; - m_bitmapMask = NULL; - - m_pixmap = (WXPixmap) 0; - m_display = (WXDisplay*) 0; - - // m_freePixmap = TRUE; //TODO: necessary? -#if 0 - m_freeColors = (unsigned long*) 0; - m_freeColorsCount = 0; -#endif - - // These 5 variables are for wxControl -#if 0 - m_insensPixmap = (WXPixmap) 0; - m_labelPixmap = (WXPixmap) 0; - m_armPixmap = (WXPixmap) 0; -#endif -#if 0 - m_image = (WXImage*) 0; - m_insensImage = (WXImage*) 0; -#endif -} - -wxBitmapRefData::~wxBitmapRefData() -{ -#if 0 - if (m_labelPixmap) - XmDestroyPixmap (DefaultScreenOfDisplay ((Display*) m_display), (Pixmap) m_labelPixmap); - - if (m_armPixmap) - XmDestroyPixmap (DefaultScreenOfDisplay ((Display*) m_display), (Pixmap) m_armPixmap); - - if (m_insensPixmap) - XmDestroyPixmap (DefaultScreenOfDisplay ((Display*) m_display), (Pixmap) m_insensPixmap); -#endif - -#if 0 - if (m_image) - { - XmUninstallImage ((XImage*) m_image); - XtFree ((char *) (XImage*) m_image); - } -#endif - -#if 0 - if (m_insensImage) - { - XmUninstallImage ((XImage*) m_insensImage); - delete[] ((XImage*) m_insensImage)->data; - XtFree ((char *) (XImage*) m_insensImage); - } -#endif - if (m_pixmap /* && m_freePixmap */) - XFreePixmap ((Display*) m_display, (Pixmap) m_pixmap); - -#if 0 - if (m_freeColors) - { - int screen = DefaultScreen((Display*) m_display); - Colormap cmp = DefaultColormap((Display*) m_display,screen); - long llp; - for(llp = 0;llp < m_freeColorsCount;llp++) - XFreeColors((Display*) m_display, cmp, &m_freeColors[llp], 1, 0L); - delete m_freeColors; - }; -#endif - - if (m_bitmapMask) - delete m_bitmapMask; - m_bitmapMask = NULL; -} - -#define M_BMPDATA ((wxBitmapRefData *)m_refData) - -wxBitmap::wxBitmap() -{ - m_refData = NULL; -} - -wxBitmap::~wxBitmap() -{ -} - -wxBitmap::wxBitmap(const char bits[], int width, int height, int depth) -{ - m_refData = new wxBitmapRefData; - - (void) Create((void*) bits, wxBITMAP_TYPE_XBM_DATA, width, height, depth); -} - -wxBitmap::wxBitmap(int w, int h, int d) -{ - (void)Create(w, h, d); -} - -wxBitmap::wxBitmap(void *data, wxBitmapType type, - int width, int height, int depth) -{ - (void) Create(data, type, width, height, depth); -} - -wxBitmap::wxBitmap(const wxString& filename, wxBitmapType type) -{ - LoadFile(filename, type); -} - -#if 0 -// Create from XPM data -static wxControl* sg_Control = NULL; -wxBitmap::wxBitmap(char **data, wxControl* control) -{ - // Pass the control to the Create function using a global - sg_Control = control; - - (void) Create((void *)data, wxBITMAP_TYPE_XPM_DATA, 0, 0, 0); - - sg_Control = (wxControl*) NULL; -} -#endif - -bool wxBitmap::CreateFromXpm(const char **bits) -{ - wxCHECK_MSG( bits, FALSE, _T("NULL pointer in wxBitmap::CreateFromXpm") ); - - return Create(bits, wxBITMAP_TYPE_XPM_DATA, 0, 0, 0); -} - -bool wxBitmap::CopyFromIcon(const wxIcon& icon) -{ - *this = icon; - return TRUE; -} - -bool wxBitmap::Create(int w, int h, int d) -{ - UnRef(); - - m_refData = new wxBitmapRefData; - - if (d < 1) - d = wxDisplayDepth(); - - M_BITMAPDATA->m_width = w; - M_BITMAPDATA->m_height = h; - M_BITMAPDATA->m_depth = d; - // M_BITMAPDATA->m_freePixmap = TRUE; - - Display *dpy = (Display*) wxGetDisplay(); - - M_BITMAPDATA->m_display = dpy; /* MATTHEW: [4] Remember the display */ - - M_BITMAPDATA->m_pixmap = (WXPixmap) XCreatePixmap (dpy, RootWindow (dpy, DefaultScreen (dpy)), - w, h, d); - - M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_pixmap != (WXPixmap) 0) ; - return M_BITMAPDATA->m_ok; -} - -bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type) -{ - UnRef(); - - m_refData = new wxBitmapRefData; - - wxBitmapHandler *handler = FindHandler(type); - - if ( handler == NULL ) { - wxImage image; - if (!image.LoadFile( filename, type )) return FALSE; - if (image.Ok()) - { - *this = wxBitmap(image); - return TRUE; - } - else return FALSE; - } - - return handler->LoadFile(this, filename, type, -1, -1); -} - -bool wxBitmap::Create(void *data, wxBitmapType type, - int width, int height, int depth) -{ - UnRef(); - - m_refData = new wxBitmapRefData; - - wxBitmapHandler *handler = FindHandler(type); - - if ( handler == NULL ) { - wxLogWarning("no data bitmap handler for type %ld defined.", - (long)type); - - return FALSE; - } - - return handler->Create(this, data, type, width, height, depth); -} - -bool wxBitmap::SaveFile(const wxString& filename, wxBitmapType type, - const wxPalette *palette) const -{ - wxBitmapHandler *handler = FindHandler(type); - - if ( handler == NULL ) { // try wxImage - wxImage image = this->ConvertToImage(); - if (image.Ok()) return image.SaveFile( filename, type ); - else return FALSE; - } - - return handler->SaveFile(this, filename, type, palette); -} - -void wxBitmap::SetWidth(int w) -{ - if (!M_BITMAPDATA) - m_refData = new wxBitmapRefData; - - M_BITMAPDATA->m_width = w; -} - -void wxBitmap::SetHeight(int h) -{ - if (!M_BITMAPDATA) - m_refData = new wxBitmapRefData; - - M_BITMAPDATA->m_height = h; -} - -void wxBitmap::SetDepth(int d) -{ - if (!M_BITMAPDATA) - m_refData = new wxBitmapRefData; - - M_BITMAPDATA->m_depth = d; -} - -#if 0 - -// XXX -void wxBitmap::SetQuality(int q) -{ - if (!M_BITMAPDATA) - m_refData = new wxBitmapRefData; - - M_BITMAPDATA->m_quality = q; -} - -#endif - -void wxBitmap::SetOk(bool isOk) -{ - if (!M_BITMAPDATA) - m_refData = new wxBitmapRefData; - - M_BITMAPDATA->m_ok = isOk; -} - -void wxBitmap::SetPalette(const wxPalette& palette) -{ - if (!M_BITMAPDATA) - m_refData = new wxBitmapRefData; - - M_BITMAPDATA->m_bitmapPalette = palette ; -} - -void wxBitmap::SetMask(wxMask *mask) -{ - if (!M_BITMAPDATA) - m_refData = new wxBitmapRefData; - - M_BITMAPDATA->m_bitmapMask = mask ; -} - -wxBitmap wxBitmap::GetSubBitmap( const wxRect& rect) const -{ - wxCHECK_MSG( Ok() && - (rect.x >= 0) && (rect.y >= 0) && - (rect.x+rect.width <= M_BMPDATA->m_width) && (rect.y+rect.height <= M_BMPDATA->m_height), - wxNullBitmap, wxT("invalid bitmap or bitmap region") ); - - wxBitmap ret( rect.width, rect.height, 0 ); - wxASSERT_MSG( ret.Ok(), wxT("GetSubBitmap error") ); - - // The remaining still TODO - return ret; -} - -/* -* wxMask -*/ - -wxMask::wxMask() -{ - m_pixmap = (WXPixmap) 0; -} - -// Construct a mask from a bitmap and a colour indicating -// the transparent area -wxMask::wxMask(const wxBitmap& bitmap, const wxColour& colour) -{ - m_pixmap = (WXPixmap) 0; - - Create(bitmap, colour); -} - -// Construct a mask from a bitmap and a palette index indicating -// the transparent area -wxMask::wxMask(const wxBitmap& bitmap, int paletteIndex) -{ - m_pixmap = (WXPixmap) 0; - - Create(bitmap, paletteIndex); -} - -// Construct a mask from a mono bitmap (copies the bitmap). -wxMask::wxMask(const wxBitmap& bitmap) -{ - m_pixmap = (WXPixmap) 0; - - Create(bitmap); -} - -wxMask::~wxMask() -{ - // TODO: this may be the wrong display - if ( m_pixmap ) - XFreePixmap ((Display*) wxGetDisplay(), (Pixmap) m_pixmap); -} - -// Create a mask from a mono bitmap (copies the bitmap). -bool wxMask::Create(const wxBitmap& WXUNUSED(bitmap)) -{ - // TODO - return FALSE; -} - -// Create a mask from a bitmap and a palette index indicating -// the transparent area -bool wxMask::Create(const wxBitmap& WXUNUSED(bitmap), int WXUNUSED(paletteIndex)) -{ - // TODO - return FALSE; -} - -// Create a mask from a bitmap and a colour indicating -// the transparent area -bool wxMask::Create(const wxBitmap& WXUNUSED(bitmap), const wxColour& WXUNUSED(colour)) -{ - // TODO - return FALSE; -} - -/* -* wxBitmapHandler -*/ - -IMPLEMENT_DYNAMIC_CLASS(wxBitmapHandler, wxObject) - -/* -* Standard handlers -*/ - -class WXDLLEXPORT wxXBMFileHandler: public wxBitmapHandler -{ - DECLARE_DYNAMIC_CLASS(wxXBMFileHandler) -public: - inline wxXBMFileHandler() - { - m_name = "XBM file"; - m_extension = "xbm"; - m_type = wxBITMAP_TYPE_XBM; - }; - - virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags, - int desiredWidth, int desiredHeight); -}; - -IMPLEMENT_DYNAMIC_CLASS(wxXBMFileHandler, wxBitmapHandler) - -bool wxXBMFileHandler::LoadFile(wxBitmap *bitmap, const wxString& name, - long WXUNUSED(flags), - int WXUNUSED(desiredWidth), - int WXUNUSED(desiredHeight)) -{ - // M_BITMAPHANDLERDATA->m_freePixmap = TRUE; - if (!bitmap->GetRefData()) - bitmap->SetRefData( new wxBitmapRefData() ); - - int hotX, hotY; - unsigned int w, h; - Pixmap pixmap; - - Display *dpy = (Display*) wxGetDisplay(); - M_BITMAPDATA->m_display = (WXDisplay*) dpy; - - int value = XReadBitmapFile (dpy, RootWindow (dpy, DefaultScreen (dpy)), - wxConstCast(name.c_str(), char), &w, &h, &pixmap, &hotX, &hotY); - M_BITMAPHANDLERDATA->m_width = w; - M_BITMAPHANDLERDATA->m_height = h; - M_BITMAPHANDLERDATA->m_depth = 1; - M_BITMAPHANDLERDATA->m_pixmap = (WXPixmap) pixmap; - - if ((value == BitmapFileInvalid) || - (value == BitmapOpenFailed) || - (value == BitmapNoMemory)) - { - M_BITMAPHANDLERDATA->m_ok = FALSE; - M_BITMAPHANDLERDATA->m_pixmap = (WXPixmap) 0; - } - else - M_BITMAPHANDLERDATA->m_ok = TRUE; - - return M_BITMAPHANDLERDATA->m_ok ; -} - -class WXDLLEXPORT wxXBMDataHandler: public wxBitmapHandler -{ - DECLARE_DYNAMIC_CLASS(wxXBMDataHandler) -public: - inline wxXBMDataHandler() - { - m_name = "XBM data"; - m_extension = "xbm"; - m_type = wxBITMAP_TYPE_XBM_DATA; - }; - - virtual bool Create(wxBitmap *bitmap, void *data, long flags, - int width, int height, int depth = 1); -}; -IMPLEMENT_DYNAMIC_CLASS(wxXBMDataHandler, wxBitmapHandler) - -bool wxXBMDataHandler::Create( wxBitmap *bitmap, void *data, - long WXUNUSED(flags), - int width, int height, int WXUNUSED(depth)) -{ - if (!bitmap->GetRefData()) - bitmap->SetRefData( new wxBitmapRefData() ); - - M_BITMAPHANDLERDATA->m_width = width; - M_BITMAPHANDLERDATA->m_height = height; - M_BITMAPHANDLERDATA->m_depth = 1; - // M_BITMAPHANDLERDATA->m_freePixmap = TRUE; - - Display *dpy = (Display*) wxGetDisplay(); - M_BITMAPHANDLERDATA->m_display = (WXDisplay*) dpy; - - M_BITMAPHANDLERDATA->m_pixmap = (WXPixmap) XCreateBitmapFromData (dpy, RootWindow (dpy, DefaultScreen (dpy)), (char*) data, width, height); - M_BITMAPHANDLERDATA->m_ok = (M_BITMAPHANDLERDATA->m_pixmap != (WXPixmap) 0) ; - -#if 0 - // code for wxControl. TODO: can we avoid doing this until we need it? - // E.g. have CreateButtonPixmaps which is called on demand. - XImage* image = (XImage *) XtMalloc (sizeof (XImage)); - image->width = width; - image->height = height; - image->data = (char*) data; - image->depth = 1; - image->xoffset = 0; - image->format = XYBitmap; - image->byte_order = LSBFirst; - image->bitmap_unit = 8; - image->bitmap_bit_order = LSBFirst; - image->bitmap_pad = 8; - image->bytes_per_line = (width + 7) >> 3; - - char tmp[128]; - sprintf (tmp, "Im%x", (unsigned int) image); - XmInstallImage (image, tmp); - - // Build our manually stipped pixmap. - - int bpl = (width + 7) / 8; - char *data1 = new char[height * bpl]; - char* bits = (char*) data; - int i; - for (i = 0; i < height; i++) - { - int mask = i % 2 ? 0x55 : 0xaa; - int j; - for (j = 0; j < bpl; j++) - data1[i * bpl + j] = bits[i * bpl + j] & mask; - } - XImage* insensImage = (XImage *) XtMalloc (sizeof (XImage)); - insensImage->width = width; - insensImage->height = height; - insensImage->data = data1; - insensImage->depth = 1; - insensImage->xoffset = 0; - insensImage->format = XYBitmap; - insensImage->byte_order = LSBFirst; - insensImage->bitmap_unit = 8; - insensImage->bitmap_bit_order = LSBFirst; - insensImage->bitmap_pad = 8; - insensImage->bytes_per_line = bpl; - - sprintf (tmp, "Not%x", (unsigned int)insensImage); - XmInstallImage (insensImage, tmp); - - M_BITMAPHANDLERDATA->m_image = (WXImage*) image; - M_BITMAPHANDLERDATA->m_insensImage = (WXImage*) insensImage; -#endif - - - - return TRUE; -} - -#if wxHAVE_LIB_XPM -class WXDLLEXPORT wxXPMFileHandler: public wxBitmapHandler -{ - DECLARE_DYNAMIC_CLASS(wxXPMFileHandler) -public: - inline wxXPMFileHandler() - { - m_name = "XPM file"; - m_extension = "xpm"; - m_type = wxBITMAP_TYPE_XPM; - }; - - virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags, - int desiredWidth, int desiredHeight); - virtual bool SaveFile(const wxBitmap *bitmap, const wxString& name, - wxBitmapType type, const wxPalette *palette = NULL); -}; - -IMPLEMENT_DYNAMIC_CLASS(wxXPMFileHandler, wxBitmapHandler) - -bool wxXPMFileHandler::LoadFile( wxBitmap *bitmap, const wxString& name, - long WXUNUSED(flags), - int WXUNUSED(desiredWidth), - int WXUNUSED(desiredHeight) ) -{ - if (!bitmap->GetRefData()) - bitmap->SetRefData( new wxBitmapRefData() ); - - Display *dpy = (Display*) wxGetDisplay(); - M_BITMAPHANDLERDATA->m_display = (WXDisplay*) dpy; - - XpmAttributes xpmAttr; - Pixmap pixmap; - Pixmap mask = 0; - - M_BITMAPHANDLERDATA->m_ok = FALSE; - xpmAttr.valuemask = XpmReturnInfos | XpmCloseness; - xpmAttr.closeness = 40000; - int errorStatus = XpmReadFileToPixmap(dpy, - RootWindow(dpy, DefaultScreen(dpy)), - wxConstCast(name.c_str(), char), - &pixmap, &mask, &xpmAttr); - - if (errorStatus == XpmSuccess) - { - M_BITMAPHANDLERDATA->m_pixmap = (WXPixmap) pixmap; - if ( mask ) - { - M_BITMAPHANDLERDATA->m_bitmapMask = new wxMask; - M_BITMAPHANDLERDATA->m_bitmapMask->SetPixmap((WXPixmap) mask); - } - - unsigned int depthRet; - int xRet, yRet; - unsigned int widthRet, heightRet, borderWidthRet; - Window rootWindowRet; - XGetGeometry(dpy, pixmap, &rootWindowRet, &xRet, &yRet, - &widthRet, &heightRet, &borderWidthRet, &depthRet); - - M_BITMAPHANDLERDATA->m_width = xpmAttr.width; - M_BITMAPHANDLERDATA->m_height = xpmAttr.height; - - /* - if ( xpmAttr.npixels > 2 ) - { - M_BITMAPHANDLERDATA->m_depth = 8; // TODO: next time not just a guess :-) ... - } else - { - M_BITMAPHANDLERDATA->m_depth = 1; // mono - } - */ - - M_BITMAPHANDLERDATA->m_depth = depthRet; - - // M_BITMAPHANDLERDATA->m_numColors = xpmAttr.npixels; - - XpmFreeAttributes(&xpmAttr); - - M_BITMAPHANDLERDATA->m_ok = TRUE; - return TRUE; - } else - { - // XpmDebugError(errorStatus, name); - M_BITMAPHANDLERDATA->m_ok = FALSE; - return FALSE; - } -} - -bool wxXPMFileHandler::SaveFile( const wxBitmap *bitmap, const wxString& name, - wxBitmapType WXUNUSED(type), - const wxPalette *WXUNUSED(palette)) -{ - if (M_BITMAPHANDLERDATA->m_ok && M_BITMAPHANDLERDATA->m_pixmap) - { - Display *dpy = (Display*) M_BITMAPHANDLERDATA->m_display; - int errorStatus = XpmWriteFileFromPixmap(dpy, - wxConstCast(name.c_str(), char), - (Pixmap) M_BITMAPHANDLERDATA->m_pixmap, - (M_BITMAPHANDLERDATA->m_bitmapMask ? (Pixmap) M_BITMAPHANDLERDATA->m_bitmapMask->GetPixmap() : (Pixmap) 0), - (XpmAttributes *) NULL); - if (errorStatus == XpmSuccess) - return TRUE; - else - return FALSE; - } - else - return FALSE; -} - -class WXDLLEXPORT wxXPMDataHandler: public wxBitmapHandler -{ - DECLARE_DYNAMIC_CLASS(wxXPMDataHandler) -public: - inline wxXPMDataHandler() - { - m_name = "XPM data"; - m_extension = "xpm"; - m_type = wxBITMAP_TYPE_XPM_DATA; - }; - - virtual bool Create(wxBitmap *bitmap, void *data, long flags, - int width, int height, int depth = 1); -}; -IMPLEMENT_DYNAMIC_CLASS(wxXPMDataHandler, wxBitmapHandler) - -bool wxXPMDataHandler::Create( wxBitmap *bitmap, void *data, - long WXUNUSED(flags), - int width, int height, int WXUNUSED(depth)) -{ - if (!bitmap->GetRefData()) - bitmap->SetRefData( new wxBitmapRefData() ); - - M_BITMAPHANDLERDATA->m_width = width; - M_BITMAPHANDLERDATA->m_height = height; - M_BITMAPHANDLERDATA->m_depth = 1; - // M_BITMAPHANDLERDATA->m_freePixmap = TRUE; - - Display *dpy = (Display*) wxGetDisplay(); - M_BITMAPHANDLERDATA->m_display = (WXDisplay*) dpy; - - XpmAttributes xpmAttr; - - xpmAttr.valuemask = XpmReturnInfos; /* nothing yet, but get infos back */ - -#if 0 - XpmColorSymbol symbolicColors[4]; - if (sg_Control && sg_Control->GetMainWidget()) - { - symbolicColors[0].name = "foreground"; - symbolicColors[0].value = NULL; - symbolicColors[1].name = "background"; - symbolicColors[1].value = NULL; - XtVaGetValues((Widget) sg_Control->GetMainWidget(), - XmNforeground, &symbolicColors[0].pixel, - XmNbackground, &symbolicColors[1].pixel,NULL); - xpmAttr.numsymbols = 2; - xpmAttr.colorsymbols = symbolicColors; - xpmAttr.valuemask |= XpmColorSymbols; // add flag - } -#endif - - Pixmap pixmap = 0; - Pixmap mask = 0; - int ErrorStatus = XpmCreatePixmapFromData(dpy, RootWindow(dpy, DefaultScreen(dpy)), - (char**) data, &pixmap, &mask, &xpmAttr); - if (ErrorStatus == XpmSuccess) - { - // Set attributes - M_BITMAPHANDLERDATA->m_width = xpmAttr.width; - M_BITMAPHANDLERDATA->m_height = xpmAttr.height; - - unsigned int depthRet; - int xRet, yRet; - unsigned int widthRet, heightRet, borderWidthRet; - Window rootWindowRet; - XGetGeometry(dpy, pixmap, &rootWindowRet, &xRet, &yRet, - &widthRet, &heightRet, &borderWidthRet, &depthRet); - - /* - if ( xpmAttr.npixels > 2 ) - { - M_BITMAPHANDLERDATA->m_depth = 8; // next time not just a guess :-) ... - } else - { - M_BITMAPHANDLERDATA->m_depth = 1; // mono - } - */ - - M_BITMAPHANDLERDATA->m_depth = depthRet; - - // M_BITMAPHANDLERDATA->m_numColors = xpmAttr.npixels; - XpmFreeAttributes(&xpmAttr); - M_BITMAPHANDLERDATA->m_ok = TRUE; - M_BITMAPHANDLERDATA->m_pixmap = (WXPixmap) pixmap; - if ( mask ) - { - M_BITMAPHANDLERDATA->m_bitmapMask = new wxMask; - M_BITMAPHANDLERDATA->m_bitmapMask->SetPixmap((WXPixmap) mask); - } - } - else - { - // XpmDebugError(ErrorStatus, NULL); - M_BITMAPHANDLERDATA->m_ok = FALSE; - } - return M_BITMAPHANDLERDATA->m_ok ; -} - -#endif // wxHAVE_LIB_XPM - -void wxBitmap::InitStandardHandlers() -{ - // Initialize all standard bitmap or derived class handlers here. - AddHandler(new wxXBMFileHandler); - AddHandler(new wxXBMDataHandler); - - // XPM is considered standard for Motif, although it can be omitted if - // libXpm is not installed -#if wxHAVE_LIB_XPM - AddHandler(new wxXPMFileHandler); - AddHandler(new wxXPMDataHandler); -#endif // wxHAVE_LIB_XPM -} - -#if 0 -WXPixmap wxBitmap::GetLabelPixmap (WXWidget w) -{ - if (!M_BITMAPDATA) - return (WXPixmap)NULL; - // if (M_BITMAPDATA->m_image == (WXPixmap) 0) - return M_BITMAPDATA->m_pixmap; - -#if 0 - Display *dpy = (Display*) M_BITMAPDATA->m_display; - -#ifdef FOO - /* - If we do: - if (labelPixmap) return labelPixmap; - things can be wrong, because colors can have been changed. - - If we do: - if (labelPixmap) - XmDestroyPixmap(DefaultScreenOfDisplay(dpy),labelPixmap) ; - we got BadDrawable if the pixmap is referenced by multiples widgets - - this is a catch22!! - - So, before doing thing really clean, I just do nothing; if the pixmap is - referenced by many widgets, Motif performs caching functions. - And if pixmap is referenced with multiples colors, we just have some - memory leaks... I hope we can deal with them... - */ - // Must be destroyed, because colours can have been changed! - if (M_BITMAPDATA->m_labelPixmap) - XmDestroyPixmap (DefaultScreenOfDisplay (dpy), M_BITMAPDATA->m_labelPixmap); -#endif - - char tmp[128]; - sprintf (tmp, "Im%x", (unsigned int) M_BITMAPDATA->m_image); - - Pixel fg, bg; - Widget widget = (Widget) w; - - while (XmIsGadget ( widget )) - widget = XtParent (widget); - XtVaGetValues (widget, XmNbackground, &bg, XmNforeground, &fg, NULL); - - M_BITMAPDATA->m_labelPixmap = (WXPixmap) XmGetPixmap (DefaultScreenOfDisplay (dpy), tmp, fg, bg); - - return M_BITMAPDATA->m_labelPixmap; -#endif -} - -WXPixmap wxBitmap::GetArmPixmap (WXWidget w) -{ - // if (M_BITMAPDATA->m_image == (WXPixmap) 0) - return M_BITMAPDATA->m_pixmap; - -#if 0 - Display *dpy = (Display*) M_BITMAPDATA->m_display; -#ifdef FOO - // See GetLabelPixmap () comment - - // Must be destroyed, because colours can have been changed! - if (M_BITMAPDATA->m_armPixmap) - XmDestroyPixmap (DefaultScreenOfDisplay (dpy), M_BITMAPDATA->m_armPixmap); -#endif - - char tmp[128]; - sprintf (tmp, "Im%x", (unsigned int) M_BITMAPDATA->m_image); - - Pixel fg, bg; - Widget widget = (Widget) w; - - XtVaGetValues (widget, XmNarmColor, &bg, NULL); - while (XmIsGadget (widget)) - widget = XtParent (widget); - XtVaGetValues (widget, XmNforeground, &fg, NULL); - - M_BITMAPDATA->m_armPixmap = (WXPixmap) XmGetPixmap (DefaultScreenOfDisplay (dpy), tmp, fg, bg); - - return M_BITMAPDATA->m_armPixmap; -#endif -} - -WXPixmap wxBitmap::GetInsensPixmap (WXWidget w) -{ - Display *dpy = (Display*) M_BITMAPDATA->m_display; - - if (!M_BITMAPDATA) - return (WXPixmap)NULL; - if (M_BITMAPDATA->m_insensPixmap) - return M_BITMAPDATA->m_insensPixmap; - - if (!w) - { - M_BITMAPDATA->m_insensPixmap = (WXPixmap) XCreateInsensitivePixmap(dpy, (Pixmap) M_BITMAPDATA->m_pixmap); - if (M_BITMAPDATA->m_insensPixmap) - return M_BITMAPDATA->m_insensPixmap; - else - return M_BITMAPDATA->m_pixmap; - } - - // if (M_BITMAPDATA->m_insensImage == (WXPixmap) 0) - return M_BITMAPDATA->m_pixmap; - -#if 0 -#ifdef FOO - See GetLabelPixmap () comment - // Must be destroyed, because colours can have been changed! - if (M_BITMAPDATA->m_insensPixmap) - XmDestroyPixmap (DefaultScreenOfDisplay (dpy), (Pixmap) M_BITMAPDATA->m_insensPixmap); -#endif - - char tmp[128]; - sprintf (tmp, "Not%x", (unsigned int) M_BITMAPDATA->m_insensImage); - - Pixel fg, bg; - Widget widget = (Widget) w; - - while (XmIsGadget (widget)) - widget = XtParent (widget); - XtVaGetValues (widget, XmNbackground, &bg, XmNforeground, &fg, NULL); - - M_BITMAPDATA->m_insensPixmap = (WXPixmap) XmGetPixmap (DefaultScreenOfDisplay (dpy), tmp, fg, bg); - - return M_BITMAPDATA->m_insensPixmap; -#endif -} -#endif - -// Creates a bitmap with transparent areas drawn in -// the given colour. -wxBitmap wxCreateMaskedBitmap(const wxBitmap& bitmap, wxColour& colour) -{ - wxBitmap newBitmap(bitmap.GetWidth(), - bitmap.GetHeight(), - bitmap.GetDepth()); - wxMemoryDC destDC; - wxMemoryDC srcDC; - srcDC.SelectObject(bitmap); - destDC.SelectObject(newBitmap); - - wxBrush brush(colour, wxSOLID); - destDC.SetOptimization(FALSE); - destDC.SetBackground(brush); - destDC.Clear(); - destDC.Blit(0, 0, bitmap.GetWidth(), bitmap.GetHeight(), & srcDC, 0, 0, wxCOPY, TRUE); - - return newBitmap; -} - - - - -//----------------------------------------------------------------------------- -// wxImage conversion routines -//----------------------------------------------------------------------------- - -/* - -Date: Wed, 05 Jan 2000 11:45:40 +0100 -From: Frits Boel -To: julian.smart@ukonline.co.uk -Subject: Patch for Motif ConvertToBitmap - -Hi Julian, - -I've been working on a wxWin application for image processing. From the -beginning, I was surprised by the (lack of) speed of ConvertToBitmap, -till I looked in the source code of image.cpp. I saw that converting a -wxImage to a bitmap with 8-bit pixels is done with comparing every pixel -to the 256 colors of the palet. A very time-consuming piece of code! - -Because I wanted a faster application, I've made a 'patch' for this. In -short: every pixel of the image is compared to a sorted list with -colors. If the color is found in the list, the palette entry is -returned; if the color is not found, the color palette is searched and -then the palette entry is returned and the color added to the sorted -list. - -Maybe there is another method for this, namely changing the palette -itself (if the colors are known, as is the case with tiffs with a -colormap). I did not look at this, maybe someone else did? - -The code of the patch is attached, have a look on it, and maybe you will -ship it with the next release of wxMotif? - -Regards, - -Frits Boel -Software engineer at Hubrecht Laboratory, The Netherlands. - -*/ - -class wxSearchColor -{ -public: - wxSearchColor( void ); - wxSearchColor( int size, XColor *colors ); - ~wxSearchColor( void ); - - int SearchColor( int r, int g, int b ); -private: - int AddColor( unsigned int value, int pos ); - - int size; - XColor *colors; - unsigned int *color; - int *entry; - - int bottom; - int top; -}; - -wxSearchColor::wxSearchColor( void ) -{ - size = 0; - colors = (XColor*) NULL; - color = (unsigned int *) NULL; - entry = (int*) NULL; - - bottom = 0; - top = 0; -} - -wxSearchColor::wxSearchColor( int size_, XColor *colors_ ) -{ - int i; - size = size_; - colors = colors_; - color = new unsigned int[size]; - entry = new int [size]; - - for (i = 0; i < size; i++ ) { - entry[i] = -1; - } - - bottom = top = ( size >> 1 ); -} - -wxSearchColor::~wxSearchColor( void ) -{ - if ( color ) delete[] color; - if ( entry ) delete[] entry; -} - -int wxSearchColor::SearchColor( int r, int g, int b ) -{ - unsigned int value = ( ( ( r * 256 ) + g ) * 256 ) + b; - int begin = bottom; - int end = top; - int middle = 0; - - while ( begin <= end ) { - - middle = ( begin + end ) >> 1; - - if ( value == color[middle] ) { - return( entry[middle] ); - } else if ( value < color[middle] ) { - end = middle - 1; - } else { - begin = middle + 1; - } - - } - - return AddColor( value, middle ); -} - -int wxSearchColor::AddColor( unsigned int value, int pos ) -{ - int i; - int pixel = -1; - int max = 3 * (65536); - for ( i = 0; i < 256; i++ ) { - int rdiff = ((value >> 8) & 0xFF00 ) - colors[i].red; - int gdiff = ((value ) & 0xFF00 ) - colors[i].green; - int bdiff = ((value << 8) & 0xFF00 ) - colors[i].blue; - int sum = abs (rdiff) + abs (gdiff) + abs (bdiff); - if (sum < max) { pixel = i; max = sum; } - } - - if ( entry[pos] < 0 ) { - color[pos] = value; - entry[pos] = pixel; - } else if ( value < color[pos] ) { - - if ( bottom > 0 ) { - for ( i = bottom; i < pos; i++ ) { - color[i-1] = color[i]; - entry[i-1] = entry[i]; - } - bottom--; - color[pos-1] = value; - entry[pos-1] = pixel; - } else if ( top < size-1 ) { - for ( i = top; i >= pos; i-- ) { - color[i+1] = color[i]; - entry[i+1] = entry[i]; - } - top++; - color[pos] = value; - entry[pos] = pixel; - } - - } else { - - if ( top < size-1 ) { - for ( i = top; i > pos; i-- ) { - color[i+1] = color[i]; - entry[i+1] = entry[i]; - } - top++; - color[pos+1] = value; - entry[pos+1] = pixel; - } else if ( bottom > 0 ) { - for ( i = bottom; i < pos; i++ ) { - color[i-1] = color[i]; - entry[i-1] = entry[i]; - } - bottom--; - color[pos] = value; - entry[pos] = pixel; - } - - } - - return( pixel ); -} - - -bool wxBitmap::CreateFromImage( const wxImage& image, int depth ) -{ - wxCHECK_MSG( image.Ok(), FALSE, wxT("invalid image") ) - wxCHECK_MSG( depth == -1, FALSE, wxT("invalid bitmap depth") ) - - m_refData = new wxBitmapRefData(); - - int width = image.GetWidth(); - int height = image.GetHeight(); - - SetHeight( height ); - 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 = (char*) malloc( data_image->bytes_per_line * data_image->height ); - - Create( width, height, bpp ); - - // Create mask - - XImage *mask_image = (XImage*) NULL; - if (image.HasMask()) - { - mask_image = XCreateImage( dpy, vis, 1, ZPixmap, 0, 0, width, height, 32, 0 ); - mask_image->data = (char*) malloc( mask_image->bytes_per_line * mask_image->height ); - } - - // 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 ); - - wxCHECK_MSG( vi, FALSE, wxT("no visual") ); - - 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; - } - - XFree( vi ); - - int r_mask = image.GetMaskRed(); - int g_mask = image.GetMaskGreen(); - int b_mask = image.GetMaskBlue(); - - XColor colors[256]; - if (bpp == 8) - { - Colormap cmap = (Colormap) wxTheApp->GetMainColormap( dpy ); - - for (int i = 0; i < 256; i++) colors[i].pixel = i; - XQueryColors( dpy, cmap, colors, 256 ); - } - - wxSearchColor scolor( 256, colors ); - unsigned char* data = image.GetData(); - - bool hasMask = image.HasMask(); - - 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)) - XPutPixel( mask_image, x, y, 0 ); - else - XPutPixel( mask_image, x, y, 1 ); - } - - switch (bpp) - { - case 8: - { -#if 0 // Old, slower code - int pixel = -1; - /* - if (wxTheApp->m_colorCube) - { - pixel = wxTheApp->m_colorCube - [ ((r & 0xf8) << 7) + ((g & 0xf8) << 2) + ((b & 0xf8) >> 3) ]; - } - else - { - */ - int max = 3 * (65536); - for (int i = 0; i < 256; 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 - - // And this is all to get the 'right' color... - int pixel = scolor.SearchColor( r, g, b ); - XPutPixel( 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)GetPixmap(), gc, data_image, 0, 0, 0, 0, width, height ); - - XDestroyImage( data_image ); - XFreeGC( dpy, gc ); - - // Blit mask - if (image.HasMask()) - { - wxBitmap maskBitmap(width, height, 1); - - GC gcMask = XCreateGC( dpy, (Pixmap) maskBitmap.GetPixmap(), (XtGCMask) 0, (XGCValues*)NULL ); - XPutImage( dpy, (Drawable)maskBitmap.GetPixmap(), gcMask, mask_image, 0, 0, 0, 0, width, height ); - - XDestroyImage( mask_image ); - XFreeGC( dpy, gcMask ); - - wxMask* mask = new wxMask; - mask->SetPixmap(maskBitmap.GetPixmap()); - - SetMask(mask); - - maskBitmap.SetPixmapNull(); - } - - - return TRUE; -} - -wxImage wxBitmap::ConvertToImage() const -{ - wxImage image; - - wxCHECK_MSG( Ok(), wxNullImage, wxT("invalid bitmap") ); - - Display *dpy = (Display*) wxGetDisplay(); - Visual* vis = DefaultVisual( dpy, DefaultScreen( dpy ) ); - int bpp = DefaultDepth( dpy, DefaultScreen( dpy ) ); - - XImage *ximage = XGetImage( dpy, - (Drawable)GetPixmap(), - 0, 0, - GetWidth(), GetHeight(), - AllPlanes, ZPixmap ); - - wxCHECK_MSG( ximage, wxNullImage, wxT("couldn't create image") ); - - image.Create( GetWidth(), GetHeight() ); - char unsigned *data = image.GetData(); - - if (!data) - { - XDestroyImage( ximage ); - wxFAIL_MSG( wxT("couldn't create image") ); - return wxNullImage; - } - - /* - GdkImage *gdk_image_mask = (GdkImage*) NULL; - if (GetMask()) - { - gdk_image_mask = gdk_image_get( GetMask()->GetBitmap(), - 0, 0, - GetWidth(), GetHeight() ); - - image.SetMaskColour( 16, 16, 16 ); // anything unlikely and dividable - } - */ - - // 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 ); - - wxCHECK_MSG( vi, wxNullImage, wxT("no visual") ); - - if ((bpp == 16) && (vi->red_mask != 0xf800)) bpp = 15; - - XFree( vi ); - - XColor colors[256]; - if (bpp == 8) - { - Colormap cmap = (Colormap)wxTheApp->GetMainColormap( dpy ); - - for (int i = 0; i < 256; i++) colors[i].pixel = i; - XQueryColors( dpy, cmap, colors, 256 ); - } - - long pos = 0; - for (int j = 0; j < GetHeight(); j++) - { - for (int i = 0; i < GetWidth(); i++) - { - int pixel = XGetPixel( ximage, i, j ); - if (bpp <= 8) - { - data[pos] = colors[pixel].red >> 8; - data[pos+1] = colors[pixel].green >> 8; - data[pos+2] = colors[pixel].blue >> 8; - } else if (bpp == 15) - { - data[pos] = (pixel >> 7) & 0xf8; - data[pos+1] = (pixel >> 2) & 0xf8; - data[pos+2] = (pixel << 3) & 0xf8; - } else if (bpp == 16) - { - data[pos] = (pixel >> 8) & 0xf8; - data[pos+1] = (pixel >> 3) & 0xfc; - data[pos+2] = (pixel << 3) & 0xf8; - } else - { - data[pos] = (pixel >> 16) & 0xff; - data[pos+1] = (pixel >> 8) & 0xff; - data[pos+2] = pixel & 0xff; - } - - /* - if (gdk_image_mask) - { - int mask_pixel = gdk_image_get_pixel( gdk_image_mask, i, j ); - if (mask_pixel == 0) - { - data[pos] = 16; - data[pos+1] = 16; - data[pos+2] = 16; - } - } - */ - - pos += 3; - } - } - - XDestroyImage( ximage ); - /* - if (gdk_image_mask) gdk_image_destroy( gdk_image_mask ); - */ - - return image; -} diff --git a/src/motif/bmpbuttn.cpp b/src/motif/bmpbuttn.cpp index d252d26a56..aede52c9b0 100644 --- a/src/motif/bmpbuttn.cpp +++ b/src/motif/bmpbuttn.cpp @@ -177,7 +177,7 @@ void wxBitmapButton::DoSetBitmap() m_bmpNormal = newBitmap; m_bitmapCache.SetBitmap( m_bmpNormal ); - pixmap = (Pixmap) m_bmpNormal.GetPixmap(); + pixmap = (Pixmap) m_bmpNormal.GetDrawable(); } else { @@ -201,7 +201,7 @@ void wxBitmapButton::DoSetBitmap() wxCreateMaskedBitmap(m_bmpDisabledOriginal, col); m_bmpDisabled = newBitmap; - insensPixmap = (Pixmap) m_bmpDisabled.GetPixmap(); + insensPixmap = (Pixmap) m_bmpDisabled.GetDrawable(); } else insensPixmap = (Pixmap) m_bitmapCache.GetInsensPixmap(m_mainWidget); @@ -226,7 +226,7 @@ void wxBitmapButton::DoSetBitmap() wxCreateMaskedBitmap(m_bmpSelectedOriginal, col); m_bmpSelected = newBitmap; - armPixmap = (Pixmap) m_bmpSelected.GetPixmap(); + armPixmap = (Pixmap) m_bmpSelected.GetDrawable(); } else armPixmap = (Pixmap) m_bitmapCache.GetArmPixmap(m_mainWidget); diff --git a/src/motif/bmpmotif.cpp b/src/motif/bmpmotif.cpp index c0b958ab78..2e800542f2 100644 --- a/src/motif/bmpmotif.cpp +++ b/src/motif/bmpmotif.cpp @@ -99,7 +99,7 @@ void wxBitmapCache::CreateImageIfNeeded( WXWidget w ) (WXDisplay*)wxGetDisplay(); XImage *ximage = XGetImage( (Display*)m_display, - (Drawable)m_bitmap.GetPixmap(), + (Drawable)m_bitmap.GetDrawable(), 0, 0, m_bitmap.GetWidth(), m_bitmap.GetHeight(), AllPlanes, ZPixmap ); @@ -197,7 +197,7 @@ WXPixmap wxBitmapCache::GetInsensPixmap( WXWidget w ) m_insensPixmap = (WXPixmap)XCreateInsensitivePixmap( (Display*)m_display, - (Pixmap)m_bitmap.GetPixmap() ); + (Pixmap)m_bitmap.GetDrawable() ); m_recalcPixmaps.insens = !m_insensPixmap; return m_insensPixmap; diff --git a/src/motif/dcclient.cpp b/src/motif/dcclient.cpp index de005e664d..3459154e7f 100644 --- a/src/motif/dcclient.cpp +++ b/src/motif/dcclient.cpp @@ -826,7 +826,7 @@ void wxWindowDC::DoDrawIcon( const wxIcon &icon, wxCoord x, wxCoord y) SetPen (m_pen); int width, height; - Pixmap iconPixmap = (Pixmap) icon.GetPixmap(); + Pixmap iconPixmap = (Pixmap) icon.GetDrawable(); width = icon.GetWidth(); height = icon.GetHeight(); if (icon.GetDisplay() == m_display) @@ -941,7 +941,7 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord he wxImage image = bitmap.ConvertToImage(); if (!image.Ok()) { - sourcePixmap = (Pixmap) bitmap.GetPixmap(); + sourcePixmap = (Pixmap) bitmap.GetDrawable(); } else { @@ -950,7 +950,7 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord he image = image.Scale(scaledW, scaledH); scaledBitmap = new wxBitmap(image); - sourcePixmap = (Pixmap) scaledBitmap->GetPixmap(); + sourcePixmap = (Pixmap) scaledBitmap->GetDrawable(); } } else @@ -982,9 +982,9 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord he { wxMemoryDC *memDC = (wxMemoryDC *)source; wxBitmap& sel = memDC->GetBitmap(); - if ( sel.Ok() && sel.GetMask() && sel.GetMask()->GetPixmap() ) + if ( sel.Ok() && sel.GetMask() && sel.GetMask()->GetBitmap() ) { - XSetClipMask ((Display*) m_display, (GC) m_gc, (Pixmap) sel.GetMask()->GetPixmap()); + XSetClipMask ((Display*) m_display, (GC) m_gc, (Pixmap) sel.GetMask()->GetBitmap()); XSetClipOrigin ((Display*) m_display, (GC) m_gc, XLOG2DEV (xdest), YLOG2DEV (ydest)); } } @@ -1033,9 +1033,9 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord he { wxMemoryDC *memDC = (wxMemoryDC *)source; wxBitmap& sel = memDC->GetBitmap(); - if ( sel.Ok() && sel.GetMask() && sel.GetMask()->GetPixmap() ) + if ( sel.Ok() && sel.GetMask() && sel.GetMask()->GetBitmap() ) { - XSetClipMask ((Display*) m_display, (GC) m_gc, (Pixmap) sel.GetMask()->GetPixmap()); + XSetClipMask ((Display*) m_display, (GC) m_gc, (Pixmap) sel.GetMask()->GetBitmap()); XSetClipOrigin ((Display*) m_display, (GC) m_gc, XLOG2DEV (xdest), YLOG2DEV (ydest)); } } @@ -1843,10 +1843,10 @@ void wxWindowDC::SetPen( const wxPen &pen ) else if (m_currentStipple.Ok() && ((m_currentStipple != oldStipple) || !GetOptimization())) { - XSetStipple ((Display*) m_display, (GC) m_gc, (Pixmap) m_currentStipple.GetPixmap()); + XSetStipple ((Display*) m_display, (GC) m_gc, (Pixmap) m_currentStipple.GetDrawable()); if (m_window && m_window->GetBackingPixmap()) - XSetStipple ((Display*) m_display,(GC) m_gcBacking, (Pixmap) m_currentStipple.GetPixmap()); + XSetStipple ((Display*) m_display,(GC) m_gcBacking, (Pixmap) m_currentStipple.GetDrawable()); } if ((m_currentFill != oldFill) || !GetOptimization()) @@ -2017,18 +2017,18 @@ void wxWindowDC::SetBrush( const wxBrush &brush ) if (m_currentStipple.GetDepth() == 1) { XSetStipple ((Display*) m_display, (GC) m_gc, - (Pixmap) m_currentStipple.GetPixmap()); + (Pixmap) m_currentStipple.GetDrawable()); if (m_window && m_window->GetBackingPixmap()) XSetStipple ((Display*) m_display,(GC) m_gcBacking, - (Pixmap) m_currentStipple.GetPixmap()); + (Pixmap) m_currentStipple.GetDrawable()); } else { XSetTile ((Display*) m_display, (GC) m_gc, - (Pixmap) m_currentStipple.GetPixmap()); + (Pixmap) m_currentStipple.GetDrawable()); if (m_window && m_window->GetBackingPixmap()) XSetTile ((Display*) m_display,(GC) m_gcBacking, - (Pixmap) m_currentStipple.GetPixmap()); + (Pixmap) m_currentStipple.GetDrawable()); } } diff --git a/src/motif/dcmemory.cpp b/src/motif/dcmemory.cpp index 8ac24c411e..451576cf5e 100644 --- a/src/motif/dcmemory.cpp +++ b/src/motif/dcmemory.cpp @@ -105,7 +105,7 @@ void wxMemoryDC::SelectObject( const wxBitmap& bitmap ) if (m_bitmap.Ok() && (bitmap.GetDisplay() == m_display)) { - m_pixmap = m_bitmap.GetPixmap(); + m_pixmap = m_bitmap.GetDrawable(); Display* display = (Display*) m_display; XGCValues gcvalues; diff --git a/src/motif/descrip.mms b/src/motif/descrip.mms index 59040acf44..9db3a5c247 100644 --- a/src/motif/descrip.mms +++ b/src/motif/descrip.mms @@ -27,7 +27,6 @@ OBJECTS = \ xmcombo.obj,\ accel.obj,\ app.obj,\ - bitmap.obj,\ bmpbuttn.obj,\ bmpmotif.obj,\ button.obj,\ @@ -83,7 +82,6 @@ OBJECTS = \ SOURCES = \ accel.cpp,\ app.cpp,\ - bitmap.cpp,\ bmpbuttn.cpp,\ bmpmotif.cpp, button.cpp,\ @@ -148,7 +146,6 @@ xmcombo.obj : [.xmcombo]xmcombo.c accel.obj : accel.cpp app.obj : app.cpp -bitmap.obj : bitmap.cpp bmpbuttn.obj : bmpbuttn.cpp bmpmotif.obj : bmpmotif.cpp button.obj : button.cpp diff --git a/src/motif/files.lst b/src/motif/files.lst index 10a3a6674d..b762acfad2 100644 --- a/src/motif/files.lst +++ b/src/motif/files.lst @@ -178,7 +178,6 @@ ALL_SOURCES = \ common/zstream.cpp \ motif/accel.cpp \ motif/app.cpp \ - motif/bitmap.cpp \ motif/bmpbuttn.cpp \ motif/bmpmotif.cpp \ motif/button.cpp \ @@ -231,6 +230,7 @@ ALL_SOURCES = \ motif/toplevel.cpp \ motif/utils.cpp \ motif/window.cpp \ + x11/bitmap.cpp \ x11/brush.cpp \ x11/pen.cpp \ x11/utilsx.cpp \ @@ -507,7 +507,6 @@ ALL_HEADERS = \ zstream.h \ motif/accel.h \ motif/app.h \ - motif/bitmap.h \ motif/bmpbuttn.h \ motif/bmpmotif.h \ motif/button.h \ @@ -623,6 +622,7 @@ ALL_HEADERS = \ protocol/ftp.h \ protocol/http.h \ protocol/protocol.h \ + x11/bitmap.h \ x11/brush.h \ x11/pen.h @@ -809,7 +809,6 @@ GUIOBJS = \ xmcombo.o \ accel.o \ app.o \ - bitmap.o \ bmpbuttn.o \ bmpmotif.o \ button.o \ @@ -862,6 +861,7 @@ GUIOBJS = \ toplevel.o \ utils.o \ window.o \ + bitmap.o \ brush.o \ pen.o \ utilsx.o diff --git a/src/motif/frame.cpp b/src/motif/frame.cpp index ef7ab95de2..f65136d32d 100644 --- a/src/motif/frame.cpp +++ b/src/motif/frame.cpp @@ -505,10 +505,12 @@ void wxFrame::DoSetIcon(const wxIcon& icon) if (!m_frameShell) return; - if (!icon.Ok() || !icon.GetPixmap()) + if (!icon.Ok() || !icon.GetDrawable()) return; - XtVaSetValues((Widget) m_frameShell, XtNiconPixmap, icon.GetPixmap(), NULL); + XtVaSetValues((Widget) m_frameShell, + XtNiconPixmap, icon.GetDrawable(), + NULL); } void wxFrame::SetIcon(const wxIcon& icon) diff --git a/src/motif/statbmp.cpp b/src/motif/statbmp.cpp index 5209698fb0..43e55139ee 100644 --- a/src/motif/statbmp.cpp +++ b/src/motif/statbmp.cpp @@ -121,7 +121,7 @@ void wxStaticBitmap::DoSetBitmap() wxBitmap newBitmap = wxCreateMaskedBitmap(m_messageBitmapOriginal, col); m_messageBitmap = newBitmap; - pixmap = (Pixmap) m_messageBitmap.GetPixmap(); + pixmap = (Pixmap) m_messageBitmap.GetDrawable(); } else { diff --git a/src/motif/toolbar.cpp b/src/motif/toolbar.cpp index a4279e48bf..0841393811 100644 --- a/src/motif/toolbar.cpp +++ b/src/motif/toolbar.cpp @@ -389,13 +389,13 @@ bool wxToolBar::Realize() wxColour col; col.SetPixel(backgroundPixel); - if( bmp.GetMask() ) + if( bmp.Ok() && bmp.GetMask() ) { bmp = wxCreateMaskedBitmap(bmp, col); tool->SetNormalBitmap(bmp); } - if( insensBmp.GetMask() ) + if( insensBmp.Ok() && insensBmp.GetMask() ) { insensBmp = wxCreateMaskedBitmap(insensBmp, col); tool->SetDisabledBitmap(insensBmp); @@ -415,12 +415,12 @@ bool wxToolBar::Realize() wxColour col; col.SetPixel(backgroundPixel); - pixmap = (Pixmap) bmp.GetPixmap(); + pixmap = (Pixmap) bmp.GetDrawable(); { wxBitmap tmp = tool->GetDisabledBitmap(); insensPixmap = tmp.Ok() ? - (Pixmap)tmp.GetPixmap() : + (Pixmap)tmp.GetDrawable() : tool->GetInsensPixmap(); } diff --git a/src/motif/utils.cpp b/src/motif/utils.cpp index b9ddd16c51..b43673b3b6 100644 --- a/src/motif/utils.cpp +++ b/src/motif/utils.cpp @@ -1235,3 +1235,30 @@ XmString wxStringToXmString( const char* str ) { return XmStringCreateLtoR((char *)str, XmSTRING_DEFAULT_CHARSET); } + +// ---------------------------------------------------------------------------- +// wxBitmap utility functions +// ---------------------------------------------------------------------------- + +// Creates a bitmap with transparent areas drawn in +// the given colour. +wxBitmap wxCreateMaskedBitmap(const wxBitmap& bitmap, wxColour& colour) +{ + wxBitmap newBitmap(bitmap.GetWidth(), + bitmap.GetHeight(), + bitmap.GetDepth()); + wxMemoryDC destDC; + wxMemoryDC srcDC; + + srcDC.SelectObject(bitmap); + destDC.SelectObject(newBitmap); + + wxBrush brush(colour, wxSOLID); + // destDC.SetOptimization(FALSE); + destDC.SetBackground(brush); + destDC.Clear(); + destDC.Blit(0, 0, bitmap.GetWidth(), bitmap.GetHeight(), + &srcDC, 0, 0, wxCOPY, TRUE); + + return newBitmap; +} diff --git a/src/x11/descrip.mms b/src/x11/descrip.mms index f2744fa84b..d29ccd7e4c 100644 --- a/src/x11/descrip.mms +++ b/src/x11/descrip.mms @@ -24,12 +24,16 @@ CXX_DEFINE = cc $(CFLAGS)$(CC_DEFINE) $(MMS$TARGET_NAME).c OBJECTS = \ + bitmap.obj,\ brush.obj,\ - pen.obj + pen.obj,\ + utilsx.obj SOURCES = \ + bitmap.cpp,\ brush.cpp,\ - pen.cpp + pen.cpp,\ + utilsx.cpp all : $(SOURCES) $(MMS)$(MMSQUALIFIERS) $(OBJECTS) @@ -37,5 +41,7 @@ all : $(SOURCES) library [--.lib]libwx_motif.olb $(OBJECTS) .endif +bitmap.obj : bitmap.cpp brush.obj : brush.cpp pen.obj : pen.cpp +utilsx.obj : utilsx.cpp -- 2.45.2