]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/bitmap.cpp
Minor corrections to native renderer. I also corrected
[wxWidgets.git] / src / msw / bitmap.cpp
index e41a8cf1974d437ebafdeb74f59762905e266818..ebcaac16529ae4a744cd39442e198e1c821536b5 100644 (file)
@@ -1,5 +1,5 @@
 ////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////
-// Name:        bitmap.cpp
+// Name:        src/msw/bitmap.cpp
 // Purpose:     wxBitmap
 // Author:      Julian Smart
 // Modified by:
 // Purpose:     wxBitmap
 // Author:      Julian Smart
 // Modified by:
 // headers
 // ----------------------------------------------------------------------------
 
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "bitmap.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
@@ -245,12 +241,6 @@ void wxBitmapRefData::Free()
 // wxBitmap creation
 // ----------------------------------------------------------------------------
 
 // wxBitmap creation
 // ----------------------------------------------------------------------------
 
-// this function should be called from all wxBitmap ctors
-void wxBitmap::Init()
-{
-    // m_refData = NULL; done in the base class ctor
-}
-
 wxGDIImageRefData *wxBitmap::CreateData() const
 {
     return new wxBitmapRefData;
 wxGDIImageRefData *wxBitmap::CreateData() const
 {
     return new wxBitmapRefData;
@@ -420,8 +410,6 @@ wxBitmap::~wxBitmap()
 
 wxBitmap::wxBitmap(const char bits[], int width, int height, int depth)
 {
 
 wxBitmap::wxBitmap(const char bits[], int width, int height, int depth)
 {
-    Init();
-
 #ifndef __WXMICROWIN__
     wxBitmapRefData *refData = new wxBitmapRefData;
     m_refData = refData;
 #ifndef __WXMICROWIN__
     wxBitmapRefData *refData = new wxBitmapRefData;
     m_refData = refData;
@@ -487,14 +475,12 @@ wxBitmap::wxBitmap(const char bits[], int width, int height, int depth)
 // Create from XPM data
 bool wxBitmap::CreateFromXpm(const char **data)
 {
 // Create from XPM data
 bool wxBitmap::CreateFromXpm(const char **data)
 {
-#if wxUSE_IMAGE && wxUSE_XPM
-    Init();
-
-    wxCHECK_MSG( data != NULL, false, wxT("invalid bitmap data") )
+#if wxUSE_IMAGE && wxUSE_XPM && wxUSE_WXDIB
+    wxCHECK_MSG( data != NULL, false, wxT("invalid bitmap data") );
 
     wxXPMDecoder decoder;
     wxImage img = decoder.ReadData(data);
 
     wxXPMDecoder decoder;
     wxImage img = decoder.ReadData(data);
-    wxCHECK_MSG( img.Ok(), false, wxT("invalid bitmap data") )
+    wxCHECK_MSG( img.Ok(), false, wxT("invalid bitmap data") );
 
     *this = wxBitmap(img);
     return true;
 
     *this = wxBitmap(img);
     return true;
@@ -506,29 +492,21 @@ bool wxBitmap::CreateFromXpm(const char **data)
 
 wxBitmap::wxBitmap(int w, int h, int d)
 {
 
 wxBitmap::wxBitmap(int w, int h, int d)
 {
-    Init();
-
     (void)Create(w, h, d);
 }
 
 wxBitmap::wxBitmap(int w, int h, const wxDC& dc)
 {
     (void)Create(w, h, d);
 }
 
 wxBitmap::wxBitmap(int w, int h, const wxDC& dc)
 {
-    Init();
-
     (void)Create(w, h, dc);
 }
 
 wxBitmap::wxBitmap(void *data, long type, int width, int height, int depth)
 {
     (void)Create(w, h, dc);
 }
 
 wxBitmap::wxBitmap(void *data, long type, int width, int height, int depth)
 {
-    Init();
-
     (void)Create(data, type, width, height, depth);
 }
 
 wxBitmap::wxBitmap(const wxString& filename, wxBitmapType type)
 {
     (void)Create(data, type, width, height, depth);
 }
 
 wxBitmap::wxBitmap(const wxString& filename, wxBitmapType type)
 {
-    Init();
-
     LoadFile(filename, (int)type);
 }
 
     LoadFile(filename, (int)type);
 }
 
@@ -802,8 +780,6 @@ wxImage wxBitmap::ConvertToImage() const
 // wxImage to/from conversions
 // ----------------------------------------------------------------------------
 
 // wxImage to/from conversions
 // ----------------------------------------------------------------------------
 
-#if wxUSE_WXDIB
-
 bool wxBitmap::CreateFromImage(const wxImage& image, int depth)
 {
     return CreateFromImage(image, depth, 0);
 bool wxBitmap::CreateFromImage(const wxImage& image, int depth)
 {
     return CreateFromImage(image, depth, 0);
@@ -817,6 +793,8 @@ bool wxBitmap::CreateFromImage(const wxImage& image, const wxDC& dc)
     return CreateFromImage(image, -1, dc.GetHDC());
 }
 
     return CreateFromImage(image, -1, dc.GetHDC());
 }
 
+#if wxUSE_WXDIB
+
 bool wxBitmap::CreateFromImage(const wxImage& image, int depth, WXHDC hdc)
 {
     wxCHECK_MSG( image.Ok(), false, wxT("invalid image") );
 bool wxBitmap::CreateFromImage(const wxImage& image, int depth, WXHDC hdc)
 {
     wxCHECK_MSG( image.Ok(), false, wxT("invalid image") );
@@ -831,6 +809,8 @@ bool wxBitmap::CreateFromImage(const wxImage& image, int depth, WXHDC hdc)
     if ( !dib.IsOk() )
         return false;
 
     if ( !dib.IsOk() )
         return false;
 
+    if ( depth == -1 )
+        depth = dib.GetDepth(); // Get depth from image if none specified
 
     // store the bitmap parameters
     wxBitmapRefData *refData = new wxBitmapRefData;
 
     // store the bitmap parameters
     wxBitmapRefData *refData = new wxBitmapRefData;
@@ -853,14 +833,14 @@ bool wxBitmap::CreateFromImage(const wxImage& image, int depth, WXHDC hdc)
         hbitmap = dib.Detach();
 
         refData->m_isDIB = true;
         hbitmap = dib.Detach();
 
         refData->m_isDIB = true;
-        refData->m_depth = dib.GetDepth();
+        refData->m_depth = depth;
     }
 #ifndef ALWAYS_USE_DIB
     else // we need to convert DIB to DDB
     {
         hbitmap = dib.CreateDDB((HDC)hdc);
 
     }
 #ifndef ALWAYS_USE_DIB
     else // we need to convert DIB to DDB
     {
         hbitmap = dib.CreateDDB((HDC)hdc);
 
-        refData->m_depth = depth == -1 ? dib.GetDepth() : depth;
+        refData->m_depth = depth;
     }
 #endif // !ALWAYS_USE_DIB
 
     }
 #endif // !ALWAYS_USE_DIB
 
@@ -994,7 +974,22 @@ wxImage wxBitmap::ConvertToImage() const
     return image;
 }
 
     return image;
 }
 
-#endif // wxUSE_WXDIB
+#else // !wxUSE_WXDIB
+
+bool
+wxBitmap::CreateFromImage(const wxImage& WXUNUSED(image),
+                          int WXUNUSED(depth),
+                          WXHDC WXUNUSED(hdc))
+{
+    return false;
+}
+
+wxImage wxBitmap::ConvertToImage() const
+{
+    return wxImage();
+}
+
+#endif // wxUSE_WXDIB/!wxUSE_WXDIB
 
 #endif // wxUSE_IMAGE
 
 
 #endif // wxUSE_IMAGE
 
@@ -1014,7 +1009,7 @@ bool wxBitmap::LoadFile(const wxString& filename, long type)
 
         return handler->LoadFile(this, filename, type, -1, -1);
     }
 
         return handler->LoadFile(this, filename, type, -1, -1);
     }
-#if wxUSE_IMAGE
+#if wxUSE_IMAGE && wxUSE_WXDIB
     else // no bitmap handler found
     {
         wxImage image;
     else // no bitmap handler found
     {
         wxImage image;
@@ -1058,7 +1053,7 @@ bool wxBitmap::SaveFile(const wxString& filename,
     {
         return handler->SaveFile(this, filename, type, palette);
     }
     {
         return handler->SaveFile(this, filename, type, palette);
     }
-#if wxUSE_IMAGE
+#if wxUSE_IMAGE && wxUSE_WXDIB
     else // no bitmap handler found
     {
         // FIXME what about palette? shouldn't we use it?
     else // no bitmap handler found
     {
         // FIXME what about palette? shouldn't we use it?
@@ -1091,7 +1086,7 @@ wxBitmap wxBitmap::GetSubBitmap( const wxRect& rect) const
 #ifndef __WXMICROWIN__
     // handle alpha channel, if any
     if (HasAlpha())
 #ifndef __WXMICROWIN__
     // handle alpha channel, if any
     if (HasAlpha())
-    ret.UseAlpha();
+        ret.UseAlpha();
 
     // copy bitmap data
     MemoryHDC dcSrc,
 
     // copy bitmap data
     MemoryHDC dcSrc,
@@ -1639,23 +1634,33 @@ HICON wxBitmapToIconOrCursor(const wxBitmap& bmp,
         return 0;
     }
 
         return 0;
     }
 
-    wxMask* mask;
-    wxBitmap newbmp;
     if ( bmp.HasAlpha() )
     {
     if ( bmp.HasAlpha() )
     {
-        // Convert alpha to a mask.  NOTE: It would be better to actually put
-        // the alpha into the icon instead of making a mask, but I don't have
-        // time to figure that out today.
-        wxImage img = bmp.ConvertToImage();
-        img.ConvertAlphaToMask();
-        newbmp = wxBitmap(img);
-        mask = newbmp.GetMask();
-    }
-    else
-    {
-        mask = bmp.GetMask();
+        // Create an empty mask bitmap.
+        // it doesn't seem to work if we mess with the mask at all.
+        HBITMAP hMonoBitmap = CreateBitmap(bmp.GetWidth(),bmp.GetHeight(),1,1,NULL);
+
+        ICONINFO iconInfo;
+        wxZeroMemory(iconInfo);
+        iconInfo.fIcon = iconWanted;  // do we want an icon or a cursor?
+        if ( !iconWanted )
+        {
+            iconInfo.xHotspot = hotSpotX;
+            iconInfo.yHotspot = hotSpotY;
+        }
+
+        iconInfo.hbmMask = hMonoBitmap;
+        iconInfo.hbmColor = GetHbitmapOf(bmp);
+
+        HICON hicon = ::CreateIconIndirect(&iconInfo);
+
+        ::DeleteObject(hMonoBitmap);
+
+        return hicon;
     }
 
     }
 
+    wxMask* mask = bmp.GetMask();
+
     if ( !mask )
     {
         // we must have a mask for an icon, so even if it's probably incorrect,
     if ( !mask )
     {
         // we must have a mask for an icon, so even if it's probably incorrect,