Add wxInvertMask for OS/2 xpm processing
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9217 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
64
include/wx/os2/xpmhand.h
Normal file
64
include/wx/os2/xpmhand.h
Normal file
@@ -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_
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user