added XYToIndex() to avoid duplicating the checks for valid coordinates in many different places
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33281 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
aa66250ba4
commit
5644ac4640
@ -354,6 +354,12 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
static wxList sm_handlers;
|
static wxList sm_handlers;
|
||||||
|
|
||||||
|
// return the index of the point with the given coordinates or -1 if the
|
||||||
|
// image is invalid of the coordinates are out of range
|
||||||
|
//
|
||||||
|
// note that index must be multiplied by 3 when using it with RGB array
|
||||||
|
long XYToIndex(int x, int y) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class WXDLLEXPORT wxImageHandler;
|
friend class WXDLLEXPORT wxImageHandler;
|
||||||
|
|
||||||
|
@ -782,16 +782,24 @@ wxImage wxImage::ConvertToMono( unsigned char r, unsigned char g, unsigned char
|
|||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long wxImage::XYToIndex(int x, int y) const
|
||||||
|
{
|
||||||
|
if ( Ok() &&
|
||||||
|
x >= 0 && y >= 0 &&
|
||||||
|
x < M_IMGDATA->m_width && y < M_IMGDATA->m_height )
|
||||||
|
{
|
||||||
|
return y*M_IMGDATA->m_width + x;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
void wxImage::SetRGB( int x, int y, unsigned char r, unsigned char g, unsigned char b )
|
void wxImage::SetRGB( int x, int y, unsigned char r, unsigned char g, unsigned char b )
|
||||||
{
|
{
|
||||||
wxCHECK_RET( Ok(), wxT("invalid image") );
|
long pos = XYToIndex(x, y);
|
||||||
|
wxCHECK_RET( pos != -1, wxT("invalid image coordinates") );
|
||||||
|
|
||||||
int w = M_IMGDATA->m_width;
|
pos *= 3;
|
||||||
int h = M_IMGDATA->m_height;
|
|
||||||
|
|
||||||
wxCHECK_RET( (x>=0) && (y>=0) && (x<w) && (y<h), wxT("invalid image index") );
|
|
||||||
|
|
||||||
long pos = (y * w + x) * 3;
|
|
||||||
|
|
||||||
M_IMGDATA->m_data[ pos ] = r;
|
M_IMGDATA->m_data[ pos ] = r;
|
||||||
M_IMGDATA->m_data[ pos+1 ] = g;
|
M_IMGDATA->m_data[ pos+1 ] = g;
|
||||||
@ -836,42 +844,30 @@ void wxImage::SetRGB( const wxRect& rect_, unsigned char r, unsigned char g, uns
|
|||||||
|
|
||||||
unsigned char wxImage::GetRed( int x, int y ) const
|
unsigned char wxImage::GetRed( int x, int y ) const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), 0, wxT("invalid image") );
|
long pos = XYToIndex(x, y);
|
||||||
|
wxCHECK_MSG( pos != -1, 0, wxT("invalid image coordinates") );
|
||||||
|
|
||||||
int w = M_IMGDATA->m_width;
|
pos *= 3;
|
||||||
int h = M_IMGDATA->m_height;
|
|
||||||
|
|
||||||
wxCHECK_MSG( (x>=0) && (y>=0) && (x<w) && (y<h), 0, wxT("invalid image index") );
|
|
||||||
|
|
||||||
long pos = (y * w + x) * 3;
|
|
||||||
|
|
||||||
return M_IMGDATA->m_data[pos];
|
return M_IMGDATA->m_data[pos];
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char wxImage::GetGreen( int x, int y ) const
|
unsigned char wxImage::GetGreen( int x, int y ) const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), 0, wxT("invalid image") );
|
long pos = XYToIndex(x, y);
|
||||||
|
wxCHECK_MSG( pos != -1, 0, wxT("invalid image coordinates") );
|
||||||
|
|
||||||
int w = M_IMGDATA->m_width;
|
pos *= 3;
|
||||||
int h = M_IMGDATA->m_height;
|
|
||||||
|
|
||||||
wxCHECK_MSG( (x>=0) && (y>=0) && (x<w) && (y<h), 0, wxT("invalid image index") );
|
|
||||||
|
|
||||||
long pos = (y * w + x) * 3;
|
|
||||||
|
|
||||||
return M_IMGDATA->m_data[pos+1];
|
return M_IMGDATA->m_data[pos+1];
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char wxImage::GetBlue( int x, int y ) const
|
unsigned char wxImage::GetBlue( int x, int y ) const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), 0, wxT("invalid image") );
|
long pos = XYToIndex(x, y);
|
||||||
|
wxCHECK_MSG( pos != -1, 0, wxT("invalid image coordinates") );
|
||||||
|
|
||||||
int w = M_IMGDATA->m_width;
|
pos *= 3;
|
||||||
int h = M_IMGDATA->m_height;
|
|
||||||
|
|
||||||
wxCHECK_MSG( (x>=0) && (y>=0) && (x<w) && (y<h), 0, wxT("invalid image index") );
|
|
||||||
|
|
||||||
long pos = (y * w + x) * 3;
|
|
||||||
|
|
||||||
return M_IMGDATA->m_data[pos+2];
|
return M_IMGDATA->m_data[pos+2];
|
||||||
}
|
}
|
||||||
@ -947,51 +943,45 @@ void wxImage::SetData( unsigned char *data, int new_width, int new_height, bool
|
|||||||
|
|
||||||
void wxImage::SetAlpha(int x, int y, unsigned char alpha)
|
void wxImage::SetAlpha(int x, int y, unsigned char alpha)
|
||||||
{
|
{
|
||||||
wxCHECK_RET( Ok() && HasAlpha(), wxT("invalid image or no alpha channel") );
|
wxCHECK_RET( HasAlpha(), wxT("no alpha channel") );
|
||||||
|
|
||||||
int w = M_IMGDATA->m_width,
|
long pos = XYToIndex(x, y);
|
||||||
h = M_IMGDATA->m_height;
|
wxCHECK_RET( pos != -1, wxT("invalid image coordinates") );
|
||||||
|
|
||||||
wxCHECK_RET( x >=0 && y >= 0 && x < w && y < h, wxT("invalid image index") );
|
M_IMGDATA->m_alpha[pos] = alpha;
|
||||||
|
|
||||||
M_IMGDATA->m_alpha[y*w + x] = alpha;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char wxImage::GetAlpha(int x, int y) const
|
unsigned char wxImage::GetAlpha(int x, int y) const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok() && HasAlpha(), 0, wxT("invalid image or no alpha channel") );
|
wxCHECK_MSG( HasAlpha(), 0, wxT("no alpha channel") );
|
||||||
|
|
||||||
int w = M_IMGDATA->m_width,
|
long pos = XYToIndex(x, y);
|
||||||
h = M_IMGDATA->m_height;
|
wxCHECK_MSG( pos != -1, 0, wxT("invalid image coordinates") );
|
||||||
|
|
||||||
wxCHECK_MSG( x >=0 && y >= 0 && x < w && y < h, 0, wxT("invalid image index") );
|
return M_IMGDATA->m_alpha[pos];
|
||||||
|
|
||||||
return M_IMGDATA->m_alpha[y*w + x];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxImage::ConvertColourToAlpha( unsigned char r, unsigned char g, unsigned char b )
|
bool
|
||||||
|
wxImage::ConvertColourToAlpha(unsigned char r, unsigned char g, unsigned char b)
|
||||||
{
|
{
|
||||||
SetAlpha( NULL );
|
SetAlpha(NULL);
|
||||||
|
|
||||||
int w = M_IMGDATA->m_width,
|
const int w = M_IMGDATA->m_width;
|
||||||
h = M_IMGDATA->m_height;
|
const int h = M_IMGDATA->m_height;
|
||||||
|
|
||||||
unsigned char *alpha = GetAlpha();
|
unsigned char *alpha = GetAlpha();
|
||||||
unsigned char *data = GetData();
|
unsigned char *data = GetData();
|
||||||
|
|
||||||
int x,y;
|
for ( int y = 0; y < h; y++ )
|
||||||
for (y = 0; y < h; y++)
|
{
|
||||||
for (x = 0; x < w; x++)
|
for ( int x = 0; x < w; x++ )
|
||||||
{
|
{
|
||||||
*alpha = *data;
|
*alpha++ = *data;
|
||||||
alpha++;
|
*data++ = r;
|
||||||
*data = r;
|
*data++ = g;
|
||||||
data++;
|
*data++ = b;
|
||||||
*data = g;
|
}
|
||||||
data++;
|
}
|
||||||
*data = b;
|
|
||||||
data++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1008,7 +998,6 @@ void wxImage::SetAlpha( unsigned char *alpha, bool static_data )
|
|||||||
free(M_IMGDATA->m_alpha);
|
free(M_IMGDATA->m_alpha);
|
||||||
M_IMGDATA->m_alpha = alpha;
|
M_IMGDATA->m_alpha = alpha;
|
||||||
M_IMGDATA->m_static = static_data;
|
M_IMGDATA->m_static = static_data;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char *wxImage::GetAlpha() const
|
unsigned char *wxImage::GetAlpha() const
|
||||||
|
Loading…
Reference in New Issue
Block a user