]> git.saurik.com Git - wxWidgets.git/commitdiff
Use bitmaps from resources by default in wxGTK under Windows.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 30 Jun 2012 16:33:23 +0000 (16:33 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 30 Jun 2012 16:33:23 +0000 (16:33 +0000)
Use wxBITMAP_TYPE_{BMP,CUR,ICON}_RESOURCE by default under Windows, even for
non-wxMSW ports.

Also allow loading wxImage from resources in all ports under MSW as a side
effect of this change.

Closes #14425.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71889 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/bitmap.h
include/wx/cursor.h
include/wx/gdicmn.h
include/wx/icon.h
src/common/image.cpp

index ea2322597ffd7aab349a637334ab722c256ef6b4..baf02d10ad9735caf56b07a3663a89fbca8047e1 100644 (file)
@@ -243,7 +243,11 @@ protected:
     #define wxBITMAP_DEFAULT_TYPE    wxBITMAP_TYPE_XPM
     #include "wx/x11/bitmap.h"
 #elif defined(__WXGTK20__)
-    #define wxBITMAP_DEFAULT_TYPE    wxBITMAP_TYPE_XPM
+    #ifdef __WINDOWS__
+        #define wxBITMAP_DEFAULT_TYPE    wxBITMAP_TYPE_BMP_RESOURCE
+    #else
+        #define wxBITMAP_DEFAULT_TYPE    wxBITMAP_TYPE_XPM
+    #endif
     #include "wx/gtk/bitmap.h"
 #elif defined(__WXGTK__)
     #define wxBITMAP_DEFAULT_TYPE    wxBITMAP_TYPE_XPM
index 55b4043cf85355a5f7124acfac33690057c6fc63..66d88994193af05e0bc1cf03ebdc6edb23fbf43a 100644 (file)
@@ -41,7 +41,11 @@ public:
     #define wxCURSOR_DEFAULT_TYPE   wxBITMAP_TYPE_XBM
     #include "wx/motif/cursor.h"
 #elif defined(__WXGTK20__)
-    #define wxCURSOR_DEFAULT_TYPE   wxBITMAP_TYPE_XPM
+    #ifdef __WINDOWS__
+        #define wxCURSOR_DEFAULT_TYPE   wxBITMAP_TYPE_CUR_RESOURCE
+    #else
+        #define wxCURSOR_DEFAULT_TYPE   wxBITMAP_TYPE_XPM
+    #endif
     #include "wx/gtk/cursor.h"
 #elif defined(__WXGTK__)
     #define wxCURSOR_DEFAULT_TYPE   wxBITMAP_TYPE_XPM
index 3ef7d6c98cfd286c62b0a2a0d548f567fd08beeb..e6368d8ff29b72d38a717e34aa5b96b50219d318 100644 (file)
@@ -174,7 +174,7 @@ enum wxStockCursor
     wxIcon *icon = new wxIcon(sample_xpm);    // On wxGTK/Linux
  */
 
-#ifdef __WXMSW__
+#ifdef __WINDOWS__
     // Load from a resource
     #define wxICON(X) wxIcon(wxT(#X))
 #elif defined(__WXPM__)
@@ -204,7 +204,7 @@ enum wxStockCursor
    under Unix bitmaps live in XPMs and under Windows they're in ressources.
  */
 
-#if defined(__WXMSW__) || defined(__WXPM__)
+#if defined(__WINDOWS__) || defined(__WXPM__)
     #define wxBITMAP(name) wxBitmap(wxT(#name), wxBITMAP_TYPE_BMP_RESOURCE)
 #elif defined(__WXGTK__)   || \
       defined(__WXMOTIF__) || \
index 3b7b9b20a53ca9a68cf70fee771c133afab05585..5eebb3f38e0d1286879112f291d23817ca60c85d 100644 (file)
   #define wxICON_DEFAULT_TYPE   wxBITMAP_TYPE_XPM
   #include "wx/motif/icon.h"
 #elif defined(__WXGTK20__)
-  #define wxICON_DEFAULT_TYPE   wxBITMAP_TYPE_XPM
+  #ifdef __WINDOWS__
+    #define wxICON_DEFAULT_TYPE   wxBITMAP_TYPE_ICO_RESOURCE
+  #else
+    #define wxICON_DEFAULT_TYPE   wxBITMAP_TYPE_XPM
+  #endif
   #include "wx/generic/icon.h"
 #elif defined(__WXGTK__)
   #define wxICON_DEFAULT_TYPE   wxBITMAP_TYPE_XPM
index ef7fb58dd9f5a96467d9b96315878263345709f8..a3a5f0ada6377f4dbd84b89afec7ba1a5d85dd24 100644 (file)
@@ -2235,10 +2235,102 @@ bool wxImage::HasOption(const wxString& name) const
 // image I/O
 // ----------------------------------------------------------------------------
 
-bool wxImage::LoadFile( const wxString& WXUNUSED_UNLESS_STREAMS(filename),
-                        wxBitmapType WXUNUSED_UNLESS_STREAMS(type),
+// Under Windows we can load wxImage not only from files but also from
+// resources.
+#if defined(__WINDOWS__) && wxUSE_WXDIB && wxUSE_IMAGE
+    #define HAS_LOAD_FROM_RESOURCE
+#endif
+
+#ifdef HAS_LOAD_FROM_RESOURCE
+
+#include "wx/msw/dib.h"
+#include "wx/msw/private.h"
+
+static wxImage LoadImageFromResource(const wxString &name, wxBitmapType type)
+{
+    AutoHBITMAP
+        hBitmap,
+        hMask;
+
+    if ( type == wxBITMAP_TYPE_BMP_RESOURCE )
+    {
+        hBitmap = ::LoadBitmap(wxGetInstance(), name.t_str());
+
+        if ( !hBitmap )
+        {
+            wxLogError(_("Failed to load bitmap \"%s\" from resources."), name);
+        }
+    }
+    else if ( type == wxBITMAP_TYPE_ICO_RESOURCE )
+    {
+        const HICON hIcon = ::LoadIcon(wxGetInstance(), name.t_str());
+
+        if ( !hIcon )
+        {
+            wxLogError(_("Failed to load icon \"%s\" from resources."), name);
+        }
+        else
+        {
+            ICONINFO info;
+            if ( !::GetIconInfo(hIcon, &info) )
+            {
+                wxLogLastError(wxT("GetIconInfo"));
+                return wxImage();
+            }
+
+            hBitmap = info.hbmColor;
+            hMask   = info.hbmMask;
+        }
+    }
+    else if ( type == wxBITMAP_TYPE_CUR_RESOURCE )
+    {
+        wxLogDebug(wxS("Loading cursors from resources is not implemented."));
+    }
+    else
+    {
+        wxFAIL_MSG(wxS("Invalid bitmap resource type."));
+    }
+
+    if ( !hBitmap )
+        return wxImage();
+
+    wxImage image = wxDIB(hBitmap).ConvertToImage();
+    if ( hMask )
+    {
+        const wxImage mask = wxDIB(hMask).ConvertToImage();
+        image.SetMaskFromImage(mask, 255, 255, 255);
+    }
+    else
+    {
+        // Light gray colour is a default mask
+        image.SetMaskColour(0xc0, 0xc0, 0xc0);
+    }
+
+    image.InitAlpha();
+
+    return image;
+}
+
+#endif // HAS_LOAD_FROM_RESOURCE
+
+bool wxImage::LoadFile( const wxString& filename,
+                        wxBitmapType type,
                         int WXUNUSED_UNLESS_STREAMS(index) )
 {
+#ifdef HAS_LOAD_FROM_RESOURCE
+    if (   type == wxBITMAP_TYPE_BMP_RESOURCE
+        || type == wxBITMAP_TYPE_ICO_RESOURCE
+        || type == wxBITMAP_TYPE_CUR_RESOURCE)
+    {
+        const wxImage image = ::LoadImageFromResource(filename, type);
+        if ( image.IsOk() )
+        {
+            *this = image;
+            return true;
+        }
+    }
+#endif // HAS_LOAD_FROM_RESOURCE
+
 #if HAS_FILE_STREAMS
     wxImageFileInputStream stream(filename);
     if ( stream.IsOk() )