From ee437b7e1d7111514b40b3588ad8f2a8d8b45f78 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 20 Jul 2008 22:36:51 +0000 Subject: [PATCH] blind attempt to fix wxBitmap in wxMGL git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54731 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/mgl/bitmap.h | 3 + src/mgl/bitmap.cpp | 144 +++++++++++++++++++++++----------------- 2 files changed, 86 insertions(+), 61 deletions(-) diff --git a/include/wx/mgl/bitmap.h b/include/wx/mgl/bitmap.h index 86bc9a8657..9e8409a815 100644 --- a/include/wx/mgl/bitmap.h +++ b/include/wx/mgl/bitmap.h @@ -69,6 +69,9 @@ public: bitmap_t *GetMGLbitmap_t() const; protected: + virtual wxGDIRefData *CreateGDIRefData() const; + virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const; + // creates temporary DC for access to bitmap's data: MGLDevCtx *CreateTmpDC() const; // sets fg & bg colours for 1bit bitmaps: diff --git a/src/mgl/bitmap.cpp b/src/mgl/bitmap.cpp index 65294d62c6..ad2e0199a1 100644 --- a/src/mgl/bitmap.cpp +++ b/src/mgl/bitmap.cpp @@ -31,6 +31,13 @@ #include +static bitmap_t *MyMGL_createBitmap(int width, int height, + int bpp, pixel_format_t *pf) +{ + MGLMemoryDC mdc(width, height, bpp, pf); + return MGL_getBitmapFromDC(mdc.getDC(), 0, 0, width, height, TRUE); +} + //----------------------------------------------------------------------------- // MGL pixel formats: //----------------------------------------------------------------------------- @@ -54,10 +61,11 @@ static pixel_format_t gs_pixel_format_wxImage = // wxBitmap //----------------------------------------------------------------------------- -class wxBitmapRefData: public wxObjectRefData +class wxBitmapRefData: public wxGDIRefData { public: - wxBitmapRefData(); + wxBitmapRefData(int width, int height, int bpp); + wxBitmapRefData(const wxBitmapRefData& data); virtual ~wxBitmapRefData(); virtual bool IsOk() const { return m_bitmap != NULL; } @@ -68,51 +76,13 @@ public: wxPalette *m_palette; wxMask *m_mask; bitmap_t *m_bitmap; -}; - -wxBitmapRefData::wxBitmapRefData() -{ - m_mask = NULL; - m_width = 0; - m_height = 0; - m_bpp = 0; - m_palette = NULL; - m_bitmap = NULL; -} -wxBitmapRefData::~wxBitmapRefData() -{ - if ( m_bitmap ) - MGL_unloadBitmap(m_bitmap); - delete m_mask; - delete m_palette; -} - -//----------------------------------------------------------------------------- - -#define M_BMPDATA ((wxBitmapRefData *)m_refData) - -IMPLEMENT_DYNAMIC_CLASS(wxBitmap,wxBitmapBase) - -wxBitmap::wxBitmap(int width, int height, int depth) -{ - Create(width, height, depth); -} - - -static bitmap_t *MyMGL_createBitmap(int width, int height, - int bpp, pixel_format_t *pf) -{ - MGLMemoryDC mdc(width, height, bpp, pf); - return MGL_getBitmapFromDC(mdc.getDC(), 0, 0, width, height, TRUE); -} +private: + void DoCreateBitmap(); +}; -bool wxBitmap::Create(int width, int height, int depth) +void wxBitmapRefData::DoCreateBitmap() { - UnRef(); - - wxCHECK_MSG( (width > 0) && (height > 0), false, wxT("invalid bitmap size") ); - pixel_format_t pf_dummy; pixel_format_t *pf; int mglDepth = depth; @@ -129,6 +99,7 @@ bool wxBitmap::Create(int width, int height, int depth) case 1: case 8: pf = NULL; + mglDepth = 8; // we emulate monochrome bitmaps using 8 bit ones break; case 15: pf = &gs_pixel_format_15; @@ -144,27 +115,80 @@ bool wxBitmap::Create(int width, int height, int depth) break; default: wxFAIL_MSG(wxT("invalid bitmap depth")); - return false; + m_bitmap = NULL; + return; } - m_refData = new wxBitmapRefData(); - M_BMPDATA->m_mask = (wxMask *) NULL; - M_BMPDATA->m_palette = (wxPalette *) NULL; - M_BMPDATA->m_width = width; - M_BMPDATA->m_height = height; - M_BMPDATA->m_bpp = mglDepth; + m_bitmap = MyMGL_createBitmap(width, height, mglDepth, pf); +} - if ( mglDepth != 1 ) - { - M_BMPDATA->m_bitmap = MyMGL_createBitmap(width, height, mglDepth, pf); - } - else +wxBitmapRefData::wxBitmapRefData(int width, int height, int bpp) +{ + m_width = width; + m_height = height; + m_bpp = bpp; + + m_palette = NULL; + m_mask = NULL; + + DoCreateBitmap(); +} + +wxBitmapRefData::wxBitmapRefData(const wxBitmapRefData& data) +{ + m_width = data.m_width; + m_height = data.m_height; + m_bpp = data.m_bpp; + + m_palette = NULL; // FIXME: should copy + m_mask = NULL; // FIXME: should copy + + DoCreateBitmap(); +} + +wxBitmapRefData::~wxBitmapRefData() +{ + if ( m_bitmap ) + MGL_unloadBitmap(m_bitmap); + delete m_mask; + delete m_palette; +} + +//----------------------------------------------------------------------------- + +#define M_BMPDATA ((wxBitmapRefData *)m_refData) + +IMPLEMENT_DYNAMIC_CLASS(wxBitmap,wxBitmapBase) + +wxBitmap::wxBitmap(int width, int height, int depth) +{ + Create(width, height, depth); +} + + +wxGDIRefData *wxBitmap::CreateGDIRefData() const +{ + return new wxBitmapRefData; +} + +wxGDIRefData *wxBitmap::CloneGDIRefData(const wxGDIRefData *data) const +{ + return new wxBitmapRefData(*wx_static_cast(const wxBitmapRefData *, data)); +} + +bool wxBitmap::Create(int width, int height, int depth) +{ + UnRef(); + + wxCHECK_MSG( (width > 0) && (height > 0), false, wxT("invalid bitmap size") ); + + m_refData = new wxBitmapRefData(width, height, depth); + + if ( depth == 1 ) { // MGL does not support mono DCs, so we have to emulate them with // 8bpp ones. We do that by using a special palette with color 0 // set to black and all other colors set to white. - - M_BMPDATA->m_bitmap = MyMGL_createBitmap(width, height, 8, pf); SetMonoPalette(wxColour(255, 255, 255), wxColour(0, 0, 0)); } @@ -398,7 +422,7 @@ MGLDevCtx *wxBitmap::CreateTmpDC() const bool wxBitmap::LoadFile(const wxString &name, wxBitmapType type) { - UnRef(); + AllocExclusive(); if ( type == wxBITMAP_TYPE_BMP || type == wxBITMAP_TYPE_PNG || type == wxBITMAP_TYPE_PCX || type == wxBITMAP_TYPE_JPEG ) @@ -428,8 +452,6 @@ bool wxBitmap::LoadFile(const wxString &name, wxBitmapType type) } } - m_refData = new wxBitmapRefData(); - return handler->LoadFile(this, name, type, -1, -1); } -- 2.45.2