[gimp] app: some cleanup in GimpTransformTool
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: some cleanup in GimpTransformTool
- Date: Mon, 3 Apr 2017 10:42:09 +0000 (UTC)
commit a9c6bc02832cb5a79dd1c3ecfc5bb49b9e82fed7
Author: Michael Natterer <mitch gimp org>
Date: Mon Apr 3 12:39:33 2017 +0200
app: some cleanup in GimpTransformTool
Copy TransInfo arrays around using memcpy(), use memcmp() to
compare them, add a function to allocate one. Clean up some
logic in gimp_transform_tool_check_active_item().
app/tools/gimptransformtool.c | 143 ++++++++++++++++++++---------------------
1 files changed, 71 insertions(+), 72 deletions(-)
---
diff --git a/app/tools/gimptransformtool.c b/app/tools/gimptransformtool.c
index a8ded8d..4b7366e 100644
--- a/app/tools/gimptransformtool.c
+++ b/app/tools/gimptransformtool.c
@@ -18,6 +18,7 @@
#include "config.h"
#include <stdlib.h>
+#include <string.h>
#include <gegl.h>
#include <gtk/gtk.h>
@@ -166,7 +167,6 @@ static void gimp_transform_tool_response (GimpToolGui
gint response_id,
GimpTransformTool *tr_tool);
-static void gimp_transform_tool_free_trans (gpointer data);
static void gimp_transform_tool_update_sensitivity (GimpTransformTool *tr_tool);
static GimpItem *gimp_transform_tool_get_active_item (GimpTransformTool *tr_tool,
GimpImage *image);
@@ -175,6 +175,9 @@ static GimpItem *gimp_transform_tool_check_active_item (GimpTransformTool
gboolean invisible_layer_ok,
GError **error);
+static TransInfo * trans_info_new (void);
+static void trans_info_free (TransInfo *info);
+
G_DEFINE_TYPE (GimpTransformTool, gimp_transform_tool, GIMP_TYPE_DRAW_TOOL)
@@ -281,8 +284,6 @@ gimp_transform_tool_initialize (GimpTool *tool,
if (display != tool->display)
{
- gint i;
-
gimp_transform_tool_halt (tr_tool);
/* Find the transform bounds for some tools (like scale,
@@ -317,17 +318,15 @@ gimp_transform_tool_initialize (GimpTool *tool,
tr_tool->function = TRANSFORM_CREATING;
/* Initialize undo and redo lists */
- tr_tool->undo_list = g_list_prepend (NULL, g_slice_new (TransInfo));
+ tr_tool->undo_list = g_list_prepend (NULL, trans_info_new ());
tr_tool->redo_list = NULL;
tr_tool->old_trans_info = g_list_last (tr_tool->undo_list)->data;
tr_tool->prev_trans_info = g_list_first (tr_tool->undo_list)->data;
gimp_transform_tool_update_sensitivity (tr_tool);
/* Save the current transformation info */
- for (i = 0; i < TRANS_INFO_SIZE; i++)
- {
- (*tr_tool->prev_trans_info)[i] = tr_tool->trans_info[i];
- }
+ memcpy (tr_tool->prev_trans_info, tr_tool->trans_info,
+ sizeof (TransInfo));
}
return TRUE;
@@ -401,30 +400,26 @@ gimp_transform_tool_button_press (GimpTool *tool,
void
gimp_transform_tool_push_internal_undo (GimpTransformTool *tr_tool)
{
- gint i;
-
g_return_if_fail (GIMP_IS_TRANSFORM_TOOL (tr_tool));
g_return_if_fail (tr_tool->prev_trans_info != NULL);
/* push current state on the undo list and set this state as the
* current state, but avoid doing this if there were no changes
*/
- for (i = 0; i < TRANS_INFO_SIZE; i++)
- if ((*tr_tool->prev_trans_info)[i] != tr_tool->trans_info[i])
- break;
-
- if (i < TRANS_INFO_SIZE)
+ if (memcmp (tr_tool->prev_trans_info, tr_tool->trans_info,
+ sizeof (TransInfo)) != 0)
{
- tr_tool->prev_trans_info = g_slice_new (TransInfo);
- for (i = 0; i < TRANS_INFO_SIZE; i++)
- (*tr_tool->prev_trans_info)[i] = tr_tool->trans_info[i];
+ tr_tool->prev_trans_info = trans_info_new ();
+ memcpy (tr_tool->prev_trans_info, tr_tool->trans_info,
+ sizeof (TransInfo));
+
tr_tool->undo_list = g_list_prepend (tr_tool->undo_list,
tr_tool->prev_trans_info);
/* If we undid anything and started interacting, we have to
* discard the redo history
*/
- g_list_free_full (tr_tool->redo_list, gimp_transform_tool_free_trans);
+ g_list_free_full (tr_tool->redo_list, (GDestroyNotify) trans_info_free);
tr_tool->redo_list = NULL;
gimp_transform_tool_update_sensitivity (tr_tool);
@@ -443,7 +438,6 @@ gimp_transform_tool_button_release (GimpTool *tool,
GimpDisplay *display)
{
GimpTransformTool *tr_tool = GIMP_TRANSFORM_TOOL (tool);
- gint i;
gimp_tool_control_halt (tool->control);
@@ -468,8 +462,8 @@ gimp_transform_tool_button_release (GimpTool *tool,
gimp_draw_tool_pause (GIMP_DRAW_TOOL (tool));
/* Restore the last saved state */
- for (i = 0; i < TRANS_INFO_SIZE; i++)
- tr_tool->trans_info[i] = (*tr_tool->prev_trans_info)[i];
+ memcpy (tr_tool->trans_info, tr_tool->prev_trans_info,
+ sizeof (TransInfo));
/* reget the selection bounds */
gimp_transform_tool_bounds (tr_tool, display);
@@ -817,7 +811,6 @@ gimp_transform_tool_undo (GimpTool *tool,
{
GimpTransformTool *tr_tool = GIMP_TRANSFORM_TOOL (tool);
GList *item;
- gint i;
if (! gimp_transform_tool_get_undo_desc (tool, display))
return FALSE;
@@ -835,10 +828,8 @@ gimp_transform_tool_undo (GimpTool *tool,
gimp_draw_tool_pause (GIMP_DRAW_TOOL (tool));
/* Restore the previous transformation info */
- for (i = 0; i < TRANS_INFO_SIZE; i++)
- {
- tr_tool->trans_info[i] = (*tr_tool->prev_trans_info)[i];
- }
+ memcpy (tr_tool->trans_info, tr_tool->prev_trans_info,
+ sizeof (TransInfo));
/* reget the selection bounds */
gimp_transform_tool_bounds (tr_tool, tool->display);
@@ -857,7 +848,6 @@ gimp_transform_tool_redo (GimpTool *tool,
{
GimpTransformTool *tr_tool = GIMP_TRANSFORM_TOOL (tool);
GList *item;
- gint i;
if (! gimp_transform_tool_get_redo_desc (tool, display))
return FALSE;
@@ -875,10 +865,8 @@ gimp_transform_tool_redo (GimpTool *tool,
gimp_draw_tool_pause (GIMP_DRAW_TOOL (tool));
/* Restore the previous transformation info */
- for (i = 0; i < TRANS_INFO_SIZE; i++)
- {
- tr_tool->trans_info[i] = (*tr_tool->prev_trans_info)[i];
- }
+ memcpy (tr_tool->trans_info, tr_tool->prev_trans_info,
+ sizeof (TransInfo));
/* reget the selection bounds */
gimp_transform_tool_bounds (tr_tool, tool->display);
@@ -1078,10 +1066,8 @@ gimp_transform_tool_draw (GimpDrawTool *draw_tool)
GimpImage *image = gimp_display_get_image (tool->display);
gint handle_w;
gint handle_h;
- gint i;
- for (i = 0; i < G_N_ELEMENTS (tr_tool->handles); i++)
- tr_tool->handles[i] = NULL;
+ memset (tr_tool->handles, 0, sizeof (tr_tool->handles));
if (tr_tool->use_grid)
{
@@ -1133,6 +1119,7 @@ gimp_transform_tool_draw (GimpDrawTool *draw_tool)
GimpBoundSeg *segs_out;
gint num_segs_in;
gint num_segs_out;
+ gint i;
if (options->direction == GIMP_TRANSFORM_BACKWARD)
gimp_matrix3_invert (&matrix);
@@ -1481,13 +1468,13 @@ gimp_transform_tool_halt (GimpTransformTool *tr_tool)
if (tr_tool->redo_list)
{
- g_list_free_full (tr_tool->redo_list, gimp_transform_tool_free_trans);
+ g_list_free_full (tr_tool->redo_list, (GDestroyNotify) trans_info_free);
tr_tool->redo_list = NULL;
}
if (tr_tool->undo_list)
{
- g_list_free_full (tr_tool->undo_list, gimp_transform_tool_free_trans);
+ g_list_free_full (tr_tool->undo_list, (GDestroyNotify) trans_info_free);
tr_tool->undo_list = NULL;
tr_tool->prev_trans_info = NULL;
}
@@ -1724,7 +1711,6 @@ gimp_transform_tool_response (GimpToolGui *gui,
{
GimpTool *tool = GIMP_TOOL (tr_tool);
GimpDisplay *display = tool->display;
- gint i;
switch (response_id)
{
@@ -1746,10 +1732,8 @@ gimp_transform_tool_response (GimpToolGui *gui,
gimp_draw_tool_pause (GIMP_DRAW_TOOL (tool));
/* Restore the previous transformation info */
- for (i = 0; i < TRANS_INFO_SIZE; i++)
- {
- tr_tool->trans_info[i] = (*tr_tool->prev_trans_info)[i];
- }
+ memcpy (tr_tool->trans_info, tr_tool->prev_trans_info,
+ sizeof (TransInfo));
/* reget the selection bounds */
gimp_transform_tool_bounds (tr_tool, display);
@@ -1780,12 +1764,6 @@ gimp_transform_tool_response (GimpToolGui *gui,
}
static void
-gimp_transform_tool_free_trans (gpointer data)
-{
- g_slice_free (TransInfo, data);
-}
-
-static void
gimp_transform_tool_update_sensitivity (GimpTransformTool *tr_tool)
{
if (! tr_tool->gui)
@@ -1808,11 +1786,12 @@ gimp_transform_tool_get_active_item (GimpTransformTool *tr_tool,
case GIMP_TRANSFORM_TYPE_SELECTION:
{
- GimpChannel *selection_mask = gimp_image_get_mask (image);
- if (selection_mask && gimp_channel_is_empty (selection_mask))
+ GimpChannel *selection = gimp_image_get_mask (image);
+
+ if (gimp_channel_is_empty (selection))
return NULL;
else
- return GIMP_ITEM (selection_mask);
+ return GIMP_ITEM (selection);
}
case GIMP_TRANSFORM_TYPE_PATH:
@@ -1840,37 +1819,46 @@ gimp_transform_tool_check_active_item (GimpTransformTool *tr_tool,
case GIMP_TRANSFORM_TYPE_LAYER:
null_message = _("There is no layer to transform.");
- if (item && gimp_item_is_content_locked (item))
- locked_message = _("The active layer's pixels are locked.");
- else
- locked_message = _("The active layer's position and size are locked.");
-
- /* invisible_layer_ok is such a hack, see bug #759194 */
- if (item && ! invisible_layer_ok && ! gimp_item_is_visible (item))
+ if (item)
{
- g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED,
- _("The active layer is not visible."));
- return NULL;
+ if (gimp_item_is_content_locked (item))
+ locked_message = _("The active layer's pixels are locked.");
+ else if (gimp_item_is_position_locked (item))
+ locked_message = _("The active layer's position and size are locked.");
+
+ /* invisible_layer_ok is such a hack, see bug #759194 */
+ if (! invisible_layer_ok && ! gimp_item_is_visible (item))
+ {
+ g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED,
+ _("The active layer is not visible."));
+ return NULL;
+ }
}
break;
case GIMP_TRANSFORM_TYPE_SELECTION:
null_message = _("There is no selection to transform.");
- /* cannot happen, so don't translate these messages */
- if (item && gimp_item_is_content_locked (item))
- locked_message = "The selection's pixels are locked.";
- else
- locked_message = "The selection's position and size are locked.";
+ if (item)
+ {
+ /* cannot happen, so don't translate these messages */
+ if (gimp_item_is_content_locked (item))
+ locked_message = "The selection's pixels are locked.";
+ else if (gimp_item_is_position_locked (item))
+ locked_message = "The selection's position and size are locked.";
+ }
break;
case GIMP_TRANSFORM_TYPE_PATH:
null_message = _("There is no path to transform.");
- if (item && gimp_item_is_content_locked (item))
- locked_message = _("The active path's strokes are locked.");
- else
- locked_message = _("The active path's position is locked.");
+ if (item)
+ {
+ if (gimp_item_is_content_locked (item))
+ locked_message = _("The active path's strokes are locked.");
+ else if (gimp_item_is_position_locked (item))
+ locked_message = _("The active path's position is locked.");
+ }
break;
}
@@ -1880,8 +1868,7 @@ gimp_transform_tool_check_active_item (GimpTransformTool *tr_tool,
return NULL;
}
- if (gimp_item_is_content_locked (item) ||
- gimp_item_is_position_locked (item))
+ if (locked_message)
{
g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED, locked_message);
return NULL;
@@ -1889,3 +1876,15 @@ gimp_transform_tool_check_active_item (GimpTransformTool *tr_tool,
return item;
}
+
+static TransInfo *
+trans_info_new (void)
+{
+ return g_slice_new0 (TransInfo);
+}
+
+static void
+trans_info_free (TransInfo *info)
+{
+ g_slice_free (TransInfo, info);
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]