From 020a1653a4ac95d1dd9c9e918a859d6d6d83d3fe Mon Sep 17 00:00:00 2001 From: David Webster Date: Mon, 29 Jan 2001 21:42:53 +0000 Subject: [PATCH] Add wxInvertMask for OS/2 xpm processing git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9217 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/os2/xpmhand.h | 64 ++++++++++++++++++++++++++++++++++++ src/os2/bitmap.cpp | 70 ++++++++++++++++++++++++++++++++++++++++ src/os2/xpmhand.cpp | 9 ++++-- 3 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 include/wx/os2/xpmhand.h diff --git a/include/wx/os2/xpmhand.h b/include/wx/os2/xpmhand.h new file mode 100644 index 0000000000..662f954da6 --- /dev/null +++ b/include/wx/os2/xpmhand.h @@ -0,0 +1,64 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: xpmhand.h +// Purpose: XPM bitmap handler +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id$ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#pragma interface "xpmhand.h" +#endif + +#ifndef _WX_XPMHAND_H_ +#define _WX_XPMHAND_H_ + +class WXDLLEXPORT wxXPMFileHandler: public wxBitmapHandler +{ + DECLARE_DYNAMIC_CLASS(wxXPMFileHandler) +public: + inline wxXPMFileHandler(void) + { + m_sName = "XPM bitmap file"; + m_sExtension = "xpm"; + m_lType = wxBITMAP_TYPE_XPM; + }; + + virtual bool LoadFile( wxBitmap* pBitmap + ,const wxString& rsName + ,long lFlags + ,int nDesiredWidth = -1 + ,int nDesiredHeight = -1 + ); + virtual bool SaveFile( wxBitmap* pBitmap + ,const wxString& rsName + ,int nType + ,const wxPalette* pPalette = NULL + ); +}; // end of CLASS wxWPMFileHandler + +class WXDLLEXPORT wxXPMDataHandler: public wxBitmapHandler +{ + DECLARE_DYNAMIC_CLASS(wxXPMDataHandler) +public: + inline wxXPMDataHandler(void) + { + m_sName = "XPM bitmap data"; + m_sExtension = "xpm"; + m_lType = wxBITMAP_TYPE_XPM_DATA; + }; + virtual bool Create( wxBitmap* pBitmap + ,void* pData + ,long lFlags + ,int lWidth + ,int lHeight + ,int lDepth = 1 + ); +}; // end of wxXPMDataHandler + +#endif + // _WX_XPMHAND_H_ + diff --git a/src/os2/bitmap.cpp b/src/os2/bitmap.cpp index 62d8a3bc6f..2bf5a7dc48 100644 --- a/src/os2/bitmap.cpp +++ b/src/os2/bitmap.cpp @@ -965,3 +965,73 @@ bool wxBitmapHandler::SaveFile( return(FALSE); } +// ---------------------------------------------------------------------------- +// Utility functions +// ---------------------------------------------------------------------------- +HBITMAP wxInvertMask( + HBITMAP hBmpMask +, int nWidth +, int nHeight +) +{ + HBITMAP hBmpInvMask = 0; + + wxCHECK_MSG( hBmpMask, 0, _T("invalid bitmap in wxInvertMask") ); + + // + // Get width/height from the bitmap if not given + // + if (!nWidth || !nHeight) + { + BITMAPINFOHEADER2 vBmhdr; + + ::GpiQueryBitmapInfoHeader( hBmpMask + ,&vBmhdr + ); + nWidth = (int)vBmhdr.cx; + nHeight = (int)vBmhdr.cyt; + } + + BITMAPINFOHEADER2 vBmih; + SIZEL vSize = {0, 0}; + DEVOPENSTRUC vDop = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L}; + HDC hDCSrc = ::DevOpenDC(ghAb, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE); + HDC hDCDst = ::DevOpenDC(ghAb, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE); + HPS hPSSrc = ::GpiCreatePS(ghAb, hDCSrc, &vSize, PU_PELS | GPIA_ASSOC); + HPS hPSDst = ::GpiCreatePS(ghAb, hDCDst, &vSize, PU_PELS | GPIA_ASSOC); + POINTL vPoint[4] = { 0 ,0, rBitmap.GetWidth(), rBitmap.GetHeight(), + 0, 0, rBitmap.GetWidth(), rBitmap.GetHeight() + }; + + memset(&vBmih, NULLC, sizeof(BITMAPINFOHEADER2)); + vBmih.cbFix = sizeof(BITMAPINFOHEADER2); + vBmih.cx = lWidth; + vBmih.cy = lHeight; + vBmih.cPlanes = 1; + vBmih.cBitCount = 1; + + hBmpInvMask = ::GpiCreateBitmap( hPSDst + ,&vBmih + ,0L + ,NULL + ,NULL + ); + + ::GpiSetBitmap(hPSSrc, (HBITMAP) hBmpMask); + ::GpiSetBitmap(hPSDst, (HBITMAP) hBmpInvMask); + + ::GpiBitBlt( hPSDst + ,hPSSrc + ,4L + ,&vPoint + ,ROP_SRCCOPY + ,BBO_IGNORE + ); + + ::GpiDestroyPS(hPSSrc); + ::GpiDestroyPS(hPSDst); + ::DevCloseDC(hDCSrc); + ::DevCloseDC(hDCDtl); + + return hBmpInvMask; +} // end of WxWinGdi_InvertMask diff --git a/src/os2/xpmhand.cpp b/src/os2/xpmhand.cpp index 71eac3afa4..ee64879e4a 100644 --- a/src/os2/xpmhand.cpp +++ b/src/os2/xpmhand.cpp @@ -69,7 +69,7 @@ static void XpmToBitmap( 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(); @@ -80,7 +80,6 @@ static void XpmToBitmap( )); pBitmap->SetMask(pMask); } -#endif } // end of XpmToBitmap IMPLEMENT_DYNAMIC_CLASS(wxXPMFileHandler, wxBitmapHandler) @@ -114,6 +113,7 @@ bool wxXPMFileHandler::LoadFile( ,&vXpmAttr ); ::GpiDestroyPS(hPS); + ::DevCloseDC(hDC); if (nErrorStatus == XpmSuccess) { XpmToBitmap( pBitmap @@ -181,6 +181,7 @@ bool wxXPMFileHandler::SaveFile( ,(XpmAttributes *) NULL ); ::GpiDestroyPS(hPS); + ::DevCloseDC(hDC); return (nErrorStatus == XpmSuccess); } return FALSE; @@ -210,13 +211,15 @@ bool wxXPMDataHandler::Create( if (hPS) { vXpmAttr.valuemask = XpmReturnInfos | XpmColorTable; + int nErrorStatus = XpmCreateImageFromData( &hPS ,(char **)pData ,&pXimage ,&pXmask ,&vXpmAttr ); - GpiDestroyPS(hPS); + ::GpiDestroyPS(hPS); + ::DevCloseDC(hDC); if (nErrorStatus == XpmSuccess) { XpmToBitmap( pBitmap -- 2.45.2