X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/20b6985553b4e01e7960847e3211d940aeff8742..b9efe021b554fa3967d1442cf758435c5cd5ae8f:/src/mac/carbon/cursor.cpp diff --git a/src/mac/carbon/cursor.cpp b/src/mac/carbon/cursor.cpp index 8c6d751197..6bb1ff40bc 100644 --- a/src/mac/carbon/cursor.cpp +++ b/src/mac/carbon/cursor.cpp @@ -240,7 +240,9 @@ wxCursor::wxCursor(const char WXUNUSED(bits)[], int WXUNUSED(width), int WXUNUSE wxCursor::wxCursor( const wxImage &image ) { +#if wxUSE_IMAGE CreateFromImage( image ) ; +#endif } wxCursor::wxCursor(const char **bits) @@ -255,12 +257,16 @@ wxCursor::wxCursor(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 @@ -291,24 +297,46 @@ short GetCTabIndex( CTabHandle colors , RGBColor *col ) 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 ; @@ -402,6 +430,8 @@ void wxCursor::CreateFromImage(const wxImage & image) M_CURSORDATA->m_isColorCursor = true ; } +#endif //wxUSE_IMAGE + wxCursor::wxCursor(const wxString& cursor_file, long flags, int hotSpotX, int hotSpotY) { m_refData = new wxCursorRefData; @@ -438,6 +468,7 @@ wxCursor::wxCursor(const wxString& cursor_file, long flags, int hotSpotX, int ho } else { +#if wxUSE_IMAGE wxImage image ; image.LoadFile( cursor_file , flags ) ; if( image.Ok() ) @@ -447,6 +478,7 @@ wxCursor::wxCursor(const wxString& cursor_file, long flags, int hotSpotX, int ho delete m_refData ; CreateFromImage(image) ; } +#endif } }