]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/os2/xpmhand.cpp
Replaced /'s with \'s as BCC requires \'s for path names
[wxWidgets.git] / src / os2 / xpmhand.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: os2/xpmhand.cpp
3// Purpose: wxBitmap: XPM handler and constructors
4// Author: Julian Smart
5// Modified for OS/2 by: Evgeny Kotsuba
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13 #pragma implementation "xpmhand.h"
14#endif
15
16// For compilers that support precompilation, includes "wx.h".
17//#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
20 #pragma hdrstop
21#endif
22
23#ifndef WX_PRECOMP
24 #include "wx/list.h"
25 #include "wx/utils.h"
26 #include "wx/app.h"
27 #include "wx/palette.h"
28 #include "wx/dcmemory.h"
29 #include "wx/bitmap.h"
30 #include "wx/icon.h"
31#endif
32
33#include "wx/os2/private.h"
34#include "wx/log.h"
35
36
37#if wxUSE_XPM_IN_OS2
38 #define FOR_MSW 1
39 #include "../xpm/xpm.h"
40#endif
41
42#include "wx/xpmhand.h"
43
44#if wxUSE_XPM_IN_OS2
45
46static void XpmToBitmap(
47 wxBitmap* pBitmap
48, const XImage* pXimage
49, const XImage* pXmask
50, const XpmAttributes& rXpmAttr
51)
52{
53 wxBitmapRefData* pRefData = pBitmap->GetBitmapData();
54 pRefData->m_hBitmap = (WXHBITMAP)pXimage->bitmap;
55
56 //
57 // First set the bitmap width, height, depth...
58 //
59 BITMAPINFOHEADER vBm;
60
61 if (!::GpiQueryBitmapParameters( GetHbitmapOf(*pBitmap)
62 ,&vBm
63 ))
64 {
65 wxLogLastError(wxT("GetObject(pBitmap)"));
66 }
67
68 pRefData->m_nWidth = vBm.cx;
69 pRefData->m_nHeight = vBm.cy;
70 pRefData->m_nDepth = vBm.cPlanes * vBm.cBitCount;
71 pRefData->m_nNumColors = rXpmAttr.npixels;
72
73 if (pXmask)
74 {
75 wxMask* pMask = new wxMask();
76
77 pMask->SetMaskBitmap((WXHBITMAP) wxInvertMask( pXmask->bitmap
78 ,vBm.cx
79 ,vBm.cy
80 ));
81 pBitmap->SetMask(pMask);
82 }
83} // end of XpmToBitmap
84
85IMPLEMENT_DYNAMIC_CLASS(wxXPMFileHandler, wxBitmapHandler)
86
87bool wxXPMFileHandler::LoadFile(
88 wxBitmap* pBitmap
89, const wxString& rName
90, long lFlags
91, int lDesiredWidth
92, int lDesiredHeight
93)
94{
95 XImage* pXimage = NULL;
96 XImage* pXmask = NULL;
97 XpmAttributes vXpmAttr;
98 HDC hDC;
99 HPS hPS;
100 DEVOPENSTRUC dOP = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
101 SIZEL vSizl;
102
103 hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&dOP, NULLHANDLE);
104 hPS = ::GpiCreatePS(vHabmain, hDC, &vSizl, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
105 if (hPS)
106 {
107 vXpmAttr.valuemask = XpmReturnPixels | XpmColorTable;
108
109 int nErrorStatus = XpmReadFileToImage( &hPS
110 ,wxMBSTRINGCAST rName.fn_str()
111 ,&pXimage
112 ,&pXmask
113 ,&vXpmAttr
114 );
115 ::GpiDestroyPS(hPS);
116 ::DevCloseDC(hDC);
117 if (nErrorStatus == XpmSuccess)
118 {
119 XpmToBitmap( pBitmap
120 ,pXimage
121 ,pXmask
122 ,vXpmAttr
123 );
124 XpmFree(vXpmAttr.pixels);
125 XpmFreeAttributes(&vXpmAttr);
126 XImageFree(pXimage);
127 if (pXmask)
128 XDestroyImage(pXmask);
129 }
130 return pBitmap->Ok();
131 }
132 return FALSE;
133} // end of wxXPMFileHandler::LoadFile
134
135bool wxXPMFileHandler::SaveFile(
136 wxBitmap* pBitmap
137, const wxString& rName
138, int lType
139, const wxPalette* pPalette
140)
141{
142 XImage vXimage;
143 XImage vXmask;
144 bool bHasmask = FALSE;
145 HDC hDC;
146 HPS hPS;
147 DEVOPENSTRUC dOP = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
148 SIZEL vSizl;
149
150 hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&dOP, NULLHANDLE);
151 hPS = ::GpiCreatePS(vHabmain, hDC, &vSizl, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
152 if (hPS)
153 {
154 // fill the XImage struct 'by hand'
155 wxBitmapRefData* pRefData = pBitmap->GetBitmapData();
156
157 vXimage.width = pRefData->m_nWidth;
158 vXimage.height = pRefData->m_nHeight;
159 vXimage.depth = pRefData->m_nDepth;
160 vXimage.bitmap = (HBITMAP)pRefData->m_hBitmap;
161
162 bHasmask = (pRefData->m_pBitmapMask != NULL);
163 if (bHasmask)
164 {
165 //
166 // Strangely enough, the MSW version of xpmlib is not
167 // coherent with itself regarding masks; we have to invert
168 // the mask we get when loading, but we still must pass it
169 // 'as is' when saving...
170 //
171 vXmask.bitmap = (HBITMAP)pRefData->m_pBitmapMask->GetMaskBitmap();
172 vXmask.width = pRefData->m_nWidth;
173 vXmask.height = pRefData->m_nHeight;
174 vXmask.depth = 1;
175 }
176
177 int nErrorStatus = XpmWriteFileFromImage( &hPS
178 ,wxMBSTRINGCAST rName.fn_str()
179 ,&vXimage
180 ,(bHasmask? &vXmask : (XImage *)NULL)
181 ,(XpmAttributes *) NULL
182 );
183 ::GpiDestroyPS(hPS);
184 ::DevCloseDC(hDC);
185 return (nErrorStatus == XpmSuccess);
186 }
187 return FALSE;
188} // end of wxXPMFileHandler::SaveFile
189
190IMPLEMENT_DYNAMIC_CLASS(wxXPMDataHandler, wxBitmapHandler)
191
192bool wxXPMDataHandler::Create(
193 wxBitmap* pBitmap
194, void* pData
195, long lFlags
196, int nWidth
197, int nHeight
198, int nDepth
199)
200{
201 XImage* pXimage = NULL;
202 XImage* pXmask = NULL;
203 XpmAttributes vXpmAttr;
204 HDC hDC;
205 HPS hPS;
206 DEVOPENSTRUC dOP = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
207 SIZEL vSizl;
208
209 hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&dOP, NULLHANDLE);
210 hPS = ::GpiCreatePS(vHabmain, hDC, &vSizl, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
211 if (hPS)
212 {
213 vXpmAttr.valuemask = XpmReturnInfos | XpmColorTable;
214
215 int nErrorStatus = XpmCreateImageFromData( &hPS
216 ,(char **)pData
217 ,&pXimage
218 ,&pXmask
219 ,&vXpmAttr
220 );
221 ::GpiDestroyPS(hPS);
222 ::DevCloseDC(hDC);
223 if (nErrorStatus == XpmSuccess)
224 {
225 XpmToBitmap( pBitmap
226 ,pXimage
227 ,pXmask
228 ,vXpmAttr
229 );
230 XpmFree(vXpmAttr.pixels);
231 XpmFreeAttributes(&vXpmAttr);
232 XImageFree(pXimage); // releases the malloc, but does not destroy bitmap
233 if (pXmask)
234 XDestroyImage(pXmask);
235 }
236 return pBitmap->Ok();
237 }
238 return FALSE;
239} // end of wxXPMDataHandler::Create
240
241#endif // wxUSE_XPM_IN_OS2