X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/319fe1034c0bdecf2b3a34669f3a15782c60d0b2..57bf907d8e45ced18486d74c04f41c06034b7e65:/src/cocoa/bitmap.mm diff --git a/src/cocoa/bitmap.mm b/src/cocoa/bitmap.mm index b16ba01087..daffce382a 100644 --- a/src/cocoa/bitmap.mm +++ b/src/cocoa/bitmap.mm @@ -27,6 +27,7 @@ #include "wx/cocoa/autorelease.h" #include "wx/cocoa/string.h" +#include "wx/cocoa/ObjcRef.h" #import #import @@ -46,6 +47,8 @@ public: wxBitmapRefData( const wxBitmapRefData& data ); virtual ~wxBitmapRefData(); + virtual bool IsOk() const { return m_ok; } + protected: int m_width; int m_height; @@ -74,6 +77,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; @@ -81,13 +86,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; @@ -125,6 +130,16 @@ wxBitmap::wxBitmap(int w, int h, int d) (void)Create(w, h, d); } +wxBitmap::wxBitmap(NSImage* cocoaNSImage) +{ + (void) Create(cocoaNSImage); +} + +wxBitmap::wxBitmap(NSBitmapImageRep* cocoaNSBitmapImageRep) +{ + (void) Create(cocoaNSBitmapImageRep); +} + wxBitmap::wxBitmap(const void* data, wxBitmapType type, int width, int height, int depth) { (void) Create(data, type, width, height, depth); @@ -135,12 +150,12 @@ wxBitmap::wxBitmap(const wxString& filename, wxBitmapType type) LoadFile(filename, type); } -wxObjectRefData *wxBitmap::CreateRefData() const +wxGDIRefData *wxBitmap::CreateGDIRefData() const { return new wxBitmapRefData; } -wxObjectRefData *wxBitmap::CloneRefData(const wxObjectRefData *data) const +wxGDIRefData *wxBitmap::CloneGDIRefData(const wxGDIRefData *data) const { return new wxBitmapRefData(*(wxBitmapRefData*)data); } @@ -183,8 +198,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; } @@ -244,11 +259,6 @@ void wxBitmap::SetMask(wxMask *mask) M_BITMAPDATA->m_bitmapMask = mask ; } -bool wxBitmap::IsOk() const -{ - return m_refData && M_BITMAPDATA->m_ok; -} - wxPalette* wxBitmap::GetPalette() const { if(!m_refData) @@ -286,6 +296,8 @@ int wxBitmap::GetHeight() const bool wxBitmap::Create(int w, int h, int d) { + wxAutoNSAutoreleasePool pool; + UnRef(); m_refData = new wxBitmapRefData; @@ -295,7 +307,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 @@ -306,7 +318,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; @@ -335,7 +347,7 @@ 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; } @@ -348,6 +360,33 @@ bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type) return true; } +bool wxBitmap::Create(NSImage* cocoaNSImage) +{ + wxAutoNSAutoreleasePool pool; + NSBitmapImageRep *bitmapImageRep = [NSBitmapImageRep imageRepWithData:[cocoaNSImage TIFFRepresentation]]; + return Create(bitmapImageRep); +} + +bool wxBitmap::Create(NSBitmapImageRep *imageRep) +{ + UnRef(); + m_refData = new wxBitmapRefData; + if(imageRep != nil) + { + M_BITMAPDATA->m_width = [imageRep pixelsWide]; + M_BITMAPDATA->m_height = [imageRep pixelsHigh]; + M_BITMAPDATA->m_depth = [imageRep bitsPerPixel]; + M_BITMAPDATA->m_ok = true; + M_BITMAPDATA->m_numColors = 0; + M_BITMAPDATA->m_quality = 0; + M_BITMAPDATA->m_cocoaNSBitmapImageRep = wxGCSafeRetain(imageRep); + M_BITMAPDATA->m_bitmapMask = NULL; + return true; + } + else + return false; +} + bool wxBitmap::Create(const void* data, wxBitmapType type, int width, int height, int depth) { UnRef(); @@ -364,18 +403,21 @@ bool wxBitmap::SaveFile(const wxString& filename, wxBitmapType type, const wxPal bool wxBitmap::CopyFromIcon(const wxIcon& icon) { + // Pool here due to lack of one during wx init phase + wxAutoNSAutoreleasePool pool; + UnRef(); if(!icon.GetNSImage()); [icon.GetNSImage() lockFocus]; 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]; @@ -386,9 +428,26 @@ bool wxBitmap::CopyFromIcon(const wxIcon& icon) return true; } -wxBitmap wxBitmap::GetSubBitmap(wxRect const&) const +wxBitmap wxBitmap::GetSubBitmap(const wxRect& rect) const { - return wxNullBitmap; + wxAutoNSAutoreleasePool pool; + if(!Ok()) + return wxNullBitmap; + NSImage *nsimage = GetNSImage(false); + + [nsimage lockFocus]; + 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 *= static_cast(rect.width) / GetWidth(); + imageRect.size.height *= static_cast(rect.height) / GetHeight(); + + NSBitmapImageRep *newBitmapRep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:imageRect]; + [nsimage unlockFocus]; + + wxBitmap newBitmap(newBitmapRep); + + return (newBitmap); } wxImage wxBitmap::ConvertToImage() const @@ -417,6 +476,7 @@ wxImage wxBitmap::ConvertToImage() const bool wxBitmap::CreateFromImage(const wxImage& image, int depth) { + wxAutoNSAutoreleasePool pool; UnRef(); wxCHECK_MSG(image.Ok(), false, wxT("invalid image")); @@ -426,7 +486,7 @@ bool wxBitmap::CreateFromImage(const wxImage& image, int depth) 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() @@ -436,7 +496,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) @@ -447,7 +507,7 @@ 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; } @@ -522,20 +582,20 @@ 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). bool wxMask::Create(const wxBitmap& bitmap) { // TODO - wxLogDebug("Cannot yet create a mask from a mono bitmap"); + wxLogDebug(wxT("Cannot yet create a mask from a mono bitmap")); return FALSE; } @@ -544,7 +604,7 @@ bool wxMask::Create(const wxBitmap& bitmap) bool wxMask::Create(const wxBitmap& bitmap, int paletteIndex) { // TODO - wxLogDebug("Cannot yet create a mask from a palette bitmap"); + wxLogDebug(wxT("Cannot yet create a mask from a palette bitmap")); return FALSE; } @@ -663,6 +723,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; }