From 016b064360b6018058a1c1cff688a055425956b1 Mon Sep 17 00:00:00 2001 From: David Elliott Date: Mon, 8 Dec 2003 15:01:39 +0000 Subject: [PATCH] Implement wxMask given a wxBitmap and a mask wxColour. TODO: Masks from other sources. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24719 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/cocoa/bitmap.h | 38 ++++++------- src/cocoa/bitmap.mm | 117 ++++++++++++++++++++++++++++++++------ 2 files changed, 119 insertions(+), 36 deletions(-) diff --git a/include/wx/cocoa/bitmap.h b/include/wx/cocoa/bitmap.h index 6b3186d1b2..622aab943e 100644 --- a/include/wx/cocoa/bitmap.h +++ b/include/wx/cocoa/bitmap.h @@ -24,38 +24,36 @@ class WXDLLEXPORT wxPixelDataBase; // ======================================================================== // wxMask // ======================================================================== -/* DFE: wxMask is not implemented yet */ -// A mask is a mono bitmap used for drawing bitmaps -// transparently. +// A mask is a 1-bit alpha bitmap used for drawing bitmaps transparently. class WXDLLEXPORT wxMask: public wxObject { DECLARE_DYNAMIC_CLASS(wxMask) public: - wxMask(); + wxMask(); - // Construct a mask from a bitmap and a colour indicating - // the transparent area - wxMask(const wxBitmap& bitmap, const wxColour& colour); + // Construct a mask from a bitmap and a colour indicating + // the transparent area + wxMask(const wxBitmap& bitmap, const wxColour& colour); - // Construct a mask from a bitmap and a palette index indicating - // the transparent area - wxMask(const wxBitmap& bitmap, int paletteIndex); + // Construct a mask from a bitmap and a palette index indicating + // the transparent area + wxMask(const wxBitmap& bitmap, int paletteIndex); - // Construct a mask from a mono bitmap (copies the bitmap). - wxMask(const wxBitmap& bitmap); + // Construct a mask from a mono bitmap (copies the bitmap). + wxMask(const wxBitmap& bitmap); - ~wxMask(); + ~wxMask(); - bool Create(const wxBitmap& bitmap, const wxColour& colour); - bool Create(const wxBitmap& bitmap, int paletteIndex); - bool Create(const wxBitmap& bitmap); + bool Create(const wxBitmap& bitmap, const wxColour& colour); + bool Create(const wxBitmap& bitmap, int paletteIndex); + bool Create(const wxBitmap& bitmap); - // Implementation -// inline WXHBITMAP GetMaskBitmap() const { return m_maskBitmap; } -// inline void SetMaskBitmap(WXHBITMAP bmp) { m_maskBitmap = bmp; } + // wxCocoa + inline WX_NSBitmapImageRep GetNSBitmapImageRep() + { return m_cocoaNSBitmapImageRep; } protected: -// WXHBITMAP m_maskBitmap; + WX_NSBitmapImageRep m_cocoaNSBitmapImageRep; }; // ======================================================================== diff --git a/src/cocoa/bitmap.mm b/src/cocoa/bitmap.mm index 20eb68c03a..b630916a41 100644 --- a/src/cocoa/bitmap.mm +++ b/src/cocoa/bitmap.mm @@ -15,6 +15,7 @@ #include "wx/utils.h" #include "wx/palette.h" #include "wx/icon.h" + #include "wx/colour.h" #endif //WX_PRECOMP #include "wx/bitmap.h" #include "wx/image.h" @@ -393,7 +394,7 @@ bool wxBitmap::CreateFromImage(const wxImage& image, int depth) M_BITMAPDATA->m_numColors = 0; M_BITMAPDATA->m_quality = 0; M_BITMAPDATA->m_cocoaNSBitmapImageRep = bitmapImage; - M_BITMAPDATA->m_bitmapMask = NULL; + M_BITMAPDATA->m_bitmapMask = new wxMask(*this,wxColour(image.GetMaskRed(),image.GetMaskGreen(),image.GetMaskBlue())); return true; } @@ -436,18 +437,14 @@ IMPLEMENT_DYNAMIC_CLASS(wxMask, wxObject) wxMask::wxMask() { -/* TODO - m_maskBitmap = 0; -*/ + m_cocoaNSBitmapImageRep = nil; } // Construct a mask from a bitmap and a colour indicating // the transparent area wxMask::wxMask(const wxBitmap& bitmap, const wxColour& colour) { -/* TODO - m_maskBitmap = 0; -*/ + m_cocoaNSBitmapImageRep = nil; Create(bitmap, colour); } @@ -455,9 +452,7 @@ wxMask::wxMask(const wxBitmap& bitmap, const wxColour& colour) // the transparent area wxMask::wxMask(const wxBitmap& bitmap, int paletteIndex) { -/* TODO - m_maskBitmap = 0; -*/ + m_cocoaNSBitmapImageRep = nil; Create(bitmap, paletteIndex); } @@ -465,16 +460,14 @@ wxMask::wxMask(const wxBitmap& bitmap, int paletteIndex) // Construct a mask from a mono bitmap (copies the bitmap). wxMask::wxMask(const wxBitmap& bitmap) { -/* TODO - m_maskBitmap = 0; -*/ + m_cocoaNSBitmapImageRep = nil; Create(bitmap); } wxMask::~wxMask() { -// TODO: delete mask bitmap + [m_cocoaNSBitmapImageRep release]; } // Create a mask from a mono bitmap (copies the bitmap). @@ -492,11 +485,103 @@ bool wxMask::Create(const wxBitmap& bitmap, int paletteIndex) return FALSE; } +template +static bool wxMask_CreateFromBitmapData(PixelData srcData, const wxColour& colour, unsigned char *dstData) +{ + wxCHECK_MSG(dstData,false,"Couldn't access mask data"); + class PixelData::Iterator p(srcData); + const int nRows = srcData.GetHeight(); + const int nCols = srcData.GetWidth(); + // Total number of bytes per destination column + const int dstRowLength = (nCols+7)/8; + // Number of source columns that fit into a byte in the destination + const int width_aligned = nCols/8*8; + for(int y=0; ym_cocoaNSBitmapImageRep; + wxCHECK_MSG(srcBitmapRep,false,"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]; + 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"); + } + 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"); + } + else + { wxCHECK_MSG(false,false,"Unimplemented pixel format"); } + + // maskRep was autoreleased in case we had to exit quickly + m_cocoaNSBitmapImageRep = [maskRep retain]; + return true; } -- 2.45.2