blind attempt to fix wxBitmap in wxMGL

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54731 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-07-20 22:36:51 +00:00
parent 567d9d70c1
commit ee437b7e1d
2 changed files with 87 additions and 62 deletions

View File

@@ -69,6 +69,9 @@ public:
bitmap_t *GetMGLbitmap_t() const; bitmap_t *GetMGLbitmap_t() const;
protected: protected:
virtual wxGDIRefData *CreateGDIRefData() const;
virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const;
// creates temporary DC for access to bitmap's data: // creates temporary DC for access to bitmap's data:
MGLDevCtx *CreateTmpDC() const; MGLDevCtx *CreateTmpDC() const;
// sets fg & bg colours for 1bit bitmaps: // sets fg & bg colours for 1bit bitmaps:

View File

@@ -31,6 +31,13 @@
#include <mgraph.hpp> #include <mgraph.hpp>
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: // MGL pixel formats:
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -54,10 +61,11 @@ static pixel_format_t gs_pixel_format_wxImage =
// wxBitmap // wxBitmap
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
class wxBitmapRefData: public wxObjectRefData class wxBitmapRefData: public wxGDIRefData
{ {
public: public:
wxBitmapRefData(); wxBitmapRefData(int width, int height, int bpp);
wxBitmapRefData(const wxBitmapRefData& data);
virtual ~wxBitmapRefData(); virtual ~wxBitmapRefData();
virtual bool IsOk() const { return m_bitmap != NULL; } virtual bool IsOk() const { return m_bitmap != NULL; }
@@ -68,16 +76,74 @@ public:
wxPalette *m_palette; wxPalette *m_palette;
wxMask *m_mask; wxMask *m_mask;
bitmap_t *m_bitmap; bitmap_t *m_bitmap;
private:
void DoCreateBitmap();
}; };
wxBitmapRefData::wxBitmapRefData() void wxBitmapRefData::DoCreateBitmap()
{ {
m_mask = NULL; pixel_format_t pf_dummy;
m_width = 0; pixel_format_t *pf;
m_height = 0; int mglDepth = depth;
m_bpp = 0;
switch ( depth )
{
case -1:
wxASSERT_MSG( g_displayDC, wxT("MGL display DC not created yet.") );
g_displayDC->getPixelFormat(pf_dummy);
mglDepth = g_displayDC->getBitsPerPixel();
pf = &pf_dummy;
break;
case 1:
case 8:
pf = NULL;
mglDepth = 8; // we emulate monochrome bitmaps using 8 bit ones
break;
case 15:
pf = &gs_pixel_format_15;
break;
case 16:
pf = &gs_pixel_format_16;
break;
case 24:
pf = &gs_pixel_format_24;
break;
case 32:
pf = &gs_pixel_format_32;
break;
default:
wxFAIL_MSG(wxT("invalid bitmap depth"));
m_bitmap = NULL;
return;
}
m_bitmap = MyMGL_createBitmap(width, height, mglDepth, pf);
}
wxBitmapRefData::wxBitmapRefData(int width, int height, int bpp)
{
m_width = width;
m_height = height;
m_bpp = bpp;
m_palette = NULL; m_palette = NULL;
m_bitmap = 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() wxBitmapRefData::~wxBitmapRefData()
@@ -100,11 +166,14 @@ wxBitmap::wxBitmap(int width, int height, int depth)
} }
static bitmap_t *MyMGL_createBitmap(int width, int height, wxGDIRefData *wxBitmap::CreateGDIRefData() const
int bpp, pixel_format_t *pf)
{ {
MGLMemoryDC mdc(width, height, bpp, pf); return new wxBitmapRefData;
return MGL_getBitmapFromDC(mdc.getDC(), 0, 0, width, height, TRUE); }
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) bool wxBitmap::Create(int width, int height, int depth)
@@ -113,58 +182,13 @@ bool wxBitmap::Create(int width, int height, int depth)
wxCHECK_MSG( (width > 0) && (height > 0), false, wxT("invalid bitmap size") ); wxCHECK_MSG( (width > 0) && (height > 0), false, wxT("invalid bitmap size") );
pixel_format_t pf_dummy; m_refData = new wxBitmapRefData(width, height, depth);
pixel_format_t *pf;
int mglDepth = depth;
switch ( depth ) if ( depth == 1 )
{
case -1:
wxASSERT_MSG( g_displayDC, wxT("MGL display DC not created yet.") );
g_displayDC->getPixelFormat(pf_dummy);
mglDepth = g_displayDC->getBitsPerPixel();
pf = &pf_dummy;
break;
case 1:
case 8:
pf = NULL;
break;
case 15:
pf = &gs_pixel_format_15;
break;
case 16:
pf = &gs_pixel_format_16;
break;
case 24:
pf = &gs_pixel_format_24;
break;
case 32:
pf = &gs_pixel_format_32;
break;
default:
wxFAIL_MSG(wxT("invalid bitmap depth"));
return false;
}
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;
if ( mglDepth != 1 )
{
M_BMPDATA->m_bitmap = MyMGL_createBitmap(width, height, mglDepth, pf);
}
else
{ {
// MGL does not support mono DCs, so we have to emulate them with // 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 // 8bpp ones. We do that by using a special palette with color 0
// set to black and all other colors set to white. // 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)); 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) bool wxBitmap::LoadFile(const wxString &name, wxBitmapType type)
{ {
UnRef(); AllocExclusive();
if ( type == wxBITMAP_TYPE_BMP || type == wxBITMAP_TYPE_PNG || if ( type == wxBITMAP_TYPE_BMP || type == wxBITMAP_TYPE_PNG ||
type == wxBITMAP_TYPE_PCX || type == wxBITMAP_TYPE_JPEG ) 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); return handler->LoadFile(this, name, type, -1, -1);
} }