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}} \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 the cursor is 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 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 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}}

View File

@@ -152,13 +152,53 @@ 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 )
{ {
int w = image.GetWidth() ; int w = image.GetWidth() ;
int h = image.GetHeight(); int h = image.GetHeight();
bool bHasMask = image.HasMask(); bool bHasMask = image.HasMask();
int hotSpotX, hotSpotY;
GetHotSpot(image, hotSpotX, hotSpotY);
m_refData = new wxCursorRefData;
wxImage image_copy(image); 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; unsigned long keyMaskColor = 0;
GdkPixmap* mask; GdkPixmap* mask;
if (bHasMask) if (bHasMask)
@@ -250,25 +290,6 @@ wxCursor::wxCursor( const wxImage & image )
bg = tmp; 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 M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixmap
( (
bitmap.GetPixmap(), bitmap.GetPixmap(),