Add wxBITMAP_PNG() macro similar to wxBITMAP() but for PNG images.
Just as wxBITMAP() provides a portable way of loading bitmaps from either Windows BMP resources or embedded XPM data depending on the platform, wxBITMAP_PNG() hides the difference between loading bitmaps from PNG resources under Windows and embedded PNG data elsewhere. Also add wxBITMAP_PNG_FROM_DATA() macro which always loads PNG data from memory: it's needed anyhow as part of wxBITMAP_PNG() implementation and some people may prefer to always use it under all platforms. Finally modify the image sample to demonstrate loading PNG images from both resources and memory. This involved creation of a new Windows .rc file for it and copying its data files to Resources bundle directory under OS X. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72477 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -39,6 +39,18 @@
|
||||
#include "wx/msw/dib.h"
|
||||
#endif
|
||||
|
||||
// By default, use PNG resource handler if we can, i.e. have support for
|
||||
// loading PNG images in the library. This symbol could be predefined as 0 to
|
||||
// avoid doing this if anybody ever needs to do it for some reason.
|
||||
#if !defined(wxUSE_PNG_RESOURCE_HANDLER) && wxUSE_LIBPNG && wxUSE_IMAGE
|
||||
#define wxUSE_PNG_RESOURCE_HANDLER 1
|
||||
#endif
|
||||
|
||||
#if wxUSE_PNG_RESOURCE_HANDLER
|
||||
#include "wx/image.h"
|
||||
#include "wx/utils.h" // For wxLoadUserResource()
|
||||
#endif
|
||||
|
||||
#ifdef __WXWINCE__
|
||||
#include <winreg.h>
|
||||
#include <shellapi.h>
|
||||
@@ -173,6 +185,27 @@ private:
|
||||
DECLARE_DYNAMIC_CLASS(wxICOResourceHandler)
|
||||
};
|
||||
|
||||
#if wxUSE_PNG_RESOURCE_HANDLER
|
||||
|
||||
class WXDLLEXPORT wxPNGResourceHandler : public wxBitmapHandler
|
||||
{
|
||||
public:
|
||||
wxPNGResourceHandler() : wxBitmapHandler(wxS("Windows PNG resource"),
|
||||
wxString(),
|
||||
wxBITMAP_TYPE_PNG_RESOURCE)
|
||||
{
|
||||
}
|
||||
|
||||
virtual bool LoadFile(wxBitmap *bitmap,
|
||||
const wxString& name, wxBitmapType flags,
|
||||
int desiredWidth, int desiredHeight);
|
||||
|
||||
private:
|
||||
wxDECLARE_DYNAMIC_CLASS(wxPNGResourceHandler);
|
||||
};
|
||||
|
||||
#endif // wxUSE_PNG_RESOURCE_HANDLER
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxWin macros
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -181,6 +214,9 @@ IMPLEMENT_DYNAMIC_CLASS(wxBMPFileHandler, wxBitmapHandler)
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxBMPResourceHandler, wxBitmapHandler)
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxICOFileHandler, wxObject)
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxICOResourceHandler, wxObject)
|
||||
#if wxUSE_PNG_RESOURCE_HANDLER
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxPNGResourceHandler, wxBitmapHandler)
|
||||
#endif // wxUSE_PNG_RESOURCE_HANDLER
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// private functions
|
||||
@@ -306,8 +342,11 @@ void wxGDIImage::InitStandardHandlers()
|
||||
#ifndef __WXMICROWIN__
|
||||
AddHandler(new wxBMPResourceHandler);
|
||||
AddHandler(new wxBMPFileHandler);
|
||||
AddHandler(new wxICOResourceHandler);
|
||||
AddHandler(new wxICOFileHandler);
|
||||
AddHandler(new wxICOResourceHandler);
|
||||
#if wxUSE_PNG_RESOURCE_HANDLER
|
||||
AddHandler(new wxPNGResourceHandler);
|
||||
#endif // wxUSE_PNG_RESOURCE_HANDLER
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -562,6 +601,55 @@ bool wxICOResourceHandler::LoadIcon(wxIcon *icon,
|
||||
return icon->IsOk();
|
||||
}
|
||||
|
||||
#if wxUSE_PNG_RESOURCE_HANDLER
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// PNG handler
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
bool wxPNGResourceHandler::LoadFile(wxBitmap *bitmap,
|
||||
const wxString& name,
|
||||
wxBitmapType WXUNUSED(flags),
|
||||
int WXUNUSED(desiredWidth),
|
||||
int WXUNUSED(desiredHeight))
|
||||
{
|
||||
const void* pngData = NULL;
|
||||
size_t pngSize = 0;
|
||||
|
||||
// Currently we hardcode RCDATA resource type as this is what is usually
|
||||
// used for the embedded images. We could allow specifying the type as part
|
||||
// of the name in the future (e.g. "type:name" or something like this) if
|
||||
// really needed.
|
||||
if ( !wxLoadUserResource(&pngData, &pngSize,
|
||||
name,
|
||||
RT_RCDATA,
|
||||
wxGetInstance()) )
|
||||
{
|
||||
// Notice that this message is not translated because only the
|
||||
// programmer (and not the end user) can make any use of it.
|
||||
wxLogError(wxS("Bitmap in PNG format \"%s\" not found, check ")
|
||||
wxS("that the resource file contains \"RCDATA\" ")
|
||||
wxS("resource with this name."),
|
||||
name);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
*bitmap = wxBitmap::NewFromPNGData(pngData, pngSize);
|
||||
if ( !bitmap->IsOk() )
|
||||
{
|
||||
wxLogError(wxS("Couldn't load resource bitmap \"%s\" as a PNG. "),
|
||||
wxS("Have you registered PNG image handler?"),
|
||||
name);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif // wxUSE_PNG_RESOURCE_HANDLER
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// private functions
|
||||
// ----------------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user