X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1cfa5d8e39c6572fd20438d5bc29360a56ac328b..6181cef53222dc7f04e0e52fc4a2d399709a076e:/include/wx/msw/dib.h diff --git a/include/wx/msw/dib.h b/include/wx/msw/dib.h index ec1a601db7..0a9fd4587a 100644 --- a/include/wx/msw/dib.h +++ b/include/wx/msw/dib.h @@ -5,7 +5,7 @@ // 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 ///////////////////////////////////////////////////////////////////////////// @@ -17,6 +17,8 @@ class WXDLLEXPORT wxPalette; #include "wx/msw/private.h" +#if wxUSE_WXDIB + // ---------------------------------------------------------------------------- // wxDIB: represents a DIB section // ---------------------------------------------------------------------------- @@ -35,26 +37,52 @@ public: wxDIB(int width, int height, int depth) { Init(); (void)Create(width, height, depth); } - // same as ctor but with return value + // create a DIB from the DDB + 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 + wxDIB(const wxString& filename) + { Init(); (void)Load(filename); } + + // same as the corresponding ctors but with return value bool Create(int width, int height, int depth); + bool Create(const wxBitmap& bmp); + bool Create(HBITMAP hbmp); + bool Load(const wxString& filename); // dtor is not virtual, this class is not meant to be used polymorphically - ~wxDIB() - { - if ( m_handle && !::DeleteObject(m_handle) ) - { - wxLogLastError(wxT("DeleteObject(hDIB)")); - } - } + ~wxDIB(); // operations // ---------- +#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) HBITMAP Detach() { HBITMAP hbmp = m_handle; m_handle = 0; return hbmp; } +#if wxUSE_PALETTE + // create a palette for this DIB (always a trivial/default one for 24bpp) + wxPalette *CreatePalette() const; +#endif // wxUSE_PALETTE + + // save the DIB as a .BMP file to the file with the given name + bool Save(const wxString& filename); + // accessors // --------- @@ -75,7 +103,35 @@ 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 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) + static HBITMAP ConvertToBitmap(const BITMAPINFO *pbi, + HDC hdc = 0, + void *bits = NULL); + + // create a plain DIB (not a DIB section) from a DDB, the caller is + // responsable for freeing it using ::GlobalFree() + static HGLOBAL ConvertFromBitmap(HBITMAP hbmp); + + // creates a DIB from the given DDB or calculates the space needed by it: + // if pbi is NULL, only the space is calculated, otherwise pbi is supposed + // to point at BITMAPINFO of the correct size which is filled by this + // 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 @@ -107,16 +163,15 @@ public: private: // common part of all ctors - void Init() - { - m_handle = 0; + void Init(); - m_data = NULL; + // free resources + void Free(); + + // initialize the contents from the provided DDB (Create() must have been + // already called) + bool CopyFromDDB(HBITMAP hbmp); - m_width = - m_height = - m_depth = 0; - } // the DIB section handle, 0 if invalid HBITMAP m_handle; @@ -140,49 +195,61 @@ 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; + + // if true, we have alpha, if false we don't (note that we can still have + // m_depth == 32 but the last component is then simply padding and not + // alpha) + bool m_hasAlpha; + // DIBs can't be copied wxDIB(const wxDIB&); wxDIB& operator=(const wxDIB&); }; - // ---------------------------------------------------------------------------- -// Functions for working with DIBs +// inline functions implementation // ---------------------------------------------------------------------------- -// WARNING: these functions are private to wxWindows and shouldn't be used -// by the user code, they risk to disappear in the next versions! - -// VZ: we have 3 different sets of functions: from bitmap.cpp (wxCreateDIB and -// wxFreeDIB), from dib.cpp and from dataobj.cpp - surely there is some -// redundancy between them? (FIXME) - -// defined in bitmap.cpp -extern bool wxCreateDIB(long xSize, long ySize, long bitsPerPixel, - HPALETTE hPal, LPBITMAPINFO* lpDIBHeader); -extern void wxFreeDIB(LPBITMAPINFO lpDIBHeader); +inline +void wxDIB::Init() +{ + m_handle = 0; + m_ownsHandle = true; + m_hasAlpha = false; -// defined in ole/dataobj.cpp -extern WXDLLEXPORT size_t wxConvertBitmapToDIB(LPBITMAPINFO pbi, const wxBitmap& bitmap); -extern WXDLLEXPORT wxBitmap wxConvertDIBToBitmap(const LPBITMAPINFO pbi); + m_data = NULL; -// the rest is defined in dib.cpp + m_width = + m_height = + m_depth = 0; +} -// Save (device dependent) wxBitmap as a DIB -bool wxSaveBitmap(wxChar *filename, wxBitmap *bitmap, wxPalette *palette = NULL); +inline +void wxDIB::Free() +{ + if ( m_handle && m_ownsHandle ) + { + if ( !::DeleteObject(m_handle) ) + { + wxLogLastError(wxT("DeleteObject(hDIB)")); + } -// Load device independent bitmap into device dependent bitmap -wxBitmap *wxLoadBitmap(wxChar *filename, wxPalette **palette = NULL); + Init(); + } +} -// Load into existing bitmap; -bool wxLoadIntoBitmap(wxChar *filename, wxBitmap *bitmap, wxPalette **pal = NULL); +inline wxDIB::~wxDIB() +{ + Free(); +} -HANDLE wxBitmapToDIB (HBITMAP hBitmap, HPALETTE hPal); -bool wxReadDIB(LPTSTR lpFileName, HBITMAP *bitmap, HPALETTE *palette); -HANDLE wxReadDIB2(LPTSTR lpFileName); -LPSTR wxFindDIBBits (LPSTR lpbi); -HPALETTE wxMakeDIBPalette(LPBITMAPINFOHEADER lpInfo); +#endif + // wxUSE_WXDIB #endif // _WX_MSW_DIB_H_