-IconFamilyHandle wxMacCreateIconFamily(const wxBitmap& bmp)
-{
- // 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;
-}