]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/gdiimage.cpp
Fixed a typo in makefile.vc, updated version numbers in templates
[wxWidgets.git] / src / msw / gdiimage.cpp
index 64ad5b730ca56b7590a8cd23b56b96967d3d5411..1b5000fa5ea694085a9c68c9b9f04565407c7165 100644 (file)
@@ -175,16 +175,15 @@ private:
 // wxWin macros
 // ----------------------------------------------------------------------------
 
-    IMPLEMENT_DYNAMIC_CLASS(wxBMPFileHandler, wxBitmapHandler)
-    IMPLEMENT_DYNAMIC_CLASS(wxBMPResourceHandler, wxBitmapHandler)
-    IMPLEMENT_DYNAMIC_CLASS(wxICOFileHandler, wxGDIImageHandler)
-    IMPLEMENT_DYNAMIC_CLASS(wxICOResourceHandler, wxGDIImageHandler)
+IMPLEMENT_DYNAMIC_CLASS(wxBMPFileHandler, wxBitmapHandler)
+IMPLEMENT_DYNAMIC_CLASS(wxBMPResourceHandler, wxBitmapHandler)
+IMPLEMENT_DYNAMIC_CLASS(wxICOFileHandler, wxObject)
+IMPLEMENT_DYNAMIC_CLASS(wxICOResourceHandler, wxObject)
 
 // ----------------------------------------------------------------------------
 // private functions
 // ----------------------------------------------------------------------------
 
-static wxSize GetHiconSize(HICON hicon);
 #endif
     // __MICROWIN__
 
@@ -209,7 +208,7 @@ bool wxGDIImage::FreeResource(bool WXUNUSED(force))
     return TRUE;
 }
 
-WXHANDLE wxGDIImage::GetResourceHandle()
+WXHANDLE wxGDIImage::GetResourceHandle() const
 {
     return GetHandle();
 }
@@ -355,6 +354,8 @@ bool wxBMPFileHandler::LoadFile(wxBitmap *bitmap,
 #if wxUSE_IMAGE_LOADING_IN_MSW
     wxPalette *palette = NULL;
     bool success = wxLoadIntoBitmap(WXSTRINGCAST name, bitmap, &palette) != 0;
+
+#if wxUSE_PALETTE
     if ( success && palette )
     {
         bitmap->SetPalette(*palette);
@@ -362,6 +363,7 @@ bool wxBMPFileHandler::LoadFile(wxBitmap *bitmap,
 
     // it was copied by the bitmap if it was loaded successfully
     delete palette;
+#endif // wxUSE_PALETTE
 
     return success;
 #else
@@ -375,9 +377,15 @@ bool wxBMPFileHandler::SaveFile(wxBitmap *bitmap,
                                 const wxPalette *pal)
 {
 #if wxUSE_IMAGE_LOADING_IN_MSW
+
+#if wxUSE_PALETTE
     wxPalette *actualPalette = (wxPalette *)pal;
     if ( !actualPalette )
         actualPalette = bitmap->GetPalette();
+#else
+    wxPalette *actualPalette = NULL;
+#endif // wxUSE_PALETTE
+
     return wxSaveBitmap(WXSTRINGCAST name, bitmap, actualPalette) != 0;
 #else
     return FALSE;
@@ -416,6 +424,27 @@ bool wxICOFileHandler::LoadIcon(wxIcon *icon,
         nameReal = name.BeforeLast(wxT(';'));
     }
 
+#if 0
+    // If we don't know what size icon we're looking for,
+    // try to find out what's there.
+    // Unfortunately this doesn't work, because ExtractIconEx
+    // will scale the icon to the 'desired' size, even if that
+    // size of icon isn't explicitly stored. So we would have
+    // to parse the icon file outselves.
+    if ( desiredWidth == -1 &&
+         desiredHeight == -1)
+    {
+        // Try loading a large icon first
+        if ( ::ExtractIconEx(nameReal, iconIndex, &hicon, NULL, 1) == 1)
+        {
+        }
+        // Then try loading a small icon
+        else if ( ::ExtractIconEx(nameReal, iconIndex, NULL, &hicon, 1) == 1)
+        {
+        }
+    }
+    else
+#endif
     // were we asked for a large icon?
     if ( desiredWidth == ::GetSystemMetrics(SM_CXICON) &&
          desiredHeight == ::GetSystemMetrics(SM_CYICON) )
@@ -445,8 +474,8 @@ bool wxICOFileHandler::LoadIcon(wxIcon *icon,
 
     if ( !hicon )
     {
-        // take any (the first one) icon from the file by default
-        hicon = ::ExtractIcon(wxGetInstance(), nameReal, 0 /* first */);
+        // take any size icon from the file by index
+        hicon = ::ExtractIcon(wxGetInstance(), nameReal, iconIndex);
     }
 
     if ( !hicon )
@@ -457,7 +486,7 @@ bool wxICOFileHandler::LoadIcon(wxIcon *icon,
         return FALSE;
     }
 
-    size = GetHiconSize(hicon);
+    size = wxGetHiconSize(hicon);
 #else // Win16
     HICON hicon = ReadIconFile((wxChar *)name.c_str(),
                                wxGetInstance(),
@@ -502,6 +531,9 @@ bool wxICOResourceHandler::LoadIcon(wxIcon *icon,
     // try to load the icon from this program first to allow overriding the
     // standard icons (although why one would want to do it considering that
     // we already have wxApp::GetStdIcon() is unclear)
+
+    // note that we can't just always call LoadImage() because it seems to do
+    // some icon rescaling internally which results in very ugly 16x16 icons
 #if defined(__WIN32__) && !defined(__SC__)
     if ( hasSize )
     {
@@ -510,7 +542,7 @@ bool wxICOResourceHandler::LoadIcon(wxIcon *icon,
                                     LR_DEFAULTCOLOR);
     }
     else
-#endif // Win32
+#endif // Win32/!Win32
     {
         hicon = ::LoadIcon(wxGetInstance(), name);
     }
@@ -527,7 +559,7 @@ bool wxICOResourceHandler::LoadIcon(wxIcon *icon,
             { wxT("wxICON_QUESTION"),   IDI_QUESTION    },
             { wxT("wxICON_WARNING"),    IDI_EXCLAMATION },
             { wxT("wxICON_ERROR"),      IDI_HAND        },
-            { wxT("wxICON_INFO"),       IDI_ASTERISK    },
+            { wxT("wxICON_INFORMATION"),       IDI_ASTERISK    },
         };
 
         for ( size_t nIcon = 0; !hicon && nIcon < WXSIZEOF(stdIcons); nIcon++ )
@@ -539,15 +571,9 @@ bool wxICOResourceHandler::LoadIcon(wxIcon *icon,
         }
     }
 
-    wxSize size = GetHiconSize(hicon);
+    wxSize size = wxGetHiconSize(hicon);
     icon->SetSize(size.x, size.y);
 
-    // Override the found values with desired values
-    if ( desiredWidth > -1 && desiredHeight > -1 )
-    {
-        icon->SetSize(desiredWidth, desiredHeight);
-    }
-
     icon->SetHICON((WXHICON)hicon);
 
     return icon->Ok();
@@ -557,7 +583,7 @@ bool wxICOResourceHandler::LoadIcon(wxIcon *icon,
 // private functions
 // ----------------------------------------------------------------------------
 
-static wxSize GetHiconSize(HICON hicon)
+wxSize wxGetHiconSize(HICON hicon)
 {
     wxSize size(32, 32);    // default