X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2b254edf9cb508b48bfd3f9cf76d46f7cf1e1f5b..d298f18ffb4bd0bd758b10f34c9e01cd119d1365:/include/wx/msw/dib.h?ds=sidebyside diff --git a/include/wx/msw/dib.h b/include/wx/msw/dib.h index f4f0bf0a86..58061449f1 100644 --- a/include/wx/msw/dib.h +++ b/include/wx/msw/dib.h @@ -5,23 +5,25 @@ // Modified by: // Created: 03.03.03 (replaces the old file with the same name) // RCS-ID: $Id$ -// Copyright: (c) 1997-2003 wxWindows team +// Copyright: (c) 1997-2003 wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_MSW_DIB_H_ #define _WX_MSW_DIB_H_ -class WXDLLEXPORT wxBitmap; -class WXDLLEXPORT wxPalette; +class WXDLLIMPEXP_FWD_CORE wxBitmap; +class WXDLLIMPEXP_FWD_CORE wxPalette; #include "wx/msw/private.h" +#if wxUSE_WXDIB + // ---------------------------------------------------------------------------- // wxDIB: represents a DIB section // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxDIB +class WXDLLIMPEXP_CORE wxDIB { public: // ctors and such @@ -39,6 +41,10 @@ public: wxDIB(const wxBitmap& bmp) { Init(); (void)Create(bmp); } + // create a DIB from the Windows DDB + wxDIB(HBITMAP hbmp) + { Init(); (void)Create(hbmp); } + // load a DIB from file (any depth is supoprted here unlike above) // // as above, use IsOk() to see if the bitmap was loaded successfully @@ -47,7 +53,8 @@ public: // same as the corresponding ctors but with return value bool Create(int width, int height, int depth); - bool Create(const wxBitmap& bmp); + bool Create(const wxBitmap& bmp) { return Create(GetHbitmapOf(bmp)); } + bool Create(HBITMAP hbmp); bool Load(const wxString& filename); // dtor is not virtual, this class is not meant to be used polymorphically @@ -57,10 +64,12 @@ public: // operations // ---------- - // create a bitmap compatiblr with the given HDC (or screen by default) and +#ifndef __WXWINCE__ + // create a bitmap compatible with the given HDC (or screen by default) and // return its handle, the caller is responsible for freeing it (using // DeleteObject()) HBITMAP CreateDDB(HDC hdc = 0) const; +#endif // !__WXWINCE__ // get the handle from the DIB and reset it, i.e. this object won't destroy // the DIB after this (but the caller should do it) @@ -94,15 +103,17 @@ public: // get raw pointer to bitmap bits, you should know what you do if you // decide to use it - void *GetData() const { DoGetObject(); return m_data; } + unsigned char *GetData() const + { DoGetObject(); return (unsigned char *)m_data; } // HBITMAP conversion // ------------------ - // these functions are only used by wxWindows internally right now, please + // these functions are only used by wxWidgets internally right now, please // don't use them directly if possible as they're subject to change +#ifndef __WXWINCE__ // creates a DDB compatible with the given (or screen) DC from either // a plain DIB or a DIB section (in which case the last parameter must be // non NULL) @@ -120,18 +131,35 @@ public: // function (this overload is needed for wxBitmapDataObject code in // src/msw/ole/dataobj.cpp) static size_t ConvertFromBitmap(BITMAPINFO *pbi, HBITMAP hbmp); +#endif // __WXWINCE__ // wxImage conversion // ------------------ #if wxUSE_IMAGE - // create a DIB from the given image, the DIB will be either 24 or 32 (if - // the image has alpha channel) bpp - wxDIB(const wxImage& image) { Init(); (void)Create(image); } + // Possible formats for DIBs created by the functions below. + enum PixelFormat + { + PixelFormat_PreMultiplied = 0, + PixelFormat_NotPreMultiplied = 1 + }; + + // Create a DIB from the given image, the DIB will be either 24 or 32 (if + // the image has alpha channel) bpp. + // + // By default the DIB stores pixel data in pre-multiplied format so that it + // can be used with ::AlphaBlend() but it is also possible to disable + // pre-multiplication for the DIB to be usable with ImageList_Draw() which + // does pre-multiplication internally. + wxDIB(const wxImage& image, PixelFormat pf = PixelFormat_PreMultiplied) + { + Init(); + (void)Create(image, pf); + } // same as the above ctor but with the return code - bool Create(const wxImage& image); + bool Create(const wxImage& image, PixelFormat pf = PixelFormat_PreMultiplied); // create wxImage having the same data as this DIB wxImage ConvertToImage() const; @@ -151,30 +179,15 @@ public: private: // common part of all ctors - void Init() - { - m_handle = 0; - - m_data = NULL; - - m_width = - m_height = - m_depth = 0; - } + void Init(); // free resources - void Free() - { - if ( m_handle ) - { - if ( !::DeleteObject(m_handle) ) - { - wxLogLastError(wxT("DeleteObject(hDIB)")); - } + void Free(); + + // initialize the contents from the provided DDB (Create() must have been + // already called) + bool CopyFromDDB(HBITMAP hbmp); - Init(); - } - } // the DIB section handle, 0 if invalid HBITMAP m_handle; @@ -198,6 +211,11 @@ private: m_height, m_depth; + // in some cases we could be using a handle which we didn't create and in + // this case we shouldn't free it neither -- this flag tell us if this is + // the case + bool m_ownsHandle; + // DIBs can't be copied wxDIB(const wxDIB&); @@ -208,10 +226,40 @@ private: // inline functions implementation // ---------------------------------------------------------------------------- +inline +void wxDIB::Init() +{ + m_handle = 0; + m_ownsHandle = true; + + m_data = NULL; + + m_width = + m_height = + m_depth = 0; +} + +inline +void wxDIB::Free() +{ + if ( m_handle && m_ownsHandle ) + { + if ( !::DeleteObject(m_handle) ) + { + wxLogLastError(wxT("DeleteObject(hDIB)")); + } + + Init(); + } +} + inline wxDIB::~wxDIB() { Free(); } +#endif + // wxUSE_WXDIB + #endif // _WX_MSW_DIB_H_