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
This commit is contained in:
@@ -32,7 +32,8 @@ public:
|
|||||||
// Copy constructors
|
// Copy constructors
|
||||||
wxCursor(const wxCursor& cursor) { Ref(cursor); }
|
wxCursor(const wxCursor& cursor) { Ref(cursor); }
|
||||||
|
|
||||||
wxCursor(const char bits[], int width, int height, int hotSpotX = -1, int hotSpotY = -1,
|
wxCursor(const char bits[], int width, int height,
|
||||||
|
int hotSpotX = -1, int hotSpotY = -1,
|
||||||
const char maskBits[] = NULL);
|
const char maskBits[] = NULL);
|
||||||
|
|
||||||
wxCursor(const wxString& name, long flags = wxBITMAP_TYPE_XBM,
|
wxCursor(const wxString& name, long flags = wxBITMAP_TYPE_XBM,
|
||||||
@@ -58,6 +59,11 @@ public:
|
|||||||
// Create/get a cursor for the current display
|
// Create/get a cursor for the current display
|
||||||
WXCursor GetXCursor(WXDisplay* display) ;
|
WXCursor GetXCursor(WXDisplay* display) ;
|
||||||
private:
|
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
|
// Make a cursor from standard id
|
||||||
WXCursor MakeCursor(WXDisplay* display, wxStockCursor id);
|
WXCursor MakeCursor(WXDisplay* display, wxStockCursor id);
|
||||||
};
|
};
|
||||||
|
@@ -98,18 +98,18 @@ wxCursor::wxCursor(const wxImage & image)
|
|||||||
int i, j, i8; unsigned char c, cMask;
|
int i, j, i8; unsigned char c, cMask;
|
||||||
for (i=0; i<imagebitcount; i++)
|
for (i=0; i<imagebitcount; i++)
|
||||||
{
|
{
|
||||||
bits[i] = 0;
|
bits[i] = 0xff;
|
||||||
i8 = i * 8;
|
i8 = i * 8;
|
||||||
|
|
||||||
cMask = 1;
|
cMask = 0xfe; // 11111110
|
||||||
for (j=0; j<8; j++)
|
for (j=0; j<8; j++)
|
||||||
{
|
{
|
||||||
// possible overflow if we do the summation first ?
|
// possible overflow if we do the summation first ?
|
||||||
c = rgbBits[(i8+j)*3]/3 + rgbBits[(i8+j)*3+1]/3 + rgbBits[(i8+j)*3+2]/3;
|
c = rgbBits[(i8+j)*3]/3 + rgbBits[(i8+j)*3+1]/3 + rgbBits[(i8+j)*3+2]/3;
|
||||||
//if average value is > mid grey
|
//if average value is > mid grey
|
||||||
if (c>127)
|
if (c>127)
|
||||||
bits[i] = bits[i] | cMask;
|
bits[i] = bits[i] & cMask;
|
||||||
cMask = cMask * 2;
|
cMask = (cMask << 1) | 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,12 +125,12 @@ wxCursor::wxCursor(const wxImage & image)
|
|||||||
maskBits[i] = 0x0;
|
maskBits[i] = 0x0;
|
||||||
i8 = i * 8;
|
i8 = i * 8;
|
||||||
|
|
||||||
cMask = 1;
|
cMask = 0x1;
|
||||||
for (j=0; j<8; j++)
|
for (j=0; j<8; j++)
|
||||||
{
|
{
|
||||||
if (rgbBits[(i8+j)*3] != r || rgbBits[(i8+j)*3+1] != g || rgbBits[(i8+j)*3+2] != b)
|
if (rgbBits[(i8+j)*3] != r || rgbBits[(i8+j)*3+1] != g || rgbBits[(i8+j)*3+2] != b)
|
||||||
maskBits[i] = maskBits[i] | cMask;
|
maskBits[i] = maskBits[i] | cMask;
|
||||||
cMask = cMask * 2;
|
cMask = (cMask << 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -158,25 +158,55 @@ wxCursor::wxCursor(const wxImage & image)
|
|||||||
if (hotSpotY < 0 || hotSpotY >= h)
|
if (hotSpotY < 0 || hotSpotY >= h)
|
||||||
hotSpotY = 0;
|
hotSpotY = 0;
|
||||||
|
|
||||||
|
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;
|
m_refData = new wxCursorRefData;
|
||||||
|
|
||||||
Display *dpy = (Display*) wxGetDisplay();
|
Display *dpy = (Display*) wxGetDisplay();
|
||||||
int screen_num = DefaultScreen (dpy);
|
int screen_num = DefaultScreen (dpy);
|
||||||
|
|
||||||
Pixmap pixmap = XCreatePixmapFromBitmapData (dpy,
|
Pixmap pixmap = XCreatePixmapFromBitmapData (dpy,
|
||||||
RootWindow (dpy, DefaultScreen(dpy)),
|
RootWindow (dpy, screen_num),
|
||||||
(char*) bits, w, h,
|
(char*) bits, width, height,
|
||||||
1 , 0 , 1);
|
1 , 0 , 1);
|
||||||
|
|
||||||
Pixmap mask_pixmap = None;
|
Pixmap mask_pixmap = None;
|
||||||
if (maskBits != NULL)
|
if (maskBits != NULL)
|
||||||
{
|
{
|
||||||
mask_pixmap = XCreatePixmapFromBitmapData (dpy,
|
mask_pixmap = XCreatePixmapFromBitmapData (dpy,
|
||||||
RootWindow (dpy, DefaultScreen(dpy)),
|
RootWindow (dpy, screen_num),
|
||||||
(char*) maskBits, w, h,
|
(char*) maskBits, width, height,
|
||||||
1 , 0 , 1);
|
1 , 0 , 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Create( (WXPixmap)pixmap, (WXPixmap)mask_pixmap, hotSpotX, hotSpotY );
|
||||||
|
|
||||||
|
XFreePixmap( dpy, pixmap );
|
||||||
|
if (mask_pixmap != None)
|
||||||
|
{
|
||||||
|
XFreePixmap( dpy, mask_pixmap );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCursor::Create(WXPixmap pixmap, WXPixmap mask_pixmap,
|
||||||
|
int hotSpotX, int hotSpotY)
|
||||||
|
{
|
||||||
|
if( !m_refData )
|
||||||
|
m_refData = new wxCursorRefData;
|
||||||
|
|
||||||
|
Display *dpy = (Display*) wxGetDisplay();
|
||||||
|
int screen_num = DefaultScreen (dpy);
|
||||||
|
|
||||||
XColor foreground_color;
|
XColor foreground_color;
|
||||||
XColor background_color;
|
XColor background_color;
|
||||||
foreground_color.pixel = BlackPixel(dpy, screen_num);
|
foreground_color.pixel = BlackPixel(dpy, screen_num);
|
||||||
@@ -186,19 +216,13 @@ wxCursor::wxCursor(const wxImage & image)
|
|||||||
XQueryColor(dpy, cmap, &background_color);
|
XQueryColor(dpy, cmap, &background_color);
|
||||||
|
|
||||||
Cursor cursor = XCreatePixmapCursor (dpy,
|
Cursor cursor = XCreatePixmapCursor (dpy,
|
||||||
pixmap,
|
(Pixmap)pixmap,
|
||||||
mask_pixmap,
|
(Pixmap)mask_pixmap,
|
||||||
&foreground_color,
|
&foreground_color,
|
||||||
&background_color,
|
&background_color,
|
||||||
hotSpotX ,
|
hotSpotX ,
|
||||||
hotSpotY);
|
hotSpotY);
|
||||||
|
|
||||||
XFreePixmap( dpy, pixmap );
|
|
||||||
if (mask_pixmap != None)
|
|
||||||
{
|
|
||||||
XFreePixmap( dpy, mask_pixmap );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cursor)
|
if (cursor)
|
||||||
{
|
{
|
||||||
wxXCursor *c = new wxXCursor;
|
wxXCursor *c = new wxXCursor;
|
||||||
@@ -208,60 +232,11 @@ wxCursor::wxCursor(const wxImage & image)
|
|||||||
M_CURSORDATA->m_cursors.Append(c);
|
M_CURSORDATA->m_cursors.Append(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
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[])
|
int hotSpotX, int hotSpotY, const char maskBits[])
|
||||||
{
|
{
|
||||||
m_refData = new wxCursorRefData;
|
Create(bits, width, height, hotSpotX, hotSpotY, maskBits);
|
||||||
|
|
||||||
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);
|
|
||||||
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);
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wxCursor::wxCursor(const wxString& name, long flags, int hotSpotX, int hotSpotY)
|
wxCursor::wxCursor(const wxString& name, long flags, int hotSpotX, int hotSpotY)
|
||||||
@@ -274,30 +249,17 @@ wxCursor::wxCursor(const wxString& name, long flags, int hotSpotX, int hotSpotY)
|
|||||||
|
|
||||||
int hotX = -1, hotY = -1;
|
int hotX = -1, hotY = -1;
|
||||||
unsigned int w, h;
|
unsigned int w, h;
|
||||||
Pixmap pixmap;
|
Pixmap pixmap = None, mask_pixmap = None;
|
||||||
|
|
||||||
Display *dpy = (Display*) wxGetDisplay();
|
Display *dpy = (Display*) wxGetDisplay();
|
||||||
int screen_num = DefaultScreen (dpy);
|
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),
|
wxConstCast(name.c_str(), char),
|
||||||
&w, &h, &pixmap, &hotX, &hotY);
|
&w, &h, &pixmap, &hotX, &hotY);
|
||||||
|
|
||||||
if ((value == BitmapFileInvalid) ||
|
if (value == BitmapSuccess)
|
||||||
(value == BitmapOpenFailed) ||
|
|
||||||
(value == BitmapNoMemory))
|
|
||||||
{
|
{
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
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?
|
// TODO: how do we determine whether hotX, hotY were read correctly?
|
||||||
if (hotX < 0 || hotY < 0)
|
if (hotX < 0 || hotY < 0)
|
||||||
{
|
{
|
||||||
@@ -310,26 +272,10 @@ wxCursor::wxCursor(const wxString& name, long flags, int hotSpotX, int hotSpotY)
|
|||||||
hotY = 0;
|
hotY = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Pixmap mask_pixmap = None;
|
Create( (WXPixmap)pixmap, (WXPixmap)mask_pixmap, hotX, hotY );
|
||||||
Cursor cursor = XCreatePixmapCursor (dpy,
|
|
||||||
pixmap,
|
|
||||||
mask_pixmap,
|
|
||||||
&foreground_color,
|
|
||||||
&background_color,
|
|
||||||
hotX,
|
|
||||||
hotY);
|
|
||||||
|
|
||||||
XFreePixmap( dpy, pixmap );
|
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
|
// Cursors by stock number
|
||||||
|
Reference in New Issue
Block a user