]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/image.cpp
compile warnings, M_BITMAPDATA privatized
[wxWidgets.git] / src / common / image.cpp
index ba3653b18f5443d7c92937450b9384847a856d6a..35acc5ef6da14183c3ff5adf94d0d56348e8dac6 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
@@ -279,6 +279,11 @@ wxImage wxImage::ShrinkBy( int xFactor , int yFactor ) const
     unsigned char maskRed = 0;
     unsigned char maskGreen = 0;
     unsigned char maskBlue =0 ;
+
+    unsigned char *source_data = M_IMGDATA->m_data;
+    unsigned char *target_data = data;
+    unsigned char *source_alpha = 0 ;
+    unsigned char *target_alpha = 0 ;
     if (M_IMGDATA->m_hasMask)
     {
         hasMask = true ;
@@ -290,8 +295,15 @@ wxImage wxImage::ShrinkBy( int xFactor , int yFactor ) const
                              M_IMGDATA->m_maskGreen,
                              M_IMGDATA->m_maskBlue );
     }
-    char unsigned *source_data = M_IMGDATA->m_data;
-    char unsigned *target_data = data;
+    else
+    {
+        source_alpha = M_IMGDATA->m_alpha ;
+        if ( source_alpha )
+        {
+            image.SetAlpha() ;
+            target_alpha = image.GetAlpha() ;
+        }
+    }
 
     for (long y = 0; y < height; y++)
     {
@@ -300,6 +312,7 @@ wxImage wxImage::ShrinkBy( int xFactor , int yFactor ) const
             unsigned long avgRed = 0 ;
             unsigned long avgGreen = 0;
             unsigned long avgBlue = 0;
+            unsigned long avgAlpha = 0 ;
             unsigned long counter = 0 ;
             // determine average
             for ( int y1 = 0 ; y1 < yFactor ; ++y1 )
@@ -311,11 +324,18 @@ wxImage wxImage::ShrinkBy( int xFactor , int yFactor ) const
                     unsigned char red = pixel[0] ;
                     unsigned char green = pixel[1] ;
                     unsigned char blue = pixel[2] ;
+                    unsigned char alpha = 255  ;
+                    if ( source_alpha )
+                        alpha = *(source_alpha + y_offset + x * xFactor + x1) ;
                     if ( !hasMask || red != maskRed || green != maskGreen || blue != maskBlue )
                     {
-                        avgRed += red ;
-                        avgGreen += green ;
-                        avgBlue += blue ;
+                        if ( alpha > 0 )
+                        {
+                            avgRed += red ;
+                            avgGreen += green ;
+                            avgBlue += blue ;
+                        }
+                        avgAlpha += alpha ;
                         counter++ ;
                     }
                 }
@@ -328,6 +348,8 @@ wxImage wxImage::ShrinkBy( int xFactor , int yFactor ) const
             }
             else
             {
+                if ( source_alpha )
+                    *(target_alpha++) = (unsigned char)(avgAlpha / counter ) ;
                 *(target_data++) = (unsigned char)(avgRed / counter);
                 *(target_data++) = (unsigned char)(avgGreen / counter);
                 *(target_data++) = (unsigned char)(avgBlue / counter);
@@ -831,13 +853,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++)
@@ -1719,7 +1741,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
@@ -1728,7 +1750,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)
     {
@@ -1775,7 +1797,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();
@@ -1866,7 +1888,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;
@@ -1879,7 +1901,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;
@@ -1892,7 +1914,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;
@@ -1905,7 +1927,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;
@@ -1936,7 +1958,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);
@@ -1956,7 +1978,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;
                 }
@@ -1981,7 +2003,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);
@@ -1993,7 +2015,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;
                 }
@@ -2002,7 +2024,7 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i
     }
 
     delete [] data;
-    
+
     if (has_alpha)
         delete [] alpha;