X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/68a8c89baadebb650357868fc4ed9b64a55e1657..d595fb29c93249b72930cad9a85a5c237a8ceff7:/src/cocoa/bitmap.mm diff --git a/src/cocoa/bitmap.mm b/src/cocoa/bitmap.mm index adcf08c262..08e8d435fe 100644 --- a/src/cocoa/bitmap.mm +++ b/src/cocoa/bitmap.mm @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/cocoa/bitmap.cpp +// Name: src/cocoa/bitmap.mm // Purpose: wxBitmap // Author: David Elliott // Modified by: @@ -10,6 +10,9 @@ ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" + +#include "wx/bitmap.h" + #ifndef WX_PRECOMP #include "wx/log.h" #include "wx/utils.h" @@ -17,7 +20,7 @@ #include "wx/icon.h" #include "wx/colour.h" #endif //WX_PRECOMP -#include "wx/bitmap.h" + #include "wx/image.h" #include "wx/xpmdecod.h" #include "wx/rawbmp.h" @@ -28,6 +31,7 @@ #import #import #import +#import // ======================================================================== // wxBitmapRefData @@ -298,7 +302,8 @@ bool wxBitmap::Create(int w, int h, int d) hasAlpha: NO isPlanar: NO colorSpaceName: NSCalibratedRGBColorSpace - bytesPerRow: 0 + bytesPerRow: 0 // NOTE: Contrary to Apple documentation Mac OS + // 10.4 will add padding bytes when 0 is used here bitsPerPixel: 0]; wxLogTrace(wxTRACE_COCOA,wxT("M_BITMAPDATA=%p NSBitmapImageRep bitmapData=%p"), M_BITMAPDATA, [M_BITMAPDATA->m_cocoaNSBitmapImageRep bitmapData]); @@ -371,7 +376,7 @@ bool wxBitmap::CopyFromIcon(const wxIcon& icon) M_BITMAPDATA->m_cocoaNSBitmapImageRep = newBitmapRep; M_BITMAPDATA->m_width = [newBitmapRep pixelsWide]; M_BITMAPDATA->m_height = [newBitmapRep pixelsHigh]; - M_BITMAPDATA->m_depth = [newBitmapRep bitsPerSample]; + M_BITMAPDATA->m_depth = [newBitmapRep bitsPerSample]*[newBitmapRep samplesPerPixel]; M_BITMAPDATA->m_ok = true; M_BITMAPDATA->m_numColors = 0; M_BITMAPDATA->m_quality = 0; @@ -386,9 +391,26 @@ wxBitmap wxBitmap::GetSubBitmap(wxRect const&) const wxImage wxBitmap::ConvertToImage() const { + wxAutoNSAutoreleasePool pool; if(!Ok()) return /*wxImage(5,5)*/wxNullImage; - return wxImage(M_BITMAPDATA->m_width,M_BITMAPDATA->m_height); + NSImage *nsimage = GetNSImage(false /* don't use mask */); + wxImage newImage(M_BITMAPDATA->m_width,M_BITMAPDATA->m_height); + [nsimage lockFocus]; + for(int i=0; i < M_BITMAPDATA->m_width; i++) + { + // Don't let the pool get too big as you'll notice we're creating + // two autoreleased NSColor objects with every iteration. + wxAutoNSAutoreleasePool loopPool; + for(int j=0; j < M_BITMAPDATA->m_height; j++) + { + NSColor *pixelColor = NSReadPixel(NSMakePoint(i,M_BITMAPDATA->m_height - j - 1)); + NSColor *color = [pixelColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace]; + newImage.SetRGB(i,j,int([color redComponent]*255.0), int([color greenComponent]*255.0), int([color blueComponent]*255.0)); + } + } + [nsimage unlockFocus]; + return newImage; } bool wxBitmap::CreateFromXpm(const char **xpm) @@ -396,11 +418,11 @@ bool wxBitmap::CreateFromXpm(const char **xpm) #if wxUSE_IMAGE && wxUSE_XPM UnRef(); - wxCHECK_MSG( xpm, false, wxT("invalid XPM data") ) + wxCHECK_MSG( xpm, false, wxT("invalid XPM data") ); wxXPMDecoder decoder; wxImage img = decoder.ReadData(xpm); - wxCHECK_MSG( img.Ok(), false, wxT("invalid XPM data") ) + wxCHECK_MSG( img.Ok(), false, wxT("invalid XPM data") ); *this = wxBitmap(img); return true; @@ -429,9 +451,11 @@ bool wxBitmap::CreateFromImage(const wxImage& image, int depth) hasAlpha: NO isPlanar: NO colorSpaceName: NSCalibratedRGBColorSpace - bytesPerRow: 0 + bytesPerRow: image.GetWidth()*3 bitsPerPixel: 0]; + // TODO: Specify bytesPerRow:0 and then use [bitmapImage bytesPerRow] + // so that the rows are aligned suitably for altivec by the OS (Tiger) const int numBytes = image.GetWidth()*image.GetHeight()*3; memcpy([bitmapImage bitmapData], image.GetData(), numBytes); // TODO: Alpha and convert to desired depth @@ -645,4 +669,3 @@ bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour) m_cocoaNSBitmapImageRep = [maskRep retain]; return true; } -