// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "cursor.h"
-#endif
-
#include "wx/wxprec.h"
#include "wx/app.h"
#include "wx/mac/private.h"
-#if !USE_SHARED_LIBRARIES
IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxBitmap)
-#endif
class WXDLLEXPORT wxCursorRefData: public wxBitmapRefData
{
wxCursor::wxCursor( const wxImage &image )
{
+#if wxUSE_IMAGE
CreateFromImage( image ) ;
+#endif
}
wxCursor::wxCursor(const char **bits)
bool wxCursor::CreateFromXpm(const char **bits)
{
+#if wxUSE_IMAGE
wxCHECK_MSG( bits != NULL, FALSE, wxT("invalid cursor data") )
wxXPMDecoder decoder;
wxImage img = decoder.ReadData(bits);
wxCHECK_MSG( img.Ok(), FALSE, wxT("invalid cursor data") )
CreateFromImage( img ) ;
return TRUE;
+#else
+ return FALSE;
+#endif
}
WXHCURSOR wxCursor::GetHCURSOR() const
return retval ;
}
+#if wxUSE_IMAGE
+
void wxCursor::CreateFromImage(const wxImage & image)
{
m_refData = new wxCursorRefData;
- wxImage image16 = image.Scale(16,16) ;
- unsigned char * rgbBits = image16.GetData();
+ int w = 16;
+ int h = 16;
+
+ int hotSpotX = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X);
+ int hotSpotY = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y);
+ int image_w = image.GetWidth();
+ int image_h = image.GetHeight();
+
+ wxASSERT_MSG( hotSpotX >= 0 && hotSpotX < image_w &&
+ hotSpotY >= 0 && hotSpotY < image_h,
+ _T("invalid cursor hot spot coordinates") );
+
+ wxImage image16(image); // final image of correct size
+ // if image is too small then place it in the center, resize it if too big
+ if ((w > image_w) && (h > image_h))
+ {
+ wxPoint offset((w - image_w)/2, (h - image_h)/2);
+ hotSpotX = hotSpotX + offset.x;
+ hotSpotY = hotSpotY + offset.y;
- int w = image16.GetWidth() ;
- int h = image16.GetHeight() ;
+ image16 = image.Size(wxSize(w, h), offset);
+ }
+ else if ((w != image_w) || (h != image_h))
+ {
+ hotSpotX = int(hotSpotX * double(w) / double(image_w));
+ hotSpotY = int(hotSpotY * double(h) / double(image_h));
+
+ image16 = image.Scale(w, h);
+ }
+
+ unsigned char * rgbBits = image16.GetData();
bool bHasMask = image16.HasMask() ;
- int hotSpotX = image16.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X);
- int hotSpotY = image16.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y);
- if (hotSpotX < 0 || hotSpotX >= w)
- hotSpotX = 0;
- if (hotSpotY < 0 || hotSpotY >= h)
- hotSpotY = 0;
PixMapHandle pm = (PixMapHandle) NewHandleClear( sizeof (PixMap)) ;
short extent = 16 ;
M_CURSORDATA->m_isColorCursor = true ;
}
+#endif //wxUSE_IMAGE
+
wxCursor::wxCursor(const wxString& cursor_file, long flags, int hotSpotX, int hotSpotY)
{
m_refData = new wxCursorRefData;
}
else
{
+#if wxUSE_IMAGE
wxImage image ;
image.LoadFile( cursor_file , flags ) ;
if( image.Ok() )
delete m_refData ;
CreateFromImage(image) ;
}
+#endif
}
}