//-----------------------------------------------------------------------------
-#define M_IMGDATA ((wxImageRefData *)m_refData)
+#define M_IMGDATA wx_static_cast(wxImageRefData*, m_refData)
IMPLEMENT_DYNAMIC_CLASS(wxImage, wxObject)
UnRef();
}
-wxImage wxImage::Copy() const
+wxObjectRefData* wxImage::CreateRefData() const
{
- wxImage image;
-
- wxCHECK_MSG( Ok(), image, wxT("invalid image") );
-
- image.Create( M_IMGDATA->m_width, M_IMGDATA->m_height, false );
-
- unsigned char *data = image.GetData();
-
- wxCHECK_MSG( data, image, wxT("unable to create image") );
-
- image.SetMaskColour( M_IMGDATA->m_maskRed, M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskBlue );
- image.SetMask( M_IMGDATA->m_hasMask );
-
- memcpy( data, GetData(), M_IMGDATA->m_width*M_IMGDATA->m_height*3 );
+ return new wxImageRefData;
+}
- wxImageRefData *imgData = (wxImageRefData *)image.m_refData;
+wxObjectRefData* wxImage::CloneRefData(const wxObjectRefData* that) const
+{
+ const wxImageRefData* refData = wx_static_cast(const wxImageRefData*, that);
+ wxCHECK_MSG(refData->m_ok, NULL, wxT("invalid image") );
- // also copy the alpha channel
- if (HasAlpha())
+ wxImageRefData* refData_new = new wxImageRefData;
+ refData_new->m_width = refData->m_width;
+ refData_new->m_height = refData->m_height;
+ refData_new->m_maskRed = refData->m_maskRed;
+ refData_new->m_maskGreen = refData->m_maskGreen;
+ refData_new->m_maskBlue = refData->m_maskBlue;
+ refData_new->m_hasMask = refData->m_hasMask;
+ refData_new->m_ok = true;
+ unsigned size = unsigned(refData->m_width) * unsigned(refData->m_height);
+ if (refData->m_alpha != NULL)
{
- image.SetAlpha();
- unsigned char* alpha = image.GetAlpha();
- memcpy( alpha, GetAlpha(), M_IMGDATA->m_width*M_IMGDATA->m_height );
+ refData_new->m_alpha = (unsigned char*)malloc(size);
+ memcpy(refData_new->m_alpha, refData->m_alpha, size);
}
+ size *= 3;
+ refData_new->m_data = (unsigned char*)malloc(size);
+ memcpy(refData_new->m_data, refData->m_data, size);
+#if wxUSE_PALETTE
+ refData_new->m_palette = refData->m_palette;
+#endif
+ refData_new->m_optionNames = refData->m_optionNames;
+ refData_new->m_optionValues = refData->m_optionValues;
+ return refData_new;
+}
- // also copy the image options
- imgData->m_optionNames = M_IMGDATA->m_optionNames;
- imgData->m_optionValues = M_IMGDATA->m_optionValues;
+wxImage wxImage::Copy() const
+{
+ wxImage image;
+
+ wxCHECK_MSG( Ok(), image, wxT("invalid image") );
+
+ image.m_refData = CloneRefData(m_refData);
return image;
}
wxImage wxImage::ShrinkBy( int xFactor , int yFactor ) const
{
if( xFactor == 1 && yFactor == 1 )
- return Copy() ;
+ return *this;
wxImage image;
wxCHECK_RET( Ok(), wxT("invalid image") );
wxCHECK_RET( image.Ok(), wxT("invalid image") );
+ AllocExclusive();
+
int xx = 0;
int yy = 0;
int width = image.GetWidth();
{
wxCHECK_RET( Ok(), wxT("invalid image") );
+ AllocExclusive();
+
unsigned char *data = GetData();
const int w = GetWidth();
long pos = XYToIndex(x, y);
wxCHECK_RET( pos != -1, wxT("invalid image coordinates") );
+ AllocExclusive();
+
pos *= 3;
M_IMGDATA->m_data[ pos ] = r;
{
wxCHECK_RET( Ok(), wxT("invalid image") );
+ AllocExclusive();
+
wxRect rect(rect_);
wxRect imageRect(0, 0, GetWidth(), GetHeight());
if ( rect == wxRect() )
long pos = XYToIndex(x, y);
wxCHECK_RET( pos != -1, wxT("invalid image coordinates") );
+ AllocExclusive();
+
M_IMGDATA->m_alpha[pos] = alpha;
}
{
wxCHECK_RET( Ok(), wxT("invalid image") );
+ AllocExclusive();
+
if ( !alpha )
{
alpha = (unsigned char *)malloc(M_IMGDATA->m_width*M_IMGDATA->m_height);
{
wxCHECK_RET( Ok(), wxT("invalid image") );
+ AllocExclusive();
+
M_IMGDATA->m_maskRed = r;
M_IMGDATA->m_maskGreen = g;
M_IMGDATA->m_maskBlue = b;
{
wxCHECK_RET( Ok(), wxT("invalid image") );
+ AllocExclusive();
+
M_IMGDATA->m_hasMask = mask;
}
return false ;
}
+ AllocExclusive();
+
unsigned char *imgdata = GetData();
unsigned char *maskdata = mask.GetData();
return false;
}
+ AllocExclusive();
+
SetMask(true);
SetMaskColour(mr, mg, mb);
{
wxCHECK_RET( Ok(), wxT("invalid image") );
+ AllocExclusive();
+
M_IMGDATA->m_palette = palette;
}
{
wxCHECK_RET( Ok(), wxT("invalid image") );
+ AllocExclusive();
+
int idx = M_IMGDATA->m_optionNames.Index(name, false);
if (idx == wxNOT_FOUND)
{
*/
void wxImage::RotateHue(double angle)
{
+ AllocExclusive();
+
unsigned char *srcBytePtr;
unsigned char *dstBytePtr;
unsigned long count;