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