added wxImage::IsTransparent(x, y)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33284 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2005-04-02 21:30:22 +00:00
parent 60b1fda237
commit 21dc4be5d2
4 changed files with 81 additions and 17 deletions

View File

@@ -29,6 +29,7 @@ All (GUI):
- Added wxTE_BESTWRAP (based on patch by Mart Raudsepp). - Added wxTE_BESTWRAP (based on patch by Mart Raudsepp).
- wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED is now only sent once at the end of - wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED is now only sent once at the end of
splitter dragging and not after each CHANGING event (Jacobo Vilella Vilahur). splitter dragging and not after each CHANGING event (Jacobo Vilella Vilahur).
- Added wxImage::IsTransparent()
Unix: Unix:

View File

@@ -270,7 +270,7 @@ Returns number of colours in the histogram.
\membersection{wxImage::ConvertAlphaToMask}\label{wximageconvertalphatomask} \membersection{wxImage::ConvertAlphaToMask}\label{wximageconvertalphatomask}
\func{bool}{ConvertAlphaToMask}{\param{unsigned char}{ threshold = 128}} \func{bool}{ConvertAlphaToMask}{\param{unsigned char}{ threshold = $128$}}
If the image has alpha channel, this method converts it to mask. All pixels 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 with alpha value less than \arg{threshold} are replaced with mask colour
@@ -708,6 +708,15 @@ of a given handler class in an application session.}
\helpref{wxImageHandler}{wximagehandler} \helpref{wxImageHandler}{wximagehandler}
\membersection{wxImage::IsTransparent}\label{wximageistransparent}
\constfunc{IsTransparent}{\param{int }{x}, \param{int }{y}, \param{unsigned char threshold = $128$}}
Returns \true if the given pixel is transparent, i.e. either has the mask
colour if this image has a mask or if this image has alpha channel and alpha
value of this pixel is strictly less than \arg{threshold}.
\membersection{wxImage::LoadFile}\label{wximageloadfile} \membersection{wxImage::LoadFile}\label{wximageloadfile}
\func{bool}{LoadFile}{\param{const wxString\&}{ name}, \param{long}{ type = wxBITMAP\_TYPE\_ANY}, \param{int}{ index = -1}} \func{bool}{LoadFile}{\param{const wxString\&}{ name}, \param{long}{ type = wxBITMAP\_TYPE\_ANY}, \param{int}{ index = -1}}

View File

@@ -46,6 +46,13 @@ enum
wxIMAGE_RESOLUTION_CM = 2 wxIMAGE_RESOLUTION_CM = 2
}; };
// alpha channel values: fully transparent, default threshold separating
// transparent pixels from opaque for a few functions dealing with alpha and
// fully opaque
const unsigned char wxIMAGE_ALPHA_TRANSPARENT = 0;
const unsigned char wxIMAGE_ALPHA_THRESHOLD = 0x80;
const unsigned char wxIMAGE_ALPHA_OPAQUE = 0xff;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// classes // classes
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -240,7 +247,7 @@ public:
// converts image's alpha channel to mask, if it has any, does nothing // converts image's alpha channel to mask, if it has any, does nothing
// otherwise: // otherwise:
bool ConvertAlphaToMask(unsigned char threshold = 128); bool ConvertAlphaToMask(unsigned char threshold = wxIMAGE_ALPHA_THRESHOLD);
// This method converts an image where the original alpha // This method converts an image where the original alpha
// information is only available as a shades of a colour // information is only available as a shades of a colour
@@ -290,6 +297,11 @@ public:
void SetAlpha(unsigned char *alpha = NULL, bool static_data=false); void SetAlpha(unsigned char *alpha = NULL, bool static_data=false);
void InitAlpha(); void InitAlpha();
// return true if this pixel is masked or has alpha less than specified
// threshold
bool IsTransparent(int x, int y,
unsigned char threshold = wxIMAGE_ALPHA_THRESHOLD) const;
// Mask functions // Mask functions
void SetMaskColour( unsigned char r, unsigned char g, unsigned char b ); void SetMaskColour( unsigned char r, unsigned char g, unsigned char b );
// Get the current mask colour or find a suitable colour // Get the current mask colour or find a suitable colour

View File

@@ -787,6 +787,20 @@ wxImage wxImage::ConvertToMono( unsigned char r, unsigned char g, unsigned char
return image; return image;
} }
int wxImage::GetWidth() const
{
wxCHECK_MSG( Ok(), 0, wxT("invalid image") );
return M_IMGDATA->m_width;
}
int wxImage::GetHeight() const
{
wxCHECK_MSG( Ok(), 0, wxT("invalid image") );
return M_IMGDATA->m_height;
}
long wxImage::XYToIndex(int x, int y) const long wxImage::XYToIndex(int x, int y) const
{ {
if ( Ok() && if ( Ok() &&
@@ -1022,8 +1036,6 @@ void wxImage::InitAlpha()
unsigned char *alpha = M_IMGDATA->m_alpha; unsigned char *alpha = M_IMGDATA->m_alpha;
const size_t lenAlpha = M_IMGDATA->m_width * M_IMGDATA->m_height; const size_t lenAlpha = M_IMGDATA->m_width * M_IMGDATA->m_height;
static const unsigned char ALPHA_TRANSPARENT = 0;
static const unsigned char ALPHA_OPAQUE = 0xff;
if ( HasMask() ) if ( HasMask() )
{ {
// use the mask to initialize the alpha channel. // use the mask to initialize the alpha channel.
@@ -1037,8 +1049,8 @@ void wxImage::InitAlpha()
src += 3, alpha++ ) src += 3, alpha++ )
{ {
*alpha = (src[0] == mr && src[1] == mg && src[2] == mb) *alpha = (src[0] == mr && src[1] == mg && src[2] == mb)
? ALPHA_TRANSPARENT ? wxIMAGE_ALPHA_TRANSPARENT
: ALPHA_OPAQUE; : wxIMAGE_ALPHA_OPAQUE;
} }
M_IMGDATA->m_hasMask = false; M_IMGDATA->m_hasMask = false;
@@ -1046,7 +1058,7 @@ void wxImage::InitAlpha()
else // no mask else // no mask
{ {
// make the image fully opaque // make the image fully opaque
memset(alpha, ALPHA_OPAQUE, lenAlpha); memset(alpha, wxIMAGE_ALPHA_OPAQUE, lenAlpha);
} }
} }
@@ -1117,18 +1129,35 @@ bool wxImage::HasMask() const
return M_IMGDATA->m_hasMask; return M_IMGDATA->m_hasMask;
} }
int wxImage::GetWidth() const bool wxImage::IsTransparent(int x, int y, unsigned char threshold) const
{ {
wxCHECK_MSG( Ok(), 0, wxT("invalid image") ); long pos = XYToIndex(x, y);
wxCHECK_MSG( pos != -1, false, wxT("invalid image coordinates") );
return M_IMGDATA->m_width; // check mask
} if ( M_IMGDATA->m_hasMask )
{
const unsigned char *p = M_IMGDATA->m_data + 3*pos;
if ( p[0] == M_IMGDATA->m_maskRed &&
p[1] == M_IMGDATA->m_maskGreen &&
p[2] == M_IMGDATA->m_maskBlue )
{
return true;
}
}
int wxImage::GetHeight() const // then check alpha
{ if ( M_IMGDATA->m_alpha )
wxCHECK_MSG( Ok(), 0, wxT("invalid image") ); {
if ( M_IMGDATA->m_alpha[pos] < threshold )
{
// transparent enough
return true;
}
}
return M_IMGDATA->m_height; // not transparent
return false;
} }
bool wxImage::SetMaskFromImage(const wxImage& mask, bool wxImage::SetMaskFromImage(const wxImage& mask,
@@ -1216,9 +1245,11 @@ bool wxImage::ConvertAlphaToMask(unsigned char threshold)
return true; return true;
} }
#if wxUSE_PALETTE // ----------------------------------------------------------------------------
// Palette functions // Palette functions
// ----------------------------------------------------------------------------
#if wxUSE_PALETTE
bool wxImage::HasPalette() const bool wxImage::HasPalette() const
{ {
@@ -1244,7 +1275,10 @@ void wxImage::SetPalette(const wxPalette& palette)
#endif // wxUSE_PALETTE #endif // wxUSE_PALETTE
// ----------------------------------------------------------------------------
// Option functions (arbitrary name/value mapping) // Option functions (arbitrary name/value mapping)
// ----------------------------------------------------------------------------
void wxImage::SetOption(const wxString& name, const wxString& value) void wxImage::SetOption(const wxString& name, const wxString& value)
{ {
wxCHECK_RET( Ok(), wxT("invalid image") ); wxCHECK_RET( Ok(), wxT("invalid image") );
@@ -1292,6 +1326,10 @@ bool wxImage::HasOption(const wxString& name) const
return (M_IMGDATA->m_optionNames.Index(name, false) != wxNOT_FOUND); return (M_IMGDATA->m_optionNames.Index(name, false) != wxNOT_FOUND);
} }
// ----------------------------------------------------------------------------
// image I/O
// ----------------------------------------------------------------------------
bool wxImage::LoadFile( const wxString& filename, long type, int index ) bool wxImage::LoadFile( const wxString& filename, long type, int index )
{ {
#if wxUSE_STREAMS #if wxUSE_STREAMS
@@ -1549,6 +1587,10 @@ bool wxImage::SaveFile( wxOutputStream& stream, const wxString& mimetype ) const
} }
#endif // wxUSE_STREAMS #endif // wxUSE_STREAMS
// ----------------------------------------------------------------------------
// image I/O handlers
// ----------------------------------------------------------------------------
void wxImage::AddHandler( wxImageHandler *handler ) void wxImage::AddHandler( wxImageHandler *handler )
{ {
// Check for an existing handler of the type being added. // Check for an existing handler of the type being added.