X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d135b1a5f7d558e80dcde7f61f618dfffc5dac98..8fdbcf4de8eeff67ccfaf3deec833d203f112629:/src/common/bmpbase.cpp?ds=sidebyside diff --git a/src/common/bmpbase.cpp b/src/common/bmpbase.cpp index 09d1261266..46804febbd 100644 --- a/src/common/bmpbase.cpp +++ b/src/common/bmpbase.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: bitmap.cpp +// Name: src/common/bmpbase.cpp // Purpose: wxBitmapBase // Author: VaclavSlavik // Created: 2001/04/11 @@ -8,10 +8,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "bitmapbase.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -19,29 +15,84 @@ #pragma hdrstop #endif -#if defined(__WXMGL__) || defined(__WXMAC__) \ - || defined(__WXMOTIF__) || defined(__WXX11__) - -#include "wx/setup.h" -#include "wx/utils.h" -#include "wx/palette.h" #include "wx/bitmap.h" -#include "wx/icon.h" -#include "wx/log.h" -#include "wx/image.h" -#include "wx/module.h" + +#ifndef WX_PRECOMP + #include "wx/colour.h" + #include "wx/icon.h" + #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 +// ---------------------------------------------------------------------------- + +#if wxUSE_VARIANT +IMPLEMENT_VARIANT_OBJECT_EXPORTED_SHALLOWCMP(wxBitmap,WXDLLEXPORT) +IMPLEMENT_VARIANT_OBJECT_EXPORTED_SHALLOWCMP(wxIcon,WXDLLEXPORT) +#endif + +#if wxUSE_EXTENDED_RTTI +//WX_IMPLEMENT_ANY_VALUE_TYPE(wxAnyValueTypeImpl) +//WX_IMPLEMENT_ANY_VALUE_TYPE(wxAnyValueTypeImpl) +#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 +// ---------------------------------------------------------------------------- + +#if wxUSE_BITMAP_BASE + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/utils.h" + #include "wx/palette.h" + #include "wx/module.h" +#endif // WX_PRECOMP + IMPLEMENT_ABSTRACT_CLASS(wxBitmapBase, wxGDIObject) -IMPLEMENT_ABSTRACT_CLASS(wxBitmapHandlerBase,wxObject) +IMPLEMENT_ABSTRACT_CLASS(wxBitmapHandler, wxObject) wxList wxBitmapBase::sm_handlers; -void wxBitmapBase::AddHandler(wxBitmapHandlerBase *handler) +void wxBitmapBase::AddHandler(wxBitmapHandler *handler) { sm_handlers.Append(handler); } -void wxBitmapBase::InsertHandler(wxBitmapHandlerBase *handler) +void wxBitmapBase::InsertHandler(wxBitmapHandler *handler) { sm_handlers.Insert(handler); } @@ -52,15 +103,15 @@ bool wxBitmapBase::RemoveHandler(const wxString& name) if ( handler ) { sm_handlers.DeleteObject(handler); - return TRUE; + return true; } else - return FALSE; + return false; } wxBitmapHandler *wxBitmapBase::FindHandler(const wxString& name) { - wxList::Node *node = sm_handlers.GetFirst(); + wxList::compatibility_iterator node = sm_handlers.GetFirst(); while ( node ) { wxBitmapHandler *handler = (wxBitmapHandler *)node->GetData(); @@ -73,12 +124,12 @@ wxBitmapHandler *wxBitmapBase::FindHandler(const wxString& name) wxBitmapHandler *wxBitmapBase::FindHandler(const wxString& extension, wxBitmapType bitmapType) { - wxList::Node *node = sm_handlers.GetFirst(); + wxList::compatibility_iterator node = sm_handlers.GetFirst(); while ( node ) { wxBitmapHandler *handler = (wxBitmapHandler *)node->GetData(); if ( handler->GetExtension() == extension && - (bitmapType == -1 || handler->GetType() == bitmapType) ) + (bitmapType == wxBITMAP_TYPE_ANY || handler->GetType() == bitmapType) ) return handler; node = node->GetNext(); } @@ -87,7 +138,7 @@ wxBitmapHandler *wxBitmapBase::FindHandler(const wxString& extension, wxBitmapTy wxBitmapHandler *wxBitmapBase::FindHandler(wxBitmapType bitmapType) { - wxList::Node *node = sm_handlers.GetFirst(); + wxList::compatibility_iterator node = sm_handlers.GetFirst(); while ( node ) { wxBitmapHandler *handler = (wxBitmapHandler *)node->GetData(); @@ -100,13 +151,13 @@ wxBitmapHandler *wxBitmapBase::FindHandler(wxBitmapType bitmapType) void wxBitmapBase::CleanUpHandlers() { - wxList::Node *node = sm_handlers.GetFirst(); + wxList::compatibility_iterator node = sm_handlers.GetFirst(); while ( node ) { wxBitmapHandler *handler = (wxBitmapHandler *)node->GetData(); - wxList::Node *next = node->GetNext(); + wxList::compatibility_iterator next = node->GetNext(); delete handler; - delete node; + sm_handlers.Erase(node); node = next; } } @@ -116,11 +167,66 @@ class wxBitmapBaseModule: public wxModule DECLARE_DYNAMIC_CLASS(wxBitmapBaseModule) public: wxBitmapBaseModule() {} - bool OnInit() { wxBitmap::InitStandardHandlers(); return TRUE; }; - void OnExit() { wxBitmap::CleanUpHandlers(); }; + bool OnInit() { wxBitmap::InitStandardHandlers(); return true; } + void OnExit() { wxBitmap::CleanUpHandlers(); } }; IMPLEMENT_DYNAMIC_CLASS(wxBitmapBaseModule, wxModule) -#endif // defined(__WXMGL__) || defined(__WXMAC__) || defined(__WXCOCOA__) || defined(__WXMOTIF__) || defined(__WXX11__) +#endif // wxUSE_BITMAP_BASE + +// ---------------------------------------------------------------------------- +// wxBitmap common +// ---------------------------------------------------------------------------- + +#if !(defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXX11__)) + +wxBitmap::wxBitmap(const char* const* bits) +{ + wxCHECK2_MSG(bits != NULL, return, wxT("invalid bitmap data")); + +#if wxUSE_IMAGE && wxUSE_XPM + wxImage image(bits); + wxCHECK2_MSG(image.IsOk(), return, wxT("invalid bitmap data")); + + *this = wxBitmap(image); +#else + wxFAIL_MSG(wxT("creating bitmaps from XPMs not supported")); +#endif // wxUSE_IMAGE && wxUSE_XPM +} +#endif // !(defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXX11__)) + +// ---------------------------------------------------------------------------- +// wxMaskBase +// ---------------------------------------------------------------------------- + +bool wxMaskBase::Create(const wxBitmap& bitmap, const wxColour& colour) +{ + FreeData(); + + return InitFromColour(bitmap, colour); +} + +#if wxUSE_PALETTE + +bool wxMaskBase::Create(const wxBitmap& bitmap, int paletteIndex) +{ + wxPalette *pal = bitmap.GetPalette(); + + wxCHECK_MSG( pal, false, + wxT("Cannot create mask from palette index of a bitmap without palette") ); + + unsigned char r,g,b; + pal->GetRGB(paletteIndex, &r, &g, &b); + return Create(bitmap, wxColour(r, g, b)); +} + +#endif // wxUSE_PALETTE + +bool wxMaskBase::Create(const wxBitmap& bitmap) +{ + FreeData(); + + return InitFromMonoBitmap(bitmap); +}