X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/efe854952aedce200e10116dc51b70ac1ec7fdb9..0fa6a0ac1a557104d8e76806eadfa1e600cfc25c:/src/cocoa/bitmap.mm diff --git a/src/cocoa/bitmap.mm b/src/cocoa/bitmap.mm index 2e18c0ae2b..05553108c4 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,15 +10,18 @@ ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" + +#include "wx/bitmap.h" + #ifndef WX_PRECOMP #include "wx/log.h" #include "wx/utils.h" #include "wx/palette.h" #include "wx/icon.h" #include "wx/colour.h" + #include "wx/image.h" #endif //WX_PRECOMP -#include "wx/bitmap.h" -#include "wx/image.h" + #include "wx/xpmdecod.h" #include "wx/rawbmp.h" @@ -30,6 +33,8 @@ #import #import +IMPLEMENT_ABSTRACT_CLASS(wxBitmapHandler, wxBitmapHandlerBase) + // ======================================================================== // wxBitmapRefData // ======================================================================== @@ -120,7 +125,17 @@ wxBitmap::wxBitmap(int w, int h, int d) (void)Create(w, h, d); } -wxBitmap::wxBitmap(void *data, wxBitmapType type, int width, int height, int depth) +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); } @@ -239,7 +254,7 @@ void wxBitmap::SetMask(wxMask *mask) M_BITMAPDATA->m_bitmapMask = mask ; } -bool wxBitmap::Ok() const +bool wxBitmap::IsOk() const { return m_refData && M_BITMAPDATA->m_ok; } @@ -343,7 +358,34 @@ bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type) return true; } -bool wxBitmap::Create(void *data, wxBitmapType type, int width, int height, int depth) +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 = [imageRep retain]; + 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(); @@ -359,6 +401,9 @@ 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]; @@ -381,9 +426,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 *= wx_static_cast(CGFloat, rect.width) / GetWidth(); + imageRect.size.height *= wx_static_cast(CGFloat, rect.height) / GetHeight(); + + NSBitmapImageRep *newBitmapRep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:imageRect]; + [nsimage unlockFocus]; + + wxBitmap newBitmap(newBitmapRep); + + return (newBitmap); } wxImage wxBitmap::ConvertToImage() const @@ -410,24 +472,6 @@ wxImage wxBitmap::ConvertToImage() const return newImage; } -bool wxBitmap::CreateFromXpm(const char **xpm) -{ -#if wxUSE_IMAGE && wxUSE_XPM - UnRef(); - - wxCHECK_MSG( xpm, false, wxT("invalid XPM data") ) - - wxXPMDecoder decoder; - wxImage img = decoder.ReadData(xpm); - wxCHECK_MSG( img.Ok(), false, wxT("invalid XPM data") ) - - *this = wxBitmap(img); - return true; -#else - return false; -#endif -} - bool wxBitmap::CreateFromImage(const wxImage& image, int depth) { UnRef(); @@ -496,10 +540,6 @@ void wxBitmap::UngetRawData(wxPixelDataBase& data) { // TODO } -void wxBitmap::UseAlpha() -{ // TODO -} - // ======================================================================== // wxMask // ======================================================================== @@ -536,6 +576,13 @@ wxMask::wxMask(const wxBitmap& bitmap) Create(bitmap); } +// Copy constructor +wxMask::wxMask(const wxMask& src) +: wxObject(src) +, m_cocoaNSBitmapImageRep([src.m_cocoaNSBitmapImageRep retain]) +{ +} + wxMask::~wxMask() { [m_cocoaNSBitmapImageRep release]; @@ -545,6 +592,7 @@ wxMask::~wxMask() bool wxMask::Create(const wxBitmap& bitmap) { // TODO + wxLogDebug(wxT("Cannot yet create a mask from a mono bitmap")); return FALSE; } @@ -553,6 +601,7 @@ bool wxMask::Create(const wxBitmap& bitmap) bool wxMask::Create(const wxBitmap& bitmap, int paletteIndex) { // TODO + wxLogDebug(wxT("Cannot yet create a mask from a palette bitmap")); return FALSE; } @@ -659,6 +708,14 @@ bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour) wxCHECK_MSG(wxMask_CreateFromBitmapData(pixelData, colour, dstData), false, wxT("Unable to access raw data")); } + else if([srcBitmapRep bitsPerPixel]==8 && [srcBitmapRep bitsPerSample]==8 && [srcBitmapRep samplesPerPixel]==1 && [srcBitmapRep hasAlpha]==NO) + // 8-bpp Grayscale, no alpha + { // Force all RGB to access the same grayscale component + typedef wxPixelFormat PixelFormat; + wxPixelData pixelData(const_cast(bitmap)); + wxCHECK_MSG(wxMask_CreateFromBitmapData(pixelData, colour, dstData), + false, wxT("Unable to access raw data")); + } else { wxCHECK_MSG(false,false,wxT("Unimplemented pixel format")); } @@ -666,4 +723,3 @@ bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour) m_cocoaNSBitmapImageRep = [maskRep retain]; return true; } -