X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f0834140313212fc54d09e28d21a95476d6545f2..aedd6d6aca05ccf22b067d34d5aa8037ed5138fc:/src/msw/cursor.cpp?ds=sidebyside diff --git a/src/msw/cursor.cpp b/src/msw/cursor.cpp index 527c1dca2d..221c3a3bf6 100644 --- a/src/msw/cursor.cpp +++ b/src/msw/cursor.cpp @@ -29,29 +29,19 @@ #endif #ifndef WX_PRECOMP - #include "wx/list.h" #include "wx/utils.h" #include "wx/app.h" #include "wx/bitmap.h" #include "wx/icon.h" #include "wx/cursor.h" + #include "wx/settings.h" + #include "wx/intl.h" #endif -#include "wx/ptr_scpd.h" - #include "wx/module.h" #include "wx/image.h" #include "wx/msw/private.h" -#ifndef __WXMICROWIN__ - #include "wx/msw/dib.h" -#endif - -#if wxUSE_RESOURCE_LOADING_IN_MSW - #include "wx/msw/curico.h" - #include "wx/msw/curicop.h" -#endif - // define functions missing in MicroWin #ifdef __WXMICROWIN__ static inline void DestroyCursor(HCURSOR) { } @@ -122,13 +112,6 @@ public: } }; -// ---------------------------------------------------------------------------- -// other types -// ---------------------------------------------------------------------------- - -wxDECLARE_SCOPED_ARRAY(unsigned char, ByteArray); -wxDEFINE_SCOPED_ARRAY(unsigned char, ByteArray); - // ============================================================================ // implementation // ============================================================================ @@ -172,8 +155,10 @@ void wxCursorRefData::Free() { if ( m_hCursor ) { +#ifndef __WXWINCE__ if ( m_destroyCursor ) ::DestroyCursor((HCURSOR)m_hCursor); +#endif m_hCursor = 0; } @@ -194,96 +179,26 @@ wxCursor::wxCursor(const wxImage& image) const int w = wxCursorRefData::GetStandardWidth(); const int h = wxCursorRefData::GetStandardHeight(); - wxImage image32 = image.Scale(w, h); - - const int imagebitcount = (w*h)/8; + const int hotSpotX = image.GetOptionInt(wxCUR_HOTSPOT_X); + const int hotSpotY = image.GetOptionInt(wxCUR_HOTSPOT_Y); - ByteArray bits(new unsigned char [imagebitcount]), - maskBits(new unsigned char [imagebitcount]); - - int i, j, i8; - unsigned char c, cMask; - - const unsigned char * const rgbBits = image32.GetData(); - - // first create the XOR mask - for ( i = 0; i < imagebitcount; i++ ) - { - bits[i] = 0; - i8 = i * 8; - // unlike gtk, the pixels go in the opposite order in the bytes - cMask = 128; - for ( j = 0; j < 8; j++ ) - { - // possible overflow if we do the summation first ? - c = rgbBits[(i8+j)*3]/3 + - rgbBits[(i8+j)*3+1]/3 + - rgbBits[(i8+j)*3+2]/3; - - // if average value is > mid grey - if ( c > 127 ) - bits[i] = bits[i] | cMask; - cMask = cMask / 2; - } - } - - // now the AND one - if ( image32.HasMask() ) - { - unsigned char r = image32.GetMaskRed(), - g = image32.GetMaskGreen(), - b = image32.GetMaskBlue(); - - for ( i = 0; i < imagebitcount; i++ ) - { - maskBits[i] = 0x0; - i8 = i * 8; - - cMask = 128; - for ( j = 0; j < 8; j++ ) - { - if ( rgbBits[(i8+j)*3] == r && - rgbBits[(i8+j)*3+1] == g && - rgbBits[(i8+j)*3+2] == b ) - { - maskBits[i] = maskBits[i] | cMask; - } - - cMask = cMask / 2; - } - } - } - else // no mask in the image - { - memset(maskBits.get(), 0, sizeof(unsigned char)*imagebitcount); - } - - // determine where should the cursors hot spot be - int hotSpotX = image32.GetOptionInt(wxCUR_HOTSPOT_X); - int hotSpotY = image32.GetOptionInt(wxCUR_HOTSPOT_Y); - if (hotSpotX < 0 || hotSpotX >= w) - hotSpotX = 0; - if (hotSpotY < 0 || hotSpotY >= h) - hotSpotY = 0; - - // do create cursor now - HCURSOR hcursor = ::CreateCursor - ( - wxGetInstance(), - hotSpotX, hotSpotY, - w, h, - /* AND */ maskBits.get(), - /* XOR */ bits.get() - ); + wxASSERT_MSG( hotSpotX >= 0 && hotSpotX < w && + hotSpotY >= 0 && hotSpotY < h, + _T("invalid cursor hot spot coordinates") ); + HCURSOR hcursor = wxBitmapToHCURSOR + ( + wxBitmap(image.Scale(w, h)), + hotSpotX, + hotSpotY + ); if ( !hcursor ) { - wxLogLastError(_T("CreateCursor")); - } - else - { - m_refData = new wxCursorRefData(hcursor, true /* delete it */); + wxLogWarning(_("Failed to create cursor.")); + return; } + + m_refData = new wxCursorRefData(hcursor, true /* delete it later */); } wxCursor::wxCursor(const char WXUNUSED(bits)[], @@ -322,41 +237,28 @@ wxCursor::wxCursor(const wxString& filename, hcursor = ::LoadCursor(wxGetInstance(), filename); break; +#ifndef __WXWINCE__ case wxBITMAP_TYPE_CUR: hcursor = ::LoadCursorFromFile(filename); break; +#endif case wxBITMAP_TYPE_ICO: -#if wxUSE_RESOURCE_LOADING_IN_MSW - hcursor = IconToCursor((wxChar *)filename.c_str(), - wxGetInstance(), - hotSpotX, hotSpotY, - NULL, NULL); -#endif // wxUSE_RESOURCE_LOADING_IN_MSW + hcursor = wxBitmapToHCURSOR + ( + wxIcon(filename, wxBITMAP_TYPE_ICO), + hotSpotX, + hotSpotY + ); break; case wxBITMAP_TYPE_BMP: - { -#if wxUSE_RESOURCE_LOADING_IN_MSW - HBITMAP hBitmap = 0; - HPALETTE hPalette = 0; - if ( wxReadDIB((wxChar *)filename.c_str(), &hBitmap, &hPalette) ) - { - if (hPalette) - DeleteObject(hPalette); - - POINT pt; - pt.x = hotSpotX; - pt.y = hotSpotY; - hcursor = MakeCursorFromBitmap(wxGetInstance(), hBitmap, &pt); - DeleteObject(hBitmap); - } - else -#endif // wxUSE_RESOURCE_LOADING_IN_MSW - { - hcursor = NULL; - } - } + hcursor = wxBitmapToHCURSOR + ( + wxBitmap(filename, wxBITMAP_TYPE_BMP), + hotSpotX, + hotSpotY + ); break; default: @@ -370,7 +272,7 @@ wxCursor::wxCursor(const wxString& filename, m_refData = new wxCursorRefData(hcursor, true /* delete it later */); #if WXWIN_COMPATIBILITY_2 - refData->SetOk(); + ((wxCursorRefData *)m_refData)->SetOk(); #endif // WXWIN_COMPATIBILITY_2 } }