From b0ea5d96038f143169458ba032451427bbf93b3a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 23 Mar 2003 01:45:37 +0000 Subject: [PATCH] added CopyFromDIB() git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19719 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/bitmap.h | 13 +++-- src/msw/bitmap.cpp | 108 ++++++++++++---------------------------- 2 files changed, 41 insertions(+), 80 deletions(-) diff --git a/include/wx/msw/bitmap.h b/include/wx/msw/bitmap.h index f834ebba85..22b8a1bb16 100644 --- a/include/wx/msw/bitmap.h +++ b/include/wx/msw/bitmap.h @@ -20,16 +20,16 @@ #include "wx/gdicmn.h" #include "wx/palette.h" -class WXDLLEXPORT wxDC; -class WXDLLEXPORT wxControl; class WXDLLEXPORT wxBitmap; class WXDLLEXPORT wxBitmapHandler; class WXDLLEXPORT wxBitmapRefData; -class WXDLLEXPORT wxIcon; -class WXDLLEXPORT wxMask; -class WXDLLEXPORT wxCursor; class WXDLLEXPORT wxControl; +class WXDLLEXPORT wxCursor; +class WXDLLEXPORT wxDC; +class WXDLLEXPORT wxDIB; +class WXDLLEXPORT wxIcon; class WXDLLEXPORT wxImage; +class WXDLLEXPORT wxMask; class WXDLLEXPORT wxPalette; class WXDLLEXPORT wxRawBitmapData; @@ -119,6 +119,9 @@ public: // copies the contents and mask of the given cursor to the bitmap bool CopyFromCursor(const wxCursor& cursor); + // copies from a device independent bitmap + bool CopyFromDIB(const wxDIB& dib); + virtual bool Create(int width, int height, int depth = -1); virtual bool Create(int width, int height, const wxDC& dc); virtual bool Create(void *data, long type, int width, int height, int depth = 1); diff --git a/src/msw/bitmap.cpp b/src/msw/bitmap.cpp index 170c5b7897..139c60f331 100644 --- a/src/msw/bitmap.cpp +++ b/src/msw/bitmap.cpp @@ -306,6 +306,38 @@ bool wxBitmap::CopyFromIcon(const wxIcon& icon) #endif // Win16/Win32 } +bool wxBitmap::CopyFromDIB(const wxDIB& dib) +{ + wxCHECK_MSG( dib.IsOk(), FALSE, _T("invalid DIB in CopyFromDIB") ); + + HBITMAP hbitmap = dib.CreateDDB(); + if ( !hbitmap ) + return FALSE; + + UnRef(); + + wxBitmapRefData *refData = new wxBitmapRefData; + m_refData = refData; + + refData->m_width = dib.GetWidth(); + refData->m_height = dib.GetHeight(); + refData->m_depth = dib.GetDepth(); + + refData->m_hBitmap = (WXHBITMAP)hbitmap; + +#if wxUSE_PALETTE + wxPalette *palette = dib.CreatePalette(); + if ( palette ) + { + refData->m_bitmapPalette = *palette; + } + + delete palette; +#endif // wxUSE_PALETTE + + return TRUE; +} + wxBitmap::~wxBitmap() { } @@ -744,81 +776,7 @@ bool wxBitmap::CreateFromImage(const wxImage& image, int depth, WXHDC hdc ) } else // we need to convert DIB to DDB { - // create and set the device-dependent bitmap - // - // VZ: why don't we just use SetDIBits() instead? because of the - // palette or is there some other reason? - hbitmap = ::CreateCompatibleBitmap(hdc ? (HDC)hdc : ScreenHDC(), w, h); - if ( !hbitmap ) - { - wxLogLastError(_T("CreateCompatibleBitmap()")); - - return FALSE; - } - - MemoryHDC hdcMem; - SelectInHDC select(hdcMem, hbitmap); - if ( !select ) - { - wxLogLastError(_T("SelectObjct(hBitmap)")); - } - -#if wxUSE_PALETTE - const wxPalette& palette = image.GetPalette(); - - HPALETTE hOldPalette; - if ( palette.Ok() ) - { - SetPalette(palette); - - hOldPalette = ::SelectPalette - ( - hdcMem, - GetHpaletteOf(palette), - FALSE // ignored for hdcMem - ); - - if ( !hOldPalette ) - { - wxLogLastError(_T("SelectPalette()")); - } - - if ( ::RealizePalette(hdcMem) == GDI_ERROR ) - { - wxLogLastError(_T("RealizePalette()")); - } - } - else // no valid palette - { - hOldPalette = 0; - } -#endif // wxUSE_PALETTE - - DIBSECTION ds; - if ( !::GetObject(dib.GetHandle(), sizeof(ds), &ds) ) - { - wxLogLastError(_T("GetObject(hDIB)")); - } - - if ( ::StretchDIBits(hdcMem, - 0, 0, w, h, - 0, 0, w, h, - dib.GetData(), - (BITMAPINFO *)&ds.dsBmih, - DIB_RGB_COLORS, - SRCCOPY) == GDI_ERROR ) - { - wxLogLastError(_T("StretchDIBits()")); - - return FALSE; - } - -#if wxUSE_PALETTE - if ( hOldPalette ) - { - ::SelectPalette(hdcMem, hOldPalette, FALSE); - } -#endif // wxUSE_PALETTE + hbitmap = dib.CreateDDB((HDC)hdc); refData->m_depth = depth == -1 ? wxDisplayDepth() : depth; }