]> git.saurik.com Git - wxWidgets.git/blame - src/os2/bitmap.cpp
correction to maintain data array in synch with string array
[wxWidgets.git] / src / os2 / bitmap.cpp
CommitLineData
0e320a79
DW
1/////////////////////////////////////////////////////////////////////////////
2// Name: bitmap.cpp
3// Purpose: wxBitmap
f0a56ab0 4// Author: David Webster
0e320a79 5// Modified by:
f0a56ab0 6// Created: 08/08/99
0e320a79 7// RCS-ID: $Id$
f0a56ab0 8// Copyright: (c) David Webster
0e320a79
DW
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
aa213887
SN
12#ifdef __GNUG__
13 #pragma implementation "bitmap.h"
14#endif
15
d88de032
DW
16// For compilers that support precompilation, includes "wx.h".
17#include "wx/wxprec.h"
18
19#ifndef WX_PRECOMP
20 #include <stdio.h>
21
22 #include "wx/list.h"
23 #include "wx/utils.h"
24 #include "wx/app.h"
25 #include "wx/palette.h"
26 #include "wx/dcmemory.h"
27 #include "wx/bitmap.h"
28 #include "wx/icon.h"
0e320a79
DW
29#endif
30
d88de032 31#include "wx/os2/private.h"
0e320a79
DW
32#include "wx/log.h"
33
3b9e3455
DW
34//#include "wx/msw/dib.h"
35#include "wx/image.h"
36
d88de032
DW
37// ----------------------------------------------------------------------------
38// macros
39// ----------------------------------------------------------------------------
40
0e320a79
DW
41IMPLEMENT_DYNAMIC_CLASS(wxBitmap, wxGDIObject)
42IMPLEMENT_DYNAMIC_CLASS(wxMask, wxObject)
3b9e3455
DW
43
44IMPLEMENT_DYNAMIC_CLASS(wxBitmapHandler, wxObject)
0e320a79 45
3b9e3455
DW
46// ============================================================================
47// implementation
48// ============================================================================
49
50// ----------------------------------------------------------------------------
51// wxBitmapRefData
52// ----------------------------------------------------------------------------
53
0e320a79
DW
54wxBitmapRefData::wxBitmapRefData()
55{
3b9e3455
DW
56 m_nQuality = 0;
57 m_pSelectedInto = NULL;
58 m_nNumColors = 0;
59 m_pBitmapMask = NULL;
341366c6
DW
60 m_hBitmap = (WXHBITMAP) NULL;
61} // end of wxBitmapRefData::wxBitmapRefData
0e320a79 62
3b9e3455 63void wxBitmapRefData::Free()
0e320a79 64{
3b9e3455
DW
65 wxASSERT_MSG( !m_pSelectedInto,
66 wxT("deleting bitmap still selected into wxMemoryDC") );
0e320a79 67
3b9e3455
DW
68 if (m_hBitmap)
69 {
70 if ( !::GpiDeleteBitmap((HBITMAP)m_hBitmap) )
71 {
72 wxLogLastError("GpiDeleteBitmap(hbitmap)");
73 }
74 }
75
76 delete m_pBitmapMask;
77 m_pBitmapMask = NULL;
341366c6 78} // end of wxBitmapRefData::Free
0e320a79 79
3b9e3455
DW
80// ----------------------------------------------------------------------------
81// wxBitmap creation
82// ----------------------------------------------------------------------------
0e320a79 83
3b9e3455
DW
84// this function should be called from all wxBitmap ctors
85void wxBitmap::Init()
0e320a79 86{
3b9e3455 87 // m_refData = NULL; done in the base class ctor
0e320a79 88
3b9e3455 89 if (wxTheBitmapList)
0e320a79
DW
90 wxTheBitmapList->AddBitmap(this);
91}
92
3b9e3455
DW
93bool wxBitmap::CopyFromIconOrCursor(
94 const wxGDIImage& rIcon
95)
d88de032 96{
3b9e3455 97 wxBitmapRefData* pRefData = new wxBitmapRefData;
d88de032 98
3b9e3455 99 m_refData = pRefData;
d88de032 100
43543d98
DW
101 pRefData->m_nWidth = rIcon.GetWidth();
102 pRefData->m_nHeight = rIcon.GetHeight();
103 pRefData->m_nDepth = wxDisplayDepth();
d88de032 104
43543d98 105 pRefData->m_hBitmap = (WXHBITMAP)rIcon.GetHandle();
3b9e3455 106 // no mask???
43543d98 107 pRefData->m_pBitmapMask = new wxMask();
d88de032 108
3b9e3455 109#if WXWIN_COMPATIBILITY_2
43543d98 110 pRefData->m_bOk = TRUE;
3b9e3455 111#endif // WXWIN_COMPATIBILITY_2
3b9e3455 112 return(TRUE);
0e320a79
DW
113}
114
3b9e3455
DW
115bool wxBitmap::CopyFromCursor(
116 const wxCursor& rCursor
117)
d88de032 118{
3b9e3455 119 UnRef();
d88de032 120
3b9e3455
DW
121 if (!rCursor.Ok())
122 return(FALSE);
43543d98 123 return(CopyFromIconOrCursor(rCursor));
d88de032
DW
124}
125
3b9e3455
DW
126bool wxBitmap::CopyFromIcon(
127 const wxIcon& rIcon
128)
0e320a79 129{
3b9e3455 130 UnRef();
0e320a79 131
3b9e3455
DW
132 if (!rIcon.Ok())
133 return(FALSE);
0e320a79 134
43543d98 135 return CopyFromIconOrCursor(rIcon);
0e320a79
DW
136}
137
3b9e3455 138wxBitmap::~wxBitmap()
d88de032 139{
3b9e3455
DW
140 if (wxTheBitmapList)
141 wxTheBitmapList->DeleteObject(this);
d88de032
DW
142}
143
3b9e3455
DW
144wxBitmap::wxBitmap(
145 const char zBits[]
146, int nTheWidth
147, int nTheHeight
148, int nNoBits
149)
150{
151 Init();
152
153 wxBitmapRefData* pRefData = new wxBitmapRefData;
154 BITMAPINFOHEADER2 vHeader;
155 BITMAPINFO2 vInfo;
156 HDC hDc;
157 HPS hPs;
43543d98 158 DEVOPENSTRUC vDop = { NULL, "DISPLAY", NULL, NULL, NULL, NULL, NULL, NULL, NULL };
3b9e3455
DW
159 SIZEL vSize = {0, 0};
160
43543d98 161 wxASSERT(vHabmain != NULL);
3b9e3455
DW
162
163 hDc = ::DevOpenDC(vHabmain, OD_MEMORY, (PSZ)"*", 1L, (PDEVOPENDATA)&vDop, 0L);
164
165 vHeader.cbFix = sizeof(vHeader);
166 vHeader.cx = (USHORT)nTheWidth;
167 vHeader.cy = (USHORT)nTheHeight;
168 vHeader.cPlanes = 1L;
169 vHeader.cBitCount = nNoBits;
170 vHeader.ulCompression = BCA_UNCOMP;
171 vHeader.cxResolution = 0;
172 vHeader.cyResolution = 0;
173 vHeader.cclrUsed = 0;
174 vHeader.cclrImportant = 0;
175 vHeader.usUnits = BRU_METRIC;
176 vHeader.usRecording = BRA_BOTTOMUP;
177 vHeader.usRendering = BRH_NOTHALFTONED;
178 vHeader.cSize1 = 0;
179 vHeader.cSize2 = 0;
180 vHeader.ulColorEncoding = 0;
181 vHeader.ulIdentifier = 0;
182
43543d98 183 hPs = ::GpiCreatePS(vHabmain, hDc, &vSize, GPIA_ASSOC | PU_PELS);
4f72fe4f 184 if (hPs == 0)
3b9e3455
DW
185 {
186 wxLogLastError("GpiCreatePS Failure");
187 }
0e320a79 188
3b9e3455 189 m_refData = pRefData;
0e320a79 190
43543d98
DW
191 pRefData->m_nWidth = nTheWidth;
192 pRefData->m_nHeight = nTheHeight;
193 pRefData->m_nDepth = nNoBits;
194 pRefData->m_nNumColors = 0;
195 pRefData->m_pSelectedInto = NULL;
0e320a79 196
3b9e3455 197 HBITMAP hBmp = ::GpiCreateBitmap(hPs, &vHeader, 0L, NULL, &vInfo);
43543d98 198 if (!hBmp)
3b9e3455
DW
199 {
200 wxLogLastError("CreateBitmap");
201 }
43543d98 202 SetHBITMAP((WXHBITMAP)hBmp);
0e320a79
DW
203}
204
3b9e3455
DW
205// Create from XPM data
206wxBitmap::wxBitmap(
207 char** ppData
208, wxControl* WXUNUSED(pAnItem))
209{
210 Init();
211
43543d98 212 (void)Create( (void *)ppData
3b9e3455
DW
213 ,wxBITMAP_TYPE_XPM_DATA
214 ,0
215 ,0
216 ,0
217 );
218}
219
220wxBitmap::wxBitmap(
221 int nW
222, int nH
223, int nD
224)
225{
226 Init();
227
228 (void)Create( nW
229 ,nH
230 ,nD
231 );
232}
233
234wxBitmap::wxBitmap(
235 void* pData
236, long lType
237, int nWidth
238, int nHeight
239, int nDepth
240)
241{
242 Init();
243
244 (void)Create( pData
245 ,lType
246 ,nWidth
247 ,nHeight
248 ,nDepth
249 );
250}
251
252wxBitmap::wxBitmap(
253 const wxString& rFilename
254, long lType
255)
256{
257 Init();
258
259 LoadFile( rFilename
260 ,(int)lType
261 );
262}
263
264bool wxBitmap::Create(
265 int nW
266, int nH
267, int nD
268)
269{
270 HBITMAP hBmp;
271 BITMAPINFOHEADER2 vHeader;
272 BITMAPINFO2 vInfo;
4f72fe4f
DW
273 HPS hpsScreen;
274 HDC hdcScreen;
43543d98 275 DEVOPENSTRUC vDop = { NULL, "DISPLAY", NULL, NULL, NULL, NULL, NULL, NULL, NULL };
3b9e3455 276 SIZEL vSize = {0, 0};
4f72fe4f 277 LONG lBitCount;
3b9e3455 278
43543d98 279 wxASSERT(vHabmain != NULL);
3b9e3455 280
4f72fe4f
DW
281 hpsScreen = ::WinGetScreenPS(HWND_DESKTOP);
282 hdcScreen = ::GpiQueryDevice(hpsScreen);
43543d98 283 ::DevQueryCaps(hdcScreen, CAPS_COLOR_BITCOUNT, 1L, &lBitCount);
3b9e3455
DW
284
285 vHeader.cbFix = sizeof(vHeader);
286 vHeader.cx = (USHORT)nW;
287 vHeader.cy = (USHORT)nH;
288 vHeader.cPlanes = (USHORT)nD;
4f72fe4f 289 vHeader.cBitCount = lBitCount;
3b9e3455
DW
290 vHeader.ulCompression = BCA_UNCOMP;
291 vHeader.cxResolution = 0;
292 vHeader.cyResolution = 0;
293 vHeader.cclrUsed = 0;
294 vHeader.cclrImportant = 0;
295 vHeader.usUnits = BRU_METRIC;
296 vHeader.usRecording = BRA_BOTTOMUP;
297 vHeader.usRendering = BRH_NOTHALFTONED;
298 vHeader.cSize1 = 0;
299 vHeader.cSize2 = 0;
300 vHeader.ulColorEncoding = 0;
301 vHeader.ulIdentifier = 0;
302
0e320a79 303 UnRef();
0e320a79
DW
304 m_refData = new wxBitmapRefData;
305
43543d98
DW
306 GetBitmapData()->m_nWidth = nW;
307 GetBitmapData()->m_nHeight = nH;
308 GetBitmapData()->m_nDepth = nD;
0e320a79 309
3b9e3455
DW
310 if (nD > 0)
311 {
4f72fe4f 312 hBmp = ::GpiCreateBitmap(hpsScreen, &vHeader, 0L, NULL, &vInfo);
3b9e3455
DW
313 if (!hBmp)
314 {
315 wxLogLastError("CreateBitmap");
316 }
317 }
318 else
319 {
4f72fe4f
DW
320 LONG lPlanes;
321
43543d98 322 ::DevQueryCaps(hdcScreen, CAPS_COLOR_PLANES, 1L, &lPlanes);
4f72fe4f
DW
323 hBmp = ::GpiCreateBitmap(hpsScreen, &vHeader, 0L, NULL, &vInfo);
324 if (!hBmp)
3b9e3455 325 {
4f72fe4f 326 wxLogLastError("CreateBitmap");
3b9e3455 327 }
43543d98 328 GetBitmapData()->m_nDepth = wxDisplayDepth();
3b9e3455 329 }
4f72fe4f 330 SetHBITMAP((WXHBITMAP)hBmp);
0e320a79 331
3b9e3455 332#if WXWIN_COMPATIBILITY_2
4f72fe4f 333 GetBitmapData()->m_bOk = hBmp != 0;
3b9e3455
DW
334#endif // WXWIN_COMPATIBILITY_2
335
336 return Ok();
0e320a79
DW
337}
338
4f72fe4f
DW
339bool wxBitmap::LoadFile(
340 const wxString& rFilename
341, long lType
342)
0e320a79 343{
4e0f4f97 344 HPS hPs = NULLHANDLE;
8ea3f821 345
0e320a79
DW
346 UnRef();
347
4f72fe4f
DW
348 wxBitmapHandler* pHandler = wxDynamicCast( FindHandler(lType)
349 ,wxBitmapHandler
350 );
0e320a79 351
4f72fe4f 352 if (pHandler)
3b9e3455
DW
353 {
354 m_refData = new wxBitmapRefData;
0e320a79 355
4f72fe4f
DW
356 return(pHandler->LoadFile( this
357 ,rFilename
8ea3f821 358 ,hPs
4f72fe4f
DW
359 ,lType
360 , -1
361 , -1
43543d98 362 ));
0e320a79 363 }
3b9e3455
DW
364 else
365 {
4f72fe4f 366 wxImage vImage;
0e320a79 367
43543d98 368 if (!vImage.LoadFile(rFilename, lType) || !vImage.Ok() )
4f72fe4f 369 return(FALSE);
3b9e3455 370
4f72fe4f
DW
371 *this = vImage.ConvertToBitmap();
372
373 return(TRUE);
3b9e3455 374 }
0e320a79
DW
375}
376
4f72fe4f
DW
377bool wxBitmap::Create(
378 void* pData
379, long lType
380, int nWidth
381, int nHeight
382, int nDepth
383)
0e320a79
DW
384{
385 UnRef();
386
4f72fe4f
DW
387 wxBitmapHandler* pHandler = wxDynamicCast( FindHandler(lType)
388 ,wxBitmapHandler
389 );
0e320a79 390
4f72fe4f 391 if (!pHandler)
3b9e3455
DW
392 {
393 wxLogDebug(wxT("Failed to create bitmap: no bitmap handler for "
43543d98 394 "type %d defined."), lType);
0e320a79 395
4f72fe4f 396 return(FALSE);
0e320a79
DW
397 }
398
3b9e3455
DW
399 m_refData = new wxBitmapRefData;
400
43543d98
DW
401 return(pHandler->Create( this
402 ,pData
403 ,lType
404 ,nWidth
405 ,nHeight
406 ,nDepth
407 ));
0e320a79
DW
408}
409
58b16424 410bool wxBitmap::SaveFile(
4f72fe4f
DW
411 const wxString& rFilename
412, int lType
413, const wxPalette* pPalette
414)
0e320a79 415{
4f72fe4f
DW
416 wxBitmapHandler* pHandler = wxDynamicCast( FindHandler(lType)
417 ,wxBitmapHandler
418 );
0e320a79 419
4f72fe4f 420 if (pHandler)
3b9e3455 421 {
4f72fe4f
DW
422 return pHandler->SaveFile( this
423 ,rFilename
424 ,lType
425 ,pPalette
426 );
3b9e3455
DW
427 }
428 else
429 {
430 // FIXME what about palette? shouldn't we use it?
4f72fe4f
DW
431 wxImage vImage(*this);
432
433 if (!vImage.Ok())
434 return(FALSE);
0e320a79 435
4f72fe4f
DW
436 return(vImage.SaveFile( rFilename
437 ,lType
438 ));
3b9e3455 439 }
0e320a79
DW
440}
441
3b9e3455
DW
442// ----------------------------------------------------------------------------
443// wxBitmap accessors
444// ----------------------------------------------------------------------------
0e320a79 445
4f72fe4f
DW
446void wxBitmap::SetQuality(
447 int nQ
448)
0e320a79 449{
3b9e3455 450 EnsureHasData();
0e320a79 451
4f72fe4f 452 GetBitmapData()->m_nQuality = nQ;
0e320a79
DW
453}
454
3b9e3455 455#if WXWIN_COMPATIBILITY_2
4f72fe4f
DW
456void wxBitmap::SetOk(
457 bool bOk
458)
0e320a79 459{
3b9e3455 460 EnsureHasData();
0e320a79 461
4f72fe4f 462 GetBitmapData()->m_bOk = bOk;
0e320a79 463}
3b9e3455 464#endif // WXWIN_COMPATIBILITY_2
0e320a79 465
4f72fe4f
DW
466void wxBitmap::SetPalette(
467 const wxPalette& rPalette
468)
0e320a79 469{
3b9e3455 470 EnsureHasData();
0e320a79 471
4f72fe4f 472 GetBitmapData()->m_vBitmapPalette = rPalette;
0e320a79
DW
473}
474
4f72fe4f
DW
475void wxBitmap::SetMask(
476 wxMask* pMask
477)
0e320a79 478{
3b9e3455 479 EnsureHasData();
0e320a79 480
4f72fe4f 481 GetBitmapData()->m_pBitmapMask = pMask;
0e320a79
DW
482}
483
4f72fe4f 484// Will try something for OS/2 but not really sure how close
58b16424 485// to the msw intent this is.
4f72fe4f
DW
486wxBitmap wxBitmap::GetBitmapForDC(
487 wxDC& rDc
488) const
d88de032 489{
4f72fe4f
DW
490 wxMemoryDC vMemDC;
491 wxBitmap vTmpBitmap( this->GetWidth()
492 ,this->GetHeight()
493 ,rDc.GetDepth()
494 );
43543d98 495 WXHBITMAP vOldBitmap;
4f72fe4f
DW
496 HPS hMemoryPS;
497 HPS hPs;
498 POINTL vPoint[4];
43543d98 499 SIZEL vSize = {0,0};
d88de032 500
43543d98
DW
501 hMemoryPS = ::GpiCreatePS(vHabmain, (HDC)vMemDC.GetHDC(), &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
502 hPs = ::GpiCreatePS(vHabmain, (HDC)rDc.GetHDC(), &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
d88de032 503
4f72fe4f 504 // TODO: Set the points
3b9e3455 505
43543d98
DW
506 vOldBitmap = (WXHBITMAP)::GpiSetBitmap(hPs, (HBITMAP)vTmpBitmap.GetHBITMAP());
507 ::GpiBitBlt(hPs, hMemoryPS, 4L, vPoint, ROP_SRCCOPY, BBO_IGNORE);
58b16424
DW
508
509 return(vTmpBitmap);
d88de032
DW
510}
511
3b9e3455
DW
512// ----------------------------------------------------------------------------
513// wxMask
514// ----------------------------------------------------------------------------
0e320a79
DW
515
516wxMask::wxMask()
517{
4f72fe4f 518 m_hMaskBitmap = 0;
0e320a79
DW
519}
520
521// Construct a mask from a bitmap and a colour indicating
522// the transparent area
4f72fe4f
DW
523wxMask::wxMask(
524 const wxBitmap& rBitmap
525, const wxColour& rColour
526)
0e320a79 527{
4f72fe4f
DW
528 m_hMaskBitmap = 0;
529 Create( rBitmap
530 ,rColour
531 );
0e320a79
DW
532}
533
534// Construct a mask from a bitmap and a palette index indicating
535// the transparent area
4f72fe4f
DW
536wxMask::wxMask(
537 const wxBitmap& rBitmap
538, int nPaletteIndex
539)
0e320a79 540{
4f72fe4f
DW
541 m_hMaskBitmap = 0;
542 Create( rBitmap
543 ,nPaletteIndex
544 );
0e320a79
DW
545}
546
547// Construct a mask from a mono bitmap (copies the bitmap).
4f72fe4f
DW
548wxMask::wxMask(
549 const wxBitmap& rBitmap
550)
0e320a79 551{
4f72fe4f
DW
552 m_hMaskBitmap = 0;
553 Create(rBitmap);
0e320a79
DW
554}
555
556wxMask::~wxMask()
557{
4f72fe4f
DW
558 if (m_hMaskBitmap)
559 ::GpiDeleteBitmap((HBITMAP)m_hMaskBitmap);
0e320a79
DW
560}
561
562// Create a mask from a mono bitmap (copies the bitmap).
58b16424
DW
563bool wxMask::Create(
564 const wxBitmap& rBitmap
565)
0e320a79 566{
58b16424 567 BITMAPINFOHEADER2 vHeader;
43543d98 568 DEVOPENSTRUC vDop = { NULL, "DISPLAY", NULL, NULL, NULL, NULL, NULL, NULL, NULL };
58b16424
DW
569 SIZEL vSize = {0, 0};
570 POINTL vPoint[4];
571
572 if (m_hMaskBitmap)
3b9e3455 573 {
58b16424
DW
574 ::GpiDeleteBitmap((HBITMAP) m_hMaskBitmap);
575 m_hMaskBitmap = 0;
3b9e3455 576 }
58b16424 577 if (!rBitmap.Ok() || rBitmap.GetDepth() != 1)
3b9e3455 578 {
58b16424 579 return(FALSE);
3b9e3455 580 }
58b16424
DW
581 vHeader.cbFix = sizeof(vHeader);
582 vHeader.cx = (USHORT)rBitmap.GetWidth();
583 vHeader.cy = (USHORT)rBitmap.GetHeight();
584 vHeader.cPlanes = 1;
585 vHeader.cBitCount = 1;
586
587 m_hMaskBitmap = (WXHBITMAP) ::GpiCreateBitmap( m_hPs
588 ,&vHeader
589 ,0L
590 ,NULL
591 ,NULL
592 );
593
594 HPS srcPS = ::GpiCreatePS(vHabmain, m_hDc, &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
595 ::GpiSetBitmap(srcPS, (HBITMAP)rBitmap.GetHBITMAP());
596 HPS destPS = ::GpiCreatePS(vHabmain, m_hDc, &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
597 ::GpiSetBitmap(srcPS, (HBITMAP)m_hMaskBitmap);
598 // TODO: Set the point array
43543d98 599 ::GpiBitBlt(destPS, srcPS, 4L, vPoint, ROP_SRCCOPY , BBO_IGNORE);
58b16424
DW
600
601 ::GpiDestroyPS(srcPS);
602 ::GpiDestroyPS(destPS);
603 return(TRUE);
0e320a79
DW
604}
605
606// Create a mask from a bitmap and a palette index indicating
607// the transparent area
58b16424
DW
608bool wxMask::Create(
609 const wxBitmap& rBitmap
610, int nPaletteIndex
611)
0e320a79 612{
58b16424 613 if (m_hMaskBitmap)
3b9e3455 614 {
58b16424
DW
615 ::GpiDeleteBitmap((HBITMAP) m_hMaskBitmap);
616 m_hMaskBitmap = 0;
3b9e3455 617 }
58b16424 618 if (rBitmap.Ok() && rBitmap.GetPalette()->Ok())
3b9e3455 619 {
43543d98
DW
620 unsigned char cRed;
621 unsigned char cGreen;
622 unsigned char cBlue;
623
58b16424 624 if (rBitmap.GetPalette()->GetRGB( nPaletteIndex
43543d98
DW
625 ,&cRed
626 ,&cGreen
627 ,&cBlue
58b16424 628 ))
3b9e3455 629 {
43543d98
DW
630 wxColour vTransparentColour( cRed
631 ,cGreen
632 ,cBlue
58b16424
DW
633 );
634
635 return (Create( rBitmap
636 ,vTransparentColour
637 ));
3b9e3455
DW
638 }
639 }
58b16424 640 return(FALSE);
0e320a79
DW
641}
642
643// Create a mask from a bitmap and a colour indicating
644// the transparent area
58b16424
DW
645bool wxMask::Create(
646 const wxBitmap& rBitmap
647, const wxColour& rColour
648)
0e320a79 649{
58b16424 650 BITMAPINFOHEADER2 vHeader;
43543d98 651 DEVOPENSTRUC vDop = { NULL, "DISPLAY", NULL, NULL, NULL, NULL, NULL, NULL, NULL };
58b16424
DW
652 SIZEL vSize = {0, 0};
653 POINTL vPoint[4];
654
655 if (m_hMaskBitmap)
3b9e3455 656 {
58b16424
DW
657 ::GpiDeleteBitmap((HBITMAP) m_hMaskBitmap);
658 m_hMaskBitmap = 0;
3b9e3455 659 }
58b16424 660 if (!rBitmap.Ok())
3b9e3455 661 {
58b16424 662 return(FALSE);
3b9e3455
DW
663 }
664
665 // scan the bitmap for the transparent colour and set
666 // the corresponding pixels in the mask to BLACK and
667 // the rest to WHITE
58b16424
DW
668 COLORREF vMaskColour = OS2RGB(rColour.Red(), rColour.Green(), rColour.Blue());
669
670 vHeader.cbFix = sizeof(vHeader);
671 vHeader.cx = (USHORT)rBitmap.GetWidth();
672 vHeader.cy = (USHORT)rBitmap.GetHeight();
673 vHeader.cPlanes = 1;
674 vHeader.cBitCount = 1;
675
676 m_hMaskBitmap = (WXHBITMAP) ::GpiCreateBitmap( m_hPs
677 ,&vHeader
678 ,0L
679 ,NULL
680 ,NULL
681 );
43543d98 682
58b16424
DW
683 HPS srcPS = ::GpiCreatePS(vHabmain, m_hDc, &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
684 ::GpiSetBitmap(srcPS, (HBITMAP)rBitmap.GetHBITMAP());
685 HPS destPS = ::GpiCreatePS(vHabmain, m_hDc, &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
686 ::GpiSetBitmap(srcPS, (HBITMAP)m_hMaskBitmap);
3b9e3455
DW
687
688 // this is not very efficient, but I can't think
689 // of a better way of doing it
58b16424 690 for (int w = 0; w < rBitmap.GetWidth(); w++)
3b9e3455 691 {
58b16424 692 for (int h = 0; h < rBitmap.GetHeight(); h++)
3b9e3455 693 {
58b16424
DW
694 POINTL vPoint;
695
696 vPoint.x = w;
697 vPoint.y = h;
698
43543d98 699 COLORREF col = ::GpiQueryPel(srcPS, &vPoint);
58b16424
DW
700
701 if (col == vMaskColour)
3b9e3455 702 {
58b16424
DW
703 ::GpiSetColor(destPS, CLR_WHITE);
704 ::GpiSetPel(destPS, &vPoint);
3b9e3455
DW
705 }
706 else
707 {
58b16424
DW
708 ::GpiSetColor(destPS, CLR_BLACK);
709 ::GpiSetPel(destPS, &vPoint);
3b9e3455
DW
710 }
711 }
712 }
58b16424
DW
713 ::GpiDestroyPS(srcPS);
714 ::GpiDestroyPS(destPS);
715 return(TRUE);
0e320a79
DW
716}
717
3b9e3455
DW
718// ----------------------------------------------------------------------------
719// wxBitmapHandler
720// ----------------------------------------------------------------------------
0e320a79 721
58b16424
DW
722bool wxBitmapHandler::Create(
723 wxGDIImage* pImage
724, void* pData
725, long lFlags
726, int nWidth
727, int nHeight
728, int nDepth
729)
3b9e3455 730{
58b16424
DW
731 wxBitmap* pBitmap = wxDynamicCast( pImage
732 ,wxBitmap
733 );
3b9e3455 734
58b16424
DW
735 return(pBitmap ? Create( pBitmap
736 ,pData
737 ,nWidth
738 ,nHeight
739 ,nDepth
740 ) : FALSE);
3b9e3455
DW
741}
742
58b16424
DW
743bool wxBitmapHandler::Load(
744 wxGDIImage* pImage
745, const wxString& rName
8ea3f821 746, HPS hPs
58b16424
DW
747, long lFlags
748, int nWidth
749, int nHeight
750)
3b9e3455 751{
43543d98
DW
752 wxBitmap* pBitmap = wxDynamicCast( pImage
753 ,wxBitmap
754 );
3b9e3455 755
58b16424
DW
756 return(pBitmap ? LoadFile( pBitmap
757 ,rName
8ea3f821 758 ,hPs
58b16424
DW
759 ,lFlags
760 ,nWidth
761 ,nHeight
762 ) : FALSE);
3b9e3455
DW
763}
764
58b16424
DW
765bool wxBitmapHandler::Save(
766 wxGDIImage* pImage
767, const wxString& rName
768, int lType
769)
0e320a79 770{
58b16424
DW
771 wxBitmap* pBitmap = wxDynamicCast( pImage
772 ,wxBitmap
773 );
0e320a79 774
58b16424
DW
775 return(pBitmap ? SaveFile( pBitmap
776 ,rName
777 ,lType
778 ) : FALSE);
0e320a79
DW
779}
780
58b16424
DW
781bool wxBitmapHandler::Create(
782 wxBitmap* WXUNUSED(pBitmap)
783, void* WXUNUSED(pData)
784, long WXUNUSED(lType)
785, int WXUNUSED(nWidth)
786, int WXUNUSED(nHeight)
787, int WXUNUSED(nDepth)
788)
0e320a79 789{
58b16424 790 return(FALSE);
0e320a79
DW
791}
792
58b16424
DW
793bool wxBitmapHandler::LoadFile(
794 wxBitmap* WXUNUSED(pBitmap)
795, const wxString& WXUNUSED(rName)
8ea3f821 796, HPS WXUNUSED(hPs)
58b16424
DW
797, long WXUNUSED(lType)
798, int WXUNUSED(nDesiredWidth)
799, int WXUNUSED(nDesiredHeight)
800)
0e320a79 801{
43543d98 802 return(FALSE);
0e320a79
DW
803}
804
58b16424
DW
805bool wxBitmapHandler::SaveFile(
806 wxBitmap* WXUNUSED(pBitmap)
807, const wxString& WXUNUSED(rName)
808, int WXUNUSED(nType)
809, const wxPalette* WXUNUSED(pPalette)
810)
0e320a79 811{
58b16424 812 return(FALSE);
0e320a79 813}
ce44c50e 814