X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f5c6eb5c178b44f4400495e06274ffd130635190..f4ac0693010cf3974ecf82d811829d13797805fb:/src/mac/carbon/bitmap.cpp diff --git a/src/mac/carbon/bitmap.cpp b/src/mac/carbon/bitmap.cpp index ff66eaff0f..df8d319f43 100644 --- a/src/mac/carbon/bitmap.cpp +++ b/src/mac/carbon/bitmap.cpp @@ -199,33 +199,34 @@ wxBitmapRefData::wxBitmapRefData() m_bitmapType = kMacBitmapTypeUnknownType ; } -wxBitmapRefData::~wxBitmapRefData() +// TODO move this do a public function of Bitmap Ref +static void DisposeBitmapRefData(wxBitmapRefData *data) { - switch (m_bitmapType) + switch (data->m_bitmapType) { case kMacBitmapTypePict : { - if ( m_hPict ) + if ( data->m_hPict ) { - KillPicture( m_hPict ) ; - m_hPict = NULL ; + KillPicture( data->m_hPict ) ; + data->m_hPict = NULL ; } } break ; case kMacBitmapTypeGrafWorld : { - if ( m_hBitmap ) + if ( data->m_hBitmap ) { - wxMacDestroyGWorld( m_hBitmap ) ; - m_hBitmap = NULL ; + wxMacDestroyGWorld( data->m_hBitmap ) ; + data->m_hBitmap = NULL ; } } break ; case kMacBitmapTypeIcon : - if ( m_hIcon ) + if ( data->m_hIcon ) { - DisposeCIcon( m_hIcon ) ; - m_hIcon = NULL ; + DisposeCIcon( data->m_hIcon ) ; + data->m_hIcon = NULL ; } default : @@ -233,19 +234,25 @@ wxBitmapRefData::~wxBitmapRefData() break ; } - if (m_bitmapMask) + if (data->m_bitmapMask) { - delete m_bitmapMask; - m_bitmapMask = NULL; + delete data->m_bitmapMask; + data->m_bitmapMask = NULL; } } +wxBitmapRefData::~wxBitmapRefData() +{ + DisposeBitmapRefData( this ) ; +} + wxList wxBitmapBase::sm_handlers; bool wxBitmap::CopyFromIcon(const wxIcon& icon) { Ref(icon) ; + return true; } wxBitmap::wxBitmap() @@ -437,7 +444,7 @@ wxBitmap wxBitmap::GetSubBitmap(const wxRect &rect) const RGBColor color; bitmap = GetHBITMAP(); - subbitmap = wxMacCreateGWorld(rect.width, rect.height, GetDepth()); + subbitmap = ref->m_hBitmap ; LockPixels(GetGWorldPixMap(bitmap)); LockPixels(GetGWorldPixMap(subbitmap)); @@ -453,7 +460,6 @@ wxBitmap wxBitmap::GetSubBitmap(const wxRect &rect) const } UnlockPixels(GetGWorldPixMap(bitmap)); UnlockPixels(GetGWorldPixMap(subbitmap)); - ret.SetHBITMAP(subbitmap); } } SetGWorld( origPort, origDevice ); @@ -486,9 +492,11 @@ int wxBitmap::GetBitmapType() const void wxBitmap::SetHBITMAP(WXHBITMAP bmp) { + DisposeBitmapRefData( M_BITMAPDATA ) ; + M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ; M_BITMAPDATA->m_hBitmap = bmp ; - M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ; + M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ; } bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type) @@ -547,55 +555,68 @@ wxBitmap::wxBitmap(const wxImage& image, int depth) // Create picture - Create( width , height , wxDisplayDepth() ) ; - wxBitmap maskBitmap( width, height, 1); + Create( width , height , 32 ) ; CGrafPtr origPort ; GDHandle origDevice ; - LockPixels( GetGWorldPixMap(GetHBITMAP()) ); - LockPixels( GetGWorldPixMap(maskBitmap.GetHBITMAP()) ); + PixMapHandle pixMap = GetGWorldPixMap(GetHBITMAP()) ; + LockPixels( pixMap ); GetGWorld( &origPort , &origDevice ) ; SetGWorld( GetHBITMAP() , NULL ) ; // Render image - wxColour rgb, maskcolor(image.GetMaskRed(), image.GetMaskGreen(), image.GetMaskBlue()); - RGBColor color; - RGBColor white = { 0xffff, 0xffff, 0xffff }; - RGBColor black = { 0 , 0 , 0 }; + RGBColor colorRGB ; register unsigned char* data = image.GetData(); - - int index = 0; + char* destinationBase = GetPixBaseAddr( pixMap ); + register unsigned char* destination = (unsigned char*) destinationBase ; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { - rgb.Set(data[index++], data[index++], data[index++]); - color = rgb.GetPixel(); - SetCPixel( x , y , &color ) ; - if (image.HasMask()) - { - SetGWorld(maskBitmap.GetHBITMAP(), NULL); - if (rgb == maskcolor) { - SetCPixel(x,y, &white); - } - else { - SetCPixel(x,y, &black); - } - SetGWorld(GetHBITMAP(), NULL); - } + *destination++ = 0 ; + *destination++ = *data++ ; + *destination++ = *data++ ; + *destination++ = *data++ ; } - } // for height + destinationBase += ((**pixMap).rowBytes & 0x7fff); + destination = (unsigned char*) destinationBase ; + } + if ( image.HasMask() ) + { + data = image.GetData(); + + wxColour maskcolor(image.GetMaskRed(), image.GetMaskGreen(), image.GetMaskBlue()); + RGBColor white = { 0xffff, 0xffff, 0xffff }; + RGBColor black = { 0 , 0 , 0 }; + wxBitmap maskBitmap ; - // Create mask - if ( image.HasMask() ) { - SetMask(new wxMask( maskBitmap )); + maskBitmap.Create( width, height, 1); + LockPixels( GetGWorldPixMap(maskBitmap.GetHBITMAP()) ); + SetGWorld(maskBitmap.GetHBITMAP(), NULL); + + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + { + if ( data[0] == image.GetMaskRed() && data[1] == image.GetMaskGreen() && data[2] == image.GetMaskBlue() ) + { + SetCPixel(x,y, &white); + } + else { + SetCPixel(x,y, &black); + } + data += 3 ; + } + } // for height + SetGWorld(GetHBITMAP(), NULL); + SetMask(new wxMask( maskBitmap )); + UnlockPixels( GetGWorldPixMap(maskBitmap.GetHBITMAP()) ); } UnlockPixels( GetGWorldPixMap(GetHBITMAP()) ); - UnlockPixels( GetGWorldPixMap(maskBitmap.GetHBITMAP()) ); SetGWorld( origPort, origDevice ); }