added CreateFromXpm method that uses image xpm decoder

use of the old xpm library code is conditionned by OBSOLETE_XPM_DATA_HANDLER
which is set be default under Classic Mac OS and not set under Mac OS X


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10054 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Gilles Depeyrot
2001-05-08 14:07:34 +00:00
parent b7d667c57b
commit 973b0afb1e
2 changed files with 210 additions and 162 deletions

View File

@@ -21,13 +21,16 @@
#include "wx/icon.h" #include "wx/icon.h"
#include "wx/log.h" #include "wx/log.h"
#include "wx/image.h" #include "wx/image.h"
#include "wx/xpmdecod.h"
extern "C" #ifndef __UNIX__
#define OBSOLETE_XPM_DATA_HANDLER
#endif
extern "C"
{ {
#ifdef __UNIX__ #ifdef OBSOLETE_XPM_DATA_HANDLER
#include "xpm/xpm.h" #include "xpm.h"
#else
#include "xpm.h"
#endif #endif
} ; } ;
@@ -200,9 +203,9 @@ wxBitmapRefData::wxBitmapRefData()
m_quality = 0; m_quality = 0;
m_numColors = 0; m_numColors = 0;
m_bitmapMask = NULL; m_bitmapMask = NULL;
m_hBitmap = NULL ; m_hBitmap = NULL ;
m_hPict = NULL ; m_hPict = NULL ;
m_bitmapType = kMacBitmapTypeUnknownType ; m_bitmapType = kMacBitmapTypeUnknownType ;
} }
wxBitmapRefData::~wxBitmapRefData() wxBitmapRefData::~wxBitmapRefData()
@@ -265,55 +268,54 @@ wxBitmap::wxBitmap(const char bits[], int the_width, int the_height, int no_bits
M_BITMAPDATA->m_numColors = 0; M_BITMAPDATA->m_numColors = 0;
if ( no_bits == 1 ) if ( no_bits == 1 )
{ {
M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ; M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
M_BITMAPDATA->m_hBitmap = wxMacCreateGWorld( the_width , the_height , no_bits ) ; M_BITMAPDATA->m_hBitmap = wxMacCreateGWorld( the_width , the_height , no_bits ) ;
M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ; M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ;
CGrafPtr origPort ; CGrafPtr origPort ;
GDHandle origDevice ; GDHandle origDevice ;
GetGWorld( &origPort , &origDevice ) ; GetGWorld( &origPort , &origDevice ) ;
SetGWorld( M_BITMAPDATA->m_hBitmap , NULL ) ; SetGWorld( M_BITMAPDATA->m_hBitmap , NULL ) ;
LockPixels( GetGWorldPixMap( M_BITMAPDATA->m_hBitmap ) ) ; LockPixels( GetGWorldPixMap( M_BITMAPDATA->m_hBitmap ) ) ;
// bits is a char array // bits is a char array
unsigned char* linestart = (unsigned char*) bits ; unsigned char* linestart = (unsigned char*) bits ;
int linesize = ( the_width / (sizeof(unsigned char) * 8)) ; int linesize = ( the_width / (sizeof(unsigned char) * 8)) ;
if ( the_width % (sizeof(unsigned char) * 8) ) { if ( the_width % (sizeof(unsigned char) * 8) ) {
linesize += sizeof(unsigned char); linesize += sizeof(unsigned char);
} }
RGBColor colors[2] = { RGBColor colors[2] = {
{ 0xFFFF , 0xFFFF , 0xFFFF } , { 0xFFFF , 0xFFFF , 0xFFFF } ,
{ 0, 0 , 0 } { 0, 0 , 0 }
} ; } ;
for ( int y = 0 ; y < the_height ; ++y , linestart += linesize ) for ( int y = 0 ; y < the_height ; ++y , linestart += linesize )
{ {
for ( int x = 0 ; x < the_width ; ++x ) for ( int x = 0 ; x < the_width ; ++x )
{ {
int index = x / 8 ; int index = x / 8 ;
int bit = x % 8 ; int bit = x % 8 ;
int mask = 1 << bit ; int mask = 1 << bit ;
if ( linestart[index] & mask ) if ( linestart[index] & mask )
{ {
SetCPixel( x , y , &colors[1] ) ; SetCPixel( x , y , &colors[1] ) ;
} }
else else
{ {
SetCPixel( x , y , &colors[0] ) ; SetCPixel( x , y , &colors[0] ) ;
} }
} }
}
} UnlockPixels( GetGWorldPixMap( M_BITMAPDATA->m_hBitmap ) ) ;
UnlockPixels( GetGWorldPixMap( M_BITMAPDATA->m_hBitmap ) ) ;
SetGWorld( origPort , origDevice ) ; SetGWorld( origPort , origDevice ) ;
} }
else else
{ {
wxFAIL_MSG(wxT("multicolor BITMAPs not yet implemented")); wxFAIL_MSG(wxT("multicolor BITMAPs not yet implemented"));
} }
if ( wxTheBitmapList ) { if ( wxTheBitmapList ) {
@@ -345,14 +347,33 @@ wxBitmap::wxBitmap(const wxString& filename, long type)
wxTheBitmapList->AddBitmap(this); wxTheBitmapList->AddBitmap(this);
} }
wxBitmap::wxBitmap(const char **data) bool wxBitmap::CreateFromXpm(const char **bits)
{ {
(void) Create((void *)data, wxBITMAP_TYPE_XPM_DATA, 0, 0, 0); wxCHECK_MSG( bits != NULL, FALSE, wxT("invalid bitmap data") )
wxXPMDecoder decoder;
wxImage img = decoder.ReadData(bits);
wxCHECK_MSG( img.Ok(), FALSE, wxT("invalid bitmap data") )
*this = wxBitmap(img);
if ( wxTheBitmapList ) wxTheBitmapList->AddBitmap(this);
return TRUE;
} }
wxBitmap::wxBitmap(char **data) wxBitmap::wxBitmap(const char **bits)
{ {
(void) Create((void *)data, wxBITMAP_TYPE_XPM_DATA, 0, 0, 0); #ifdef OBSOLETE_XPM_DATA_HANDLER
(void) Create((void *)bits, wxBITMAP_TYPE_XPM_DATA, 0, 0, 0);
#else
(void) CreateFromXpm(bits);
#endif
}
wxBitmap::wxBitmap(char **bits)
{
#ifdef OBSOLETE_XPM_DATA_HANDLER
(void) Create((void *)bits, wxBITMAP_TYPE_XPM_DATA, 0, 0, 0);
#else
(void) CreateFromXpm((const char **)bits);
#endif
} }
wxBitmap wxBitmap::GetSubBitmap(const wxRect &rect) const wxBitmap wxBitmap::GetSubBitmap(const wxRect &rect) const
@@ -567,7 +588,7 @@ wxBitmap::wxBitmap(const wxImage& image, int depth)
// Create mask // Create mask
if ( image.HasMask() ) { if ( image.HasMask() ) {
wxMask *mask = new wxMask( maskBitmap ); SetMask(new wxMask( maskBitmap ));
} }
UnlockPixels( GetGWorldPixMap(GetHBITMAP()) ); UnlockPixels( GetGWorldPixMap(GetHBITMAP()) );
@@ -1264,7 +1285,7 @@ bool wxXPMFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type
#endif #endif
} }
#ifdef OBSOLETE_XPM_DATA_HANDLER
class WXDLLEXPORT wxXPMDataHandler: public wxBitmapHandler class WXDLLEXPORT wxXPMDataHandler: public wxBitmapHandler
{ {
DECLARE_DYNAMIC_CLASS(wxXPMDataHandler) DECLARE_DYNAMIC_CLASS(wxXPMDataHandler)
@@ -1282,10 +1303,10 @@ IMPLEMENT_DYNAMIC_CLASS(wxXPMDataHandler, wxBitmapHandler)
bool wxXPMDataHandler::Create(wxBitmap *bitmap, void *data, long flags, int width, int height, int depth) bool wxXPMDataHandler::Create(wxBitmap *bitmap, void *data, long flags, int width, int height, int depth)
{ {
XImage * ximage = NULL ; XImage * ximage = NULL ;
XImage * xshapeimage = NULL ; XImage * xshapeimage = NULL ;
int ErrorStatus; int ErrorStatus;
XpmAttributes xpmAttr; XpmAttributes xpmAttr;
xpmAttr.valuemask = XpmReturnInfos; // get infos back xpmAttr.valuemask = XpmReturnInfos; // get infos back
ErrorStatus = XpmCreateImageFromData( GetMainDevice() , (char **)data, ErrorStatus = XpmCreateImageFromData( GetMainDevice() , (char **)data,
@@ -1293,27 +1314,27 @@ bool wxXPMDataHandler::Create(wxBitmap *bitmap, void *data, long flags, int widt
if (ErrorStatus == XpmSuccess) if (ErrorStatus == XpmSuccess)
{ {
M_BITMAPHANDLERDATA->m_ok = FALSE; M_BITMAPHANDLERDATA->m_ok = FALSE;
M_BITMAPHANDLERDATA->m_numColors = 0; M_BITMAPHANDLERDATA->m_numColors = 0;
M_BITMAPHANDLERDATA->m_hBitmap = ximage->gworldptr ; M_BITMAPHANDLERDATA->m_hBitmap = ximage->gworldptr ;
M_BITMAPHANDLERDATA->m_width = ximage->width; M_BITMAPHANDLERDATA->m_width = ximage->width;
M_BITMAPHANDLERDATA->m_height = ximage->height; M_BITMAPHANDLERDATA->m_height = ximage->height;
M_BITMAPHANDLERDATA->m_depth = ximage->depth; M_BITMAPHANDLERDATA->m_depth = ximage->depth;
M_BITMAPHANDLERDATA->m_numColors = xpmAttr.npixels; M_BITMAPHANDLERDATA->m_numColors = xpmAttr.npixels;
XpmFreeAttributes(&xpmAttr); XpmFreeAttributes(&xpmAttr);
M_BITMAPHANDLERDATA->m_ok = TRUE; M_BITMAPHANDLERDATA->m_ok = TRUE;
ximage->gworldptr = NULL ; ximage->gworldptr = NULL ;
XImageFree(ximage); // releases the malloc, but does not detroy XImageFree(ximage); // releases the malloc, but does not detroy
// the bitmap // the bitmap
M_BITMAPHANDLERDATA->m_bitmapType = kMacBitmapTypeGrafWorld ; M_BITMAPHANDLERDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
if ( xshapeimage != NULL ) if ( xshapeimage != NULL )
{ {
wxMask* m = new wxMask() ; wxMask* m = new wxMask() ;
m->SetMaskBitmap( xshapeimage->gworldptr ) ; m->SetMaskBitmap( xshapeimage->gworldptr ) ;
M_BITMAPHANDLERDATA->m_bitmapMask = m ; M_BITMAPHANDLERDATA->m_bitmapMask = m ;
} }
return TRUE; return TRUE;
} }
else else
{ {
@@ -1322,6 +1343,7 @@ bool wxXPMDataHandler::Create(wxBitmap *bitmap, void *data, long flags, int widt
} }
return FALSE; return FALSE;
} }
#endif
class WXDLLEXPORT wxBMPResourceHandler: public wxBitmapHandler class WXDLLEXPORT wxBMPResourceHandler: public wxBitmapHandler
{ {
@@ -1416,10 +1438,12 @@ void wxBitmap::CleanUpHandlers()
void wxBitmap::InitStandardHandlers() void wxBitmap::InitStandardHandlers()
{ {
AddHandler( new wxPICTResourceHandler ) ; AddHandler(new wxPICTResourceHandler) ;
AddHandler( new wxICONResourceHandler ) ; AddHandler(new wxICONResourceHandler) ;
AddHandler(new wxXPMFileHandler); AddHandler(new wxXPMFileHandler);
AddHandler(new wxXPMDataHandler); #ifdef OBSOLETE_XPM_DATA_HANDLER
AddHandler(new wxBMPResourceHandler); AddHandler(new wxXPMDataHandler);
AddHandler(new wxBMPFileHandler); #endif
AddHandler(new wxBMPResourceHandler);
AddHandler(new wxBMPFileHandler);
} }

View File

@@ -21,13 +21,16 @@
#include "wx/icon.h" #include "wx/icon.h"
#include "wx/log.h" #include "wx/log.h"
#include "wx/image.h" #include "wx/image.h"
#include "wx/xpmdecod.h"
extern "C" #ifndef __UNIX__
#define OBSOLETE_XPM_DATA_HANDLER
#endif
extern "C"
{ {
#ifdef __UNIX__ #ifdef OBSOLETE_XPM_DATA_HANDLER
#include "xpm/xpm.h" #include "xpm.h"
#else
#include "xpm.h"
#endif #endif
} ; } ;
@@ -200,9 +203,9 @@ wxBitmapRefData::wxBitmapRefData()
m_quality = 0; m_quality = 0;
m_numColors = 0; m_numColors = 0;
m_bitmapMask = NULL; m_bitmapMask = NULL;
m_hBitmap = NULL ; m_hBitmap = NULL ;
m_hPict = NULL ; m_hPict = NULL ;
m_bitmapType = kMacBitmapTypeUnknownType ; m_bitmapType = kMacBitmapTypeUnknownType ;
} }
wxBitmapRefData::~wxBitmapRefData() wxBitmapRefData::~wxBitmapRefData()
@@ -265,55 +268,54 @@ wxBitmap::wxBitmap(const char bits[], int the_width, int the_height, int no_bits
M_BITMAPDATA->m_numColors = 0; M_BITMAPDATA->m_numColors = 0;
if ( no_bits == 1 ) if ( no_bits == 1 )
{ {
M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ; M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
M_BITMAPDATA->m_hBitmap = wxMacCreateGWorld( the_width , the_height , no_bits ) ; M_BITMAPDATA->m_hBitmap = wxMacCreateGWorld( the_width , the_height , no_bits ) ;
M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ; M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ;
CGrafPtr origPort ; CGrafPtr origPort ;
GDHandle origDevice ; GDHandle origDevice ;
GetGWorld( &origPort , &origDevice ) ; GetGWorld( &origPort , &origDevice ) ;
SetGWorld( M_BITMAPDATA->m_hBitmap , NULL ) ; SetGWorld( M_BITMAPDATA->m_hBitmap , NULL ) ;
LockPixels( GetGWorldPixMap( M_BITMAPDATA->m_hBitmap ) ) ; LockPixels( GetGWorldPixMap( M_BITMAPDATA->m_hBitmap ) ) ;
// bits is a char array // bits is a char array
unsigned char* linestart = (unsigned char*) bits ; unsigned char* linestart = (unsigned char*) bits ;
int linesize = ( the_width / (sizeof(unsigned char) * 8)) ; int linesize = ( the_width / (sizeof(unsigned char) * 8)) ;
if ( the_width % (sizeof(unsigned char) * 8) ) { if ( the_width % (sizeof(unsigned char) * 8) ) {
linesize += sizeof(unsigned char); linesize += sizeof(unsigned char);
} }
RGBColor colors[2] = { RGBColor colors[2] = {
{ 0xFFFF , 0xFFFF , 0xFFFF } , { 0xFFFF , 0xFFFF , 0xFFFF } ,
{ 0, 0 , 0 } { 0, 0 , 0 }
} ; } ;
for ( int y = 0 ; y < the_height ; ++y , linestart += linesize ) for ( int y = 0 ; y < the_height ; ++y , linestart += linesize )
{ {
for ( int x = 0 ; x < the_width ; ++x ) for ( int x = 0 ; x < the_width ; ++x )
{ {
int index = x / 8 ; int index = x / 8 ;
int bit = x % 8 ; int bit = x % 8 ;
int mask = 1 << bit ; int mask = 1 << bit ;
if ( linestart[index] & mask ) if ( linestart[index] & mask )
{ {
SetCPixel( x , y , &colors[1] ) ; SetCPixel( x , y , &colors[1] ) ;
} }
else else
{ {
SetCPixel( x , y , &colors[0] ) ; SetCPixel( x , y , &colors[0] ) ;
} }
} }
}
} UnlockPixels( GetGWorldPixMap( M_BITMAPDATA->m_hBitmap ) ) ;
UnlockPixels( GetGWorldPixMap( M_BITMAPDATA->m_hBitmap ) ) ;
SetGWorld( origPort , origDevice ) ; SetGWorld( origPort , origDevice ) ;
} }
else else
{ {
wxFAIL_MSG(wxT("multicolor BITMAPs not yet implemented")); wxFAIL_MSG(wxT("multicolor BITMAPs not yet implemented"));
} }
if ( wxTheBitmapList ) { if ( wxTheBitmapList ) {
@@ -345,14 +347,33 @@ wxBitmap::wxBitmap(const wxString& filename, long type)
wxTheBitmapList->AddBitmap(this); wxTheBitmapList->AddBitmap(this);
} }
wxBitmap::wxBitmap(const char **data) bool wxBitmap::CreateFromXpm(const char **bits)
{ {
(void) Create((void *)data, wxBITMAP_TYPE_XPM_DATA, 0, 0, 0); wxCHECK_MSG( bits != NULL, FALSE, wxT("invalid bitmap data") )
wxXPMDecoder decoder;
wxImage img = decoder.ReadData(bits);
wxCHECK_MSG( img.Ok(), FALSE, wxT("invalid bitmap data") )
*this = wxBitmap(img);
if ( wxTheBitmapList ) wxTheBitmapList->AddBitmap(this);
return TRUE;
} }
wxBitmap::wxBitmap(char **data) wxBitmap::wxBitmap(const char **bits)
{ {
(void) Create((void *)data, wxBITMAP_TYPE_XPM_DATA, 0, 0, 0); #ifdef OBSOLETE_XPM_DATA_HANDLER
(void) Create((void *)bits, wxBITMAP_TYPE_XPM_DATA, 0, 0, 0);
#else
(void) CreateFromXpm(bits);
#endif
}
wxBitmap::wxBitmap(char **bits)
{
#ifdef OBSOLETE_XPM_DATA_HANDLER
(void) Create((void *)bits, wxBITMAP_TYPE_XPM_DATA, 0, 0, 0);
#else
(void) CreateFromXpm((const char **)bits);
#endif
} }
wxBitmap wxBitmap::GetSubBitmap(const wxRect &rect) const wxBitmap wxBitmap::GetSubBitmap(const wxRect &rect) const
@@ -567,7 +588,7 @@ wxBitmap::wxBitmap(const wxImage& image, int depth)
// Create mask // Create mask
if ( image.HasMask() ) { if ( image.HasMask() ) {
wxMask *mask = new wxMask( maskBitmap ); SetMask(new wxMask( maskBitmap ));
} }
UnlockPixels( GetGWorldPixMap(GetHBITMAP()) ); UnlockPixels( GetGWorldPixMap(GetHBITMAP()) );
@@ -1264,7 +1285,7 @@ bool wxXPMFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type
#endif #endif
} }
#ifdef OBSOLETE_XPM_DATA_HANDLER
class WXDLLEXPORT wxXPMDataHandler: public wxBitmapHandler class WXDLLEXPORT wxXPMDataHandler: public wxBitmapHandler
{ {
DECLARE_DYNAMIC_CLASS(wxXPMDataHandler) DECLARE_DYNAMIC_CLASS(wxXPMDataHandler)
@@ -1282,10 +1303,10 @@ IMPLEMENT_DYNAMIC_CLASS(wxXPMDataHandler, wxBitmapHandler)
bool wxXPMDataHandler::Create(wxBitmap *bitmap, void *data, long flags, int width, int height, int depth) bool wxXPMDataHandler::Create(wxBitmap *bitmap, void *data, long flags, int width, int height, int depth)
{ {
XImage * ximage = NULL ; XImage * ximage = NULL ;
XImage * xshapeimage = NULL ; XImage * xshapeimage = NULL ;
int ErrorStatus; int ErrorStatus;
XpmAttributes xpmAttr; XpmAttributes xpmAttr;
xpmAttr.valuemask = XpmReturnInfos; // get infos back xpmAttr.valuemask = XpmReturnInfos; // get infos back
ErrorStatus = XpmCreateImageFromData( GetMainDevice() , (char **)data, ErrorStatus = XpmCreateImageFromData( GetMainDevice() , (char **)data,
@@ -1293,27 +1314,27 @@ bool wxXPMDataHandler::Create(wxBitmap *bitmap, void *data, long flags, int widt
if (ErrorStatus == XpmSuccess) if (ErrorStatus == XpmSuccess)
{ {
M_BITMAPHANDLERDATA->m_ok = FALSE; M_BITMAPHANDLERDATA->m_ok = FALSE;
M_BITMAPHANDLERDATA->m_numColors = 0; M_BITMAPHANDLERDATA->m_numColors = 0;
M_BITMAPHANDLERDATA->m_hBitmap = ximage->gworldptr ; M_BITMAPHANDLERDATA->m_hBitmap = ximage->gworldptr ;
M_BITMAPHANDLERDATA->m_width = ximage->width; M_BITMAPHANDLERDATA->m_width = ximage->width;
M_BITMAPHANDLERDATA->m_height = ximage->height; M_BITMAPHANDLERDATA->m_height = ximage->height;
M_BITMAPHANDLERDATA->m_depth = ximage->depth; M_BITMAPHANDLERDATA->m_depth = ximage->depth;
M_BITMAPHANDLERDATA->m_numColors = xpmAttr.npixels; M_BITMAPHANDLERDATA->m_numColors = xpmAttr.npixels;
XpmFreeAttributes(&xpmAttr); XpmFreeAttributes(&xpmAttr);
M_BITMAPHANDLERDATA->m_ok = TRUE; M_BITMAPHANDLERDATA->m_ok = TRUE;
ximage->gworldptr = NULL ; ximage->gworldptr = NULL ;
XImageFree(ximage); // releases the malloc, but does not detroy XImageFree(ximage); // releases the malloc, but does not detroy
// the bitmap // the bitmap
M_BITMAPHANDLERDATA->m_bitmapType = kMacBitmapTypeGrafWorld ; M_BITMAPHANDLERDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
if ( xshapeimage != NULL ) if ( xshapeimage != NULL )
{ {
wxMask* m = new wxMask() ; wxMask* m = new wxMask() ;
m->SetMaskBitmap( xshapeimage->gworldptr ) ; m->SetMaskBitmap( xshapeimage->gworldptr ) ;
M_BITMAPHANDLERDATA->m_bitmapMask = m ; M_BITMAPHANDLERDATA->m_bitmapMask = m ;
} }
return TRUE; return TRUE;
} }
else else
{ {
@@ -1322,6 +1343,7 @@ bool wxXPMDataHandler::Create(wxBitmap *bitmap, void *data, long flags, int widt
} }
return FALSE; return FALSE;
} }
#endif
class WXDLLEXPORT wxBMPResourceHandler: public wxBitmapHandler class WXDLLEXPORT wxBMPResourceHandler: public wxBitmapHandler
{ {
@@ -1416,10 +1438,12 @@ void wxBitmap::CleanUpHandlers()
void wxBitmap::InitStandardHandlers() void wxBitmap::InitStandardHandlers()
{ {
AddHandler( new wxPICTResourceHandler ) ; AddHandler(new wxPICTResourceHandler) ;
AddHandler( new wxICONResourceHandler ) ; AddHandler(new wxICONResourceHandler) ;
AddHandler(new wxXPMFileHandler); AddHandler(new wxXPMFileHandler);
AddHandler(new wxXPMDataHandler); #ifdef OBSOLETE_XPM_DATA_HANDLER
AddHandler(new wxBMPResourceHandler); AddHandler(new wxXPMDataHandler);
AddHandler(new wxBMPFileHandler); #endif
AddHandler(new wxBMPResourceHandler);
AddHandler(new wxBMPFileHandler);
} }