added CopyFromDIB()
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19719 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user