X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8f884a0dccd6b642f35c441ac9bfc87a6d5b4d35..eea4d01c65f9b29baa1193db762b4c6b8144af24:/src/cocoa/bitmap.mm?ds=inline diff --git a/src/cocoa/bitmap.mm b/src/cocoa/bitmap.mm index 7d04461049..16ca2a7847 100644 --- a/src/cocoa/bitmap.mm +++ b/src/cocoa/bitmap.mm @@ -6,7 +6,7 @@ // Created: 2003/07/19 // RCS-ID: $Id$ // Copyright: (c) 2003 David Elliott -// Licence: wxWidgets licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" @@ -27,6 +27,7 @@ #include "wx/cocoa/autorelease.h" #include "wx/cocoa/string.h" +#include "wx/cocoa/ObjcRef.h" #import #import @@ -38,6 +39,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxBitmapHandler, wxBitmapHandlerBase) // ======================================================================== // wxBitmapRefData // ======================================================================== + class wxBitmapRefData: public wxGDIRefData { friend class wxBitmap; @@ -60,8 +62,6 @@ protected: wxMask *m_bitmapMask; // Optional mask }; -#define M_BITMAPDATA ((wxBitmapRefData *)m_refData) - wxBitmapRefData::wxBitmapRefData() { m_ok = FALSE; @@ -76,6 +76,8 @@ wxBitmapRefData::wxBitmapRefData() wxBitmapRefData::wxBitmapRefData( const wxBitmapRefData& data) { + wxAutoNSAutoreleasePool pool; + m_width = data.m_width; m_height = data.m_height; m_depth = data.m_depth; @@ -83,13 +85,13 @@ wxBitmapRefData::wxBitmapRefData( const wxBitmapRefData& data) m_numColors = data.m_numColors; m_bitmapPalette = data.m_bitmapPalette; m_quality = data.m_quality; - m_cocoaNSBitmapImageRep = [data.m_cocoaNSBitmapImageRep copyWithZone:nil]; + m_cocoaNSBitmapImageRep = wxGCSafeRetain([[data.m_cocoaNSBitmapImageRep copyWithZone:nil] autorelease]); m_bitmapMask = data.m_bitmapMask?new wxMask(*data.m_bitmapMask):NULL; } wxBitmapRefData::~wxBitmapRefData() { - [m_cocoaNSBitmapImageRep release]; + wxGCSafeRelease(m_cocoaNSBitmapImageRep); m_cocoaNSBitmapImageRep = NULL; delete m_bitmapMask; @@ -99,6 +101,9 @@ wxBitmapRefData::~wxBitmapRefData() // ======================================================================== // wxBitmap // ======================================================================== + +#define M_BITMAPDATA ((wxBitmapRefData *)m_refData) + IMPLEMENT_DYNAMIC_CLASS(wxBitmap, wxGDIObject) wxBitmap::wxBitmap() @@ -122,11 +127,6 @@ wxBitmap::wxBitmap(const char bits[], int the_width, int the_height, int no_bits /* TODO: create the bitmap from data */ } -wxBitmap::wxBitmap(int w, int h, int d) -{ - (void)Create(w, h, d); -} - wxBitmap::wxBitmap(NSImage* cocoaNSImage) { (void) Create(cocoaNSImage); @@ -166,7 +166,7 @@ WX_NSBitmapImageRep wxBitmap::GetNSBitmapImageRep() WX_NSImage wxBitmap::GetNSImage(bool useMask) const { - if(!Ok()) + if(!IsOk()) return nil; NSImage *nsimage = [[[NSImage alloc] initWithSize:NSMakeSize(GetWidth(), GetHeight())] autorelease]; @@ -195,8 +195,8 @@ void wxBitmap::SetNSBitmapImageRep(WX_NSBitmapImageRep bitmapImageRep) if(!M_BITMAPDATA) return; // NOTE: No checking is done to make sure width/height agree - [bitmapImageRep retain]; - [M_BITMAPDATA->m_cocoaNSBitmapImageRep release]; + wxGCSafeRetain(bitmapImageRep); + wxGCSafeRelease(M_BITMAPDATA->m_cocoaNSBitmapImageRep); M_BITMAPDATA->m_cocoaNSBitmapImageRep = bitmapImageRep; } @@ -293,6 +293,8 @@ int wxBitmap::GetHeight() const bool wxBitmap::Create(int w, int h, int d) { + wxAutoNSAutoreleasePool pool; + UnRef(); m_refData = new wxBitmapRefData; @@ -302,7 +304,7 @@ bool wxBitmap::Create(int w, int h, int d) M_BITMAPDATA->m_depth = d; /* TODO: create new bitmap */ - M_BITMAPDATA->m_cocoaNSBitmapImageRep = [[NSBitmapImageRep alloc] + M_BITMAPDATA->m_cocoaNSBitmapImageRep = wxGCSafeRetain([[[NSBitmapImageRep alloc] initWithBitmapDataPlanes: NULL pixelsWide: w pixelsHigh: h @@ -313,7 +315,7 @@ bool wxBitmap::Create(int w, int h, int d) colorSpaceName: NSCalibratedRGBColorSpace bytesPerRow: 0 // NOTE: Contrary to Apple documentation Mac OS // 10.4 will add padding bytes when 0 is used here - bitsPerPixel: 0]; + bitsPerPixel: 0] autorelease]); wxLogTrace(wxTRACE_COCOA,wxT("M_BITMAPDATA=%p NSBitmapImageRep bitmapData=%p"), M_BITMAPDATA, [M_BITMAPDATA->m_cocoaNSBitmapImageRep bitmapData]); M_BITMAPDATA->m_ok = true; @@ -342,14 +344,14 @@ bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type) M_BITMAPDATA->m_ok = true; M_BITMAPDATA->m_numColors = 0; M_BITMAPDATA->m_quality = 0; - M_BITMAPDATA->m_cocoaNSBitmapImageRep = [imageRep retain]; + M_BITMAPDATA->m_cocoaNSBitmapImageRep = wxGCSafeRetain(imageRep); M_BITMAPDATA->m_bitmapMask = NULL; return true; } wxImage image; if(!image.LoadFile(filename,type)) return false; - if(!image.Ok()) + if(!image.IsOk()) return false; *this = wxBitmap(image); return true; @@ -374,7 +376,7 @@ bool wxBitmap::Create(NSBitmapImageRep *imageRep) M_BITMAPDATA->m_ok = true; M_BITMAPDATA->m_numColors = 0; M_BITMAPDATA->m_quality = 0; - M_BITMAPDATA->m_cocoaNSBitmapImageRep = [imageRep retain]; + M_BITMAPDATA->m_cocoaNSBitmapImageRep = wxGCSafeRetain(imageRep); M_BITMAPDATA->m_bitmapMask = NULL; return true; } @@ -407,12 +409,12 @@ bool wxBitmap::CopyFromIcon(const wxIcon& icon) NSRect imageRect; imageRect.origin.x = imageRect.origin.y = 0.0; imageRect.size = [icon.GetNSImage() size]; - NSBitmapImageRep *newBitmapRep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:imageRect]; + NSBitmapImageRep *newBitmapRep = [[[NSBitmapImageRep alloc] initWithFocusedViewRect:imageRect] autorelease]; [icon.GetNSImage() unlockFocus]; if(!newBitmapRep) return false; m_refData = new wxBitmapRefData; - M_BITMAPDATA->m_cocoaNSBitmapImageRep = newBitmapRep; + M_BITMAPDATA->m_cocoaNSBitmapImageRep = wxGCSafeRetain(newBitmapRep); M_BITMAPDATA->m_width = [newBitmapRep pixelsWide]; M_BITMAPDATA->m_height = [newBitmapRep pixelsHigh]; M_BITMAPDATA->m_depth = [newBitmapRep bitsPerSample]*[newBitmapRep samplesPerPixel]; @@ -426,7 +428,7 @@ bool wxBitmap::CopyFromIcon(const wxIcon& icon) wxBitmap wxBitmap::GetSubBitmap(const wxRect& rect) const { wxAutoNSAutoreleasePool pool; - if(!Ok()) + if(!IsOk()) return wxNullBitmap; NSImage *nsimage = GetNSImage(false); @@ -434,8 +436,8 @@ wxBitmap wxBitmap::GetSubBitmap(const wxRect& rect) const NSRect imageRect = {{0,0}, [nsimage size]}; imageRect.origin.x = imageRect.size.width * rect.x / GetWidth(); imageRect.origin.y = imageRect.size.height * rect.y / GetHeight(); - imageRect.size.width *= wx_static_cast(CGFloat, rect.width) / GetWidth(); - imageRect.size.height *= wx_static_cast(CGFloat, rect.height) / GetHeight(); + imageRect.size.width *= static_cast(rect.width) / GetWidth(); + imageRect.size.height *= static_cast(rect.height) / GetHeight(); NSBitmapImageRep *newBitmapRep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:imageRect]; [nsimage unlockFocus]; @@ -448,7 +450,7 @@ wxBitmap wxBitmap::GetSubBitmap(const wxRect& rect) const wxImage wxBitmap::ConvertToImage() const { wxAutoNSAutoreleasePool pool; - if(!Ok()) + if(!IsOk()) return /*wxImage(5,5)*/wxNullImage; NSImage *nsimage = GetNSImage(false /* don't use mask */); wxImage newImage(M_BITMAPDATA->m_width,M_BITMAPDATA->m_height); @@ -471,16 +473,17 @@ wxImage wxBitmap::ConvertToImage() const bool wxBitmap::CreateFromImage(const wxImage& image, int depth) { + wxAutoNSAutoreleasePool pool; UnRef(); - wxCHECK_MSG(image.Ok(), false, wxT("invalid image")); + wxCHECK_MSG(image.IsOk(), false, wxT("invalid image")); wxCHECK_MSG(depth == -1 || depth == 1, false, wxT("invalid bitmap depth")); m_refData = new wxBitmapRefData(); M_BITMAPDATA->m_width = image.GetWidth(); M_BITMAPDATA->m_height = image.GetHeight(); - NSBitmapImageRep *bitmapImage = [[NSBitmapImageRep alloc] + NSBitmapImageRep *bitmapImage = [[[NSBitmapImageRep alloc] initWithBitmapDataPlanes: NULL pixelsWide: image.GetWidth() pixelsHigh: image.GetHeight() @@ -490,7 +493,7 @@ bool wxBitmap::CreateFromImage(const wxImage& image, int depth) isPlanar: NO colorSpaceName: NSCalibratedRGBColorSpace bytesPerRow: image.GetWidth()*3 - bitsPerPixel: 0]; + bitsPerPixel: 0] autorelease]; // TODO: Specify bytesPerRow:0 and then use [bitmapImage bytesPerRow] // so that the rows are aligned suitably for altivec by the OS (Tiger) @@ -501,14 +504,14 @@ bool wxBitmap::CreateFromImage(const wxImage& image, int depth) M_BITMAPDATA->m_ok = true; M_BITMAPDATA->m_numColors = 0; M_BITMAPDATA->m_quality = 0; - M_BITMAPDATA->m_cocoaNSBitmapImageRep = bitmapImage; + M_BITMAPDATA->m_cocoaNSBitmapImageRep = wxGCSafeRetain(bitmapImage); M_BITMAPDATA->m_bitmapMask = new wxMask(*this,wxColour(image.GetMaskRed(),image.GetMaskGreen(),image.GetMaskBlue())); return true; } void *wxBitmap::GetRawData(wxPixelDataBase& data, int bpp) { - if(!Ok()) + if(!IsOk()) return NULL; NSBitmapImageRep *bitmapRep = M_BITMAPDATA->m_cocoaNSBitmapImageRep; @@ -517,7 +520,7 @@ void *wxBitmap::GetRawData(wxPixelDataBase& data, int bpp) if([bitmapRep bitsPerPixel]!=bpp) { - wxFAIL_MSG( _T("incorrect bitmap type in wxBitmap::GetRawData()") ); + wxFAIL_MSG( wxT("incorrect bitmap type in wxBitmap::GetRawData()") ); return NULL; } data.m_width = [bitmapRep pixelsWide]; @@ -576,13 +579,13 @@ wxMask::wxMask(const wxBitmap& bitmap) // Copy constructor wxMask::wxMask(const wxMask& src) : wxObject(src) -, m_cocoaNSBitmapImageRep([src.m_cocoaNSBitmapImageRep retain]) +, m_cocoaNSBitmapImageRep(wxGCSafeRetain(src.m_cocoaNSBitmapImageRep)) { } wxMask::~wxMask() { - [m_cocoaNSBitmapImageRep release]; + wxGCSafeRelease(m_cocoaNSBitmapImageRep); } // Create a mask from a mono bitmap (copies the bitmap). @@ -654,7 +657,7 @@ static bool wxMask_CreateFromBitmapData(PixelData srcData, const wxColour& colou bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour) { wxAutoNSAutoreleasePool pool; - if(!bitmap.Ok()) + if(!bitmap.IsOk()) return false; int bmpWidth = bitmap.GetWidth(); int bmpHeight = bitmap.GetHeight(); @@ -717,6 +720,6 @@ bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour) { wxCHECK_MSG(false,false,wxT("Unimplemented pixel format")); } // maskRep was autoreleased in case we had to exit quickly - m_cocoaNSBitmapImageRep = [maskRep retain]; + m_cocoaNSBitmapImageRep = wxGCSafeRetain(maskRep); return true; }