[gimp/gimp-2-10] Issue 3100: cage transform tool -> always blurred without any action



commit 1fc5ff4ed030dea84b957ac3b30dda2e4db8f25e
Author: Massimo Valentini <mvalentini src gnome org>
Date:   Fri Dec 19 15:08:52 2014 +0100

    Issue 3100: cage transform tool -> always blurred without any action
    
    Makes sure the tool doesn't offset everything by 0.5 pixels.
    
    (cherry picked from commit 44cc7d239ea86cfb65ea23cd26a820399451022b)

 app/operations/gimpoperationcagetransform.c | 44 ++++++++++++++++-------------
 1 file changed, 25 insertions(+), 19 deletions(-)
---
diff --git a/app/operations/gimpoperationcagetransform.c b/app/operations/gimpoperationcagetransform.c
index 46bc4cb138..d2f04500ff 100644
--- a/app/operations/gimpoperationcagetransform.c
+++ b/app/operations/gimpoperationcagetransform.c
@@ -271,8 +271,8 @@ gimp_operation_cage_transform_process (GeglOperation       *operation,
             }
           if (!output_set)
             {
-              output[0] = x;
-              output[1] = y;
+              output[0] = x + 0.5;
+              output[1] = y + 0.5;
             }
 
           output += 2;
@@ -385,8 +385,7 @@ gimp_operation_cage_transform_interpolate_source_coords_recurs (GimpOperationCag
                                                                 gint                        recursion_depth,
                                                                 gfloat                     *coords)
 {
-  GeglRectangle rect = { 0, 0, 1, 1 };
-  gint          xmin, xmax, ymin, ymax;
+  gint xmin, xmax, ymin, ymax, x, y;
 
   /* Stop recursion if all 3 vertices of the triangle are outside the
    * ROI (left/right or above/below).
@@ -405,20 +404,24 @@ gimp_operation_cage_transform_interpolate_source_coords_recurs (GimpOperationCag
       p2_d.y < roi->y &&
       p3_d.y < roi->y) return;
 
-  xmin = xmax = p1_d.x;
-  ymin = ymax = p1_d.y;
+  xmin = xmax = lrint (p1_d.x);
+  ymin = ymax = lrint (p1_d.y);
 
-  if (xmin > p2_d.x) xmin = p2_d.x;
-  if (xmin > p3_d.x) xmin = p3_d.x;
+  x = lrint (p2_d.x);
+  xmin = MIN (x, xmin);
+  xmax = MAX (x, xmax);
 
-  if (xmax < p2_d.x) xmax = p2_d.x;
-  if (xmax < p3_d.x) xmax = p3_d.x;
+  x = lrint (p3_d.x);
+  xmin = MIN (x, xmin);
+  xmax = MAX (x, xmax);
 
-  if (ymin > p2_d.y) ymin = p2_d.y;
-  if (ymin > p3_d.y) ymin = p3_d.y;
+  y = lrint (p2_d.y);
+  ymin = MIN (y, ymin);
+  ymax = MAX (y, ymax);
 
-  if (ymax < p2_d.y) ymax = p2_d.y;
-  if (ymax < p3_d.y) ymax = p3_d.y;
+  y = lrint (p3_d.y);
+  ymin = MIN (y, ymin);
+  ymax = MAX (y, ymax);
 
   /* test if there is no more pixel in the triangle */
   if (xmin == xmax || ymin == ymax)
@@ -438,11 +441,8 @@ gimp_operation_cage_transform_interpolate_source_coords_recurs (GimpOperationCag
     {
       gdouble a, b, c, denom, x, y;
 
-      rect.x = xmax;
-      rect.y = ymax;
-
-      x = (gdouble) xmax;
-      y = (gdouble) ymax;
+      x = (gdouble) xmin + 0.5;
+      y = (gdouble) ymin + 0.5;
 
       denom = (p2_d.x - p1_d.x) * p3_d.y + (p1_d.x - p3_d.x) * p2_d.y + (p3_d.x - p2_d.x) * p1_d.y;
       a = ((p2_d.x - x) * p3_d.y + (x - p3_d.x) * p2_d.y + (p3_d.x - p2_d.x) * y) / denom;
@@ -454,6 +454,12 @@ gimp_operation_cage_transform_interpolate_source_coords_recurs (GimpOperationCag
        */
       if ((a > 0 && b > 0 && c > 0) || (a < 0 && b < 0 && c < 0))
         {
+          GeglRectangle rect = { 0, 0, 1, 1 };
+          gfloat        coords[2];
+
+          rect.x = xmin;
+          rect.y = ymin;
+
           coords[0] = (a * p1_s.x + b * p2_s.x + c * p3_s.x);
           coords[1] = (a * p1_s.y + b * p2_s.y + c * p3_s.y);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]