From ffa3d6b8a38a13b84b727697b59cc8742174cdc0 Mon Sep 17 00:00:00 2001 From: Mattia Barbon Date: Tue, 27 May 2003 20:31:41 +0000 Subject: [PATCH] Removed some duplicated code, made wxCursor( wxImage ) handling of dark/light colors agree with wxMSW and wxGTK, i.e. dark -> black, light -> white. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@20748 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/motif/cursor.h | 10 ++- src/motif/cursor.cpp | 136 ++++++++++++-------------------------- 2 files changed, 49 insertions(+), 97 deletions(-) diff --git a/include/wx/motif/cursor.h b/include/wx/motif/cursor.h index fd5e67dcfa..d5ccf28f7a 100644 --- a/include/wx/motif/cursor.h +++ b/include/wx/motif/cursor.h @@ -32,8 +32,9 @@ public: // Copy constructors wxCursor(const wxCursor& cursor) { Ref(cursor); } - wxCursor(const char bits[], int width, int height, int hotSpotX = -1, int hotSpotY = -1, - const char maskBits[] = NULL); + wxCursor(const char bits[], int width, int height, + int hotSpotX = -1, int hotSpotY = -1, + const char maskBits[] = NULL); wxCursor(const wxString& name, long flags = wxBITMAP_TYPE_XBM, int hotSpotX = 0, int hotSpotY = 0); @@ -58,6 +59,11 @@ public: // Create/get a cursor for the current display WXCursor GetXCursor(WXDisplay* display) ; private: + void Create(const char bits[], int width, int height, + int hotSpotX = -1, int hotSpotY = -1, + const char maskBits[] = NULL); + void Create(WXPixmap cursor, WXPixmap mask, int hotSpotX, int hotSpotY); + // Make a cursor from standard id WXCursor MakeCursor(WXDisplay* display, wxStockCursor id); }; diff --git a/src/motif/cursor.cpp b/src/motif/cursor.cpp index 72425e23d8..3c5f636840 100644 --- a/src/motif/cursor.cpp +++ b/src/motif/cursor.cpp @@ -98,18 +98,18 @@ wxCursor::wxCursor(const wxImage & image) int i, j, i8; unsigned char c, cMask; for (i=0; i mid grey if (c>127) - bits[i] = bits[i] | cMask; - cMask = cMask * 2; + bits[i] = bits[i] & cMask; + cMask = (cMask << 1) | 1; } } @@ -125,12 +125,12 @@ wxCursor::wxCursor(const wxImage & image) maskBits[i] = 0x0; i8 = i * 8; - cMask = 1; + cMask = 0x1; for (j=0; j<8; j++) { if (rgbBits[(i8+j)*3] != r || rgbBits[(i8+j)*3+1] != g || rgbBits[(i8+j)*3+2] != b) maskBits[i] = maskBits[i] | cMask; - cMask = cMask * 2; + cMask = (cMask << 1); } } } @@ -157,81 +157,56 @@ wxCursor::wxCursor(const wxImage & image) hotSpotX = 0; if (hotSpotY < 0 || hotSpotY >= h) hotSpotY = 0; - - m_refData = new wxCursorRefData; + + Create( (const char*)bits, w, h, hotSpotX, hotSpotY, + (const char*)maskBits ); + + delete[] bits; + delete[] maskBits; +} +#endif + +void wxCursor::Create(const char bits[], int width, int height, + int hotSpotX, int hotSpotY, const char maskBits[]) +{ + if( !m_refData ) + m_refData = new wxCursorRefData; Display *dpy = (Display*) wxGetDisplay(); int screen_num = DefaultScreen (dpy); Pixmap pixmap = XCreatePixmapFromBitmapData (dpy, - RootWindow (dpy, DefaultScreen(dpy)), - (char*) bits, w, h, + RootWindow (dpy, screen_num), + (char*) bits, width, height, 1 , 0 , 1); Pixmap mask_pixmap = None; if (maskBits != NULL) { mask_pixmap = XCreatePixmapFromBitmapData (dpy, - RootWindow (dpy, DefaultScreen(dpy)), - (char*) maskBits, w, h, + RootWindow (dpy, screen_num), + (char*) maskBits, width, height, 1 , 0 , 1); } - XColor foreground_color; - XColor background_color; - foreground_color.pixel = BlackPixel(dpy, screen_num); - background_color.pixel = WhitePixel(dpy, screen_num); - Colormap cmap = (Colormap) wxTheApp->GetMainColormap((WXDisplay*) dpy); - XQueryColor(dpy, cmap, &foreground_color); - XQueryColor(dpy, cmap, &background_color); - - Cursor cursor = XCreatePixmapCursor (dpy, - pixmap, - mask_pixmap, - &foreground_color, - &background_color, - hotSpotX , - hotSpotY); + Create( (WXPixmap)pixmap, (WXPixmap)mask_pixmap, hotSpotX, hotSpotY ); XFreePixmap( dpy, pixmap ); if (mask_pixmap != None) { XFreePixmap( dpy, mask_pixmap ); } - - if (cursor) - { - wxXCursor *c = new wxXCursor; - - c->m_cursor = (WXCursor) cursor; - c->m_display = (WXDisplay*) dpy; - M_CURSORDATA->m_cursors.Append(c); - } } -#endif -wxCursor::wxCursor(const char bits[], int width, int height, - int hotSpotX, int hotSpotY, const char maskBits[]) +void wxCursor::Create(WXPixmap pixmap, WXPixmap mask_pixmap, + int hotSpotX, int hotSpotY) { - m_refData = new wxCursorRefData; + if( !m_refData ) + m_refData = new wxCursorRefData; Display *dpy = (Display*) wxGetDisplay(); int screen_num = DefaultScreen (dpy); - Pixmap pixmap = XCreatePixmapFromBitmapData (dpy, - RootWindow (dpy, DefaultScreen(dpy)), - (char*) bits, width, height, - 1 , 0 , 1); - - Pixmap mask_pixmap = None; - if (maskBits != NULL) - { - mask_pixmap = XCreatePixmapFromBitmapData (dpy, - RootWindow (dpy, DefaultScreen(dpy)), - (char*) maskBits, width, height, - 1 , 0 , 1); - } - XColor foreground_color; XColor background_color; foreground_color.pixel = BlackPixel(dpy, screen_num); @@ -241,19 +216,13 @@ wxCursor::wxCursor(const char bits[], int width, int height, XQueryColor(dpy, cmap, &background_color); Cursor cursor = XCreatePixmapCursor (dpy, - pixmap, - mask_pixmap, + (Pixmap)pixmap, + (Pixmap)mask_pixmap, &foreground_color, &background_color, hotSpotX , hotSpotY); - XFreePixmap( dpy, pixmap ); - if (mask_pixmap != None) - { - XFreePixmap( dpy, mask_pixmap ); - } - if (cursor) { wxXCursor *c = new wxXCursor; @@ -264,6 +233,12 @@ wxCursor::wxCursor(const char bits[], int width, int height, } } +wxCursor::wxCursor(const char bits[], int width, int height, + int hotSpotX, int hotSpotY, const char maskBits[]) +{ + Create(bits, width, height, hotSpotX, hotSpotY, maskBits); +} + wxCursor::wxCursor(const wxString& name, long flags, int hotSpotX, int hotSpotY) { // Must be an XBM file @@ -274,30 +249,17 @@ wxCursor::wxCursor(const wxString& name, long flags, int hotSpotX, int hotSpotY) int hotX = -1, hotY = -1; unsigned int w, h; - Pixmap pixmap; + Pixmap pixmap = None, mask_pixmap = None; Display *dpy = (Display*) wxGetDisplay(); int screen_num = DefaultScreen (dpy); - int value = XReadBitmapFile (dpy, RootWindow (dpy, DefaultScreen (dpy)), + int value = XReadBitmapFile (dpy, RootWindow (dpy, screen_num), wxConstCast(name.c_str(), char), &w, &h, &pixmap, &hotX, &hotY); - if ((value == BitmapFileInvalid) || - (value == BitmapOpenFailed) || - (value == BitmapNoMemory)) - { - } - else + if (value == BitmapSuccess) { - XColor foreground_color; - XColor background_color; - foreground_color.pixel = BlackPixel(dpy, screen_num); - background_color.pixel = WhitePixel(dpy, screen_num); - Colormap cmap = (Colormap) wxTheApp->GetMainColormap((WXDisplay*) dpy); - XQueryColor(dpy, cmap, &foreground_color); - XQueryColor(dpy, cmap, &background_color); - // TODO: how do we determine whether hotX, hotY were read correctly? if (hotX < 0 || hotY < 0) { @@ -310,26 +272,10 @@ wxCursor::wxCursor(const wxString& name, long flags, int hotSpotX, int hotSpotY) hotY = 0; } - Pixmap mask_pixmap = None; - Cursor cursor = XCreatePixmapCursor (dpy, - pixmap, - mask_pixmap, - &foreground_color, - &background_color, - hotX, - hotY); + Create( (WXPixmap)pixmap, (WXPixmap)mask_pixmap, hotX, hotY ); XFreePixmap( dpy, pixmap ); - if (cursor) - { - wxXCursor *c = new wxXCursor; - - c->m_cursor = (WXCursor) cursor; - c->m_display = (WXDisplay*) dpy; - M_CURSORDATA->m_cursors.Append(c); - } } - } // Cursors by stock number -- 2.45.2