From: David Webster Date: Sun, 21 Jan 2001 23:00:59 +0000 (+0000) Subject: initial coding of and OS/2 XpmHandler X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/8ef38fd9f880f60c249a9e77a3f72aa58ffc00ee initial coding of and OS/2 XpmHandler git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9142 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/os2/xpmhand.cpp b/src/os2/xpmhand.cpp new file mode 100644 index 0000000000..71eac3afa4 --- /dev/null +++ b/src/os2/xpmhand.cpp @@ -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