fixing naming to GetScaleFactor, adding default Create with a dc parameter
[wxWidgets.git] / src / common / bmpbase.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/common/bmpbase.cpp
3 // Purpose: wxBitmapBase
4 // Author: VaclavSlavik
5 // Created: 2001/04/11
6 // RCS-ID: $Id$
7 // Copyright: (c) 2001, Vaclav Slavik
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11 // For compilers that support precompilation, includes "wx.h".
12 #include "wx/wxprec.h"
13
14 #ifdef __BORLANDC__
15 #pragma hdrstop
16 #endif
17
18 #include "wx/bitmap.h"
19
20 #ifndef WX_PRECOMP
21 #include "wx/colour.h"
22 #include "wx/icon.h"
23 #include "wx/image.h"
24 #endif // WX_PRECOMP
25
26 #if wxUSE_IMAGE && wxUSE_LIBPNG && wxUSE_STREAMS
27 #define wxHAS_PNG_LOAD
28
29 #include "wx/mstream.h"
30 #endif
31
32 // ----------------------------------------------------------------------------
33 // wxVariant support
34 // ----------------------------------------------------------------------------
35
36 #if wxUSE_VARIANT
37 IMPLEMENT_VARIANT_OBJECT_EXPORTED_SHALLOWCMP(wxBitmap,WXDLLEXPORT)
38 IMPLEMENT_VARIANT_OBJECT_EXPORTED_SHALLOWCMP(wxIcon,WXDLLEXPORT)
39 #endif
40
41 #if wxUSE_EXTENDED_RTTI
42 //WX_IMPLEMENT_ANY_VALUE_TYPE(wxAnyValueTypeImpl<wxBitmap>)
43 //WX_IMPLEMENT_ANY_VALUE_TYPE(wxAnyValueTypeImpl<wxIcon>)
44 #endif
45
46 // ----------------------------------------------------------------------------
47 // wxBitmapHelpers
48 // ----------------------------------------------------------------------------
49
50 // wxOSX has a native version and doesn't use this one.
51
52 #ifndef __WXOSX__
53
54 /* static */
55 wxBitmap wxBitmapHelpers::NewFromPNGData(const void* data, size_t size)
56 {
57 wxBitmap bitmap;
58
59 #ifdef wxHAS_PNG_LOAD
60 wxMemoryInputStream is(data, size);
61 wxImage image(is, wxBITMAP_TYPE_PNG);
62 if ( image.IsOk() )
63 bitmap = wxBitmap(image);
64 #endif // wxHAS_PNG_LOAD
65
66 return bitmap;
67 }
68
69 #endif // !__WXOSX__
70
71 // ----------------------------------------------------------------------------
72 // wxBitmapBase
73 // ----------------------------------------------------------------------------
74
75 #if wxUSE_BITMAP_BASE
76
77 #ifndef WX_PRECOMP
78 #include "wx/log.h"
79 #include "wx/utils.h"
80 #include "wx/palette.h"
81 #include "wx/module.h"
82 #endif // WX_PRECOMP
83
84
85 IMPLEMENT_ABSTRACT_CLASS(wxBitmapBase, wxGDIObject)
86 IMPLEMENT_ABSTRACT_CLASS(wxBitmapHandler, wxObject)
87
88 wxList wxBitmapBase::sm_handlers;
89
90 bool wxBitmapBase::Create(int width, int height, const wxDC& WXUNUSED(dc))
91 {
92 return Create(width,height);
93 }
94
95 void wxBitmapBase::AddHandler(wxBitmapHandler *handler)
96 {
97 sm_handlers.Append(handler);
98 }
99
100 void wxBitmapBase::InsertHandler(wxBitmapHandler *handler)
101 {
102 sm_handlers.Insert(handler);
103 }
104
105 bool wxBitmapBase::RemoveHandler(const wxString& name)
106 {
107 wxBitmapHandler *handler = FindHandler(name);
108 if ( handler )
109 {
110 sm_handlers.DeleteObject(handler);
111 return true;
112 }
113 else
114 return false;
115 }
116
117 wxBitmapHandler *wxBitmapBase::FindHandler(const wxString& name)
118 {
119 wxList::compatibility_iterator node = sm_handlers.GetFirst();
120 while ( node )
121 {
122 wxBitmapHandler *handler = (wxBitmapHandler *)node->GetData();
123 if ( handler->GetName() == name )
124 return handler;
125 node = node->GetNext();
126 }
127 return NULL;
128 }
129
130 wxBitmapHandler *wxBitmapBase::FindHandler(const wxString& extension, wxBitmapType bitmapType)
131 {
132 wxList::compatibility_iterator node = sm_handlers.GetFirst();
133 while ( node )
134 {
135 wxBitmapHandler *handler = (wxBitmapHandler *)node->GetData();
136 if ( handler->GetExtension() == extension &&
137 (bitmapType == wxBITMAP_TYPE_ANY || handler->GetType() == bitmapType) )
138 return handler;
139 node = node->GetNext();
140 }
141 return NULL;
142 }
143
144 wxBitmapHandler *wxBitmapBase::FindHandler(wxBitmapType bitmapType)
145 {
146 wxList::compatibility_iterator node = sm_handlers.GetFirst();
147 while ( node )
148 {
149 wxBitmapHandler *handler = (wxBitmapHandler *)node->GetData();
150 if (handler->GetType() == bitmapType)
151 return handler;
152 node = node->GetNext();
153 }
154 return NULL;
155 }
156
157 void wxBitmapBase::CleanUpHandlers()
158 {
159 wxList::compatibility_iterator node = sm_handlers.GetFirst();
160 while ( node )
161 {
162 wxBitmapHandler *handler = (wxBitmapHandler *)node->GetData();
163 wxList::compatibility_iterator next = node->GetNext();
164 delete handler;
165 sm_handlers.Erase(node);
166 node = next;
167 }
168 }
169
170 class wxBitmapBaseModule: public wxModule
171 {
172 DECLARE_DYNAMIC_CLASS(wxBitmapBaseModule)
173 public:
174 wxBitmapBaseModule() {}
175 bool OnInit() { wxBitmap::InitStandardHandlers(); return true; }
176 void OnExit() { wxBitmap::CleanUpHandlers(); }
177 };
178
179 IMPLEMENT_DYNAMIC_CLASS(wxBitmapBaseModule, wxModule)
180
181 #endif // wxUSE_BITMAP_BASE
182
183 // ----------------------------------------------------------------------------
184 // wxBitmap common
185 // ----------------------------------------------------------------------------
186
187 #if !(defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXX11__))
188
189 wxBitmap::wxBitmap(const char* const* bits)
190 {
191 wxCHECK2_MSG(bits != NULL, return, wxT("invalid bitmap data"));
192
193 #if wxUSE_IMAGE && wxUSE_XPM
194 wxImage image(bits);
195 wxCHECK2_MSG(image.IsOk(), return, wxT("invalid bitmap data"));
196
197 *this = wxBitmap(image);
198 #else
199 wxFAIL_MSG(wxT("creating bitmaps from XPMs not supported"));
200 #endif // wxUSE_IMAGE && wxUSE_XPM
201 }
202 #endif // !(defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXX11__))
203
204 // ----------------------------------------------------------------------------
205 // wxMaskBase
206 // ----------------------------------------------------------------------------
207
208 bool wxMaskBase::Create(const wxBitmap& bitmap, const wxColour& colour)
209 {
210 FreeData();
211
212 return InitFromColour(bitmap, colour);
213 }
214
215 #if wxUSE_PALETTE
216
217 bool wxMaskBase::Create(const wxBitmap& bitmap, int paletteIndex)
218 {
219 wxPalette *pal = bitmap.GetPalette();
220
221 wxCHECK_MSG( pal, false,
222 wxT("Cannot create mask from palette index of a bitmap without palette") );
223
224 unsigned char r,g,b;
225 pal->GetRGB(paletteIndex, &r, &g, &b);
226
227 return Create(bitmap, wxColour(r, g, b));
228 }
229
230 #endif // wxUSE_PALETTE
231
232 bool wxMaskBase::Create(const wxBitmap& bitmap)
233 {
234 FreeData();
235
236 return InitFromMonoBitmap(bitmap);
237 }