X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6408deedee874b3fb873e2fc7f1a148e973bd23d..9a727a3bb8d1ea77ef561b6fa4af05c7b5602595:/src/common/image.cpp?ds=sidebyside diff --git a/src/common/image.cpp b/src/common/image.cpp index a86831b26b..0a12ff7847 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -33,10 +33,10 @@ #include "wx/module.h" #include "wx/hash.h" #include "wx/utils.h" +#include "wx/math.h" // For memcpy #include -#include #ifdef __SALFORDC__ #undef FAR @@ -94,10 +94,11 @@ wxImageRefData::wxImageRefData() wxImageRefData::~wxImageRefData() { - if ( !m_static ) + if (!m_static) + { free( m_data ); - - free(m_alpha); + free( m_alpha ); + } } wxList wxImage::sm_handlers; @@ -120,6 +121,11 @@ wxImage::wxImage( int width, int height, unsigned char* data, bool static_data ) Create( width, height, data, static_data ); } +wxImage::wxImage( int width, int height, unsigned char* data, unsigned char* alpha, bool static_data ) +{ + Create( width, height, data, alpha, static_data ); +} + wxImage::wxImage( const wxString& name, long type, int index ) { LoadFile( name, type, index ); @@ -193,6 +199,24 @@ bool wxImage::Create( int width, int height, unsigned char* data, bool static_da return true; } +bool wxImage::Create( int width, int height, unsigned char* data, unsigned char* alpha, bool static_data ) +{ + UnRef(); + + wxCHECK_MSG( data, false, _T("NULL data in wxImage::Create") ); + + m_refData = new wxImageRefData(); + + M_IMGDATA->m_data = data; + M_IMGDATA->m_alpha = alpha; + M_IMGDATA->m_width = width; + M_IMGDATA->m_height = height; + M_IMGDATA->m_ok = true; + M_IMGDATA->m_static = static_data; + + return true; +} + void wxImage::Destroy() { UnRef(); @@ -807,13 +831,13 @@ unsigned char wxImage::GetAlpha(int x, int y) const bool wxImage::ConvertColourToAlpha( unsigned char r, unsigned char g, unsigned char b ) { SetAlpha( NULL ); - + int w = M_IMGDATA->m_width, h = M_IMGDATA->m_height; - + unsigned char *alpha = GetAlpha(); unsigned char *data = GetData(); - + int x,y; for (y = 0; y < h; y++) for (x = 0; x < w; x++) @@ -1695,7 +1719,7 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i { int i; angle = -angle; // screen coordinates are a mirror image of "real" coordinates - + bool has_alpha = HasAlpha(); // Create pointer-based array to accelerate access to wxImage's data @@ -1704,7 +1728,7 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i for (i = 1; i < GetHeight(); i++) data[i] = data[i - 1] + (3 * GetWidth()); - // Same for alpha channel + // Same for alpha channel unsigned char ** alpha = NULL; if (has_alpha) { @@ -1751,7 +1775,7 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i // array here (and in fact it would be slower). // unsigned char * dst = rotated.GetData(); - + unsigned char * alpha_dst = NULL; if (has_alpha) alpha_dst = rotated.GetAlpha(); @@ -1842,7 +1866,7 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i *(dst++) = *(p++); *(dst++) = *(p++); *(dst++) = *p; - + if (has_alpha) { unsigned char *p = alpha[y1] + x1; @@ -1855,7 +1879,7 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i *(dst++) = *(p++); *(dst++) = *(p++); *(dst++) = *p; - + if (has_alpha) { unsigned char *p = alpha[y1] + x2; @@ -1868,7 +1892,7 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i *(dst++) = *(p++); *(dst++) = *(p++); *(dst++) = *p; - + if (has_alpha) { unsigned char *p = alpha[y2] + x2; @@ -1881,7 +1905,7 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i *(dst++) = *(p++); *(dst++) = *(p++); *(dst++) = *p; - + if (has_alpha) { unsigned char *p = alpha[y2] + x1; @@ -1912,7 +1936,7 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i ( (w1 * *v1 + w2 * *v2 + w3 * *v3 + w4 * *v4) / (w1 + w2 + w3 + w4) ); - + if (has_alpha) { unsigned char *v1 = alpha[y1] + (x1); @@ -1932,7 +1956,7 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i *(dst++) = blank_r; *(dst++) = blank_g; *(dst++) = blank_b; - + if (has_alpha) *(alpha_dst++) = 0; } @@ -1957,7 +1981,7 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i *(dst++) = *(p++); *(dst++) = *(p++); *(dst++) = *p; - + if (has_alpha) { unsigned char *p = alpha[ys] + (xs); @@ -1969,7 +1993,7 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i *(dst++) = blank_r; *(dst++) = blank_g; *(dst++) = blank_b; - + if (has_alpha) *(alpha_dst++) = 255; } @@ -1978,7 +2002,7 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i } delete [] data; - + if (has_alpha) delete [] alpha;