unsigned char *m_alpha;
bool m_ok;
+
+ // if true, m_data is pointer to static data and shouldn't be freed
bool m_static;
+ // same as m_static but for m_alpha
+ bool m_staticAlpha;
+
#if wxUSE_PALETTE
wxPalette m_palette;
#endif // wxUSE_PALETTE
m_hasMask = false;
m_ok = false;
- m_static = false;
+ m_static =
+ m_staticAlpha = false;
}
wxImageRefData::~wxImageRefData()
{
- if (!m_static)
- {
+ if ( !m_static )
free( m_data );
+ if ( !m_staticAlpha )
free( m_alpha );
- }
}
wxList wxImage::sm_handlers;
wxCHECK_MSG( data, image, wxT("unable to create image") );
+ unsigned char *source_data = M_IMGDATA->m_data;
+ unsigned char *target_data;
+ unsigned char *alpha_data = 0 ;
+ unsigned char *source_alpha = 0 ;
+ unsigned char *target_alpha = 0 ;
+
if (M_IMGDATA->m_hasMask)
+ {
image.SetMaskColour( M_IMGDATA->m_maskRed, M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskBlue );
+ }
+ else
+ {
+ source_alpha = M_IMGDATA->m_alpha ;
+ if ( source_alpha )
+ {
+ image.SetAlpha() ;
+ alpha_data = image.GetAlpha() ;
+ }
+ }
long height = M_IMGDATA->m_height;
long width = M_IMGDATA->m_width;
- unsigned char *source_data = M_IMGDATA->m_data;
- unsigned char *target_data;
-
for (long j = 0; j < height; j++)
{
for (long i = 0; i < width; i++)
{
if (clockwise)
+ {
target_data = data + (((i+1)*height) - j - 1)*3;
+ if(source_alpha)
+ target_alpha = alpha_data + (((i+1)*height) - j - 1);
+ }
else
+ {
target_data = data + ((height*(width-1)) + j - (i*height))*3;
+ if(source_alpha)
+ target_alpha = alpha_data + ((height*(width-1)) + j - (i*height));
+ }
memcpy( target_data, source_data, 3 );
source_data += 3;
+
+ if(source_alpha)
+ {
+ memcpy( target_alpha, source_alpha, 1 );
+ source_alpha += 1;
+ }
}
}
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
{
if ( Ok() &&
free(M_IMGDATA->m_alpha);
M_IMGDATA->m_alpha = alpha;
- M_IMGDATA->m_static = static_data;
+ M_IMGDATA->m_staticAlpha = static_data;
}
unsigned char *wxImage::GetAlpha() const
unsigned char *alpha = M_IMGDATA->m_alpha;
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() )
{
// use the mask to initialize the alpha channel.
src += 3, alpha++ )
{
*alpha = (src[0] == mr && src[1] == mg && src[2] == mb)
- ? ALPHA_TRANSPARENT
- : ALPHA_OPAQUE;
+ ? wxIMAGE_ALPHA_TRANSPARENT
+ : wxIMAGE_ALPHA_OPAQUE;
}
M_IMGDATA->m_hasMask = false;
else // no mask
{
// make the image fully opaque
- memset(alpha, ALPHA_OPAQUE, lenAlpha);
+ memset(alpha, wxIMAGE_ALPHA_OPAQUE, lenAlpha);
}
}
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
-{
- wxCHECK_MSG( Ok(), 0, wxT("invalid image") );
+ // then check alpha
+ if ( M_IMGDATA->m_alpha )
+ {
+ 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,
return true;
}
-#if wxUSE_PALETTE
-
+// ----------------------------------------------------------------------------
// Palette functions
+// ----------------------------------------------------------------------------
+
+#if wxUSE_PALETTE
bool wxImage::HasPalette() const
{
#endif // wxUSE_PALETTE
+// ----------------------------------------------------------------------------
// Option functions (arbitrary name/value mapping)
+// ----------------------------------------------------------------------------
+
void wxImage::SetOption(const wxString& name, const wxString& value)
{
wxCHECK_RET( Ok(), wxT("invalid image") );
return (M_IMGDATA->m_optionNames.Index(name, false) != wxNOT_FOUND);
}
+// ----------------------------------------------------------------------------
+// image I/O
+// ----------------------------------------------------------------------------
+
bool wxImage::LoadFile( const wxString& filename, long type, int index )
{
#if wxUSE_STREAMS
}
#endif // wxUSE_STREAMS
+// ----------------------------------------------------------------------------
+// image I/O handlers
+// ----------------------------------------------------------------------------
+
void wxImage::AddHandler( wxImageHandler *handler )
{
// Check for an existing handler of the type being added.