X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cf6824d93de87e00c2a7659e9c405ecf9bf87d5c..437a8892a107139e9f808f0a11792a56a55b4e25:/src/mgl/bitmap.cpp?ds=sidebyside diff --git a/src/mgl/bitmap.cpp b/src/mgl/bitmap.cpp index 1c424417fe..b58ad78567 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,30 +61,100 @@ 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; } + int m_width; int m_height; int m_bpp; wxPalette *m_palette; wxMask *m_mask; bitmap_t *m_bitmap; + +private: + void DoCreateBitmap(int width, int height, int depth); }; +void wxBitmapRefData::DoCreateBitmap(int width, int height, int depth) +{ + m_width = width; + m_height = height; + m_bpp = depth; + + pixel_format_t pf_dummy; + pixel_format_t *pf; + int mglDepth = depth; + + 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() { - m_mask = NULL; - m_width = 0; - m_height = 0; + m_width = + m_height = m_bpp = 0; + m_palette = NULL; + m_mask = NULL; + m_bitmap = NULL; } +wxBitmapRefData::wxBitmapRefData(int width, int height, int bpp) +{ + DoCreateBitmap(width, height, bpp); + + m_palette = NULL; + m_mask = NULL; +} + +wxBitmapRefData::wxBitmapRefData(const wxBitmapRefData& data) +{ + DoCreateBitmap(data.m_width, data.m_height, data.m_bpp); + + m_palette = NULL; // FIXME: should copy + m_mask = NULL; // FIXME: should copy +} + wxBitmapRefData::~wxBitmapRefData() { if ( m_bitmap ) @@ -90,8 +167,6 @@ wxBitmapRefData::~wxBitmapRefData() #define M_BMPDATA ((wxBitmapRefData *)m_refData) - -IMPLEMENT_ABSTRACT_CLASS(wxBitmapHandler, wxBitmapHandlerBase) IMPLEMENT_DYNAMIC_CLASS(wxBitmap,wxBitmapBase) wxBitmap::wxBitmap(int width, int height, int depth) @@ -100,11 +175,14 @@ wxBitmap::wxBitmap(int width, int height, int depth) } -static bitmap_t *MyMGL_createBitmap(int width, int height, - int bpp, pixel_format_t *pf) +wxGDIRefData *wxBitmap::CreateGDIRefData() const { - MGLMemoryDC mdc(width, height, bpp, pf); - return MGL_getBitmapFromDC(mdc.getDC(), 0, 0, width, height, TRUE); + return new wxBitmapRefData; +} + +wxGDIRefData *wxBitmap::CloneGDIRefData(const wxGDIRefData *data) const +{ + return new wxBitmapRefData(*static_cast(data)); } bool wxBitmap::Create(int width, int height, int depth) @@ -113,58 +191,13 @@ bool wxBitmap::Create(int width, int height, int depth) wxCHECK_MSG( (width > 0) && (height > 0), false, wxT("invalid bitmap size") ); - pixel_format_t pf_dummy; - pixel_format_t *pf; - int mglDepth = depth; + m_refData = new wxBitmapRefData(width, height, depth); - 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; - 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 + 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)); } @@ -267,11 +300,6 @@ wxBitmap::wxBitmap(const char bits[], int width, int height, int depth) delete bdc; } -bool wxBitmap::IsOk() const -{ - return (m_refData != NULL && M_BMPDATA->m_bitmap != NULL); -} - int wxBitmap::GetHeight() const { wxCHECK_MSG( Ok(), -1, wxT("invalid bitmap") ); @@ -403,7 +431,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 ) @@ -433,8 +461,6 @@ bool wxBitmap::LoadFile(const wxString &name, wxBitmapType type) } } - m_refData = new wxBitmapRefData(); - return handler->LoadFile(this, name, type, -1, -1); }