wxVariant support needs wx/icon.h earlier.
[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 #endif // WX_PRECOMP
24
25 // ----------------------------------------------------------------------------
26 // wxVariant support
27 // ----------------------------------------------------------------------------
28
29 #if wxUSE_VARIANT
30 IMPLEMENT_VARIANT_OBJECT_EXPORTED(wxBitmap,WXDLLEXPORT)
31 IMPLEMENT_VARIANT_OBJECT_EXPORTED(wxIcon,WXDLLEXPORT)
32 #endif
33
34 // ----------------------------------------------------------------------------
35 // wxBitmapBase
36 // ----------------------------------------------------------------------------
37
38 #if wxUSE_BITMAP_BASE
39
40 #ifndef WX_PRECOMP
41 #include "wx/log.h"
42 #include "wx/utils.h"
43 #include "wx/palette.h"
44 #include "wx/image.h"
45 #include "wx/module.h"
46 #endif // WX_PRECOMP
47
48
49 IMPLEMENT_ABSTRACT_CLASS(wxBitmapBase, wxGDIObject)
50 IMPLEMENT_ABSTRACT_CLASS(wxBitmapHandlerBase,wxObject)
51
52 wxList wxBitmapBase::sm_handlers;
53
54 void wxBitmapBase::AddHandler(wxBitmapHandlerBase *handler)
55 {
56 sm_handlers.Append(handler);
57 }
58
59 void wxBitmapBase::InsertHandler(wxBitmapHandlerBase *handler)
60 {
61 sm_handlers.Insert(handler);
62 }
63
64 bool wxBitmapBase::RemoveHandler(const wxString& name)
65 {
66 wxBitmapHandler *handler = FindHandler(name);
67 if ( handler )
68 {
69 sm_handlers.DeleteObject(handler);
70 return true;
71 }
72 else
73 return false;
74 }
75
76 wxBitmapHandler *wxBitmapBase::FindHandler(const wxString& name)
77 {
78 wxList::compatibility_iterator node = sm_handlers.GetFirst();
79 while ( node )
80 {
81 wxBitmapHandler *handler = (wxBitmapHandler *)node->GetData();
82 if ( handler->GetName() == name )
83 return handler;
84 node = node->GetNext();
85 }
86 return NULL;
87 }
88
89 wxBitmapHandler *wxBitmapBase::FindHandler(const wxString& extension, wxBitmapType bitmapType)
90 {
91 wxList::compatibility_iterator node = sm_handlers.GetFirst();
92 while ( node )
93 {
94 wxBitmapHandler *handler = (wxBitmapHandler *)node->GetData();
95 if ( handler->GetExtension() == extension &&
96 (bitmapType == wxBITMAP_TYPE_ANY || handler->GetType() == bitmapType) )
97 return handler;
98 node = node->GetNext();
99 }
100 return NULL;
101 }
102
103 wxBitmapHandler *wxBitmapBase::FindHandler(wxBitmapType bitmapType)
104 {
105 wxList::compatibility_iterator node = sm_handlers.GetFirst();
106 while ( node )
107 {
108 wxBitmapHandler *handler = (wxBitmapHandler *)node->GetData();
109 if (handler->GetType() == bitmapType)
110 return handler;
111 node = node->GetNext();
112 }
113 return NULL;
114 }
115
116 void wxBitmapBase::CleanUpHandlers()
117 {
118 wxList::compatibility_iterator node = sm_handlers.GetFirst();
119 while ( node )
120 {
121 wxBitmapHandler *handler = (wxBitmapHandler *)node->GetData();
122 wxList::compatibility_iterator next = node->GetNext();
123 delete handler;
124 sm_handlers.Erase(node);
125 node = next;
126 }
127 }
128
129 class wxBitmapBaseModule: public wxModule
130 {
131 DECLARE_DYNAMIC_CLASS(wxBitmapBaseModule)
132 public:
133 wxBitmapBaseModule() {}
134 bool OnInit() { wxBitmap::InitStandardHandlers(); return true; };
135 void OnExit() { wxBitmap::CleanUpHandlers(); };
136 };
137
138 IMPLEMENT_DYNAMIC_CLASS(wxBitmapBaseModule, wxModule)
139
140 #endif // wxUSE_BITMAP_BASE
141
142 // ----------------------------------------------------------------------------
143 // wxMaskBase
144 // ----------------------------------------------------------------------------
145
146 bool wxMaskBase::Create(const wxBitmap& bitmap, const wxColour& colour)
147 {
148 FreeData();
149
150 return InitFromColour(bitmap, colour);
151 }
152
153 #if wxUSE_PALETTE
154
155 bool wxMaskBase::Create(const wxBitmap& bitmap, int paletteIndex)
156 {
157 wxPalette *pal = bitmap.GetPalette();
158
159 wxCHECK_MSG( pal, false,
160 wxT("Cannot create mask from palette index of a bitmap without palette") );
161
162 unsigned char r,g,b;
163 pal->GetRGB(paletteIndex, &r, &g, &b);
164
165 return Create(bitmap, wxColour(r, g, b));
166 }
167
168 #endif // wxUSE_PALETTE
169
170 bool wxMaskBase::Create(const wxBitmap& bitmap)
171 {
172 FreeData();
173
174 return InitFromMonoBitmap(bitmap);
175 }