added support for colour cursors in wxGTK (patch 1655576)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44462 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -33,6 +33,7 @@ wxGTK:
|
|||||||
- wxTopLevelWindow::SetSizeHints size increments now work
|
- wxTopLevelWindow::SetSizeHints size increments now work
|
||||||
- wxTopLevelWindow::GetSize() returns the size including the WM decorations
|
- wxTopLevelWindow::GetSize() returns the size including the WM decorations
|
||||||
- wxTopLevelWindow::GetClientSize() returns 0x0 when the window is minimized
|
- wxTopLevelWindow::GetClientSize() returns 0x0 when the window is minimized
|
||||||
|
- Added support for colour cursors (Pascal Monasse)
|
||||||
|
|
||||||
wxMSW:
|
wxMSW:
|
||||||
|
|
||||||
|
@@ -74,13 +74,20 @@ Constructs a cursor using a cursor identifier.
|
|||||||
|
|
||||||
\func{}{wxCursor}{\param{const wxImage\&}{ image}}
|
\func{}{wxCursor}{\param{const wxImage\&}{ image}}
|
||||||
|
|
||||||
Constructs a cursor from a wxImage. The cursor is monochrome, colors with the RGB elements all greater
|
Constructs a cursor from a wxImage. If cursor are monochrome on the current
|
||||||
than 127 will be foreground, colors less than this background. The mask (if any) will be used as transparent.
|
platform, colors with the RGB elements all greater than 127 will be foreground,
|
||||||
|
colors less than this background. The mask (if any) will be used to specify the
|
||||||
|
transparent area.
|
||||||
|
|
||||||
In MSW the foreground will be white and the background black. If the cursor is larger than 32x32 it is resized.
|
In wxMSW the foreground will be white and the background black. If the cursor
|
||||||
In GTK, the two most frequent colors will be used for foreground and background. The cursor will be displayed
|
is larger than 32x32 it is resized.
|
||||||
at the size of the image.
|
|
||||||
On MacOS if the cursor is larger than 16x16 it is resized and currently only shown as black/white (mask respected).
|
In wxGTK, colour cursors and alpha channel are supported (starting from GTK+
|
||||||
|
2.2). Otherwise the two most frequent colors will be used for foreground and
|
||||||
|
background. In any case, the cursor will be displayed at the size of the image.
|
||||||
|
|
||||||
|
In wxMac, if the cursor is larger than 16x16 it is resized and currently only
|
||||||
|
shown as black/white (mask respected).
|
||||||
|
|
||||||
\func{}{wxCursor}{\param{const wxCursor\&}{ cursor}}
|
\func{}{wxCursor}{\param{const wxCursor\&}{ cursor}}
|
||||||
|
|
||||||
|
@@ -152,6 +152,24 @@ wxCursor::wxCursor(const char bits[], int width, int height,
|
|||||||
|
|
||||||
#if wxUSE_IMAGE
|
#if wxUSE_IMAGE
|
||||||
|
|
||||||
|
static void GetHotSpot(const wxImage& image, int& x, int& y)
|
||||||
|
{
|
||||||
|
if (image.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_X))
|
||||||
|
x = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X);
|
||||||
|
else
|
||||||
|
x = 0;
|
||||||
|
|
||||||
|
if (image.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y))
|
||||||
|
y = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y);
|
||||||
|
else
|
||||||
|
y = 0;
|
||||||
|
|
||||||
|
if (x < 0 || x >= image.GetWidth())
|
||||||
|
x = 0;
|
||||||
|
if (y < 0 || y >= image.GetHeight())
|
||||||
|
y = 0;
|
||||||
|
}
|
||||||
|
|
||||||
wxCursor::wxCursor( const wxImage & image )
|
wxCursor::wxCursor( const wxImage & image )
|
||||||
{
|
{
|
||||||
unsigned char * rgbBits = image.GetData();
|
unsigned char * rgbBits = image.GetData();
|
||||||
@@ -160,6 +178,55 @@ wxCursor::wxCursor( const wxImage & image )
|
|||||||
bool bHasMask = image.HasMask();
|
bool bHasMask = image.HasMask();
|
||||||
int imagebitcount = (w*h)/8;
|
int imagebitcount = (w*h)/8;
|
||||||
|
|
||||||
|
#if GTK_CHECK_VERSION(2,2,0)
|
||||||
|
if ( gdk_display_supports_cursor_color(gdk_display_get_default()) )
|
||||||
|
{
|
||||||
|
unsigned char rMask = 0,
|
||||||
|
gMask = 0,
|
||||||
|
bMask = 0;
|
||||||
|
if (bHasMask)
|
||||||
|
{
|
||||||
|
rMask = image.GetMaskRed();
|
||||||
|
gMask = image.GetMaskGreen();
|
||||||
|
bMask = image.GetMaskBlue();
|
||||||
|
}
|
||||||
|
|
||||||
|
GdkPixbuf *pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, true, 8, w, h);
|
||||||
|
unsigned char *alpha = image.HasAlpha() ? image.GetAlpha() : NULL;
|
||||||
|
unsigned char *out = gdk_pixbuf_get_pixels(pixbuf);
|
||||||
|
int rowpad = gdk_pixbuf_get_rowstride(pixbuf) - 4 * w;
|
||||||
|
for ( int y = 0; y < h; y++, out += rowpad )
|
||||||
|
{
|
||||||
|
for ( int x = 0; x < w; x++, out += 4, rgbBits += 3 )
|
||||||
|
{
|
||||||
|
out[0] = rgbBits[0];
|
||||||
|
out[1] = rgbBits[1];
|
||||||
|
out[2] = rgbBits[2];
|
||||||
|
if (bHasMask &&
|
||||||
|
out[0] == rMask && out[1] == gMask && out[2] == bMask)
|
||||||
|
out[3] = 0;
|
||||||
|
else
|
||||||
|
out[3] = alpha ? *alpha : 255;
|
||||||
|
if ( alpha )
|
||||||
|
++alpha;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int hotSpotX, hotSpotY;
|
||||||
|
GetHotSpot(image, hotSpotX, hotSpotY);
|
||||||
|
|
||||||
|
m_refData = new wxCursorRefData;
|
||||||
|
M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixbuf
|
||||||
|
(
|
||||||
|
gdk_display_get_default(),
|
||||||
|
pixbuf,
|
||||||
|
hotSpotX, hotSpotY
|
||||||
|
);
|
||||||
|
g_object_unref (pixbuf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif // GTK+ 2.2+
|
||||||
|
|
||||||
unsigned char * bits = new unsigned char [imagebitcount];
|
unsigned char * bits = new unsigned char [imagebitcount];
|
||||||
unsigned char * maskBits = new unsigned char [imagebitcount];
|
unsigned char * maskBits = new unsigned char [imagebitcount];
|
||||||
|
|
||||||
@@ -266,23 +333,8 @@ wxCursor::wxCursor( const wxImage & image )
|
|||||||
bg = tmp;
|
bg = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
int hotSpotX;
|
int hotSpotX, hotSpotY;
|
||||||
int hotSpotY;
|
GetHotSpot(image, hotSpotX, hotSpotY);
|
||||||
|
|
||||||
if (image.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_X))
|
|
||||||
hotSpotX = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X);
|
|
||||||
else
|
|
||||||
hotSpotX = 0;
|
|
||||||
|
|
||||||
if (image.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y))
|
|
||||||
hotSpotY = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y);
|
|
||||||
else
|
|
||||||
hotSpotY = 0;
|
|
||||||
|
|
||||||
if (hotSpotX < 0 || hotSpotX >= w)
|
|
||||||
hotSpotX = 0;
|
|
||||||
if (hotSpotY < 0 || hotSpotY >= h)
|
|
||||||
hotSpotY = 0;
|
|
||||||
|
|
||||||
GdkBitmap *data = gdk_bitmap_create_from_data(wxGetRootWindow()->window,
|
GdkBitmap *data = gdk_bitmap_create_from_data(wxGetRootWindow()->window,
|
||||||
(gchar *) bits, w, h);
|
(gchar *) bits, w, h);
|
||||||
|
Reference in New Issue
Block a user