1
/////////////////////////////////////////////////////////////////////////////
3
// Purpose: wxDIB class representing Win32 device independent bitmaps
4
// Author: Vadim Zeitlin
6
// Created: 03.03.03 (replaces the old file with the same name)
7
// RCS-ID: $Id: dib.h,v 1.25 2004/07/22 11:43:53 VZ Exp $
8
// Copyright: (c) 1997-2003 wxWidgets team
9
// Licence: wxWindows licence
10
/////////////////////////////////////////////////////////////////////////////
12
#ifndef _WX_MSW_DIB_H_
13
#define _WX_MSW_DIB_H_
15
class WXDLLEXPORT wxBitmap;
16
class WXDLLEXPORT wxPalette;
18
#include "wx/msw/private.h"
22
// ----------------------------------------------------------------------------
23
// wxDIB: represents a DIB section
24
// ----------------------------------------------------------------------------
26
class WXDLLEXPORT wxDIB
32
// create an uninitialized DIB with the given width, height and depth (only
33
// 24 and 32 bpp DIBs are currently supported)
35
// after using this ctor, GetData() and GetHandle() may be used if IsOk()
37
wxDIB(int width, int height, int depth)
38
{ Init(); (void)Create(width, height, depth); }
40
// create a DIB from the DDB
41
wxDIB(const wxBitmap& bmp)
42
{ Init(); (void)Create(bmp); }
44
// create a DIB from the Windows DDB
46
{ Init(); (void)Create(hbmp); }
48
// load a DIB from file (any depth is supoprted here unlike above)
50
// as above, use IsOk() to see if the bitmap was loaded successfully
51
wxDIB(const wxString& filename)
52
{ Init(); (void)Load(filename); }
54
// same as the corresponding ctors but with return value
55
bool Create(int width, int height, int depth);
56
bool Create(const wxBitmap& bmp);
57
bool Create(HBITMAP hbmp);
58
bool Load(const wxString& filename);
60
// dtor is not virtual, this class is not meant to be used polymorphically
68
// create a bitmap compatible with the given HDC (or screen by default) and
69
// return its handle, the caller is responsible for freeing it (using
71
HBITMAP CreateDDB(HDC hdc = 0) const;
72
#endif // !__WXWINCE__
74
// get the handle from the DIB and reset it, i.e. this object won't destroy
75
// the DIB after this (but the caller should do it)
76
HBITMAP Detach() { HBITMAP hbmp = m_handle; m_handle = 0; return hbmp; }
79
// create a palette for this DIB (always a trivial/default one for 24bpp)
80
wxPalette *CreatePalette() const;
81
#endif // wxUSE_PALETTE
83
// save the DIB as a .BMP file to the file with the given name
84
bool Save(const wxString& filename);
90
// return true if DIB was successfully created, false otherwise
91
bool IsOk() const { return m_handle != 0; }
93
// get the bitmap size
94
wxSize GetSize() const { DoGetObject(); return wxSize(m_width, m_height); }
95
int GetWidth() const { DoGetObject(); return m_width; }
96
int GetHeight() const { DoGetObject(); return m_height; }
98
// get the number of bits per pixel, or depth
99
int GetDepth() const { DoGetObject(); return m_depth; }
101
// get the DIB handle
102
HBITMAP GetHandle() const { return m_handle; }
104
// get raw pointer to bitmap bits, you should know what you do if you
106
unsigned char *GetData() const
107
{ DoGetObject(); return (unsigned char *)m_data; }
110
// HBITMAP conversion
111
// ------------------
113
// these functions are only used by wxWidgets internally right now, please
114
// don't use them directly if possible as they're subject to change
117
// creates a DDB compatible with the given (or screen) DC from either
118
// a plain DIB or a DIB section (in which case the last parameter must be
120
static HBITMAP ConvertToBitmap(const BITMAPINFO *pbi,
124
// create a plain DIB (not a DIB section) from a DDB, the caller is
125
// responsable for freeing it using ::GlobalFree()
126
static HGLOBAL ConvertFromBitmap(HBITMAP hbmp);
128
// creates a DIB from the given DDB or calculates the space needed by it:
129
// if pbi is NULL, only the space is calculated, otherwise pbi is supposed
130
// to point at BITMAPINFO of the correct size which is filled by this
131
// function (this overload is needed for wxBitmapDataObject code in
132
// src/msw/ole/dataobj.cpp)
133
static size_t ConvertFromBitmap(BITMAPINFO *pbi, HBITMAP hbmp);
134
#endif // __WXWINCE__
137
// wxImage conversion
138
// ------------------
141
// create a DIB from the given image, the DIB will be either 24 or 32 (if
142
// the image has alpha channel) bpp
143
wxDIB(const wxImage& image) { Init(); (void)Create(image); }
145
// same as the above ctor but with the return code
146
bool Create(const wxImage& image);
148
// create wxImage having the same data as this DIB
149
wxImage ConvertToImage() const;
150
#endif // wxUSE_IMAGE
156
// return the size of one line in a DIB with given width and depth: the
157
// point here is that as the scan lines need to be DWORD aligned so we may
158
// need to add some padding
159
static unsigned long GetLineSize(int width, int depth)
161
return ((width*depth + 31) & ~31) >> 3;
165
// common part of all ctors
171
// initialize the contents from the provided DDB (Create() must have been
173
bool CopyFromDDB(HBITMAP hbmp);
176
// the DIB section handle, 0 if invalid
179
// NB: we could store only m_handle and not any of the other fields as
180
// we may always retrieve them from it using ::GetObject(), but we
181
// decide to still store them for efficiency concerns -- however if we
182
// don't have them from the very beginning (e.g. DIB constructed from a
183
// bitmap), we only retrieve them when necessary and so these fields
184
// should *never* be accessed directly, even from inside wxDIB code
186
// function which must be called before accessing any members and which
187
// gets their values from m_handle, if not done yet
188
void DoGetObject() const;
190
// pointer to DIB bits, may be NULL
193
// size and depth of the image
198
// in some cases we could be using a handle which we didn't create and in
199
// this case we shouldn't free it neither -- this flag tell us if this is
203
// if true, we have alpha, if false we don't (note that we can still have
204
// m_depth == 32 but the last component is then simply padding and not
209
// DIBs can't be copied
211
wxDIB& operator=(const wxDIB&);
214
// ----------------------------------------------------------------------------
215
// inline functions implementation
216
// ----------------------------------------------------------------------------
235
if ( m_handle && m_ownsHandle )
237
if ( !::DeleteObject(m_handle) )
239
wxLogLastError(wxT("DeleteObject(hDIB)"));
246
inline wxDIB::~wxDIB()
254
#endif // _WX_MSW_DIB_H_