fix the wxCursor(const wxString& cursor_file, ...) ctor by reusing wxImage ctor; fix doxygen rendering of that ctor docs

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60648 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Francesco Montorsi 2009-05-16 10:42:48 +00:00
parent 0ed6c93314
commit d6764050d8
4 changed files with 111 additions and 106 deletions

View File

@ -14,6 +14,26 @@
#include "wx/defs.h"
/*
wxCursor classes should have the following public API:
class WXDLLIMPEXP_CORE wxCursor : public wxGDIObject
{
public:
wxCursor();
wxCursor(const wxImage& image);
wxCursor(const wxString& name,
wxBitmapType type = wxCURSOR_DEFAULT_TYPE,
int hotSpotX = 0, int hotSpotY = 0);
wxCursor(wxStockCursor id) { InitFromStock(id); }
#if WXWIN_COMPATIBILITY_2_8
wxCursor(int id) { InitFromStock((wxStockCursor)id); }
#endif
virtual ~wxCursor();
};
*/
#if defined(__WXPALMOS__)
#define wxCURSOR_DEFAULT_TYPE wxBITMAP_TYPE_CUR_RESOURCE
#include "wx/palmos/cursor.h"

View File

@ -30,14 +30,14 @@ public:
#endif
#if wxUSE_IMAGE
wxCursor( const wxImage & image );
wxCursor(const wxString& name,
wxBitmapType type = wxCURSOR_DEFAULT_TYPE,
int hotSpotX = 0, int hotSpotY = 0);
#endif
wxCursor( const char bits[], int width, int height,
int hotSpotX = -1, int hotSpotY = -1,
const char maskBits[] = NULL,
const wxColour* fg = NULL, const wxColour* bg = NULL);
wxCursor(const wxString& name,
wxBitmapType type = wxCURSOR_DEFAULT_TYPE,
int hotSpotX = 0, int hotSpotY = 0);
virtual ~wxCursor();
// implementation
@ -46,6 +46,9 @@ public:
protected:
void InitFromStock(wxStockCursor);
#if wxUSE_IMAGE
void InitFromImage(const wxImage& image);
#endif
virtual wxGDIRefData *CreateGDIRefData() const;
virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const;

View File

@ -104,9 +104,9 @@ public:
@param height
Cursor height.
@param hotSpotX
Hotspot x coordinate.
Hotspot x coordinate (relative to the top left of the image).
@param hotSpotY
Hotspot y coordinate.
Hotspot y coordinate (relative to the top left of the image).
@param maskBits
Bits for a mask bitmap.
@ -119,39 +119,32 @@ public:
/**
Constructs a cursor by passing a string resource name or filename.
@note
On MacOS when specifying a string resource name, first the color
cursors 'crsr' and then the black/white cursors 'CURS' in the resource
chain are scanned through.
@a hotSpotX and @a hotSpotY are currently only used under Windows when
loading from an icon file, to specify the cursor hotspot relative to
the top left of the image.
The arguments @a hotSpotX and @a hotSpotY are only used when there's no
hotspot info in the resource/image-file to load (e.g. when using
@c wxBITMAP_TYPE_ICO under wxMSW or @c wxBITMAP_TYPE_XPM under wxGTK).
@param cursorName
The name of the resource or the image file to load.
@param type
Icon type to load. It defaults to wxCURSOR_DEFAULT_TYPE,
Icon type to load. It defaults to @c wxCURSOR_DEFAULT_TYPE,
which is a @#define associated to different values on different
platforms:
- under Windows, it defaults to wxBITMAP_TYPE_CUR_RESOURCE.
- under MacOS, it defaults to wxBITMAP_TYPE_MACCURSOR_RESOURCE.
- under GTK, it defaults to wxBITMAP_TYPE_XPM.
- under X11, it defaults to wxBITMAP_TYPE_XPM.
- under Motif, type defaults to wxBITMAP_TYPE_XBM.
Under Windows, the permitted types are:
- wxBITMAP_TYPE_CUR - Load a cursor from a .cur cursor file (only
if USE_RESOURCE_LOADING_IN_MSW is enabled in
setup.h).
- wxBITMAP_TYPE_CUR_RESOURCE - Load a Windows resource
(as specified in the .rc file).
- wxBITMAP_TYPE_ICO - Load a cursor from a .ico icon file (only if
USE_RESOURCE_LOADING_IN_MSW is enabled in
setup.h). Specify @a hotSpotX and @a hotSpotY.
- under Windows, it defaults to @c wxBITMAP_TYPE_CUR_RESOURCE.
Other permitted types under Windows are @c wxBITMAP_TYPE_CUR
(to load a cursor from a .cur cursor file) and @c wxBITMAP_TYPE_ICO
(to load a cursor from a .ico icon file).
- under MacOS, it defaults to @c wxBITMAP_TYPE_MACCURSOR_RESOURCE;
when specifying a string resource name, first the color cursors 'crsr'
and then the black/white cursors 'CURS' in the resource chain are scanned
through.
- under GTK, it defaults to @c wxBITMAP_TYPE_XPM.
See the wxCursor(const wxImage& image) ctor for more info.
- under X11, it defaults to @c wxBITMAP_TYPE_XPM.
- under Motif, it defaults to @c wxBITMAP_TYPE_XBM.
@param hotSpotX
Hotspot x coordinate.
Hotspot x coordinate (relative to the top left of the image).
@param hotSpotY
Hotspot y coordinate.
Hotspot y coordinate (relative to the top left of the image).
*/
wxCursor(const wxString& cursorName,
wxBitmapType type = wxCURSOR_DEFAULT_TYPE,

View File

@ -1,6 +1,6 @@
/////////////////////////////////////////////////////////////////////////////
// Name: src/gtk/cursor.cpp
// Purpose:
// Purpose: wxCursor implementation
// Author: Robert Roebling
// Id: $Id$
// Copyright: (c) 1998 Robert Roebling
@ -23,7 +23,7 @@
#include <gtk/gtk.h>
//-----------------------------------------------------------------------------
// wxCursor
// wxCursorRefData
//-----------------------------------------------------------------------------
class wxCursorRefData: public wxGDIRefData
@ -47,16 +47,78 @@ wxCursorRefData::~wxCursorRefData()
if (m_cursor) gdk_cursor_unref( m_cursor );
}
//-----------------------------------------------------------------------------
// wxCursor
//-----------------------------------------------------------------------------
#define M_CURSORDATA static_cast<wxCursorRefData*>(m_refData)
IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxGDIObject)
// used in the following two ctors
extern GtkWidget *wxGetRootWindow();
wxCursor::wxCursor()
{
}
#if wxUSE_IMAGE
wxCursor::wxCursor(const wxString& cursor_file,
wxBitmapType type,
int hotSpotX, int hotSpotY)
{
wxImage img;
if (!img.LoadFile(cursor_file, type))
return;
// eventually set the hotspot:
if (!image.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_X))
img.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X, hotSpotX);
if (!image.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y))
img.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y, hotSpotY);
InitFromImage(img);
}
wxCursor::wxCursor(const wxImage& img)
{
InitFromImage(img);
}
#endif
wxCursor::wxCursor(const char bits[], int width, int height,
int hotSpotX, int hotSpotY,
const char maskBits[], const wxColour *fg, const wxColour *bg)
{
if (!maskBits)
maskBits = bits;
if (!fg)
fg = wxBLACK;
if (!bg)
bg = wxWHITE;
if (hotSpotX < 0 || hotSpotX >= width)
hotSpotX = 0;
if (hotSpotY < 0 || hotSpotY >= height)
hotSpotY = 0;
GdkBitmap *data = gdk_bitmap_create_from_data( wxGetRootWindow()->window, (gchar *) bits, width, height );
GdkBitmap *mask = gdk_bitmap_create_from_data( wxGetRootWindow()->window, (gchar *) maskBits, width, height);
m_refData = new wxCursorRefData;
M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixmap(
data, mask, fg->GetColor(), bg->GetColor(),
hotSpotX, hotSpotY );
g_object_unref (data);
g_object_unref (mask);
}
wxCursor::~wxCursor()
{
}
void wxCursor::InitFromStock( wxStockCursor cursorId )
{
m_refData = new wxCursorRefData();
@ -123,75 +185,6 @@ void wxCursor::InitFromStock( wxStockCursor cursorId )
M_CURSORDATA->m_cursor = gdk_cursor_new( gdk_cur );
}
// used in the following two ctors
extern GtkWidget *wxGetRootWindow();
wxCursor::wxCursor(const wxString& cursor_file,
wxBitmapType type,
int hotSpotX, int hotSpotY)
{
/* TODO: test this code! */
// Must be an XBM file
if (type != wxBITMAP_TYPE_XPM) {
wxLogError("Invalid cursor bitmap type '%d'", type);
return;
}
// load the XPM
GdkBitmap *mask = NULL;
GdkBitmap *data = gdk_pixmap_create_from_xpm( wxGetRootWindow()->window,
&mask, NULL, cursor_file.mb_str() );
if (!data)
return;
// check given hotspot
gint w, h;
gdk_drawable_get_size( data, &w, &h );
if (hotSpotX < 0 || hotSpotX >= w)
hotSpotX = 0;
if (hotSpotY < 0 || hotSpotY >= h)
hotSpotY = 0;
// create the real cursor
m_refData = new wxCursorRefData;
M_CURSORDATA->m_cursor =
gdk_cursor_new_from_pixmap( data, mask,
wxBLACK->GetColor(), wxWHITE->GetColor(),
hotSpotX, hotSpotY );
g_object_unref (data);
g_object_unref (mask);
}
wxCursor::wxCursor(const char bits[], int width, int height,
int hotSpotX, int hotSpotY,
const char maskBits[], const wxColour *fg, const wxColour *bg)
{
if (!maskBits)
maskBits = bits;
if (!fg)
fg = wxBLACK;
if (!bg)
bg = wxWHITE;
if (hotSpotX < 0 || hotSpotX >= width)
hotSpotX = 0;
if (hotSpotY < 0 || hotSpotY >= height)
hotSpotY = 0;
GdkBitmap *data = gdk_bitmap_create_from_data( wxGetRootWindow()->window, (gchar *) bits, width, height );
GdkBitmap *mask = gdk_bitmap_create_from_data( wxGetRootWindow()->window, (gchar *) maskBits, width, height);
m_refData = new wxCursorRefData;
M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixmap(
data, mask, fg->GetColor(), bg->GetColor(),
hotSpotX, hotSpotY );
g_object_unref (data);
g_object_unref (mask);
}
#if wxUSE_IMAGE
static void GetHotSpot(const wxImage& image, int& x, int& y)
@ -212,7 +205,7 @@ static void GetHotSpot(const wxImage& image, int& x, int& y)
y = 0;
}
wxCursor::wxCursor( const wxImage & image )
void wxCursor::InitFromImage( const wxImage & image )
{
int w = image.GetWidth() ;
int h = image.GetHeight();
@ -345,10 +338,6 @@ wxCursor::wxCursor( const wxImage & image )
#endif // wxUSE_IMAGE
wxCursor::~wxCursor()
{
}
GdkCursor *wxCursor::GetCursor() const
{
return M_CURSORDATA->m_cursor;