Applied #10546: GTK support for multi-colored wxCursor

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@62102 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2009-09-24 20:41:08 +00:00
parent 1408355593
commit 551d768d12
2 changed files with 53 additions and 25 deletions

View File

@@ -74,13 +74,20 @@ Constructs a cursor using a cursor identifier.
\func{}{wxCursor}{\param{const wxImage\&}{ image}}
Constructs a cursor from a wxImage. The cursor is monochrome, colors with the RGB elements all greater
than 127 will be foreground, colors less than this background. The mask (if any) will be used as transparent.
Constructs a cursor from a wxImage. If the cursor is monochrome on the current
platform, colors with the RGB elements all greater than 127 will be foreground,
colors less than this will be 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 GTK, the two most frequent colors will be used for foreground and background. The cursor will be displayed
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 wxMSW the foreground will be white and the background black. If the cursor
is larger than 32x32 it is resized.
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}}

View File

@@ -152,13 +152,53 @@ wxCursor::wxCursor(const char bits[], int width, int height,
#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 )
{
int w = image.GetWidth() ;
int h = image.GetHeight();
bool bHasMask = image.HasMask();
int hotSpotX, hotSpotY;
GetHotSpot(image, hotSpotX, hotSpotY);
m_refData = new wxCursorRefData;
wxImage image_copy(image);
GdkDisplay* display = gdk_drawable_get_display(wxGetRootWindow()->window);
if (gdk_display_supports_cursor_color(display))
{
if (!image.HasAlpha())
{
// add alpha, so wxBitmap will convert to pixbuf format
image_copy.InitAlpha();
}
wxBitmap bitmap(image_copy);
wxASSERT(bitmap.HasPixbuf());
M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixbuf
(
display,
bitmap.GetPixbuf(),
hotSpotX, hotSpotY
);
return;
}
unsigned long keyMaskColor = 0;
GdkPixmap* mask;
if (bHasMask)
@@ -250,25 +290,6 @@ wxCursor::wxCursor( const wxImage & image )
bg = tmp;
}
int hotSpotX;
int 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;
m_refData = new wxCursorRefData;
M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixmap
(
bitmap.GetPixmap(),