added wxImage::ConvertAlphaToMask

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28810 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2004-08-16 12:31:08 +00:00
parent bc88f66f5f
commit ff5ad79411
3 changed files with 60 additions and 1 deletions

View File

@@ -257,6 +257,22 @@ WX_DECLARE_EXPORTED_HASH_MAP(unsigned long, wxImageHistogramEntry,
Returns number of colours in the histogram. Returns number of colours in the histogram.
\membersection{wxImage::ConvertAlphaToMask}\label{wximageconvertalphatomask}
\func{bool}{ConvertAlphaToMask}{\param{unsigned char}{ threshold = 128}}
If the image has alpha channel, this method converts it to mask. All pixels
with alpha value less than \arg{threshold} are replaced with mask colour
and the alpha channel is removed. Mask colour is chosen automatically using
\helpref{FindFirstUnusedColour}{wximagefindfirstunusedcolour}.
If the image image doesn't have alpha channel,
ConvertAlphaToMask does nothing.
\wxheading{Return value}
\false if FindFirstUnusedColour returns \false, \true otherwise.
\membersection{wxImage::ConvertToBitmap}\label{wximageconverttobitmap} \membersection{wxImage::ConvertToBitmap}\label{wximageconverttobitmap}
\constfunc{wxBitmap}{ConvertToBitmap}{\void} \constfunc{wxBitmap}{ConvertToBitmap}{\void}

View File

@@ -185,7 +185,8 @@ public:
void Replace( unsigned char r1, unsigned char g1, unsigned char b1, void Replace( unsigned char r1, unsigned char g1, unsigned char b1,
unsigned char r2, unsigned char g2, unsigned char b2 ); unsigned char r2, unsigned char g2, unsigned char b2 );
// convert to monochrome image (<r,g,b> will be replaced by white, everything else by black) // convert to monochrome image (<r,g,b> will be replaced by white,
// everything else by black)
wxImage ConvertToMono( unsigned char r, unsigned char g, unsigned char b ) const; wxImage ConvertToMono( unsigned char r, unsigned char g, unsigned char b ) const;
// these routines are slow but safe // these routines are slow but safe
@@ -206,6 +207,10 @@ public:
bool SetMaskFromImage(const wxImage & mask, bool SetMaskFromImage(const wxImage & mask,
unsigned char mr, unsigned char mg, unsigned char mb); unsigned char mr, unsigned char mg, unsigned char mb);
// converts image's alpha channel to mask, if it has any, does nothing
// otherwise:
bool ConvertAlphaToMask(unsigned threshold = 128);
static bool CanRead( const wxString& name ); static bool CanRead( const wxString& name );
static int GetImageCount( const wxString& name, long type = wxBITMAP_TYPE_ANY ); static int GetImageCount( const wxString& name, long type = wxBITMAP_TYPE_ANY );
virtual bool LoadFile( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 ); virtual bool LoadFile( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 );

View File

@@ -935,6 +935,44 @@ bool wxImage::SetMaskFromImage(const wxImage& mask,
return true; return true;
} }
bool wxImage::ConvertAlphaToMask(unsigned threshold)
{
if (!HasAlpha())
return true;
unsigned char mr, mg, mb;
if (!FindFirstUnusedColour(&mr, &mg, &mb))
{
wxLogError( _("No unused colour in image being masked.") );
return false;
}
SetMask(true);
SetMaskColour(mr, mg, mb);
unsigned char *imgdata = GetData();
unsigned char *alphadata = GetAlpha();
size_t w = GetWidth();
size_t h = GetHeight();
for (size_t y = 0; y < h; y++)
{
for (size_t x = 0; x < w; x++, imgdata += 3, alphadata++)
{
if (*alphadata < threshold)
{
imgdata[0] = mr;
imgdata[1] = mg;
imgdata[2] = mb;
}
}
}
free(M_IMGDATA->m_alpha);
M_IMGDATA->m_alpha = NULL;
}
#if wxUSE_PALETTE #if wxUSE_PALETTE