]> git.saurik.com Git - wxWidgets.git/commitdiff
blind attempt to fix wxBitmap in wxMGL
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 20 Jul 2008 22:36:51 +0000 (22:36 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 20 Jul 2008 22:36:51 +0000 (22:36 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54731 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/mgl/bitmap.h
src/mgl/bitmap.cpp

index 86bc9a8657fe3de5666b0492dcc08daca5ee6bdd..9e8409a815b701ffa8e46d8fb06dc315211e6d5f 100644 (file)
@@ -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:
index 65294d62c6185f5d939397c858c38f9f02a8081d..ad2e0199a1724dff52c81991ab1f15a9e85c53d8 100644 (file)
 
 #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:
 //-----------------------------------------------------------------------------
@@ -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);
 }