Index: app/core/gimpbrush.c
===================================================================
--- app/core/gimpbrush.c	(revision 28030)
+++ app/core/gimpbrush.c	(working copy)
@@ -276,13 +276,13 @@ gimp_brush_get_new_preview (GimpViewable
 
       if (scale != 1.0)
         {
-          mask_buf = gimp_brush_transform_mask (brush, scale, 0.0);
+          mask_buf = gimp_brush_transform_mask (brush, scale, scale, 0.0);
 
           if (! mask_buf)
             mask_buf = temp_buf_new (1, 1, 1, 0, 0, transp);
 
           if (pixmap_buf)
-            pixmap_buf = gimp_brush_transform_pixmap (brush, scale, 0.0);
+            pixmap_buf = gimp_brush_transform_pixmap (brush, scale, scale, 0.0);
 
           mask_width  = mask_buf->width;
           mask_height = mask_buf->height;
@@ -457,17 +457,19 @@ gimp_brush_want_null_motion (GimpBrush  
 
 void
 gimp_brush_transform_size (GimpBrush     *brush,
-                           gdouble        scale,
+                           gdouble        scale_x,
+                           gdouble        scale_y,
                            gdouble        angle,
                            gint          *width,
                            gint          *height)
 {
   g_return_if_fail (GIMP_IS_BRUSH (brush));
-  g_return_if_fail (scale > 0.0);
+  g_return_if_fail (scale_x > 0.0);
+  g_return_if_fail (scale_y > 0.0);
   g_return_if_fail (width != NULL);
   g_return_if_fail (height != NULL);
 
-  if ((scale == 1.0) && ((angle == 0.0) || (angle == 0.5) || (angle == 1.0)))
+  if ((scale_x == 1.0) && (scale_y == 1.0) && ((angle == 0.0) || (angle == 0.5) || (angle == 1.0)))
     {
       *width  = brush->mask->width;
       *height = brush->mask->height;
@@ -475,36 +477,41 @@ gimp_brush_transform_size (GimpBrush    
       return;
     }
 
-  GIMP_BRUSH_GET_CLASS (brush)->transform_size (brush, scale, angle, width, height);
+  GIMP_BRUSH_GET_CLASS (brush)->transform_size (brush, scale_x, scale_y, angle, width, height);
 }
 
 TempBuf *
 gimp_brush_transform_mask (GimpBrush *brush,
-                           gdouble    scale,
+                           gdouble    scale_x,
+                           gdouble    scale_y,
                            gdouble    angle)
 {
   g_return_val_if_fail (GIMP_IS_BRUSH (brush), NULL);
-  g_return_val_if_fail (scale > 0.0, NULL);
+  g_return_val_if_fail (scale_x > 0.0, NULL);
+  g_return_val_if_fail (scale_y > 0.0, NULL);
 
-  if ((scale == 1.0) && (angle == 0.0))
+  if ((scale_x == 1.0) && (scale_y == 1.0) && (angle == 0.0))
     return temp_buf_copy (brush->mask, NULL);
 
-  return GIMP_BRUSH_GET_CLASS (brush)->transform_mask (brush, scale, angle);
+  return GIMP_BRUSH_GET_CLASS (brush)->transform_mask (brush, scale_x, scale_y, angle);
 }
 
 TempBuf *
 gimp_brush_transform_pixmap (GimpBrush *brush,
-                             gdouble    scale,
+                             gdouble    scale_x,
+                             gdouble    scale_y,
                              gdouble    angle)
 {
   g_return_val_if_fail (GIMP_IS_BRUSH (brush), NULL);
   g_return_val_if_fail (brush->pixmap != NULL, NULL);
-  g_return_val_if_fail (scale > 0.0, NULL);
+  g_return_val_if_fail (scale_x > 0.0, NULL);
+  g_return_val_if_fail (scale_y > 0.0, NULL);
 
-  if ((scale == 1.0) && (angle == 0.0))
+
+  if ((scale_x == 1.0) && (scale_y == 1.0) && (angle == 0.0))
     return temp_buf_copy (brush->pixmap, NULL);
 
-  return GIMP_BRUSH_GET_CLASS (brush)->transform_pixmap (brush, scale, angle);
+  return GIMP_BRUSH_GET_CLASS (brush)->transform_pixmap (brush, scale_x, scale_y, angle);
 }
 
 TempBuf *
Index: app/core/gimpbrush.h
===================================================================
--- app/core/gimpbrush.h	(revision 28030)
+++ app/core/gimpbrush.h	(working copy)
@@ -57,15 +57,18 @@ struct _GimpBrushClass
                                     GimpCoords *last_coords,
                                     GimpCoords *cur_coords);
   void        (* transform_size)   (GimpBrush  *brush,
-                                    gdouble     scale,
+                                    gdouble     scale_x,
+                                    gdouble     scale_y,
                                     gdouble     angle,
                                     gint       *width,
                                     gint       *height);
   TempBuf   * (* transform_mask)   (GimpBrush  *brush,
-                                    gdouble     scale,
+                                    gdouble     scale_x,
+                                    gdouble     scale_y,
                                     gdouble     angle);
   TempBuf   * (* transform_pixmap) (GimpBrush  *brush,
-                                    gdouble     scale,
+                                    gdouble     scale_x,
+                                    gdouble     scale_y,
                                     gdouble     angle);
 
   /*  signals  */
@@ -87,15 +90,18 @@ gboolean    gimp_brush_want_null_motion 
 
 /* Gets width and height of a transformed mask of the brush, for provided parameters. */
 void        gimp_brush_transform_size   (GimpBrush        *brush,
-                                         gdouble           scale,
+                                         gdouble           scale_x,
+                                         gdouble           scale_y,
                                          gdouble           angle,
                                          gint             *width,
                                          gint             *height);
 TempBuf   * gimp_brush_transform_mask   (GimpBrush        *brush,
-                                         gdouble           scale,
+                                         gdouble           scale_x,
+                                         gdouble           scale_y,
                                          gdouble           angle);
 TempBuf   * gimp_brush_transform_pixmap (GimpBrush        *brush,
-                                         gdouble           scale,
+                                         gdouble           scale_x,
+                                         gdouble           scale_y,
                                          gdouble           angle);
 
 TempBuf   * gimp_brush_get_mask         (const GimpBrush  *brush);
Index: app/core/gimpbrushgenerated.c
===================================================================
--- app/core/gimpbrushgenerated.c	(revision 28030)
+++ app/core/gimpbrushgenerated.c	(working copy)
@@ -64,12 +64,14 @@ static const gchar * gimp_brush_generate
 static GimpData    * gimp_brush_generated_duplicate     (GimpData     *data);
 
 static void          gimp_brush_generated_transform_size(GimpBrush    *gbrush,
-                                                         gdouble       scale,
+                                                         gdouble       scale_x,
+                                                         gdouble       scale_y,
                                                          gdouble       angle,
                                                          gint         *width,
                                                          gint         *height);
 static TempBuf     * gimp_brush_generated_transform_mask(GimpBrush    *gbrush,
-                                                         gdouble       scale,
+                                                         gdouble       scale_x,
+                                                         gdouble       scale_y,
                                                          gdouble       angle);
 
 static TempBuf     * gimp_brush_generated_calc          (GimpBrushGenerated      *brush,
@@ -280,7 +282,8 @@ gimp_brush_generated_duplicate (GimpData
 
 static void
 gimp_brush_generated_transform_size (GimpBrush *gbrush,
-                                     gdouble    scale,
+                                     gdouble    scale_x,
+                                     gdouble    scale_y,
                                      gdouble    angle,
                                      gint      *width,
                                      gint      *height)
@@ -291,10 +294,10 @@ gimp_brush_generated_transform_size (Gim
 
   gimp_brush_generated_get_half_size (brush,
                                       brush->shape,
-                                      brush->radius * scale,
+                                      brush->radius * (scale_x + scale_y) / 2,
                                       brush->spikes,
                                       brush->hardness,
-                                      brush->aspect_ratio,
+                                      brush->aspect_ratio * scale_x / scale_y,
                                       (brush->angle + 360 * angle),
                                       &half_width, &half_height,
                                       NULL, NULL, NULL, NULL);
@@ -305,17 +308,18 @@ gimp_brush_generated_transform_size (Gim
 
 static TempBuf *
 gimp_brush_generated_transform_mask (GimpBrush *gbrush,
-                                     gdouble    scale,
+                                     gdouble    scale_x,
+                                     gdouble    scale_y,
                                      gdouble    angle)
 {
   GimpBrushGenerated *brush  = GIMP_BRUSH_GENERATED (gbrush);
 
   return gimp_brush_generated_calc (brush,
                                     brush->shape,
-                                    brush->radius * scale,
+                                    brush->radius * (scale_x + scale_y) / 2,
                                     brush->spikes,
                                     brush->hardness,
-                                    brush->aspect_ratio,
+                                    brush->aspect_ratio * scale_x / scale_y,
                                     (brush->angle + 360 * angle),
                                     NULL, NULL);
 }
Index: app/core/gimpbrush-transform.c
===================================================================
--- app/core/gimpbrush-transform.c	(revision 28030)
+++ app/core/gimpbrush-transform.c	(working copy)
@@ -34,7 +34,8 @@
 /*  local function prototypes  */
 
 static void  gimp_brush_transform_matrix       (GimpBrush         *brush,
-                                                gdouble            scale,
+                                                gdouble            scale_x,
+                                                gdouble            scale_y,
                                                 gdouble            angle,
                                                 GimpMatrix3       *matrix);
 static void  gimp_brush_transform_bounding_box (GimpBrush         *brush,
@@ -49,7 +50,8 @@ static void  gimp_brush_transform_boundi
 
 void
 gimp_brush_real_transform_size (GimpBrush *brush,
-                                gdouble    scale,
+                                gdouble    scale_x,
+                                gdouble    scale_y,
                                 gdouble    angle,
                                 gint      *width,
                                 gint      *height)
@@ -57,13 +59,14 @@ gimp_brush_real_transform_size (GimpBrus
   GimpMatrix3 matrix;
   gint        x, y;
 
-  gimp_brush_transform_matrix (brush, scale, angle, &matrix);
+  gimp_brush_transform_matrix (brush, scale_x, scale_y, angle, &matrix);
   gimp_brush_transform_bounding_box (brush, &matrix, &x, &y, width, height);
 }
 
 TempBuf *
 gimp_brush_real_transform_mask (GimpBrush *brush,
-                                gdouble    scale,
+                                gdouble    scale_x,
+                                gdouble    scale_y,
                                 gdouble    angle)
 {
   TempBuf      *result;
@@ -76,7 +79,7 @@ gimp_brush_real_transform_mask (GimpBrus
   gint          dest_height;
   gint          x, y;
 
-  gimp_brush_transform_matrix (brush, scale, angle, &matrix);
+  gimp_brush_transform_matrix (brush, scale_x, scale_y, angle, &matrix);
 
   if (gimp_matrix3_is_identity (&matrix))
     return temp_buf_copy (brush->mask, NULL);
@@ -125,7 +128,8 @@ gimp_brush_real_transform_mask (GimpBrus
 
 TempBuf *
 gimp_brush_real_transform_pixmap (GimpBrush *brush,
-                                  gdouble    scale,
+                                  gdouble    scale_x,
+                                  gdouble    scale_y,
                                   gdouble    angle)
 {
   TempBuf      *result;
@@ -138,7 +142,7 @@ gimp_brush_real_transform_pixmap (GimpBr
   gint          dest_height;
   gint          x, y;
 
-  gimp_brush_transform_matrix (brush, scale, angle, &matrix);
+  gimp_brush_transform_matrix (brush, scale_x, scale_y, angle, &matrix);
 
   if (gimp_matrix3_is_identity (&matrix))
     return temp_buf_copy (brush->pixmap, NULL);
@@ -196,7 +200,8 @@ gimp_brush_real_transform_pixmap (GimpBr
 
 static void
 gimp_brush_transform_matrix (GimpBrush   *brush,
-                             gdouble      scale,
+                             gdouble      scale_x,
+                             gdouble      scale_y,
                              gdouble      angle,
                              GimpMatrix3 *matrix)
 {
@@ -207,7 +212,7 @@ gimp_brush_transform_matrix (GimpBrush  
   gimp_matrix3_translate (matrix, - center_x, - center_x);
   gimp_matrix3_rotate (matrix, -2 * G_PI * angle);
   gimp_matrix3_translate (matrix, center_x, center_y);
-  gimp_matrix3_scale (matrix, scale, scale);
+  gimp_matrix3_scale (matrix, scale_x, scale_y);
 }
 
 static void
Index: app/core/gimpbrush-transform.h
===================================================================
--- app/core/gimpbrush-transform.h	(revision 28030)
+++ app/core/gimpbrush-transform.h	(working copy)
@@ -24,15 +24,18 @@
 /*  virtual functions of GimpBrush, don't call directly  */
 
 void      gimp_brush_real_transform_size   (GimpBrush *brush,
-                                            gdouble    scale,
+                                            gdouble    scale_x,
+                                            gdouble    scale_y,
                                             gdouble    angle,
                                             gint      *scaled_width,
                                             gint      *scaled_height);
 TempBuf * gimp_brush_real_transform_mask   (GimpBrush *brush,
-                                            gdouble    scale,
+                                            gdouble    scale_x,
+                                            gdouble    scale_y,
                                             gdouble    angle);
 TempBuf * gimp_brush_real_transform_pixmap (GimpBrush *brush,
-                                            gdouble    scale,
+                                            gdouble    scale_x,
+                                            gdouble    scale_y,
                                             gdouble    angle);
 
 
Index: app/paint/gimpsmudge.c
===================================================================
--- app/paint/gimpsmudge.c	(revision 28030)
+++ app/paint/gimpsmudge.c	(working copy)
@@ -328,8 +328,10 @@ gimp_smudge_brush_coords (GimpPaintCore 
   gint           width;
   gint           height;
 
-  gimp_brush_transform_size (brush_core->brush, brush_core->scale,
-                             brush_core->angle, &width, &height);
+  gimp_brush_transform_size (brush_core->brush,
+                             brush_core->scale, brush_core->scale,
+                             brush_core->angle,
+                             &width, &height);
 
   /* Note: these are the brush mask size plus a border of 1 pixel */
   *x = (gint) paint_core->cur_coords.x - width  / 2 - 1;
Index: app/paint/gimpbrushcore.c
===================================================================
--- app/paint/gimpbrushcore.c	(revision 28030)
+++ app/paint/gimpbrushcore.c	(working copy)
@@ -716,7 +716,7 @@ gimp_brush_core_get_paint_area (GimpPain
 
   core->scale = gimp_brush_core_clamp_brush_scale (core, core->scale);
 
-  gimp_brush_transform_size (core->brush, core->scale, core->angle, &brush_width, &brush_height);
+  gimp_brush_transform_size (core->brush, core->scale, core->scale, core->angle, &brush_width, &brush_height);
 
   /*  adjust the x and y coordinates to the upper left corner of the brush  */
   x = (gint) floor (paint_core->cur_coords.x) - (brush_width  / 2);
@@ -809,7 +809,7 @@ gimp_brush_core_create_bound_segs (GimpB
     {
       scale = gimp_brush_core_clamp_brush_scale (core, scale);
 
-      mask = gimp_brush_transform_mask (core->main_brush, scale, angle);
+      mask = gimp_brush_transform_mask (core->main_brush, scale, scale, angle);
     }
 
   if (mask)
@@ -1314,7 +1314,7 @@ gimp_brush_core_transform_mask (GimpBrus
   if ((core->scale == 1.0) && (core->angle == 0.0))
     return brush->mask;
 
-  gimp_brush_transform_size (brush, core->scale, core->angle, &width, &height);
+  gimp_brush_transform_size (brush, core->scale, core->scale, core->angle, &width, &height);
 
     if (! core->cache_invalid                      &&
       core->transform_brush                      &&
@@ -1337,7 +1337,7 @@ gimp_brush_core_transform_mask (GimpBrus
   if (core->transform_brush)
     temp_buf_free (core->transform_brush);
 
-  core->transform_brush = gimp_brush_transform_mask (brush, core->scale, core->angle);
+  core->transform_brush = gimp_brush_transform_mask (brush, core->scale, core->scale, core->angle);
 
   core->cache_invalid       = TRUE;
   core->solid_cache_invalid = TRUE;
@@ -1358,7 +1358,7 @@ gimp_brush_core_transform_pixmap (GimpBr
   if ((core->scale == 1.0) && (core->angle == 0.0))
     return brush->pixmap;
 
-  gimp_brush_transform_size (brush, core->scale, core->angle, &width, &height);
+  gimp_brush_transform_size (brush, core->scale, core->scale, core->angle, &width, &height);
 
 
   if (! core->cache_invalid                              &&
@@ -1380,7 +1380,7 @@ gimp_brush_core_transform_pixmap (GimpBr
     temp_buf_free (core->transform_pixmap);
 
 
-  core->transform_pixmap = gimp_brush_transform_pixmap (brush, core->scale, core->angle);
+  core->transform_pixmap = gimp_brush_transform_pixmap (brush, core->scale, core->scale, core->angle);
 
   core->cache_invalid = TRUE;
 
