1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/msw/bitmap.h
3 // Purpose:     wxBitmap class
4 // Author:      Julian Smart
5 // Modified by:
6 // Created:     01/02/97
7 // RCS-ID:      $Id: bitmap.h,v 1.1 2006/12/02 15:58:29 scara Exp $
8 // Copyright:   (c) Julian Smart
9 // Licence:     wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11 
12 #ifndef _WX_BITMAP_H_
13 #define _WX_BITMAP_H_
14 
15 #ifdef __GNUG__
16     #pragma interface "bitmap.h"
17 #endif
18 
19 #include "wx/msw/gdiimage.h"
20 #include "wx/gdicmn.h"
21 #include "wx/palette.h"
22 
23 class WXDLLEXPORT wxDC;
24 class WXDLLEXPORT wxControl;
25 class WXDLLEXPORT wxBitmap;
26 class WXDLLEXPORT wxBitmapHandler;
27 class WXDLLEXPORT wxIcon;
28 class WXDLLEXPORT wxMask;
29 class WXDLLEXPORT wxCursor;
30 class WXDLLEXPORT wxControl;
31 class WXDLLEXPORT wxImage;
32 class WXDLLEXPORT wxPalette;
33 
34 // ----------------------------------------------------------------------------
35 // Bitmap data
36 //
37 // NB: this class is private, but declared here to make it possible inline
38 //     wxBitmap functions accessing it
39 // ----------------------------------------------------------------------------
40 
41 class WXDLLEXPORT wxBitmapRefData : public wxGDIImageRefData
42 {
43 public:
44     wxBitmapRefData();
~wxBitmapRefData()45     virtual ~wxBitmapRefData() { Free(); }
46 
47     virtual void Free();
48 
49 public:
50     int           m_numColors;
51 #if wxUSE_PALETTE
52     wxPalette     m_bitmapPalette;
53 #endif // wxUSE_PALETTE
54     int           m_quality;
55 
56     // MSW-specific
57     // ------------
58 
59     // this field is solely for error checking: we detect selecting a bitmap
60     // into more than one DC at once or deleting a bitmap still selected into a
61     // DC (both are serious programming errors under Windows)
62     wxDC         *m_selectedInto;
63 
64     // optional mask for transparent drawing
65     wxMask       *m_bitmapMask;
66 };
67 
68 // ----------------------------------------------------------------------------
69 // wxBitmap: a mono or colour bitmap
70 // ----------------------------------------------------------------------------
71 
72 class WXDLLEXPORT wxBitmap : public wxGDIImage
73 {
74 public:
75     // default ctor creates an invalid bitmap, you must Create() it later
wxBitmap()76     wxBitmap() { Init(); }
77 
78     // Copy constructors
wxBitmap(const wxBitmap & bitmap)79     wxBitmap(const wxBitmap& bitmap) { Init(); Ref(bitmap); }
80 
81     // Initialize with raw data
82     wxBitmap(const char bits[], int width, int height, int depth = 1);
83 
84     // Initialize with XPM data
wxBitmap(const char ** data)85     wxBitmap(const char **data) { CreateFromXpm(data); }
wxBitmap(char ** data)86     wxBitmap(char **data) { CreateFromXpm((const char **)data); }
87 
88     // Load a file or resource
89     wxBitmap(const wxString& name, wxBitmapType type = wxBITMAP_TYPE_BMP_RESOURCE);
90 
91     // New constructor for generalised creation from data
92     wxBitmap(void *data, long type, int width, int height, int depth = 1);
93 
94     // If depth is omitted, will create a bitmap compatible with the display
95     wxBitmap(int width, int height, int depth = -1);
96 
97 #if wxUSE_IMAGE
98     // Convert from wxImage:
99     wxBitmap(const wxImage& image, int depth = -1)
100         { (void)CreateFromImage(image, depth); }
101 #endif // wxUSE_IMAGE
102 
103     // we must have this, otherwise icons are silently copied into bitmaps using
104     // the copy ctor but the resulting bitmap is invalid!
wxBitmap(const wxIcon & icon)105     wxBitmap(const wxIcon& icon) { Init(); CopyFromIcon(icon); }
106 
107     wxBitmap& operator=(const wxBitmap& bitmap)
108     {
109         if ( m_refData != bitmap.m_refData )
110             Ref(bitmap);
111         return *this;
112     }
113 
114     wxBitmap& operator=(const wxIcon& icon)
115     {
116         (void)CopyFromIcon(icon);
117 
118         return *this;
119     }
120 
121     wxBitmap& operator=(const wxCursor& cursor)
122     {
123         (void)CopyFromCursor(cursor);
124 
125         return *this;
126     }
127 
128     virtual ~wxBitmap();
129 
130 #if wxUSE_IMAGE
131     wxImage ConvertToImage() const;
132 #endif // wxUSE_IMAGE
133 
134     // get the given part of bitmap
135     wxBitmap GetSubBitmap( const wxRect& rect ) const;
136 
137     // copies the contents and mask of the given (colour) icon to the bitmap
138     bool CopyFromIcon(const wxIcon& icon);
139 
140     // copies the contents and mask of the given cursor to the bitmap
141     bool CopyFromCursor(const wxCursor& cursor);
142 
143     virtual bool Create(int width, int height, int depth = -1);
144     virtual bool Create(void *data, long type, int width, int height, int depth = 1);
145     virtual bool LoadFile(const wxString& name, long type = wxBITMAP_TYPE_BMP_RESOURCE);
146     virtual bool SaveFile(const wxString& name, int type, const wxPalette *cmap = NULL);
147 
GetBitmapData()148     wxBitmapRefData *GetBitmapData() const { return (wxBitmapRefData *)m_refData; }
149 
GetQuality()150     int GetQuality() const { return (GetBitmapData() ? GetBitmapData()->m_quality : 0); }
151     void SetQuality(int q);
152 
153 #if wxUSE_PALETTE
GetPalette()154     wxPalette* GetPalette() const { return (GetBitmapData() ? (& GetBitmapData()->m_bitmapPalette) : (wxPalette*) NULL); }
155     void SetPalette(const wxPalette& palette);
156 #endif // wxUSE_PALETTE
157 
GetMask()158     wxMask *GetMask() const { return (GetBitmapData() ? GetBitmapData()->m_bitmapMask : (wxMask*) NULL); }
159     void SetMask(wxMask *mask) ;
160 
161     bool operator==(const wxBitmap& bitmap) const { return m_refData == bitmap.m_refData; }
162     bool operator!=(const wxBitmap& bitmap) const { return m_refData != bitmap.m_refData; }
163 
164 #if WXWIN_COMPATIBILITY_2
165     void SetOk(bool isOk);
166 #endif // WXWIN_COMPATIBILITY_2
167 
168 #if wxUSE_PALETTE
169 #if WXWIN_COMPATIBILITY
GetColourMap()170     wxPalette *GetColourMap() const { return GetPalette(); }
SetColourMap(wxPalette * cmap)171     void SetColourMap(wxPalette *cmap) { SetPalette(*cmap); };
172 #endif // WXWIN_COMPATIBILITY
173 #endif // wxUSE_PALETTE
174 
175     // Implementation
176 public:
SetHBITMAP(WXHBITMAP bmp)177     void SetHBITMAP(WXHBITMAP bmp) { SetHandle((WXHANDLE)bmp); }
GetHBITMAP()178     WXHBITMAP GetHBITMAP() const { return (WXHBITMAP)GetHandle(); }
179 
SetSelectedInto(wxDC * dc)180     void SetSelectedInto(wxDC *dc) { if (GetBitmapData()) GetBitmapData()->m_selectedInto = dc; }
GetSelectedInto()181     wxDC *GetSelectedInto() const { return (GetBitmapData() ? GetBitmapData()->m_selectedInto : (wxDC*) NULL); }
182 
183     // Creates a bitmap that matches the device context's depth, from an
184     // arbitray bitmap. At present, the original bitmap must have an associated
185     // palette. (TODO: use a default palette if no palette exists.) This
186     // function is necessary for you to Blit an arbitrary bitmap (which may
187     // have the wrong depth). wxDC::SelectObject will compare the depth of the
188     // bitmap with the DC's depth, and create a new bitmap if the depths
189     // differ. Eventually we should perhaps make this a public API function so
190     // that an app can efficiently produce bitmaps of the correct depth. The
191     // Windows solution is to use SetDibBits to blit an arbotrary DIB directly
192     // to a DC, but this is too Windows-specific, hence this solution of
193     // quietly converting the wxBitmap. Contributed by Frederic Villeneuve
194     // <frederic.villeneuve@natinst.com>
195     wxBitmap GetBitmapForDC(wxDC& dc) const;
196 
197 protected:
198     // common part of all ctors
199     void Init();
200 
CreateData()201     virtual wxGDIImageRefData *CreateData() const
202         { return new wxBitmapRefData; }
203 
204     // creates the bitmap from XPM data, supposed to be called from ctor
205     bool CreateFromXpm(const char **bits);
206 
207 #if wxUSE_IMAGE
208     // creates the bitmap from wxImage, supposed to be called from ctor
209     bool CreateFromImage(const wxImage& image, int depth);
210 #endif // wxUSE_IMAGE
211 
212 private:
213 #ifdef __WIN32__
214     // common part of CopyFromIcon/CopyFromCursor for Win32
215     bool CopyFromIconOrCursor(const wxGDIImage& icon);
216 #endif // __WIN32__
217 
218     DECLARE_DYNAMIC_CLASS(wxBitmap)
219 };
220 
221 // ----------------------------------------------------------------------------
222 // wxMask: a mono bitmap used for drawing bitmaps transparently.
223 // ----------------------------------------------------------------------------
224 
225 class WXDLLEXPORT wxMask : public wxObject
226 {
227 public:
228     wxMask();
229 
230     // Construct a mask from a bitmap and a colour indicating the transparent
231     // area
232     wxMask(const wxBitmap& bitmap, const wxColour& colour);
233 
234     // Construct a mask from a bitmap and a palette index indicating the
235     // transparent area
236     wxMask(const wxBitmap& bitmap, int paletteIndex);
237 
238     // Construct a mask from a mono bitmap (copies the bitmap).
239     wxMask(const wxBitmap& bitmap);
240 
241     // construct a mask from the givne bitmap handle
wxMask(WXHBITMAP hbmp)242     wxMask(WXHBITMAP hbmp) { m_maskBitmap = hbmp; }
243 
244     virtual ~wxMask();
245 
246     bool Create(const wxBitmap& bitmap, const wxColour& colour);
247     bool Create(const wxBitmap& bitmap, int paletteIndex);
248     bool Create(const wxBitmap& bitmap);
249 
250     // Implementation
GetMaskBitmap()251     WXHBITMAP GetMaskBitmap() const { return m_maskBitmap; }
SetMaskBitmap(WXHBITMAP bmp)252     void SetMaskBitmap(WXHBITMAP bmp) { m_maskBitmap = bmp; }
253 
254 protected:
255     WXHBITMAP m_maskBitmap;
256 
257     DECLARE_DYNAMIC_CLASS(wxMask)
258 };
259 
260 // ----------------------------------------------------------------------------
261 // wxBitmapHandler is a class which knows how to load/save bitmaps to/from file
262 // ----------------------------------------------------------------------------
263 
264 class WXDLLEXPORT wxBitmapHandler : public wxGDIImageHandler
265 {
266 public:
wxBitmapHandler()267     wxBitmapHandler() { m_type = wxBITMAP_TYPE_INVALID; }
wxBitmapHandler(const wxString & name,const wxString & ext,long type)268     wxBitmapHandler(const wxString& name, const wxString& ext, long type)
269         : wxGDIImageHandler(name, ext, type)
270     {
271     }
272 
273     // keep wxBitmapHandler derived from wxGDIImageHandler compatible with the
274     // old class which worked only with bitmaps
275     virtual bool Create(wxBitmap *bitmap,
276                         void *data,
277                         long flags,
278                         int width, int height, int depth = 1);
279     virtual bool LoadFile(wxBitmap *bitmap,
280                           const wxString& name,
281                           long flags,
282                           int desiredWidth, int desiredHeight);
283     virtual bool SaveFile(wxBitmap *bitmap,
284                           const wxString& name,
285                           int type,
286                           const wxPalette *palette = NULL);
287 
288     virtual bool Create(wxGDIImage *image,
289                         void *data,
290                         long flags,
291                         int width, int height, int depth = 1);
292     virtual bool Load(wxGDIImage *image,
293                       const wxString& name,
294                       long flags,
295                       int desiredWidth, int desiredHeight);
296     virtual bool Save(wxGDIImage *image,
297                       const wxString& name,
298                       int type);
299 
300 private:
301     DECLARE_DYNAMIC_CLASS(wxBitmapHandler)
302 };
303 
304 #endif
305   // _WX_BITMAP_H_
306