/////////////////////////////////////////////////////////////////////////////
-// Name: bitmap.cpp
+// Name: src/mac/carbon/bitmap.cpp
// Purpose: wxBitmap
// Author: Stefan Csomor
// Modified by:
#include "wx/wxprec.h"
#include "wx/bitmap.h"
-#include "wx/icon.h"
-#include "wx/log.h"
-#include "wx/image.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/log.h"
+ #include "wx/dcmemory.h"
+ #include "wx/icon.h"
+ #include "wx/image.h"
+#endif
+
#include "wx/metafile.h"
#include "wx/xpmdecod.h"
#endif
#include "wx/mac/uma.h"
-#include "wx/dcmemory.h"
// Implementation Notes
// --------------------
bool wxBitmapRefData::Create( int w , int h , int d )
{
- m_width = w ;
- m_height = h ;
+ m_width = wxMax(1, w);
+ m_height = wxMax(1, h);
m_depth = d ;
m_bytesPerRow = w * 4 ;
PicHandle pic = GetPictHandle() ;
SetIconFamilyData( iconFamily, 'PICT' , (Handle) pic ) ;
}
-
// transform into IconRef
-
+#if defined( __WXMAC_OSX__ ) && MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
+ // cleaner version existing from 10.3 upwards
+ HLock((Handle) iconFamily);
+ OSStatus err = GetIconRefFromIconFamilyPtr( *iconFamily, GetHandleSize((Handle) iconFamily), &m_iconRef );
+ HUnlock((Handle) iconFamily);
+ wxASSERT_MSG( err == noErr , wxT("Error when constructing icon ref") );
+#else
static int iconCounter = 2 ;
OSStatus err = RegisterIconRefFromIconFamily( 'WXNG' , (OSType) iconCounter, iconFamily, &m_iconRef ) ;
// we have to retain a reference, as Unregister will decrement it
AcquireIconRef( m_iconRef ) ;
UnregisterIconRef( 'WXNG' , (OSType) iconCounter ) ;
- DisposeHandle( (Handle) iconFamily ) ;
++iconCounter ;
+#endif
+ DisposeHandle( (Handle) iconFamily ) ;
}
return m_iconRef ;
bool wxBitmap::CreateFromXpm(const char **bits)
{
#if wxUSE_IMAGE
- wxCHECK_MSG( bits != NULL, false, wxT("invalid bitmap data") )
+ 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") )
+ wxCHECK_MSG( img.Ok(), false, wxT("invalid bitmap data") );
*this = wxBitmap(img);
wxBitmap::wxBitmap(const wxImage& image, int depth)
{
- wxCHECK_RET( image.Ok(), wxT("invalid image") )
+ wxCHECK_RET( image.Ok(), wxT("invalid image") );
// width and height of the device-dependent bitmap
int width = image.GetWidth();
for (int xx = 0; xx < width; xx++)
{
color = *((long*) source) ;
+#ifdef WORDS_BIGENDIAN
a = ((color&0xFF000000) >> 24) ;
r = ((color&0x00FF0000) >> 16) ;
g = ((color&0x0000FF00) >> 8) ;
b = (color&0x000000FF);
-
+#else
+ b = ((color&0xFF000000) >> 24) ;
+ g = ((color&0x00FF0000) >> 16) ;
+ r = ((color&0x0000FF00) >> 8) ;
+ a = (color&0x000000FF);
+#endif
if ( hasMask )
{
if ( *maskp++ == 0xFF )
data.m_height = GetHeight() ;
data.m_stride = GetWidth() * 4 ;
- return GetRawAccess() ;
+ return BeginRawAccess() ;
}
void wxBitmap::UngetRawData(wxPixelDataBase& dataBase)
{
- if ( !Ok() )
- return;
-
- // TODO: if we have some information about the API we should check
- // this code looks strange...
-
- if ( !M_BITMAPDATA->HasAlpha() )
- return;
-
- wxAlphaPixelData& data = (wxAlphaPixelData&)dataBase;
- int w = data.GetWidth();
- int h = data.GetHeight();
-
- wxBitmap bmpMask( GetWidth(), GetHeight(), 32 );
- wxAlphaPixelData dataMask( bmpMask, data.GetOrigin(), wxSize( w, h ) );
- wxAlphaPixelData::Iterator pMask( dataMask ), p( data );
-
- for ( int y = 0; y < h; y++ )
- {
- wxAlphaPixelData::Iterator rowStartMask = pMask;
- wxAlphaPixelData::Iterator rowStart = p;
-
- for ( int x = 0; x < w; x++ )
- {
- const wxAlphaPixelData::Iterator::ChannelType alpha = p.Alpha();
-
- pMask.Red() = alpha;
- pMask.Green() = alpha;
- pMask.Blue() = alpha;
-
- ++p;
- ++pMask;
- }
-
- p = rowStart;
- p.OffsetY( data, 1 );
-
- pMask = rowStartMask;
- pMask.OffsetY( dataMask, 1 );
- }
-
- SetMask( new wxMask( bmpMask ) );
+ EndRawAccess() ;
}
void wxBitmap::UseAlpha()