initial coding of and OS/2 XpmHandler
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9142 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
238
src/os2/xpmhand.cpp
Normal file
238
src/os2/xpmhand.cpp
Normal file
@@ -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
|
Reference in New Issue
Block a user