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:
@@ -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}}
|
||||
|
||||
|
@@ -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(),
|
||||
|
Reference in New Issue
Block a user