]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/cursor.cpp
use custom class which doesn't redraw everything on resize instead of SysTabCtl32...
[wxWidgets.git] / src / msw / cursor.cpp
index f1bbdb1336bb110262881d1ca87a20ac7c65c7db..f546bd06b30fbc86abb8574e1c57b5a8cc277b9e 100644 (file)
@@ -17,7 +17,7 @@
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "cursor.h"
 #endif
 
 #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) { }
@@ -112,7 +102,7 @@ public:
     {
         gs_globalCursor = new wxCursor;
 
-        return TRUE;
+        return true;
     }
 
     virtual void OnExit()
@@ -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;
     }
@@ -187,6 +172,7 @@ wxCursor::wxCursor()
 {
 }
 
+#if wxUSE_IMAGE
 wxCursor::wxCursor(const wxImage& image)
 {
     // image has to be of the standard cursor size, otherwise we won't be able
@@ -194,97 +180,28 @@ 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;
-
-    ByteArray bits(new unsigned char [imagebitcount]),
-              maskBits(new unsigned char [imagebitcount]);
+    const int hotSpotX = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X);
+    const int hotSpotY = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y);
 
-    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 */);
 }
+#endif
 
 wxCursor::wxCursor(const char WXUNUSED(bits)[],
                    int WXUNUSED(width),
@@ -322,40 +239,29 @@ wxCursor::wxCursor(const wxString& filename,
             hcursor = ::LoadCursor(wxGetInstance(), filename);
             break;
 
+#ifndef __WXWINCE__
         case wxBITMAP_TYPE_CUR:
             hcursor = ::LoadCursorFromFile(filename);
             break;
+#endif
 
-#if wxUSE_RESOURCE_LOADING_IN_MSW
         case wxBITMAP_TYPE_ICO:
-            hcursor = IconToCursor((wxChar *)filename.c_str(),
-                                   wxGetInstance(),
-                                   hotSpotX, hotSpotY,
-                                   NULL, NULL);
+            hcursor = wxBitmapToHCURSOR
+                      (
+                       wxIcon(filename, wxBITMAP_TYPE_ICO),
+                       hotSpotX,
+                       hotSpotY
+                      );
             break;
 
         case wxBITMAP_TYPE_BMP:
-            {
-                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
-                {
-                    hcursor = NULL;
-                }
-            }
+            hcursor = wxBitmapToHCURSOR
+                      (
+                       wxBitmap(filename, wxBITMAP_TYPE_BMP),
+                       hotSpotX,
+                       hotSpotY
+                      );
             break;
-#endif // wxUSE_RESOURCE_LOADING_IN_MSW
 
         default:
             wxFAIL_MSG( _T("unknown cursor resource type") );
@@ -366,17 +272,13 @@ wxCursor::wxCursor(const wxString& filename,
     if ( hcursor )
     {
         m_refData = new wxCursorRefData(hcursor, true /* delete it later */);
-
-#if WXWIN_COMPATIBILITY_2
-        refData->SetOk();
-#endif // WXWIN_COMPATIBILITY_2
     }
 }
 
 // Cursors by stock number
 wxCursor::wxCursor(int idCursor)
 {
-    // all wxWindows standard cursors
+    // all wxWidgets standard cursors
     static const struct StdCursor
     {
         // is this a standard Windows cursor?
@@ -388,31 +290,31 @@ wxCursor::wxCursor(int idCursor)
     {
         {  true, NULL                        }, // wxCURSOR_NONE
         {  true, IDC_ARROW                   }, // wxCURSOR_ARROW
-        { false, _T("wxCURSOR_RIGHT_ARROW")  }, // wxCURSOR_RIGHT_ARROW
-        { false, _T("wxCURSOR_BULLSEYE")     }, // wxCURSOR_BULLSEYE
-        {  true, IDC_ARROW                   }, // wxCURSOR_CHAR
-        {  true, IDC_CROSS                   }, // wxCURSOR_CROSS
-        { false, _T("wxCURSOR_HAND")         }, // wxCURSOR_HAND
-        {  true, IDC_IBEAM                   }, // wxCURSOR_IBEAM
-        {  true, IDC_ARROW                   }, // wxCURSOR_LEFT_BUTTON
-        { false, _T("wxCURSOR_MAGNIFIER")    }, // wxCURSOR_MAGNIFIER
-        {  true, IDC_ARROW                   }, // wxCURSOR_MIDDLE_BUTTON
-        {  true, IDC_NO                      }, // wxCURSOR_NO_ENTRY
-        { false, _T("wxCURSOR_PAINT_BRUSH")  }, // wxCURSOR_PAINT_BRUSH
-        { false, _T("wxCURSOR_PENCIL")       }, // wxCURSOR_PENCIL
-        { false, _T("wxCURSOR_POINT_LEFT")   }, // wxCURSOR_POINT_LEFT
-        { false, _T("wxCURSOR_POINT_RIGHT")  }, // wxCURSOR_POINT_RIGHT
-        {  true, IDC_HELP                    }, // wxCURSOR_QUESTION_ARROW
-        {  true, IDC_ARROW                   }, // wxCURSOR_RIGHT_BUTTON
-        {  true, IDC_SIZENESW                }, // wxCURSOR_SIZENESW
-        {  true, IDC_SIZENS                  }, // wxCURSOR_SIZENS
-        {  true, IDC_SIZENWSE                }, // wxCURSOR_SIZENWSE
-        {  true, IDC_SIZEWE                  }, // wxCURSOR_SIZEWE
-        {  true, IDC_SIZEALL                 }, // wxCURSOR_SIZING
-        { false, _T("wxCURSOR_SPRAYCAN")     }, // wxCURSOR_SPRAYCAN
-        {  true, IDC_WAIT                    }, // wxCURSOR_WAIT
-        {  true, IDC_WAIT                    }, // wxCURSOR_WATCH
-        { false, _T("wxCURSOR_BLANK")        }, // wxCURSOR_BLANK
+        { false, _T("WXCURSOR_RIGHT_ARROW")  }, // wxCURSOR_RIGHT_ARROW
+        { false, _T("WXCURSOR_BULLSEYE")     }, // wxCURSOR_BULLSEYE
+        {  true, IDC_ARROW                   }, // WXCURSOR_CHAR
+        {  true, IDC_CROSS                   }, // WXCURSOR_CROSS
+        { false, _T("WXCURSOR_HAND")         }, // wxCURSOR_HAND
+        {  true, IDC_IBEAM                   }, // WXCURSOR_IBEAM
+        {  true, IDC_ARROW                   }, // WXCURSOR_LEFT_BUTTON
+        { false, _T("WXCURSOR_MAGNIFIER")    }, // wxCURSOR_MAGNIFIER
+        {  true, IDC_ARROW                   }, // WXCURSOR_MIDDLE_BUTTON
+        {  true, IDC_NO                      }, // WXCURSOR_NO_ENTRY
+        { false, _T("WXCURSOR_PBRUSH")       }, // wxCURSOR_PAINT_BRUSH
+        { false, _T("WXCURSOR_PENCIL")       }, // wxCURSOR_PENCIL
+        { false, _T("WXCURSOR_PLEFT")        }, // wxCURSOR_POINT_LEFT
+        { false, _T("WXCURSOR_PRIGHT")       }, // wxCURSOR_POINT_RIGHT
+        {  true, IDC_HELP                    }, // WXCURSOR_QUESTION_ARROW
+        {  true, IDC_ARROW                   }, // WXCURSOR_RIGHT_BUTTON
+        {  true, IDC_SIZENESW                }, // WXCURSOR_SIZENESW
+        {  true, IDC_SIZENS                  }, // WXCURSOR_SIZENS
+        {  true, IDC_SIZENWSE                }, // WXCURSOR_SIZENWSE
+        {  true, IDC_SIZEWE                  }, // WXCURSOR_SIZEWE
+        {  true, IDC_SIZEALL                 }, // WXCURSOR_SIZING
+        { false, _T("WXCURSOR_PBRUSH")       }, // wxCURSOR_SPRAYCAN
+        {  true, IDC_WAIT                    }, // WXCURSOR_WAIT
+        { false, _T("WXCURSOR_WATCH")        }, // WXCURSOR_WATCH
+        { false, _T("WXCURSOR_BLANK")        }, // wxCURSOR_BLANK
         {  true, IDC_APPSTARTING             }, // wxCURSOR_ARROWWAIT
 
         // no entry for wxCURSOR_MAX