- CTabHandle newColors; /* Handle to the new color table */
-
- /* Allocate memory for the color table */
- newColors = (CTabHandle)NewHandleClear( sizeof (ColorTable) +
- sizeof (ColorSpec) * (numColors - 1) );
- if (newColors != nil)
- {
- /* Initialize the fields */
- (**newColors).ctSeed = GetCTSeed();
- (**newColors).ctFlags = 0;
- (**newColors).ctSize = numColors - 1;
- /* Initialize the table of colors */
- }
- return newColors ;
-}
-
-void wxMacDestroyColorTable( CTabHandle colors )
-{
- DisposeHandle( (Handle) colors ) ;
-}
-
-void wxMacSetColorTableEntry( CTabHandle newColors , int index , int red , int green , int blue )
-{
- (**newColors).ctTable[index].value = index;
- (**newColors).ctTable[index].rgb.red = 0 ;// someRedValue;
- (**newColors).ctTable[index].rgb.green = 0 ; // someGreenValue;
- (**newColors).ctTable[index].rgb.blue = 0 ; // someBlueValue;
-}
-
-GWorldPtr wxMacCreateGWorld( int width , int height , int depth )
-{
- OSErr err = noErr ;
- GWorldPtr port ;
- Rect rect = { 0 , 0 , height , width } ;
-
- if ( depth < 0 )
- {
- depth = wxDisplayDepth() ;
- }
-
- err = NewGWorld( &port , depth , &rect , NULL , NULL , 0 ) ;
- if ( err == noErr )
- {
- return port ;
- }
- return NULL ;
-}
-
-void wxMacDestroyGWorld( GWorldPtr gw )
-{
- if ( gw )
- DisposeGWorld( gw ) ;
-}
-
-PicHandle wxMacCreatePict(GWorldPtr wp, GWorldPtr mask)
-{
- CGrafPtr origPort ;
- GDHandle origDev ;
-
- PicHandle pict; // this is the Picture we give back
-
- RGBColor gray = { 0xCCCC ,0xCCCC , 0xCCCC } ;
- RGBColor white = { 0xffff ,0xffff , 0xffff } ;
- RGBColor black = { 0x0000 ,0x0000 , 0x0000 } ;
-
- unsigned char *maskimage = NULL ;
- Rect portRect ;
- GetPortBounds( wp , &portRect ) ;
- int width = portRect.right - portRect.left ;
- int height = portRect.bottom - portRect.top ;
-
- LockPixels( GetGWorldPixMap( wp ) ) ;
- GetGWorld( &origPort , &origDev ) ;
-
- if ( mask )
- {
- maskimage = (unsigned char*) malloc( width * height ) ;
- SetGWorld( mask , NULL ) ;
- LockPixels( GetGWorldPixMap( mask ) ) ;
- for ( int y = 0 ; y < height ; y++ )
- {
- for( int x = 0 ; x < width ; x++ )
- {
- RGBColor col ;
-
- GetCPixel( x + portRect.left , y + portRect.top , &col ) ;
- maskimage[y*width + x] = ( col.red == 0 ) ; // for monochrome masks
- }
- }
- UnlockPixels( GetGWorldPixMap( mask ) ) ;
- }
-
- SetGWorld( wp , NULL ) ;
-
- pict = OpenPicture(&portRect); // open a picture, this disables drawing
- if(!pict)
- return NULL;
-
- if ( maskimage )
- {
- RGBForeColor( &black ) ;
- RGBBackColor( &white ) ;
- PenMode(transparent);
-
- for ( int y = 0 ; y < height ; ++y )
- {
- for( int x = 0 ; x < width ; ++x )
- {
- if ( maskimage[y*width + x] )
- {
- RGBColor col ;
+ // setup the header properly
+
+ IconFamilyHandle iconFamily = (IconFamilyHandle) NewHandle(8) ;
+ (**iconFamily).resourceType = kIconFamilyType ;
+ (**iconFamily).resourceSize = sizeof(OSType) + sizeof(Size);
+
+ int w = bmp.GetWidth() ;
+ int h = bmp.GetHeight() ;
+ int sz = wxMax( w , h ) ;
+ if ( sz > 128 )
+ {
+ wxFAIL_MSG( wxT("Currently only 128 pixels wide images are supported") ) ;
+ }
+
+ Handle data = NULL ;
+ Handle maskdata = NULL ;
+ unsigned char * maskptr = NULL ;
+ unsigned char * ptr = NULL ;
+ size_t size ;
+ size_t masksize ;
+ OSType dataType ;
+ OSType maskType ;
+
+ bool hasAlpha = bmp.HasAlpha() ;
+ wxMask *mask = bmp.GetMask() ;
+ // thumbnail is 128 x 128 with 32 bits per pixel
+
+ if ( sz > 48 )
+ {
+ sz = 128 ;
+ dataType = kThumbnail32BitData ;
+ maskType = kThumbnail8BitMask ;
+ }
+ else if ( sz > 32 )
+ {
+ sz = 48 ;
+ dataType = kHuge32BitData ;
+ maskType = kHuge8BitMask ;
+ }
+ else if ( sz > 16 )
+ {
+ sz = 32 ;
+ dataType = kLarge32BitData ;
+ maskType = kLarge8BitMask ;
+ }
+ else
+ {
+ sz = 16 ;
+ dataType = kSmall32BitData ;
+ maskType = kSmall8BitMask ;
+ }
+
+ size = sz * sz * 4 ;
+ data = NewHandle( size) ;
+ HLock( data ) ;
+ ptr = (unsigned char*) *data ;
+ memset( ptr , 0, size ) ;
+
+ masksize = sz * sz ;
+ maskdata = NewHandle( masksize ) ;
+ HLock( maskdata ) ;
+ maskptr = (unsigned char*) *maskdata ;
+ memset( maskptr , 0 , masksize ) ;
+
+ unsigned char * source = (unsigned char*) bmp.GetRawAccess() ;
+ unsigned char * masksource = mask ? (unsigned char*) mask->GetRawAccess() : NULL ;
+ for ( int y = 0 ; y < h ; ++y )
+ {
+ unsigned char * dest = ptr + y * sz * 4 ;
+ unsigned char * maskdest = maskptr + y * sz ;
+ for ( int x = 0 ; x < w ; ++x )
+ {
+ unsigned char a = *source ++ ;
+ unsigned char r = *source ++ ;
+ unsigned char g = *source ++ ;
+ unsigned char b = *source ++ ;
+
+ *dest++ = 0 ;
+ *dest++ = r ;
+ *dest++ = g ;
+ *dest++ = b ;
+
+ if ( mask )
+ *maskdest++ = *masksource++ ;
+ else if ( hasAlpha )
+ *maskdest++ = a ;
+ else
+ *maskdest++ = 0xFF ;
+ }
+ }
+
+ OSStatus err = SetIconFamilyData( iconFamily, dataType , data ) ;
+ wxASSERT_MSG( err == noErr , wxT("Error when adding bitmap") ) ;
+
+ err = SetIconFamilyData( iconFamily, maskType , maskdata ) ;
+ wxASSERT_MSG( err == noErr , wxT("Error when adding mask") ) ;
+ HUnlock( data ) ;
+ HUnlock( maskdata ) ;
+ DisposeHandle( data ) ;
+ DisposeHandle( maskdata ) ;
+ return iconFamily ;
+}
+
+IconRef wxMacCreateIconRef(const wxBitmap& bmp)
+{
+ IconFamilyHandle iconFamily = wxMacCreateIconFamily( bmp ) ;
+ IconRef iconRef ;
+ static int iconCounter = 2 ;
+
+ OSStatus err = RegisterIconRefFromIconFamily( 'WXNG' , (OSType) iconCounter, iconFamily, &iconRef ) ;
+ UInt16 owners ;
+ err = GetIconRefOwners(iconRef , &owners ) ;
+
+ wxASSERT_MSG( err == noErr , wxT("Error when adding bitmap") ) ;
+ // we have to retain a reference, as Unregister will decrement it
+ AcquireIconRef( iconRef ) ;
+ UnregisterIconRef( 'WXNG' , (OSType) iconCounter ) ;
+ DisposeHandle( (Handle) iconFamily ) ;
+ ++iconCounter ;
+
+ return iconRef ;
+}
+
+PicHandle wxMacCreatePicHandle( const wxBitmap &bmp )
+{
+ CGrafPtr origPort = NULL ;
+ GDHandle origDev = NULL ;
+ PicHandle pict = NULL ;
+ GWorldPtr wp = NULL ;
+ GWorldPtr mask = NULL ;
+
+ GetGWorld( &origPort , &origDev ) ;
+
+ wp = (GWorldPtr) bmp.GetHBITMAP( (WXHBITMAP*) &mask ) ;
+
+ SetGWorld( wp , NULL ) ;
+ Rect portRect ;
+ GetPortBounds( wp , &portRect ) ;
+ pict = OpenPicture(&portRect);
+
+ if(pict)
+ {
+ RGBColor white = { 0xffff ,0xffff , 0xffff } ;
+ RGBColor black = { 0x0000 ,0x0000 , 0x0000 } ;
+ RGBForeColor( &black ) ;
+ RGBBackColor( &white ) ;
+
+ LockPixels( GetGWorldPixMap( wp ) ) ;
+ CopyBits(GetPortBitMapForCopyBits(wp),
+ GetPortBitMapForCopyBits(wp),
+ &portRect,
+ &portRect,
+ srcCopy,NULL);
+ UnlockPixels( GetGWorldPixMap( wp ) ) ;
+ ClosePicture();
+ }
+ SetGWorld( origPort , origDev ) ;
+
+ return pict;
+}
+
+void wxMacCreateBitmapButton( ControlButtonContentInfo*info , const wxBitmap& bitmap , int forceType )
+{
+ memset( info , 0 , sizeof(ControlButtonContentInfo) ) ;
+ if ( bitmap.Ok() )
+ {
+ wxBitmapRefData * bmap = (wxBitmapRefData*) ( bitmap.GetRefData()) ;
+ if ( bmap == NULL )
+ return ;
+ info->contentType = kControlContentIconRef ;
+ info->u.iconRef = wxMacCreateIconRef( bitmap ) ;
+
+#if wxMAC_USE_CORE_GRAPHICS
+ /*
+ // only on 10.4 more controls will accept a CGImage
+
+ info->contentType = kControlContentCGImageRef ;
+ info->u.imageRef = (CGImageRef) bmap->CGImageCreate() ;
+ */
+#endif
+ }
+}
+
+void wxMacReleaseBitmapButton( ControlButtonContentInfo*info )
+{
+ if ( info->contentType == kControlContentIconRef )
+ {
+ ReleaseIconRef(info->u.iconRef) ;
+ }
+#if wxMAC_USE_CORE_GRAPHICS
+ else if ( info->contentType == kControlContentCGImageRef )
+ {
+ CGImageRelease( info->u.imageRef ) ;
+ }
+#endif
+ else
+ {
+ wxFAIL_MSG(wxT("Unexpected bitmap type") ) ;
+ }
+}
+