]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/image.cpp
reorganize deferred show logic a bit, to reset m_deferShow properly and avoid realizi...
[wxWidgets.git] / src / common / image.cpp
index 30c9f8994c2643d262ae83a89f77e5379a07a2bc..e4ccc1b8f322c80e49348c4d96c5e528f48eda24 100644 (file)
@@ -538,13 +538,8 @@ wxImage wxImage::ResampleBox(int width, int height) const
     const int scale_factor_x_2 = (int)(scale_factor_x / 2);
     const int scale_factor_y_2 = (int)(scale_factor_y / 2);
 
     const int scale_factor_x_2 = (int)(scale_factor_x / 2);
     const int scale_factor_y_2 = (int)(scale_factor_y / 2);
 
-    // If we want good-looking results we need to pre-blur the image a bit first
-    wxImage src_image(*this);
-    src_image = src_image.BlurHorizontal(scale_factor_x_2);
-    src_image = src_image.BlurVertical(scale_factor_y_2);
-
-    unsigned char* src_data = src_image.GetData();
-    unsigned char* src_alpha = src_image.GetAlpha();
+    unsigned char* src_data = M_IMGDATA->m_data;
+    unsigned char* src_alpha = M_IMGDATA->m_alpha;
     unsigned char* dst_data = ret_image.GetData();
     unsigned char* dst_alpha = NULL;
 
     unsigned char* dst_data = ret_image.GetData();
     unsigned char* dst_alpha = NULL;
 
@@ -576,7 +571,7 @@ wxImage wxImage::ResampleBox(int width, int height) const
                   j++ )
             {
                 // We don't care to average pixels that don't exist (edges)
                   j++ )
             {
                 // We don't care to average pixels that don't exist (edges)
-                if ( j < 0 || j > M_IMGDATA->m_height )
+                if ( j < 0 || j > M_IMGDATA->m_height - 1 )
                     continue;
 
                 for ( int i = int(src_x - scale_factor_x/2.0 + 1);
                     continue;
 
                 for ( int i = int(src_x - scale_factor_x/2.0 + 1);
@@ -584,11 +579,11 @@ wxImage wxImage::ResampleBox(int width, int height) const
                       i++ )
                 {
                     // Don't average edge pixels
                       i++ )
                 {
                     // Don't average edge pixels
-                    if ( i < 0 || i > M_IMGDATA->m_width )
+                    if ( i < 0 || i > M_IMGDATA->m_width - 1 )
                         continue;
 
                     // Calculate the actual index in our source pixels
                         continue;
 
                     // Calculate the actual index in our source pixels
-                    src_pixel_index = src_y * M_IMGDATA->m_width + src_x;
+                    src_pixel_index = j * M_IMGDATA->m_width + i;
 
                     sum_r += src_data[src_pixel_index * 3 + 0];
                     sum_g += src_data[src_pixel_index * 3 + 1];
 
                     sum_r += src_data[src_pixel_index * 3 + 0];
                     sum_g += src_data[src_pixel_index * 3 + 1];
@@ -1288,6 +1283,26 @@ void wxImage::Paste( const wxImage &image, int x, int y )
         return;
     }
 
         return;
     }
 
+    // Copy over the alpha channel from the original image
+    if ( image.HasAlpha() )
+    {
+        if ( !HasAlpha() )
+            InitAlpha();
+
+        unsigned char* source_data = image.GetAlpha() + xx + yy*image.GetWidth();
+        int source_step = image.GetWidth();
+
+        unsigned char* target_data = GetAlpha() + (x+xx) + (y+yy)*M_IMGDATA->m_width;
+        int target_step = M_IMGDATA->m_width;
+
+        for (int j = 0; j < height; j++,
+                                    source_data += source_step,
+                                    target_data += target_step)
+        {
+            memcpy( target_data, source_data, width );
+        }
+    }
+
     if (!HasMask() && image.HasMask())
     {
         unsigned char r = image.GetMaskRed();
     if (!HasMask() && image.HasMask())
     {
         unsigned char r = image.GetMaskRed();
@@ -2338,7 +2353,7 @@ wxImageHandler *wxImage::FindHandler( const wxString& name )
 
         node = node->GetNext();
     }
 
         node = node->GetNext();
     }
-    return 0;
+    return NULL;
 }
 
 wxImageHandler *wxImage::FindHandler( const wxString& extension, long bitmapType )
 }
 
 wxImageHandler *wxImage::FindHandler( const wxString& extension, long bitmapType )
@@ -2352,7 +2367,7 @@ wxImageHandler *wxImage::FindHandler( const wxString& extension, long bitmapType
             return handler;
         node = node->GetNext();
     }
             return handler;
         node = node->GetNext();
     }
-    return 0;
+    return NULL;
 }
 
 wxImageHandler *wxImage::FindHandler( long bitmapType )
 }
 
 wxImageHandler *wxImage::FindHandler( long bitmapType )
@@ -2364,7 +2379,7 @@ wxImageHandler *wxImage::FindHandler( long bitmapType )
         if (handler->GetType() == bitmapType) return handler;
         node = node->GetNext();
     }
         if (handler->GetType() == bitmapType) return handler;
         node = node->GetNext();
     }
-    return 0;
+    return NULL;
 }
 
 wxImageHandler *wxImage::FindHandlerMime( const wxString& mimetype )
 }
 
 wxImageHandler *wxImage::FindHandlerMime( const wxString& mimetype )
@@ -2376,7 +2391,7 @@ wxImageHandler *wxImage::FindHandlerMime( const wxString& mimetype )
         if (handler->GetMimeType().IsSameAs(mimetype, false)) return handler;
         node = node->GetNext();
     }
         if (handler->GetMimeType().IsSameAs(mimetype, false)) return handler;
         node = node->GetNext();
     }
-    return 0;
+    return NULL;
 }
 
 void wxImage::InitStandardHandlers()
 }
 
 void wxImage::InitStandardHandlers()