[gimp] app: some cleanup in the Iscissors tool
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: some cleanup in the Iscissors tool
- Date: Fri, 20 Mar 2015 20:19:27 +0000 (UTC)
commit 94a872f051c414f28cbd7f2bfb3ee8b124db37c8
Author: Michael Natterer <mitch gimp org>
Date: Fri Mar 20 21:18:23 2015 +0100
app: some cleanup in the Iscissors tool
Create utility functions to create and free ICurve segments, improves
readability. And some random code cleanup.
app/tools/gimpiscissorstool.c | 142 ++++++++++++++++++++++------------------
1 files changed, 78 insertions(+), 64 deletions(-)
---
diff --git a/app/tools/gimpiscissorstool.c b/app/tools/gimpiscissorstool.c
index e805f3f..03be744 100644
--- a/app/tools/gimpiscissorstool.c
+++ b/app/tools/gimpiscissorstool.c
@@ -192,6 +192,12 @@ static GPtrArray * plot_pixels (GimpIscissorsTool *iscissors,
gint xe,
gint ye);
+static ICurve * icurve_new (gint x1,
+ gint y1,
+ gint x2,
+ gint y2);
+static void icurve_free (ICurve *curve);
+
/* static variables */
@@ -307,7 +313,8 @@ gimp_iscissors_tool_init (GimpIscissorsTool *iscissors)
gimp_tool_control_set_dirty_mask (tool->control,
GIMP_DIRTY_IMAGE_SIZE |
GIMP_DIRTY_ACTIVE_DRAWABLE);
- gimp_tool_control_set_tool_cursor (tool->control, GIMP_TOOL_CURSOR_ISCISSORS);
+ gimp_tool_control_set_tool_cursor (tool->control,
+ GIMP_TOOL_CURSOR_ISCISSORS);
iscissors->op = ISCISSORS_OP_NONE;
iscissors->curves = g_queue_new ();
@@ -386,7 +393,7 @@ gimp_iscissors_tool_button_press (GimpTool *tool,
iscissors->ix = iscissors->x;
iscissors->iy = iscissors->y;
- /* Initialize the selection core only on starting the tool */
+ /* Initialize the draw tool only on starting the tool */
gimp_draw_tool_start (GIMP_DRAW_TOOL (tool), display);
break;
@@ -394,6 +401,8 @@ gimp_iscissors_tool_button_press (GimpTool *tool,
/* Check if the mouse click occurred on a vertex or the curve itself */
if (clicked_on_vertex (iscissors, coords->x, coords->y))
{
+ gimp_draw_tool_pause (GIMP_DRAW_TOOL (iscissors));
+
iscissors->nx = iscissors->x;
iscissors->ny = iscissors->y;
iscissors->state = SEED_ADJUSTMENT;
@@ -455,15 +464,15 @@ iscissors_convert (GimpIscissorsTool *iscissors,
list = g_list_previous (list))
{
ICurve *icurve = list->data;
- gint i;
guint n_points;
+ gint i;
n_points = icurve->points->len;
for (i = 0; i < n_points; i++)
{
- guint32 packed = GPOINTER_TO_INT (g_ptr_array_index (icurve->points,
- i));
+ guint32 packed = GPOINTER_TO_INT (g_ptr_array_index (icurve->points,
+ i));
points[n_total_points+i].x = packed & 0x0000ffff;
points[n_total_points+i].y = packed >> 16;
@@ -484,6 +493,7 @@ iscissors_convert (GimpIscissorsTool *iscissors,
gimp_scan_convert_render (sc,
gimp_drawable_get_buffer (GIMP_DRAWABLE (iscissors->mask)),
0, 0, options->antialias);
+
gimp_scan_convert_free (sc);
}
@@ -514,7 +524,7 @@ gimp_iscissors_tool_button_release (GimpTool *tool,
{
case SEED_PLACEMENT:
/* Add a new icurve */
- if (!iscissors->first_point)
+ if (! iscissors->first_point)
{
/* Determine if we're connecting to the first point */
if (! g_queue_is_empty (iscissors->curves))
@@ -539,13 +549,13 @@ gimp_iscissors_tool_button_release (GimpTool *tool,
if (iscissors->ix != iscissors->x ||
iscissors->iy != iscissors->y)
{
- ICurve *curve = g_slice_new (ICurve);
+ ICurve *curve = icurve_new (iscissors->ix,
+ iscissors->iy,
+ iscissors->x,
+ iscissors->y);
- curve->x1 = iscissors->ix;
- curve->y1 = iscissors->iy;
- iscissors->ix = curve->x2 = iscissors->x;
- iscissors->iy = curve->y2 = iscissors->y;
- curve->points = NULL;
+ iscissors->ix = iscissors->x;
+ iscissors->iy = iscissors->y;
g_queue_push_tail (iscissors->curves, curve);
@@ -676,32 +686,20 @@ gimp_iscissors_tool_draw (GimpDrawTool *draw_tool)
{
/* See if the mouse has moved. If so, create a new segment... */
if (! iscissors->livewire ||
- (iscissors->livewire &&
- (iscissors->ix != iscissors->livewire->x1 ||
- iscissors->x != iscissors->livewire->x2 ||
- iscissors->iy != iscissors->livewire->y1 ||
- iscissors->y != iscissors->livewire->y2)))
+ (iscissors->ix != iscissors->livewire->x1 ||
+ iscissors->iy != iscissors->livewire->y1 ||
+ iscissors->x != iscissors->livewire->x2 ||
+ iscissors->y != iscissors->livewire->y2))
{
- ICurve *curve = g_slice_new (ICurve);
-
- curve->x1 = iscissors->ix;
- curve->y1 = iscissors->iy;
- curve->x2 = iscissors->x;
- curve->y2 = iscissors->y;
- curve->points = NULL;
-
if (iscissors->livewire)
- {
- if (iscissors->livewire->points)
- g_ptr_array_free (iscissors->livewire->points, TRUE);
+ icurve_free (iscissors->livewire);
- g_slice_free (ICurve, iscissors->livewire);
+ iscissors->livewire = icurve_new (iscissors->ix,
+ iscissors->iy,
+ iscissors->x,
+ iscissors->y);
- iscissors->livewire = NULL;
- }
-
- iscissors->livewire = curve;
- calculate_curve (iscissors, curve);
+ calculate_curve (iscissors, iscissors->livewire);
}
/* plot the curve */
@@ -1018,12 +1016,7 @@ gimp_iscissors_tool_halt (GimpIscissorsTool *iscissors,
/* Free and reset the curve list */
while (! g_queue_is_empty (iscissors->curves))
{
- ICurve *curve = g_queue_pop_head (iscissors->curves);
-
- if (curve->points)
- g_ptr_array_free (curve->points, TRUE);
-
- g_slice_free (ICurve, curve);
+ icurve_free (g_queue_pop_head (iscissors->curves));
}
/* free mask */
@@ -1139,16 +1132,10 @@ clicked_on_vertex (GimpIscissorsTool *iscissors,
gdouble x,
gdouble y)
{
- gint curves_found = 0;
-
- curves_found = mouse_over_vertex (iscissors, x, y);
+ gint curves_found = mouse_over_vertex (iscissors, x, y);
if (curves_found > 1)
- {
- gimp_draw_tool_pause (GIMP_DRAW_TOOL (iscissors));
-
- return TRUE;
- }
+ return TRUE;
/* if only one curve was found, the curves are unconnected, and
* the user only wants to move either the first or last point
@@ -1223,16 +1210,14 @@ clicked_on_curve (GimpIscissorsTool *iscissors,
ICurve *curve = list->data;
ICurve *new_curve;
- gimp_draw_tool_pause (GIMP_DRAW_TOOL (iscissors));
-
/* Create the new curve */
- new_curve = g_slice_new (ICurve);
+ new_curve = icurve_new (iscissors->x,
+ iscissors->y,
+ curve->x2,
+ curve->y2);
- new_curve->x2 = curve->x2;
- new_curve->y2 = curve->y2;
- new_curve->x1 = curve->x2 = iscissors->x;
- new_curve->y1 = curve->y2 = iscissors->y;
- new_curve->points = NULL;
+ curve->x2 = iscissors->x;
+ curve->y2 = iscissors->y;
/* Create the new link and supply the new curve as data */
g_queue_insert_after (iscissors->curves, list, new_curve);
@@ -1479,10 +1464,10 @@ plot_pixels (GimpIscissorsTool *iscissors,
}
-#define PACK(x, y) ((((y) & 0xff) << 8) | ((x) & 0xff))
+#define PACK(x, y) ((((y) & 0xff) << 8) | ((x) & 0xff))
#define OFFSET(pixel) ((gint8)((pixel) & 0xff) + \
- ((gint8)(((pixel) & 0xff00) >> 8)) * gimp_temp_buf_get_width (dp_buf))
-
+ ((gint8)(((pixel) & 0xff00) >> 8)) * \
+ gimp_temp_buf_get_width (dp_buf))
static void
find_optimal_path (GeglBuffer *gradient_map,
@@ -1534,7 +1519,8 @@ find_optimal_path (GeglBuffer *gradient_map,
/* pixel[] array encodes how to get to a neighbour, if possible.
* 0 means no connection (eg edge).
* Rest packed as bottom two bytes: y offset then x offset.
- * Initially, we assume we can't get anywhere. */
+ * Initially, we assume we can't get anywhere.
+ */
for (k = 0; k < 8; k++)
pixel[k] = 0;
@@ -1550,7 +1536,7 @@ find_optimal_path (GeglBuffer *gradient_map,
link = (linkdir == 1) ? 3 : 2;
if (j)
- pixel[((diry == 1) ? (link + 4) : link)] = PACK(-dirx, -diry);
+ pixel[((diry == 1) ? (link + 4) : link)] = PACK (-dirx, -diry);
link = (linkdir == 1) ? 2 : 3;
if (j != dp_buf_width - 1)
@@ -1581,7 +1567,8 @@ find_optimal_path (GeglBuffer *gradient_map,
/* If anything can be done... */
if (link >= 0)
{
- /* set the cumulative cost of this pixel and the new direction */
+ /* set the cumulative cost of this pixel and the new direction
+ */
*d = (cum_cost[link] << 8) + link;
/* possibly change the links from the other pixels to this pixel...
@@ -1598,7 +1585,7 @@ find_optimal_path (GeglBuffer *gradient_map,
new_cost = link_cost[k] + cum_cost[link];
if (pixel_cost[k] > new_cost)
{
- /* reverse the link direction /-----------------------\ */
+ /* reverse the link direction /--------------------\ */
offset = OFFSET (pixel[k]);
d[offset] = (new_cost << 8) + ((k > 3) ? k - 4 : k + 4);
}
@@ -1606,7 +1593,9 @@ find_optimal_path (GeglBuffer *gradient_map,
}
/* Set the seed point */
else if (!i && !j)
- *d = SEED_POINT;
+ {
+ *d = SEED_POINT;
+ }
/* increment the data pointer and the x counter */
d += dirx;
@@ -1713,3 +1702,28 @@ find_max_gradient (GimpIscissorsTool *iscissors,
}
}
}
+
+static ICurve *
+icurve_new (gint x1,
+ gint y1,
+ gint x2,
+ gint y2)
+{
+ ICurve *curve = g_slice_new0 (ICurve);
+
+ curve->x1 = x1;
+ curve->y1 = y1;
+ curve->x2 = x2;
+ curve->y2 = y2;
+
+ return curve;
+}
+
+static void
+icurve_free (ICurve *curve)
+{
+ if (curve->points)
+ g_ptr_array_free (curve->points, TRUE);
+
+ g_slice_free (ICurve, curve);
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]