]> git.saurik.com Git - wxWidgets.git/commitdiff
initial coding of and OS/2 XpmHandler
authorDavid Webster <Dave.Webster@bhmi.com>
Sun, 21 Jan 2001 23:00:59 +0000 (23:00 +0000)
committerDavid Webster <Dave.Webster@bhmi.com>
Sun, 21 Jan 2001 23:00:59 +0000 (23:00 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9142 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/os2/xpmhand.cpp [new file with mode: 0644]

diff --git a/src/os2/xpmhand.cpp b/src/os2/xpmhand.cpp
new file mode 100644 (file)
index 0000000..71eac3a
--- /dev/null
@@ -0,0 +1,238 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        os2/xpmhand.cpp
+// Purpose:     wxBitmap: XPM handler and constructors
+// Author:      Julian Smart
+// Modified for OS/2 by: Evgeny Kotsuba
+// Created:     04/01/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef __GNUG__
+    #pragma implementation "xpmhand.h"
+#endif
+
+// For compilers that support precompilation, includes "wx.h".
+//#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+    #include "wx/list.h"
+    #include "wx/utils.h"
+    #include "wx/app.h"
+    #include "wx/palette.h"
+    #include "wx/dcmemory.h"
+    #include "wx/bitmap.h"
+    #include "wx/icon.h"
+#endif
+
+#include "wx/os2/private.h"
+#include "wx/log.h"
+
+
+#if wxUSE_XPM_IN_OS2
+    #define FOR_MSW 1
+    #include "../xpm/xpm.h"
+#endif
+
+#include  "wx/xpmhand.h"
+
+#if wxUSE_XPM_IN_OS2
+
+static void XpmToBitmap(
+  wxBitmap*                         pBitmap
+, const XImage*                     pXimage
+, const XImage*                     pXmask
+, const XpmAttributes&              rXpmAttr
+)
+{
+    wxBitmapRefData*                pRefData = pBitmap->GetBitmapData();
+    pRefData->m_hBitmap = (WXHBITMAP)pXimage->bitmap;
+
+    //
+    // First set the bitmap width, height, depth...
+    //
+    BITMAPINFOHEADER                vBm;
+
+    if (!::GpiQueryBitmapParameters( GetHbitmapOf(*pBitmap)
+                                    ,&vBm
+                                   ))
+    {
+        wxLogLastError(wxT("GetObject(pBitmap)"));
+    }
+
+    pRefData->m_nWidth     = vBm.cx;
+    pRefData->m_nHeight    = vBm.cy;
+    pRefData->m_nDepth     = vBm.cPlanes * vBm.cBitCount;
+    pRefData->m_nNumColors = rXpmAttr.npixels;
+#if 0
+    if (pXmask)
+    {
+        wxMask*                     pMask = new wxMask();
+
+        pMask->SetMaskBitmap((WXHBITMAP) wxInvertMask( pXmask->bitmap
+                                                      ,vBm.cx
+                                                      ,vBm.cy
+                                                     ));
+        pBitmap->SetMask(pMask);
+    }
+#endif
+} // end of XpmToBitmap
+
+IMPLEMENT_DYNAMIC_CLASS(wxXPMFileHandler, wxBitmapHandler)
+
+bool wxXPMFileHandler::LoadFile(
+  wxBitmap*                         pBitmap
+, const wxString&                   rName
+, long                              lFlags
+, int                               lDesiredWidth
+, int                               lDesiredHeight
+)
+{
+    XImage*                         pXimage = NULL;
+    XImage*                         pXmask = NULL;
+    XpmAttributes                   vXpmAttr;
+    HDC                             hDC;
+    HPS                             hPS;
+    DEVOPENSTRUC                    dOP = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
+    SIZEL                           vSizl;
+
+    hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&dOP, NULLHANDLE);
+    hPS = ::GpiCreatePS(vHabmain, hDC, &vSizl, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
+    if (hPS)
+    {
+        vXpmAttr.valuemask = XpmReturnPixels | XpmColorTable;
+
+        int                         nErrorStatus = XpmReadFileToImage( &hPS
+                                                                      ,wxMBSTRINGCAST rName.fn_str()
+                                                                      ,&pXimage
+                                                                      ,&pXmask
+                                                                      ,&vXpmAttr
+                                                                     );
+        ::GpiDestroyPS(hPS);
+        if (nErrorStatus == XpmSuccess)
+        {
+            XpmToBitmap( pBitmap
+                        ,pXimage
+                        ,pXmask
+                        ,vXpmAttr
+                       );
+            XpmFree(vXpmAttr.pixels);
+            XpmFreeAttributes(&vXpmAttr);
+            XImageFree(pXimage);
+            if (pXmask)
+                XDestroyImage(pXmask);
+        }
+        return pBitmap->Ok();
+    }
+    return FALSE;
+} // end of wxXPMFileHandler::LoadFile
+
+bool wxXPMFileHandler::SaveFile(
+  wxBitmap*                         pBitmap
+, const wxString&                   rName
+, int                               lType
+, const wxPalette*                  pPalette
+)
+{
+    XImage                          vXimage;
+    XImage                          vXmask;
+    bool                            bHasmask = FALSE;
+    HDC                             hDC;
+    HPS                             hPS;
+    DEVOPENSTRUC                    dOP = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
+    SIZEL                           vSizl;
+
+    hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&dOP, NULLHANDLE);
+    hPS = ::GpiCreatePS(vHabmain, hDC, &vSizl, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
+    if (hPS)
+    {
+        // fill the XImage struct 'by hand'
+        wxBitmapRefData*            pRefData = pBitmap->GetBitmapData();
+
+        vXimage.width  = pRefData->m_nWidth;
+        vXimage.height = pRefData->m_nHeight;
+        vXimage.depth  = pRefData->m_nDepth;
+        vXimage.bitmap = (HBITMAP)pRefData->m_hBitmap;
+
+        bHasmask = (pRefData->m_pBitmapMask != NULL);
+        if (bHasmask)
+        {
+            //
+            // Strangely enough, the MSW version of xpmlib is not
+            // coherent with itself regarding masks; we have to invert
+            // the mask we get when loading, but we still must pass it
+            // 'as is' when saving...
+            //
+            vXmask.bitmap = (HBITMAP)pRefData->m_pBitmapMask->GetMaskBitmap();
+            vXmask.width  = pRefData->m_nWidth;
+            vXmask.height = pRefData->m_nHeight;
+            vXmask.depth  = 1;
+        }
+
+        int                         nErrorStatus = XpmWriteFileFromImage( &hPS
+                                                                         ,wxMBSTRINGCAST rName.fn_str()
+                                                                         ,&vXimage
+                                                                         ,(bHasmask? &vXmask : (XImage *)NULL)
+                                                                         ,(XpmAttributes *) NULL
+                                                                        );
+        ::GpiDestroyPS(hPS);
+        return (nErrorStatus == XpmSuccess);
+    }
+    return FALSE;
+} // end of wxXPMFileHandler::SaveFile
+
+IMPLEMENT_DYNAMIC_CLASS(wxXPMDataHandler, wxBitmapHandler)
+
+bool wxXPMDataHandler::Create(
+  wxBitmap*                         pBitmap
+, void*                             pData
+, long                              lFlags
+, int                               nWidth
+, int                               nHeight
+, int                               nDepth
+)
+{
+    XImage*                         pXimage = NULL;
+    XImage*                         pXmask = NULL;
+    XpmAttributes                   vXpmAttr;
+    HDC                             hDC;
+    HPS                             hPS;
+    DEVOPENSTRUC                    dOP = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
+    SIZEL                           vSizl;
+
+    hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&dOP, NULLHANDLE);
+    hPS = ::GpiCreatePS(vHabmain, hDC, &vSizl, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
+    if (hPS)
+    {
+        vXpmAttr.valuemask = XpmReturnInfos | XpmColorTable;
+        int                         nErrorStatus = XpmCreateImageFromData( &hPS
+                                                                          ,(char **)pData
+                                                                          ,&pXimage
+                                                                          ,&pXmask
+                                                                          ,&vXpmAttr
+                                                                         );
+        GpiDestroyPS(hPS);
+        if (nErrorStatus == XpmSuccess)
+        {
+            XpmToBitmap( pBitmap
+                        ,pXimage
+                        ,pXmask
+                        ,vXpmAttr
+                       );
+            XpmFree(vXpmAttr.pixels);
+            XpmFreeAttributes(&vXpmAttr);
+            XImageFree(pXimage); // releases the malloc, but does not destroy bitmap
+            if (pXmask)
+                XDestroyImage(pXmask);
+        }
+        return pBitmap->Ok();
+    }
+    return FALSE;
+} // end of wxXPMDataHandler::Create
+
+#endif // wxUSE_XPM_IN_OS2