]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/cursor.cpp
cleanup - reformat
[wxWidgets.git] / src / mac / carbon / cursor.cpp
index 8c6d75119728520f69277d94a6f219b282ce79b4..802671928b840ef1e95b4ab1034a8f1fd5a677ad 100644 (file)
@@ -9,10 +9,6 @@
 // Licence:       wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "cursor.h"
-#endif
-
 #include "wx/wxprec.h"
 
 #include "wx/app.h"
@@ -23,9 +19,7 @@
 
 #include "wx/mac/private.h"
 
-#if !USE_SHARED_LIBRARIES
 IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxBitmap)
-#endif
 
 class WXDLLEXPORT wxCursorRefData: public wxBitmapRefData
 {
@@ -240,7 +234,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 +251,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 +291,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 +424,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 +462,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 +472,7 @@ wxCursor::wxCursor(const wxString& cursor_file, long flags, int hotSpotX, int ho
             delete m_refData ;
             CreateFromImage(image) ;
         }
+#endif
     }
 }