]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/image.cpp
correcting dangling refs / reuse
[wxWidgets.git] / src / common / image.cpp
index a86831b26b0dfa77e7542ffb3d8fb907ac3fef48..0a12ff78478ee9a297d438ec2b97ed67e8204254 100644 (file)
 #include "wx/module.h"
 #include "wx/hash.h"
 #include "wx/utils.h"
+#include "wx/math.h"
 
 // For memcpy
 #include <string.h>
-#include <math.h>
 
 #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;