]> git.saurik.com Git - wxWidgets.git/blame - src/mac/carbon/bitmap.cpp
wxMSW update for CW, wxMac updated
[wxWidgets.git] / src / mac / carbon / bitmap.cpp
CommitLineData
e9576ca5
SC
1/////////////////////////////////////////////////////////////////////////////
2// Name: bitmap.cpp
3// Purpose: wxBitmap
4// Author: AUTHOR
5// Modified by:
6// Created: ??/??/98
7// RCS-ID: $Id$
8// Copyright: (c) AUTHOR
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation "bitmap.h"
14#endif
15
16#include "wx/setup.h"
17#include "wx/utils.h"
18#include "wx/palette.h"
19#include "wx/bitmap.h"
20#include "wx/icon.h"
21#include "wx/log.h"
22
519cb848
SC
23extern "C"
24{
25 #include "xpm.h"
26} ;
27
e9576ca5
SC
28#if !USE_SHARED_LIBRARIES
29IMPLEMENT_DYNAMIC_CLASS(wxBitmap, wxGDIObject)
30IMPLEMENT_DYNAMIC_CLASS(wxMask, wxObject)
31#endif
32
519cb848
SC
33#include <PictUtils.h>
34
35CTabHandle wxMacCreateColorTable( int numColors )
36{
37 CTabHandle newColors; /* Handle to the new color table */
38 short index; /* Index into the table of colors */
39 /* Allocate memory for the color table */
40 newColors = (CTabHandle)NewHandleClear( sizeof (ColorTable) +
41 sizeof (ColorSpec) * (numColors - 1) );
42 if (newColors != nil)
43 {
44 /* Initialize the fields */
45 (**newColors).ctSeed = GetCTSeed();
46 (**newColors).ctFlags = 0;
47 (**newColors).ctSize = numColors - 1;
48 /* Initialize the table of colors */
49 }
50 return newColors ;
51}
52
53void wxMacDestroyColorTable( CTabHandle colors )
54{
55 DisposeHandle( (Handle) colors ) ;
56}
57
58void wxMacSetColorTableEntry( CTabHandle newColors , int index , int red , int green , int blue )
59{
60 (**newColors).ctTable[index].value = index;
61 (**newColors).ctTable[index].rgb.red = 0 ;// someRedValue;
62 (**newColors).ctTable[index].rgb.green = 0 ; // someGreenValue;
63 (**newColors).ctTable[index].rgb.blue = 0 ; // someBlueValue;
64}
65
66GWorldPtr wxMacCreateGWorld( int height , int width , int depth )
67{
68 OSErr err = noErr ;
69 GWorldPtr port ;
70 Rect rect = { 0 , 0 , width , height } ;
71
72 if ( depth < 0 )
73 {
74 // get max pixel depth
75 CGrafPtr port ;
76 GetCWMgrPort( &port ) ;
77 GDHandle maxDevice ;
78
79 maxDevice = GetMaxDevice( &port->portRect ) ;
80 if ( maxDevice )
81 depth = (**((**maxDevice).gdPMap)).pixelSize ;
82 else
83 depth = 8 ;
84 }
85
86 err = NewGWorld( &port , depth , &rect , NULL , NULL , 0 ) ;
87 if ( err == noErr )
88 {
89 return port ;
90 }
91 return NULL ;
92}
93
94void wxMacDestroyGWorld( GWorldPtr gw )
95{
96 if ( gw )
97 DisposeGWorld( gw ) ;
98}
99
e9576ca5
SC
100wxBitmapRefData::wxBitmapRefData()
101{
102 m_ok = FALSE;
103 m_width = 0;
104 m_height = 0;
105 m_depth = 0;
106 m_quality = 0;
107 m_numColors = 0;
108 m_bitmapMask = NULL;
519cb848
SC
109 m_hBitmap = NULL ;
110 m_hPict = NULL ;
111 m_bitmapType = kMacBitmapTypeUnknownType ;
e9576ca5
SC
112}
113
114wxBitmapRefData::~wxBitmapRefData()
115{
519cb848
SC
116 switch (m_bitmapType)
117 {
118 case kMacBitmapTypePict :
119 {
120 if ( m_hPict )
121 {
122 KillPicture( m_hPict ) ;
123 m_hPict = NULL ;
124 }
125 }
126 break ;
127 case kMacBitmapTypeGrafWorld :
128 {
129 if ( m_hBitmap )
130 {
131 wxMacDestroyGWorld( m_hBitmap ) ;
132 m_hBitmap = NULL ;
133 }
134 }
135 break ;
136 default :
137 // unkown type ?
138 break ;
139 } ;
140
141 if (m_bitmapMask)
142 {
143 delete m_bitmapMask;
e9576ca5 144 m_bitmapMask = NULL;
519cb848 145 }
e9576ca5
SC
146}
147
148wxList wxBitmap::sm_handlers;
149
150wxBitmap::wxBitmap()
151{
152 m_refData = NULL;
153
154 if ( wxTheBitmapList )
155 wxTheBitmapList->AddBitmap(this);
156}
157
158wxBitmap::~wxBitmap()
159{
160 if (wxTheBitmapList)
161 wxTheBitmapList->DeleteObject(this);
162}
163
164wxBitmap::wxBitmap(const char bits[], int the_width, int the_height, int no_bits)
165{
166 m_refData = new wxBitmapRefData;
167
168 M_BITMAPDATA->m_width = the_width ;
169 M_BITMAPDATA->m_height = the_height ;
170 M_BITMAPDATA->m_depth = no_bits ;
171 M_BITMAPDATA->m_numColors = 0;
519cb848
SC
172 if ( no_bits == 1 )
173 {
174 M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
175 M_BITMAPDATA->m_hBitmap = wxMacCreateGWorld( the_width , the_height , no_bits ) ;
176 M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ;
177
178 CGrafPtr origPort ;
179 GDHandle origDevice ;
180
181 GetGWorld( &origPort , &origDevice ) ;
182 SetGWorld( M_BITMAPDATA->m_hBitmap , NULL ) ;
183
184 // bits is a word aligned array
185
186 unsigned char* linestart = (unsigned char*) bits ;
187 int linesize = ( the_width / 16 ) * 2 ;
188 if ( the_width % 16 )
189 {
190 linesize += 2 ;
191 } ;
192
193 RGBColor colors[2] = {
194 { 0xFFFF , 0xFFFF , 0xFFFF } ,
195 { 0, 0 , 0 }
196 } ;
197
198 for( int y = 0 ; y < the_height ; ++y , linestart += linesize )
199 {
200 for( int x = 0 ; x < the_width ; ++x )
201 {
202 int index = x / 8 ;
203 int bit = x % 8 ;
204 int mask = 1 << bit ;
205 if ( linestart[index] & mask )
206 {
207 SetCPixel( x , y , &colors[1] ) ;
208 }
209 else
210 {
211 SetCPixel( x , y , &colors[0] ) ;
212 }
213 }
214
215 }
216
217 SetGWorld( origPort , origDevice ) ;
218 }
219 else
220 {
221 //multicolor BITMAPs not yet implemented
222 }
e9576ca5
SC
223
224 if ( wxTheBitmapList )
225 wxTheBitmapList->AddBitmap(this);
226}
227
228wxBitmap::wxBitmap(int w, int h, int d)
229{
230 (void)Create(w, h, d);
231
232 if ( wxTheBitmapList )
233 wxTheBitmapList->AddBitmap(this);
234}
235
236wxBitmap::wxBitmap(void *data, long type, int width, int height, int depth)
237{
238 (void) Create(data, type, width, height, depth);
239
240 if ( wxTheBitmapList )
241 wxTheBitmapList->AddBitmap(this);
242}
243
244wxBitmap::wxBitmap(const wxString& filename, long type)
245{
246 LoadFile(filename, (int)type);
247
248 if ( wxTheBitmapList )
249 wxTheBitmapList->AddBitmap(this);
250}
251
e9576ca5
SC
252wxBitmap::wxBitmap(const char **data)
253{
254 (void) Create((void *)data, wxBITMAP_TYPE_XPM_DATA, 0, 0, 0);
255}
e9576ca5
SC
256
257bool wxBitmap::Create(int w, int h, int d)
258{
259 UnRef();
260
261 m_refData = new wxBitmapRefData;
262
263 M_BITMAPDATA->m_width = w;
264 M_BITMAPDATA->m_height = h;
265 M_BITMAPDATA->m_depth = d;
266
519cb848
SC
267 M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
268 M_BITMAPDATA->m_hBitmap = wxMacCreateGWorld( w , h , d ) ;
269 M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ;
e9576ca5
SC
270 return M_BITMAPDATA->m_ok;
271}
272
519cb848
SC
273void wxBitmap::SetHBITMAP(WXHBITMAP bmp)
274{
275 M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
276 M_BITMAPDATA->m_hBitmap = bmp ;
277 M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ;
278}
279
e9576ca5
SC
280bool wxBitmap::LoadFile(const wxString& filename, long type)
281{
282 UnRef();
283
284 m_refData = new wxBitmapRefData;
285
286 wxBitmapHandler *handler = FindHandler(type);
287
288 if ( handler == NULL ) {
289 wxLogWarning("no bitmap handler for type %d defined.", type);
290
291 return FALSE;
292 }
293
294 return handler->LoadFile(this, filename, type, -1, -1);
295}
296
297bool wxBitmap::Create(void *data, long type, int width, int height, int depth)
298{
299 UnRef();
300
301 m_refData = new wxBitmapRefData;
302
303 wxBitmapHandler *handler = FindHandler(type);
304
305 if ( handler == NULL ) {
306 wxLogWarning("no bitmap handler for type %d defined.", type);
307
308 return FALSE;
309 }
310
311 return handler->Create(this, data, type, width, height, depth);
312}
313
314bool wxBitmap::SaveFile(const wxString& filename, int type, const wxPalette *palette)
315{
316 wxBitmapHandler *handler = FindHandler(type);
317
318 if ( handler == NULL ) {
319 wxLogWarning("no bitmap handler for type %d defined.", type);
320
321 return FALSE;
322 }
323
324 return handler->SaveFile(this, filename, type, palette);
325}
326
327void wxBitmap::SetWidth(int w)
328{
329 if (!M_BITMAPDATA)
330 m_refData = new wxBitmapRefData;
331
332 M_BITMAPDATA->m_width = w;
333}
334
335void wxBitmap::SetHeight(int h)
336{
337 if (!M_BITMAPDATA)
338 m_refData = new wxBitmapRefData;
339
340 M_BITMAPDATA->m_height = h;
341}
342
343void wxBitmap::SetDepth(int d)
344{
345 if (!M_BITMAPDATA)
346 m_refData = new wxBitmapRefData;
347
348 M_BITMAPDATA->m_depth = d;
349}
350
351void wxBitmap::SetQuality(int q)
352{
353 if (!M_BITMAPDATA)
354 m_refData = new wxBitmapRefData;
355
356 M_BITMAPDATA->m_quality = q;
357}
358
359void wxBitmap::SetOk(bool isOk)
360{
361 if (!M_BITMAPDATA)
362 m_refData = new wxBitmapRefData;
363
364 M_BITMAPDATA->m_ok = isOk;
365}
366
367void wxBitmap::SetPalette(const wxPalette& palette)
368{
369 if (!M_BITMAPDATA)
370 m_refData = new wxBitmapRefData;
371
372 M_BITMAPDATA->m_bitmapPalette = palette ;
373}
374
375void wxBitmap::SetMask(wxMask *mask)
376{
377 if (!M_BITMAPDATA)
378 m_refData = new wxBitmapRefData;
379
380 M_BITMAPDATA->m_bitmapMask = mask ;
381}
382
383void wxBitmap::AddHandler(wxBitmapHandler *handler)
384{
385 sm_handlers.Append(handler);
386}
387
388void wxBitmap::InsertHandler(wxBitmapHandler *handler)
389{
390 sm_handlers.Insert(handler);
391}
392
393bool wxBitmap::RemoveHandler(const wxString& name)
394{
395 wxBitmapHandler *handler = FindHandler(name);
396 if ( handler )
397 {
398 sm_handlers.DeleteObject(handler);
399 return TRUE;
400 }
401 else
402 return FALSE;
403}
404
405wxBitmapHandler *wxBitmap::FindHandler(const wxString& name)
406{
407 wxNode *node = sm_handlers.First();
408 while ( node )
409 {
410 wxBitmapHandler *handler = (wxBitmapHandler *)node->Data();
411 if ( handler->GetName() == name )
412 return handler;
413 node = node->Next();
414 }
415 return NULL;
416}
417
418wxBitmapHandler *wxBitmap::FindHandler(const wxString& extension, long bitmapType)
419{
420 wxNode *node = sm_handlers.First();
421 while ( node )
422 {
423 wxBitmapHandler *handler = (wxBitmapHandler *)node->Data();
424 if ( handler->GetExtension() == extension &&
425 (bitmapType == -1 || handler->GetType() == bitmapType) )
426 return handler;
427 node = node->Next();
428 }
429 return NULL;
430}
431
432wxBitmapHandler *wxBitmap::FindHandler(long bitmapType)
433{
434 wxNode *node = sm_handlers.First();
435 while ( node )
436 {
437 wxBitmapHandler *handler = (wxBitmapHandler *)node->Data();
438 if (handler->GetType() == bitmapType)
439 return handler;
440 node = node->Next();
441 }
442 return NULL;
443}
444
445/*
446 * wxMask
447 */
448
449wxMask::wxMask()
450{
451/* TODO
452 m_maskBitmap = 0;
453*/
454}
455
456// Construct a mask from a bitmap and a colour indicating
457// the transparent area
458wxMask::wxMask(const wxBitmap& bitmap, const wxColour& colour)
459{
460/* TODO
461 m_maskBitmap = 0;
462*/
463 Create(bitmap, colour);
464}
465
466// Construct a mask from a bitmap and a palette index indicating
467// the transparent area
468wxMask::wxMask(const wxBitmap& bitmap, int paletteIndex)
469{
470/* TODO
471 m_maskBitmap = 0;
472*/
473
474 Create(bitmap, paletteIndex);
475}
476
477// Construct a mask from a mono bitmap (copies the bitmap).
478wxMask::wxMask(const wxBitmap& bitmap)
479{
480/* TODO
481 m_maskBitmap = 0;
482*/
483
484 Create(bitmap);
485}
486
487wxMask::~wxMask()
488{
489// TODO: delete mask bitmap
490}
491
492// Create a mask from a mono bitmap (copies the bitmap).
493bool wxMask::Create(const wxBitmap& bitmap)
494{
495// TODO
496 return FALSE;
497}
498
499// Create a mask from a bitmap and a palette index indicating
500// the transparent area
501bool wxMask::Create(const wxBitmap& bitmap, int paletteIndex)
502{
503// TODO
504 return FALSE;
505}
506
507// Create a mask from a bitmap and a colour indicating
508// the transparent area
509bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour)
510{
511// TODO
512 return FALSE;
513}
514
515/*
516 * wxBitmapHandler
517 */
518
519IMPLEMENT_DYNAMIC_CLASS(wxBitmapHandler, wxObject)
520
521bool wxBitmapHandler::Create(wxBitmap *bitmap, void *data, long type, int width, int height, int depth)
522{
523 return FALSE;
524}
525
526bool wxBitmapHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long type,
527 int desiredWidth, int desiredHeight)
528{
529 return FALSE;
530}
531
532bool wxBitmapHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *palette)
533{
534 return FALSE;
535}
536
537/*
538 * Standard handlers
539 */
540
519cb848
SC
541class WXDLLEXPORT wxPICTResourceHandler: public wxBitmapHandler
542{
543 DECLARE_DYNAMIC_CLASS(wxPICTResourceHandler)
544public:
545 inline wxPICTResourceHandler()
546 {
547 m_name = "Macintosh Pict resource";
548 m_extension = "";
549 m_type = wxBITMAP_TYPE_PICT_RESOURCE;
550 };
551
552 virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
553 int desiredWidth, int desiredHeight);
554};
555IMPLEMENT_DYNAMIC_CLASS(wxPICTResourceHandler, wxBitmapHandler)
556
557bool wxPICTResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
558 int desiredWidth, int desiredHeight)
559{
560 Str255 theName ;
561
562 strcpy( (char*) theName , name ) ;
563 c2pstr( (char*) theName ) ;
564
565 PicHandle thePict = (PicHandle ) GetNamedResource( 'PICT' , theName ) ;
566 if ( thePict )
567 {
568 PictInfo theInfo ;
569
570 GetPictInfo( thePict , &theInfo , 0 , 0 , systemMethod , 0 ) ;
571 DetachResource( (Handle) thePict ) ;
572 M_BITMAPHANDLERDATA->m_bitmapType = kMacBitmapTypePict ;
573 M_BITMAPHANDLERDATA->m_hPict = thePict ;
574 M_BITMAPHANDLERDATA->m_width = theInfo.sourceRect.right - theInfo.sourceRect.left ;
575 M_BITMAPHANDLERDATA->m_height = theInfo.sourceRect.bottom - theInfo.sourceRect.top ;
576
577 M_BITMAPHANDLERDATA->m_depth = theInfo.depth ;
578 M_BITMAPHANDLERDATA->m_ok = true ;
579 M_BITMAPHANDLERDATA->m_numColors = theInfo.uniqueColors ;
580// M_BITMAPHANDLERDATA->m_bitmapPalette;
581// M_BITMAPHANDLERDATA->m_quality;
582 return TRUE ;
583 }
584 return FALSE ;
585}
586
e9576ca5
SC
587/* TODO: bitmap handlers, a bit like this:
588class WXDLLEXPORT wxBMPResourceHandler: public wxBitmapHandler
589{
590 DECLARE_DYNAMIC_CLASS(wxBMPResourceHandler)
591public:
592 inline wxBMPResourceHandler()
593 {
594 m_name = "Windows bitmap resource";
595 m_extension = "";
596 m_type = wxBITMAP_TYPE_BMP_RESOURCE;
597 };
598
599 virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
600 int desiredWidth, int desiredHeight);
601};
602IMPLEMENT_DYNAMIC_CLASS(wxBMPResourceHandler, wxBitmapHandler)
603*/
604
519cb848
SC
605class WXDLLEXPORT wxXPMFileHandler: public wxBitmapHandler
606{
607 DECLARE_DYNAMIC_CLASS(wxXPMFileHandler)
608public:
609 inline wxXPMFileHandler(void)
610 {
611 m_name = "XPM bitmap file";
612 m_extension = "xpm";
613 m_type = wxBITMAP_TYPE_XPM;
614 };
615
616 virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
617 int desiredWidth = -1, int desiredHeight = -1);
618 virtual bool SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *palette = NULL);
619};
620IMPLEMENT_DYNAMIC_CLASS(wxXPMFileHandler, wxBitmapHandler)
621
622bool wxXPMFileHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
623 int desiredWidth, int desiredHeight)
624{
625#if USE_XPM_IN_MSW
626 XImage *ximage;
627 XpmAttributes xpmAttr;
628 HDC dc;
629
630 M_BITMAPHANDLERDATA->m_ok = FALSE;
631 dc = CreateCompatibleDC(NULL);
632 if (dc)
633 {
634 xpmAttr.valuemask = XpmReturnPixels;
635 int errorStatus = XpmReadFileToImage(&dc, WXSTRINGCAST name, &ximage, (XImage **) NULL, &xpmAttr);
636 DeleteDC(dc);
637 if (errorStatus == XpmSuccess)
638 {
639 M_BITMAPHANDLERDATA->m_hBitmap = (WXHBITMAP) ximage->bitmap;
640
641 BITMAP bm;
642 GetObject((HBITMAP)M_BITMAPHANDLERDATA->m_hBitmap, sizeof(bm), (LPSTR) & bm);
643
644 M_BITMAPHANDLERDATA->m_width = (bm.bmWidth);
645 M_BITMAPHANDLERDATA->m_height = (bm.bmHeight);
646 M_BITMAPHANDLERDATA->m_depth = (bm.bmPlanes * bm.bmBitsPixel);
647 M_BITMAPHANDLERDATA->m_numColors = xpmAttr.npixels;
648 XpmFreeAttributes(&xpmAttr);
649 XImageFree(ximage);
650
651 M_BITMAPHANDLERDATA->m_ok = TRUE;
652 return TRUE;
653 }
654 else
655 {
656 M_BITMAPHANDLERDATA->m_ok = FALSE;
657 return FALSE;
658 }
659 }
660#endif
661
662 return FALSE;
663}
664
665bool wxXPMFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *palette)
666{
667#if USE_XPM_IN_MSW
668 HDC dc = NULL;
669
670 Visual *visual = NULL;
671 XImage ximage;
672
673 dc = CreateCompatibleDC(NULL);
674 if (dc)
675 {
676 if (SelectObject(dc, (HBITMAP) M_BITMAPHANDLERDATA->m_hBitmap))
677 { /* for following SetPixel */
678 /* fill the XImage struct 'by hand' */
679 ximage.width = M_BITMAPHANDLERDATA->m_width;
680 ximage.height = M_BITMAPHANDLERDATA->m_height;
681 ximage.depth = M_BITMAPHANDLERDATA->m_depth;
682 ximage.bitmap = (void *)M_BITMAPHANDLERDATA->m_hBitmap;
683 int errorStatus = XpmWriteFileFromImage(&dc, WXSTRINGCAST name,
684 &ximage, (XImage *) NULL, (XpmAttributes *) NULL);
685
686 if (dc)
687 DeleteDC(dc);
688
689 if (errorStatus == XpmSuccess)
690 return TRUE; /* no error */
691 else
692 return FALSE;
693 } else return FALSE;
694 } else return FALSE;
695#else
696 return FALSE;
697#endif
698}
699
700
701class WXDLLEXPORT wxXPMDataHandler: public wxBitmapHandler
702{
703 DECLARE_DYNAMIC_CLASS(wxXPMDataHandler)
704public:
705 inline wxXPMDataHandler(void)
706 {
707 m_name = "XPM bitmap data";
708 m_extension = "xpm";
709 m_type = wxBITMAP_TYPE_XPM_DATA;
710 };
711
712 virtual bool Create(wxBitmap *bitmap, void *data, long flags, int width, int height, int depth = 1);
713};
714IMPLEMENT_DYNAMIC_CLASS(wxXPMDataHandler, wxBitmapHandler)
715
716bool wxXPMDataHandler::Create(wxBitmap *bitmap, void *data, long flags, int width, int height, int depth)
717{
718 XImage * ximage;
719 int ErrorStatus;
720 XpmAttributes xpmAttr;
721
722 xpmAttr.valuemask = XpmReturnInfos; // get infos back
723 ErrorStatus = XpmCreateImageFromData( GetMainDevice() , (char **)data,
724 &ximage, (XImage **) NULL, &xpmAttr);
725
726 if (ErrorStatus == XpmSuccess)
727 {
728 M_BITMAPHANDLERDATA->m_ok = FALSE;
729 M_BITMAPHANDLERDATA->m_numColors = 0;
730 M_BITMAPHANDLERDATA->m_hBitmap = ximage->gworldptr ;
731
732 M_BITMAPHANDLERDATA->m_width = ximage->width;
733 M_BITMAPHANDLERDATA->m_height = ximage->height;
734 M_BITMAPHANDLERDATA->m_depth = ximage->depth;
735 M_BITMAPHANDLERDATA->m_numColors = xpmAttr.npixels;
736 XpmFreeAttributes(&xpmAttr);
737 M_BITMAPHANDLERDATA->m_ok = TRUE;
738 ximage->gworldptr = NULL ;
739 XImageFree(ximage); // releases the malloc, but does not detroy
740 // the bitmap
741 M_BITMAPHANDLERDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
742
743 return TRUE;
744 }
745 else
746 {
747 M_BITMAPHANDLERDATA->m_ok = FALSE;
748 return FALSE;
749 }
750 return FALSE;
751}
752
753class WXDLLEXPORT wxBMPResourceHandler: public wxBitmapHandler
754{
755 DECLARE_DYNAMIC_CLASS(wxBMPResourceHandler)
756public:
757 inline wxBMPResourceHandler()
758 {
759 m_name = "Windows bitmap resource";
760 m_extension = "";
761 m_type = wxBITMAP_TYPE_BMP_RESOURCE;
762 };
763
764 virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
765 int desiredWidth, int desiredHeight);
766};
767
768IMPLEMENT_DYNAMIC_CLASS(wxBMPResourceHandler, wxBitmapHandler)
769
770bool wxBMPResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
771 int desiredWidth, int desiredHeight)
772{
773 // TODO: load colourmap.
774/*
775 M_BITMAPHANDLERDATA->m_hBitmap = (WXHBITMAP) ::LoadBitmap(wxGetInstance(), name);
776 if (M_BITMAPHANDLERDATA->m_hBitmap)
777 {
778 M_BITMAPHANDLERDATA->m_ok = TRUE;
779 BITMAP bm;
780 GetObject((HBITMAP) M_BITMAPHANDLERDATA->m_hBitmap, sizeof(BITMAP), (LPSTR) &bm);
781 M_BITMAPHANDLERDATA->m_width = bm.bmWidth;
782 M_BITMAPHANDLERDATA->m_height = bm.bmHeight;
783 M_BITMAPHANDLERDATA->m_depth = bm.bmBitsPixel;
784 return TRUE;
785 }
786*/
787 // it's probably not found
788 wxLogError("Can't load bitmap '%s' from resources! Check .rc file.", name.c_str());
789
790 return FALSE;
791}
792
793class WXDLLEXPORT wxBMPFileHandler: public wxBitmapHandler
794{
795 DECLARE_DYNAMIC_CLASS(wxBMPFileHandler)
796public:
797 inline wxBMPFileHandler(void)
798 {
799 m_name = "Windows bitmap file";
800 m_extension = "bmp";
801 m_type = wxBITMAP_TYPE_BMP;
802 };
803
804 virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
805 int desiredWidth, int desiredHeight);
806 virtual bool SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *palette = NULL);
807};
808
809IMPLEMENT_DYNAMIC_CLASS(wxBMPFileHandler, wxBitmapHandler)
810
811bool wxBMPFileHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
812 int desiredWidth, int desiredHeight)
813{
814#if USE_IMAGE_LOADING_IN_MSW
815 wxPalette *palette = NULL;
816 bool success = FALSE;
817/*
818 if (type & wxBITMAP_DISCARD_COLOURMAP)
819 success = wxLoadIntoBitmap(WXSTRINGCAST name, bitmap);
820 else
821*/
822 success = (wxLoadIntoBitmap(WXSTRINGCAST name, bitmap, &palette) != 0);
823 if (!success && palette)
824 {
825 delete palette;
826 palette = NULL;
827 }
828 if (palette)
829 M_BITMAPHANDLERDATA->m_bitmapPalette = *palette;
830 return success;
831#else
832 return FALSE;
833#endif
834}
835
836bool wxBMPFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *pal)
837{
838#if USE_IMAGE_LOADING_IN_MSW
839 wxPalette *actualPalette = (wxPalette *)pal;
840 if (!actualPalette && (!M_BITMAPHANDLERDATA->m_bitmapPalette.IsNull()))
841 actualPalette = & (M_BITMAPHANDLERDATA->m_bitmapPalette);
842 return (wxSaveBitmap(WXSTRINGCAST name, bitmap, actualPalette) != 0);
843#else
844 return FALSE;
845#endif
846}
847
848
849
e9576ca5
SC
850void wxBitmap::CleanUpHandlers()
851{
852 wxNode *node = sm_handlers.First();
853 while ( node )
854 {
855 wxBitmapHandler *handler = (wxBitmapHandler *)node->Data();
856 wxNode *next = node->Next();
857 delete handler;
858 delete node;
859 node = next;
860 }
861}
862
863void wxBitmap::InitStandardHandlers()
864{
519cb848
SC
865 AddHandler( new wxPICTResourceHandler ) ;
866 AddHandler( new wxICONResourceHandler ) ;
867 AddHandler(new wxXPMFileHandler);
868 AddHandler(new wxXPMDataHandler);
869 AddHandler(new wxBMPResourceHandler);
870 AddHandler(new wxBMPFileHandler);
e9576ca5 871}