gimp r25036 - in trunk: . app/display app/tools



Author: mitch
Date: Wed Mar  5 16:37:43 2008
New Revision: 25036
URL: http://svn.gnome.org/viewvc/gimp?rev=25036&view=rev

Log:
2008-03-05  Michael Natterer  <mitch gimp org>

	* app/display/gimpdisplayshell.h: changed PROJ_ROUND() macros to
	use RINT() so they work correctly with negative numbers.

	* app/tools/gimpdrawtool.c
	(gimp_draw_tool_draw_line)
	(gimp_draw_tool_draw_dashed_line)
	(gimp_draw_tool_draw_rectangle)
	(gimp_draw_tool_draw_arc)
	(gimp_draw_tool_draw_boundary): use floating-point coordinate
	transform functions again. These functions were changed to use
	integer transform functions in 2004 (!!) which broke sub-pixel
	precision drawing for stuff like straight-line and blend tool
	and also sub-pixel drawing of the brush outline.

	Should be backported to 2.4 after it has shown no ill effects in
	trunk.



Modified:
   trunk/ChangeLog
   trunk/app/display/gimpdisplayshell.h
   trunk/app/tools/gimpdrawtool.c

Modified: trunk/app/display/gimpdisplayshell.h
==============================================================================
--- trunk/app/display/gimpdisplayshell.h	(original)
+++ trunk/app/display/gimpdisplayshell.h	Wed Mar  5 16:37:43 2008
@@ -26,8 +26,8 @@
 
 
 /* Apply to a float the same rounding mode used in the renderer */
-#define  PROJ_ROUND(coord)   ((gint) ((coord) + 0.5))
-#define  PROJ_ROUND64(coord) ((gint64) ((coord) + 0.5))
+#define  PROJ_ROUND(coord)   ((gint) RINT (coord))
+#define  PROJ_ROUND64(coord) ((gint64) RINT (coord))
 
 /* finding the effective screen resolution (double) */
 #define  SCREEN_XRES(s)   ((s)->dot_for_dot ? \

Modified: trunk/app/tools/gimpdrawtool.c
==============================================================================
--- trunk/app/tools/gimpdrawtool.c	(original)
+++ trunk/app/tools/gimpdrawtool.c	Wed Mar  5 16:37:43 2008
@@ -473,25 +473,25 @@
                           gboolean      use_offsets)
 {
   GimpDisplayShell *shell;
-  gint              tx1, ty1;
-  gint              tx2, ty2;
+  gdouble           tx1, ty1;
+  gdouble           tx2, ty2;
 
   g_return_if_fail (GIMP_IS_DRAW_TOOL (draw_tool));
 
   shell = GIMP_DISPLAY_SHELL (draw_tool->display->shell);
 
-  gimp_display_shell_transform_xy (shell,
-                                   x1, y1,
-                                   &tx1, &ty1,
-                                   use_offsets);
-  gimp_display_shell_transform_xy (shell,
-                                   x2, y2,
-                                   &tx2, &ty2,
-                                   use_offsets);
+  gimp_display_shell_transform_xy_f (shell,
+                                     x1, y1,
+                                     &tx1, &ty1,
+                                     use_offsets);
+  gimp_display_shell_transform_xy_f (shell,
+                                     x2, y2,
+                                     &tx2, &ty2,
+                                     use_offsets);
 
   gimp_canvas_draw_line (GIMP_CANVAS (shell->canvas), GIMP_CANVAS_STYLE_XOR,
-                         tx1, ty1,
-                         tx2, ty2);
+                         PROJ_ROUND (tx1), PROJ_ROUND (ty1),
+                         PROJ_ROUND (tx2), PROJ_ROUND (ty2));
 }
 
 /**
@@ -516,26 +516,26 @@
                                  gboolean      use_offsets)
 {
   GimpDisplayShell *shell;
-  gint              tx1, ty1;
-  gint              tx2, ty2;
+  gdouble           tx1, ty1;
+  gdouble           tx2, ty2;
 
   g_return_if_fail (GIMP_IS_DRAW_TOOL (draw_tool));
 
   shell = GIMP_DISPLAY_SHELL (draw_tool->display->shell);
 
-  gimp_display_shell_transform_xy (shell,
-                                   x1, y1,
-                                   &tx1, &ty1,
-                                   use_offsets);
-  gimp_display_shell_transform_xy (shell,
-                                   x2, y2,
-                                   &tx2, &ty2,
-                                   use_offsets);
+  gimp_display_shell_transform_xy_f (shell,
+                                     x1, y1,
+                                     &tx1, &ty1,
+                                     use_offsets);
+  gimp_display_shell_transform_xy_f (shell,
+                                     x2, y2,
+                                     &tx2, &ty2,
+                                     use_offsets);
 
   gimp_canvas_draw_line (GIMP_CANVAS (shell->canvas),
                          GIMP_CANVAS_STYLE_XOR_DASHED,
-                         tx1, ty1,
-                         tx2, ty2);
+                         PROJ_ROUND (tx1), PROJ_ROUND (ty1),
+                         PROJ_ROUND (tx2), PROJ_ROUND (ty2));
 }
 
 /**
@@ -561,22 +561,22 @@
                                gboolean      use_offsets)
 {
   GimpDisplayShell *shell;
-  gint              tx1, ty1;
-  gint              tx2, ty2;
+  gdouble           tx1, ty1;
+  gdouble           tx2, ty2;
   guint             w, h;
 
   g_return_if_fail (GIMP_IS_DRAW_TOOL (draw_tool));
 
   shell = GIMP_DISPLAY_SHELL (draw_tool->display->shell);
 
-  gimp_display_shell_transform_xy (shell,
-                                   MIN (x, x + width), MIN (y, y + height),
-                                   &tx1, &ty1,
-                                   use_offsets);
-  gimp_display_shell_transform_xy (shell,
-                                   MAX (x, x + width), MAX (y, y + height),
-                                   &tx2, &ty2,
-                                   use_offsets);
+  gimp_display_shell_transform_xy_f (shell,
+                                     MIN (x, x + width), MIN (y, y + height),
+                                     &tx1, &ty1,
+                                     use_offsets);
+  gimp_display_shell_transform_xy_f (shell,
+                                     MAX (x, x + width), MAX (y, y + height),
+                                     &tx2, &ty2,
+                                     use_offsets);
 
   tx1 = CLAMP (tx1, -1, shell->disp_width  + 1);
   ty1 = CLAMP (ty1, -1, shell->disp_height + 1);
@@ -585,14 +585,14 @@
 
   tx2 -= tx1;
   ty2 -= ty1;
-  w = MAX (0, tx2);
-  h = MAX (0, ty2);
+  w = PROJ_ROUND (MAX (0.0, tx2));
+  h = PROJ_ROUND (MAX (0.0, ty2));
 
   if (w > 0 && h > 0)
     gimp_canvas_draw_rectangle (GIMP_CANVAS (shell->canvas),
                                 GIMP_CANVAS_STYLE_XOR,
                                 filled,
-                                tx1, ty1,
+                                PROJ_ROUND (tx1), PROJ_ROUND (ty1),
                                 w - 1, h - 1);
 }
 
@@ -608,27 +608,27 @@
                          gboolean      use_offsets)
 {
   GimpDisplayShell *shell;
-  gint              tx1, ty1;
-  gint              tx2, ty2;
+  gdouble           tx1, ty1;
+  gdouble           tx2, ty2;
   guint             w, h;
 
   g_return_if_fail (GIMP_IS_DRAW_TOOL (draw_tool));
 
   shell = GIMP_DISPLAY_SHELL (draw_tool->display->shell);
 
-  gimp_display_shell_transform_xy (shell,
-                                   MIN (x, x + width), MIN (y, y + height),
-                                   &tx1, &ty1,
-                                   use_offsets);
-  gimp_display_shell_transform_xy (shell,
-                                   MAX (x, x + width), MAX (y, y + height),
-                                   &tx2, &ty2,
-                                   use_offsets);
+  gimp_display_shell_transform_xy_f (shell,
+                                     MIN (x, x + width), MIN (y, y + height),
+                                     &tx1, &ty1,
+                                     use_offsets);
+  gimp_display_shell_transform_xy_f (shell,
+                                     MAX (x, x + width), MAX (y, y + height),
+                                     &tx2, &ty2,
+                                     use_offsets);
 
   tx2 -= tx1;
   ty2 -= ty1;
-  w = MAX (0, tx2);
-  h = MAX (0, ty2);
+  w = PROJ_ROUND (MAX (0.0, tx2));
+  h = PROJ_ROUND (MAX (0.0, ty2));
 
   if (w > 0 && h > 0)
     {
@@ -637,18 +637,19 @@
           gimp_canvas_draw_arc (GIMP_CANVAS (shell->canvas),
                                 GIMP_CANVAS_STYLE_XOR,
                                 filled,
-                                tx1, ty1,
+                                PROJ_ROUND (tx1), PROJ_ROUND (ty1),
                                 w - 1, h - 1,
                                 angle1, angle2);
         }
       else
         {
           /* work around the problem of an 1xN or Nx1 arc not being shown
-             properly */
+           * properly
+           */
           gimp_canvas_draw_rectangle (GIMP_CANVAS (shell->canvas),
                                       GIMP_CANVAS_STYLE_XOR,
                                       filled,
-                                      tx1, ty1,
+                                      PROJ_ROUND (tx1), PROJ_ROUND (ty1),
                                       w - 1, h - 1);
         }
     }
@@ -1693,7 +1694,7 @@
   GdkPoint         *gdk_points;
   gint              n_gdk_points;
   gint              xmax, ymax;
-  gint              x, y;
+  gdouble           x, y;
   gint              i;
 
   g_return_if_fail (GIMP_IS_DRAW_TOOL (draw_tool));
@@ -1728,14 +1729,14 @@
 
       if (n_gdk_points == 0)
         {
-          gimp_display_shell_transform_xy (shell,
-                                           bound_segs[i].x1 + offset_x,
-                                           bound_segs[i].y1 + offset_y,
-                                           &x, &y,
-                                           use_offsets);
+          gimp_display_shell_transform_xy_f (shell,
+                                             bound_segs[i].x1 + offset_x,
+                                             bound_segs[i].y1 + offset_y,
+                                             &x, &y,
+                                             use_offsets);
 
-          gdk_points[0].x = CLAMP (x, -1, xmax);
-          gdk_points[0].y = CLAMP (y, -1, ymax);
+          gdk_points[0].x = PROJ_ROUND (CLAMP (x, -1, xmax));
+          gdk_points[0].y = PROJ_ROUND (CLAMP (y, -1, ymax));
 
           /*  If this segment is a closing segment && the segments lie inside
            *  the region, OR if this is an opening segment and the segments
@@ -1760,14 +1761,14 @@
 
       g_assert (n_gdk_points < n_bound_segs + 1);
 
-      gimp_display_shell_transform_xy (shell,
-                                       bound_segs[i].x2 + offset_x,
-                                       bound_segs[i].y2 + offset_y,
-                                       &x, &y,
-                                       use_offsets);
+      gimp_display_shell_transform_xy_f (shell,
+                                         bound_segs[i].x2 + offset_x,
+                                         bound_segs[i].y2 + offset_y,
+                                         &x, &y,
+                                         use_offsets);
 
-      gdk_points[n_gdk_points].x = CLAMP (x, -1, xmax);
-      gdk_points[n_gdk_points].y = CLAMP (y, -1, ymax);
+      gdk_points[n_gdk_points].x = PROJ_ROUND (CLAMP (x, -1, xmax));
+      gdk_points[n_gdk_points].y = PROJ_ROUND (CLAMP (y, -1, ymax));
 
       /*  If this segment is a closing segment && the segments lie inside
        *  the region, OR if this is an opening segment and the segments



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