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)
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 WXDLLIMPEXP_FWD_CORE wxBitmap
;
16 class WXDLLIMPEXP_FWD_CORE wxPalette
;
18 #include "wx/msw/private.h"
22 // ----------------------------------------------------------------------------
23 // wxDIB: represents a DIB section
24 // ----------------------------------------------------------------------------
26 class WXDLLIMPEXP_CORE 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
); }
41 // create a DIB from the DDB
42 wxDIB(const wxBitmap
& bmp
)
43 { Init(); (void)Create(bmp
); }
46 // create a DIB from the Windows DDB
48 { Init(); (void)Create(hbmp
); }
50 // load a DIB from file (any depth is supoprted here unlike above)
52 // as above, use IsOk() to see if the bitmap was loaded successfully
53 wxDIB(const wxString
& filename
)
54 { Init(); (void)Load(filename
); }
56 // same as the corresponding ctors but with return value
57 bool Create(int width
, int height
, int depth
);
59 bool Create(const wxBitmap
& bmp
) { return Create(GetHbitmapOf(bmp
)); }
61 bool Create(HBITMAP hbmp
);
62 bool Load(const wxString
& filename
);
64 // dtor is not virtual, this class is not meant to be used polymorphically
72 // create a bitmap compatible with the given HDC (or screen by default) and
73 // return its handle, the caller is responsible for freeing it (using
75 HBITMAP
CreateDDB(HDC hdc
= 0) const;
76 #endif // !__WXWINCE__
78 // get the handle from the DIB and reset it, i.e. this object won't destroy
79 // the DIB after this (but the caller should do it)
80 HBITMAP
Detach() { HBITMAP hbmp
= m_handle
; m_handle
= 0; return hbmp
; }
83 // create a palette for this DIB (always a trivial/default one for 24bpp)
84 wxPalette
*CreatePalette() const;
85 #endif // wxUSE_PALETTE
87 // save the DIB as a .BMP file to the file with the given name
88 bool Save(const wxString
& filename
);
94 // return true if DIB was successfully created, false otherwise
95 bool IsOk() const { return m_handle
!= 0; }
97 // get the bitmap size
98 wxSize
GetSize() const { DoGetObject(); return wxSize(m_width
, m_height
); }
99 int GetWidth() const { DoGetObject(); return m_width
; }
100 int GetHeight() const { DoGetObject(); return m_height
; }
102 // get the number of bits per pixel, or depth
103 int GetDepth() const { DoGetObject(); return m_depth
; }
105 // get the DIB handle
106 HBITMAP
GetHandle() const { return m_handle
; }
108 // get raw pointer to bitmap bits, you should know what you do if you
110 unsigned char *GetData() const
111 { DoGetObject(); return (unsigned char *)m_data
; }
114 // HBITMAP conversion
115 // ------------------
117 // these functions are only used by wxWidgets internally right now, please
118 // don't use them directly if possible as they're subject to change
121 // creates a DDB compatible with the given (or screen) DC from either
122 // a plain DIB or a DIB section (in which case the last parameter must be
124 static HBITMAP
ConvertToBitmap(const BITMAPINFO
*pbi
,
128 // create a plain DIB (not a DIB section) from a DDB, the caller is
129 // responsable for freeing it using ::GlobalFree()
130 static HGLOBAL
ConvertFromBitmap(HBITMAP hbmp
);
132 // creates a DIB from the given DDB or calculates the space needed by it:
133 // if pbi is NULL, only the space is calculated, otherwise pbi is supposed
134 // to point at BITMAPINFO of the correct size which is filled by this
135 // function (this overload is needed for wxBitmapDataObject code in
136 // src/msw/ole/dataobj.cpp)
137 static size_t ConvertFromBitmap(BITMAPINFO
*pbi
, HBITMAP hbmp
);
138 #endif // __WXWINCE__
141 // wxImage conversion
142 // ------------------
145 // Possible formats for DIBs created by the functions below.
148 PixelFormat_PreMultiplied
= 0,
149 PixelFormat_NotPreMultiplied
= 1
152 // Create a DIB from the given image, the DIB will be either 24 or 32 (if
153 // the image has alpha channel) bpp.
155 // By default the DIB stores pixel data in pre-multiplied format so that it
156 // can be used with ::AlphaBlend() but it is also possible to disable
157 // pre-multiplication for the DIB to be usable with ImageList_Draw() which
158 // does pre-multiplication internally.
159 wxDIB(const wxImage
& image
, PixelFormat pf
= PixelFormat_PreMultiplied
)
162 (void)Create(image
, pf
);
165 // same as the above ctor but with the return code
166 bool Create(const wxImage
& image
, PixelFormat pf
= PixelFormat_PreMultiplied
);
168 // create wxImage having the same data as this DIB
169 wxImage
ConvertToImage() const;
170 #endif // wxUSE_IMAGE
176 // return the size of one line in a DIB with given width and depth: the
177 // point here is that as the scan lines need to be DWORD aligned so we may
178 // need to add some padding
179 static unsigned long GetLineSize(int width
, int depth
)
181 return ((width
*depth
+ 31) & ~31) >> 3;
185 // common part of all ctors
191 // initialize the contents from the provided DDB (Create() must have been
193 bool CopyFromDDB(HBITMAP hbmp
);
196 // the DIB section handle, 0 if invalid
199 // NB: we could store only m_handle and not any of the other fields as
200 // we may always retrieve them from it using ::GetObject(), but we
201 // decide to still store them for efficiency concerns -- however if we
202 // don't have them from the very beginning (e.g. DIB constructed from a
203 // bitmap), we only retrieve them when necessary and so these fields
204 // should *never* be accessed directly, even from inside wxDIB code
206 // function which must be called before accessing any members and which
207 // gets their values from m_handle, if not done yet
208 void DoGetObject() const;
210 // pointer to DIB bits, may be NULL
213 // size and depth of the image
218 // in some cases we could be using a handle which we didn't create and in
219 // this case we shouldn't free it neither -- this flag tell us if this is
224 // DIBs can't be copied
226 wxDIB
& operator=(const wxDIB
&);
229 // ----------------------------------------------------------------------------
230 // inline functions implementation
231 // ----------------------------------------------------------------------------
249 if ( m_handle
&& m_ownsHandle
)
251 if ( !::DeleteObject(m_handle
) )
253 wxLogLastError(wxT("DeleteObject(hDIB)"));
260 inline wxDIB::~wxDIB()
268 #endif // _WX_MSW_DIB_H_