]> git.saurik.com Git - wxWidgets.git/commitdiff
Add wxBitmap::NewFromPNGData() for creating bitmaps from PNG data.
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 13 Sep 2012 17:15:00 +0000 (17:15 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 13 Sep 2012 17:15:00 +0000 (17:15 +0000)
This simple function can be used to create a wxBitmap from the raw image data
in PNG format. It is just a thin wrapper around wxImage load functions under
almost all platforms but has two advantages:

1. It can be implemented natively for some platforms (currently only OS X).
2. It can be used in a single expression as it doesn't require creating a
   temporary wxMemoryInputStream and this will be required by wxBITMAP_PNG()
   macro that will be added soon.

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

include/wx/bitmap.h
include/wx/cocoa/bitmap.h
include/wx/msw/bitmap.h
include/wx/os2/bitmap.h
interface/wx/bitmap.h
src/common/bmpbase.cpp
src/osx/core/bitmap.cpp

index baf02d10ad9735caf56b07a3663a89fbca8047e1..82943ca228b8fd930ba9dd9bfdbc07004864ae16 100644 (file)
@@ -83,6 +83,23 @@ protected:
 #define wxBITMAP_SCREEN_DEPTH       (-1)
 
 
+// ----------------------------------------------------------------------------
+// wxBitmapHelpers: container for various bitmap methods common to all ports.
+// ----------------------------------------------------------------------------
+
+// Unfortunately, currently wxBitmap does not inherit from wxBitmapBase on all
+// platforms and this is not easy to fix. So we extract at least some common
+// methods into this class from which both wxBitmapBase (and hase wxBitmap on
+// all platforms where it does inherit from it) and wxBitmap in wxMSW and other
+// exceptional ports (only wxPM and old wxCocoa) inherit.
+class WXDLLIMPEXP_CORE wxBitmapHelpers
+{
+public:
+    // Create a new wxBitmap from the PNG data in the given buffer.
+    static wxBitmap NewFromPNGData(const void* data, size_t size);
+};
+
+
 // All ports except wxMSW and wxOS2 use wxBitmapHandler and wxBitmapBase as
 // base class for wxBitmapHandler; wxMSW and wxOS2 use wxGDIImageHandler as
 // base class since it allows some code reuse there.
@@ -132,12 +149,12 @@ private:
     DECLARE_ABSTRACT_CLASS(wxBitmapHandler)
 };
 
-
 // ----------------------------------------------------------------------------
 // wxBitmap: class which represents platform-dependent bitmap (unlike wxImage)
 // ----------------------------------------------------------------------------
 
-class WXDLLIMPEXP_CORE wxBitmapBase : public wxGDIObject
+class WXDLLIMPEXP_CORE wxBitmapBase : public wxGDIObject,
+                                      public wxBitmapHelpers
 {
 public:
     /*
index 94d7eb3140801c310f1fde5a36cc6c3313616672..59e7bbb732ec205ce10db6f62d1fe1bc09816df4 100644 (file)
@@ -64,7 +64,8 @@ protected:
 // wxBitmap
 // ========================================================================
 
-class WXDLLIMPEXP_CORE wxBitmap: public wxGDIObject
+class WXDLLIMPEXP_CORE wxBitmap: public wxGDIObject,
+                                 public wxBitmapHelpers
 {
 // ------------------------------------------------------------------------
 // initialization
index ce3e841aee8b161e6a1d77af93db4561c39f5f5d..ef2a73fb2798c888e7b10cfe911eaa530e7b992e 100644 (file)
@@ -43,7 +43,8 @@ enum wxBitmapTransparency
 // NOTE: for wxMSW we don't use the wxBitmapBase base class declared in bitmap.h!
 // ----------------------------------------------------------------------------
 
-class WXDLLIMPEXP_CORE wxBitmap : public wxGDIImage
+class WXDLLIMPEXP_CORE wxBitmap : public wxGDIImage,
+                                  public wxBitmapHelpers
 {
 public:
     // default ctor creates an invalid bitmap, you must Create() it later
index 653dd9635a66aea007158ae92aa64d97f1b2d8b4..6069f285807fdd0a220e3b07c0c1d17304223d9f 100644 (file)
@@ -63,7 +63,8 @@ public:
 // wxBitmap: a mono or colour bitmap
 // ----------------------------------------------------------------------------
 
-class WXDLLIMPEXP_CORE wxBitmap : public wxGDIImage
+class WXDLLIMPEXP_CORE wxBitmap : public wxGDIImage,
+                                  public wxBitmapHelpers
 {
 public:
     // default ctor creates an invalid bitmap, you must Create() it later
index 1b185d7f3c90fe9a0d1d43d869fd1e24e1df6c07..9f6c3ffe41c44c3eb15650b17e2716f9f573b670 100644 (file)
@@ -584,6 +584,31 @@ public:
     */
     virtual bool LoadFile(const wxString& name, wxBitmapType type = wxBITMAP_DEFAULT_TYPE);
 
+    /**
+        Loads a bitmap from the memory containing image data in PNG format.
+
+        This helper function provides the simplest way to create a wxBitmap
+        from PNG image data. On most platforms, it's simply a wrapper around
+        wxImage loading functions and so requires the PNG image handler to be
+        registered by either calling wxInitAllImageHandlers() which also
+        registers all the other image formats or including the necessary
+        header:
+        @code
+            #include <wx/imagpng.h>
+        @endcode
+        and calling
+        @code
+            wxImage::AddHandler(new wxPNGHandler);
+        @endcode
+        in your application startup code.
+
+        However under OS X this function uses native image loading and so
+        doesn't require wxWidgets PNG support.
+
+        @since 2.9.5
+     */
+    static wxBitmap NewFromPNGData(const void* data, size_t size);
+
     /**
         Finds the handler with the given name, and removes it.
         The handler is not deleted.
index 34bf85608ed8911b2be3e0a6d818d06f1a0e4a19..46804febbd8436d329f880f9098bb8f17fd92500 100644 (file)
     #include "wx/image.h"
 #endif // WX_PRECOMP
 
+#if wxUSE_IMAGE && wxUSE_LIBPNG && wxUSE_STREAMS
+    #define wxHAS_PNG_LOAD
+
+    #include "wx/mstream.h"
+#endif
+
 // ----------------------------------------------------------------------------
 // wxVariant support
 // ----------------------------------------------------------------------------
@@ -37,6 +43,31 @@ IMPLEMENT_VARIANT_OBJECT_EXPORTED_SHALLOWCMP(wxIcon,WXDLLEXPORT)
 //WX_IMPLEMENT_ANY_VALUE_TYPE(wxAnyValueTypeImpl<wxIcon>)
 #endif
 
+// ----------------------------------------------------------------------------
+// wxBitmapHelpers
+// ----------------------------------------------------------------------------
+
+// wxOSX has a native version and doesn't use this one.
+
+#ifndef __WXOSX__
+
+/* static */
+wxBitmap wxBitmapHelpers::NewFromPNGData(const void* data, size_t size)
+{
+    wxBitmap bitmap;
+
+#ifdef wxHAS_PNG_LOAD
+    wxMemoryInputStream is(data, size);
+    wxImage image(is, wxBITMAP_TYPE_PNG);
+    if ( image.IsOk() )
+        bitmap = wxBitmap(image);
+#endif // wxHAS_PNG_LOAD
+
+    return bitmap;
+}
+
+#endif // !__WXOSX__
+
 // ----------------------------------------------------------------------------
 // wxBitmapBase
 // ----------------------------------------------------------------------------
index b88d13ff95378d16dd39ee45e907ffad18cd7bdd..f6442aa30a68d620a8df2321aae0c1ddd49354df 100644 (file)
@@ -1736,6 +1736,18 @@ bool wxBundleResourceHandler::LoadFile(wxBitmap *bitmap,
     return false ;
 }
 
+/* static */
+wxBitmap wxBitmapHelpers::NewFromPNGData(const void* data, size_t size)
+{
+    wxCFRef<CGDataProviderRef>
+        provider(CGDataProviderCreateWithData(NULL, data, size, NULL) );
+    wxCFRef<CGImageRef>
+        image(CGImageCreateWithPNGDataProvider(provider, NULL, true,
+                                                kCGRenderingIntentDefault));
+
+    return wxBitmap(image);
+}
+
 void wxBitmap::InitStandardHandlers()
 {
 #if wxOSX_USE_COCOA_OR_CARBON