X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ce20d822b0e486fff1b6368e9be3eeb1a74d8589..eb65cb341bb04925a8698497e0d2d4a35986f6d4:/src/cocoa/bitmap.mm diff --git a/src/cocoa/bitmap.mm b/src/cocoa/bitmap.mm index c73bc16b68..79ec8ebcf0 100644 --- a/src/cocoa/bitmap.mm +++ b/src/cocoa/bitmap.mm @@ -27,6 +27,7 @@ #import #import +#import // ======================================================================== // wxBitmapRefData @@ -145,6 +146,32 @@ WX_NSBitmapImageRep wxBitmap::GetNSBitmapImageRep() return M_BITMAPDATA->m_cocoaNSBitmapImageRep; } +WX_NSImage wxBitmap::GetNSImage(bool useMask) const +{ + if(!Ok()) + return nil; + NSImage *nsimage = [[[NSImage alloc] + initWithSize:NSMakeSize(GetWidth(), GetHeight())] autorelease]; + if(!nsimage) + return nil; + [nsimage addRepresentation: M_BITMAPDATA->m_cocoaNSBitmapImageRep]; + if(useMask && GetMask()) + { + // Show before/after to prove that the bitmap itself is not changed + // even though we just composited onto the NSImage + wxLogTrace(wxTRACE_COCOA,"Before: bpp=%d",[M_BITMAPDATA->m_cocoaNSBitmapImageRep bitsPerPixel]); + NSImage *maskImage = [[NSImage alloc] + initWithSize:NSMakeSize(GetWidth(), GetHeight())]; + [maskImage addRepresentation: GetMask()->GetNSBitmapImageRep()]; + [nsimage lockFocus]; + [maskImage compositeToPoint:NSZeroPoint operation:NSCompositeDestinationIn]; + [nsimage unlockFocus]; + [maskImage release]; + wxLogTrace(wxTRACE_COCOA,"After: bpp=%d",[M_BITMAPDATA->m_cocoaNSBitmapImageRep bitsPerPixel]); + } + return nsimage; +} + void wxBitmap::SetNSBitmapImageRep(WX_NSBitmapImageRep bitmapImageRep) { if(!M_BITMAPDATA) @@ -274,7 +301,7 @@ bool wxBitmap::Create(int w, int h, int d) bytesPerRow: 0 bitsPerPixel: 0]; - wxLogDebug("M_BITMAPDATA=%p NSBitmapImageRep bitmapData=%p", M_BITMAPDATA, [M_BITMAPDATA->m_cocoaNSBitmapImageRep bitmapData]); + wxLogTrace(wxTRACE_COCOA,wxT("M_BITMAPDATA=%p NSBitmapImageRep bitmapData=%p"), M_BITMAPDATA, [M_BITMAPDATA->m_cocoaNSBitmapImageRep bitmapData]); M_BITMAPDATA->m_ok = true; M_BITMAPDATA->m_numColors = 0; M_BITMAPDATA->m_quality = 0; @@ -340,8 +367,8 @@ wxBitmap wxBitmap::GetSubBitmap(wxRect const&) const wxImage wxBitmap::ConvertToImage() const { - if(!M_BITMAPDATA->m_ok) - return wxImage(5,5)/*wxNullImage*/; + if(!Ok()) + return /*wxImage(5,5)*/wxNullImage; return wxImage(M_BITMAPDATA->m_width,M_BITMAPDATA->m_height); } @@ -488,7 +515,7 @@ bool wxMask::Create(const wxBitmap& bitmap, int paletteIndex) template static bool wxMask_CreateFromBitmapData(PixelData srcData, const wxColour& colour, unsigned char *dstData) { - wxCHECK_MSG(dstData,false,"Couldn't access mask data"); + wxCHECK_MSG(dstData,false,wxT("Couldn't access mask data")); class PixelData::Iterator p(srcData); const int nRows = srcData.GetHeight(); const int nCols = srcData.GetWidth(); @@ -516,7 +543,8 @@ static bool wxMask_CreateFromBitmapData(PixelData srcData, const wxColour& colou } // Handle the remaining 0-7 pixels in the row unsigned char *dstByte = dstRow + width_aligned/8; - *dstByte = 0; + if(nCols%8>0) + *dstByte = 0; for(int j=0; j<(nCols%8); ++j, ++p) { *dstByte += @@ -559,26 +587,36 @@ bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour) // We need the source NSBitmapImageRep to detemine its pixel format NSBitmapImageRep *srcBitmapRep = const_cast(bitmap).GetNSBitmapImageRep(); - wxCHECK_MSG(srcBitmapRep,false,"Can't create mask for an uninitialized bitmap"); + wxCHECK_MSG(srcBitmapRep,false,wxT("Can't create mask for an uninitialized bitmap")); // Get a pointer to the destination data unsigned char *dstPlanes[5] = {NULL,NULL,NULL,NULL,NULL}; [maskRep getBitmapDataPlanes:dstPlanes]; unsigned char *dstData = dstPlanes[1]; + // The wxImage format (which we use whenever we imported from wxImage) if([srcBitmapRep bitsPerPixel]==24 && [srcBitmapRep bitsPerSample]==8 && [srcBitmapRep samplesPerPixel]==3 && [srcBitmapRep hasAlpha]==NO) { wxPixelData pixelData(const_cast(bitmap)); wxCHECK_MSG(wxMask_CreateFromBitmapData(pixelData, colour, dstData), - false, "Unable to access raw data"); + false, wxT("Unable to access raw data")); + } + // 32-bpp RGBx (x=throw away, no alpha) + else if([srcBitmapRep bitsPerPixel]==32 && [srcBitmapRep bitsPerSample]==8 && [srcBitmapRep samplesPerPixel]==3 && [srcBitmapRep hasAlpha]==NO) + { + typedef wxPixelFormat PixelFormat; + wxPixelData pixelData(const_cast(bitmap)); + wxCHECK_MSG(wxMask_CreateFromBitmapData(pixelData, colour, dstData), + false, wxT("Unable to access raw data")); } + // 32-bpp RGBA else if([srcBitmapRep bitsPerPixel]==32 && [srcBitmapRep bitsPerSample]==8 && [srcBitmapRep samplesPerPixel]==4 && [srcBitmapRep hasAlpha]==YES) { wxPixelData pixelData(const_cast(bitmap)); wxCHECK_MSG(wxMask_CreateFromBitmapData(pixelData, colour, dstData), - false, "Unable to access raw data"); + false, wxT("Unable to access raw data")); } else - { wxCHECK_MSG(false,false,"Unimplemented pixel format"); } + { wxCHECK_MSG(false,false,wxT("Unimplemented pixel format")); } // maskRep was autoreleased in case we had to exit quickly m_cocoaNSBitmapImageRep = [maskRep retain];