-PicHandle wxBitmap::GetPict() const
-{
- wxCHECK_MSG( Ok(), NULL, wxT("invalid bitmap") );
-
- PicHandle picture; // This is the returned picture
-
- // If bitmap already in Pict format return pointer
- if(M_BITMAPDATA->m_bitmapType == kMacBitmapTypePict) {
- return M_BITMAPDATA->m_hPict;
- }
- else if(M_BITMAPDATA->m_bitmapType != kMacBitmapTypeGrafWorld) {
- // Invalid bitmap
- return NULL;
- }
-
- RGBColor gray = { 0xCCCC ,0xCCCC , 0xCCCC } ;
- RGBColor white = { 0xffff ,0xffff , 0xffff } ;
- RGBColor black = { 0x0000 ,0x0000 , 0x0000 } ;
- CGrafPtr origPort;
- GDHandle origDev ;
- wxMask *mask;
- Rect portRect ;
-
- GetPortBounds( GetHBITMAP() , &portRect ) ;
- int width = portRect.right - portRect.left ;
- int height = portRect.bottom - portRect.top ;
-
- LockPixels( GetGWorldPixMap( GetHBITMAP() ) ) ;
- GetGWorld( &origPort , &origDev ) ;
-
- mask = GetMask();
-
- SetGWorld( GetHBITMAP() , NULL ) ;
-
- picture = OpenPicture(&portRect); // open a picture, this disables drawing
- if(!picture) {
- return NULL;
- }
-
- if( mask )
- {
-#ifdef __DARWIN__
- RGBColor trans = white;
-#else
- RGBBackColor( &gray );
- EraseRect( &portRect );
- RGBColor trans = gray;
-#endif
- RGBForeColor( &black ) ;
- RGBBackColor( &white ) ;
- PenMode(transparent);
-
- for ( int y = 0 ; y < height ; ++y )
- {
- for( int x = 0 ; x < width ; ++x )
- {
- if ( !mask->PointMasked(x,y) )
- {
- RGBColor col ;
-
- GetCPixel( x + portRect.left , y + portRect.top , &col ) ;
- SetCPixel( x + portRect.left , y + portRect.top , &col ) ;
- }
- else {
- // With transparency this sets a blank pixel
- SetCPixel( x + portRect.left , y + portRect.top , &trans);
- }
- }
- }
- }
- else
- {
- RGBBackColor( &gray ) ;
- EraseRect(&portRect);
- RGBForeColor( &black ) ;
- RGBBackColor( &white ) ;
-
- CopyBits(GetPortBitMapForCopyBits(GetHBITMAP()),
- // src PixMap - we copy image over itself -
- GetPortBitMapForCopyBits(GetHBITMAP()),
- // dst PixMap - no drawing occurs
- &portRect, // srcRect - it will be recorded and compressed -
- &portRect, // dstRect - into the picture that is open -
- srcCopy,NULL); // copyMode and no clip region
- }
- ClosePicture(); // We are done recording the picture
- UnlockPixels( GetGWorldPixMap( GetHBITMAP() ) ) ;
- SetGWorld( origPort , origDev ) ;
-
- return picture; // return our groovy pict handle
-}
-
-void wxBitmap::AddHandler(wxBitmapHandler *handler)
-{
- sm_handlers.Append(handler);
-}
-
-void wxBitmap::InsertHandler(wxBitmapHandler *handler)
-{
- sm_handlers.Insert(handler);
-}
-
-bool wxBitmap::RemoveHandler(const wxString& name)
-{
- wxBitmapHandler *handler = FindHandler(name);
- if ( handler )
- {
- sm_handlers.DeleteObject(handler);
- return TRUE;
- }
- else
- return FALSE;
-}
-
-wxBitmapHandler *wxBitmap::FindHandler(const wxString& name)
-{
- wxNode *node = sm_handlers.First();
- while ( node )
- {
- wxBitmapHandler *handler = (wxBitmapHandler *)node->Data();
- if ( handler->GetName() == name )
- return handler;
- node = node->Next();
- }
- return NULL;
-}
-
-wxBitmapHandler *wxBitmap::FindHandler(const wxString& extension, wxBitmapType type)
-{
- wxNode *node = sm_handlers.First();
- while ( node )
- {
- wxBitmapHandler *handler = (wxBitmapHandler *)node->Data();
- if ( handler->GetExtension() == extension &&
- (type == -1 || handler->GetType() == type) )
- return handler;
- node = node->Next();
- }
- return NULL;
-}
-
-wxBitmapHandler *wxBitmap::FindHandler(wxBitmapType type)
-{
- wxNode *node = sm_handlers.First();
- while ( node )
- {
- wxBitmapHandler *handler = (wxBitmapHandler *)node->Data();
- if (handler->GetType() == type)
- return handler;
- node = node->Next();
- }
- return NULL;
-}
-
-/*
- * wxMask
- */