From d46b53f63ddfe3fd1189f599842af683c2e8b0b0 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Thu, 25 Nov 2010 11:31:40 +0100 Subject: [PATCH] Bug 635040 - Edit -> Stroke Path performs no action on an incomplete path Add error reporting to gimp_drawable_stroke_vectors() and produce the same warning as the paint core when trying to stroke a path with zero or one points only. --- app/core/gimpdrawable-stroke.c | 76 +++++++++++++++++++++------------- app/core/gimpdrawable-stroke.h | 46 ++++++++++---------- app/tools/gimprectangletool.c | 4 +- app/vectors/gimpvectors.c | 17 ++++---- 4 files changed, 84 insertions(+), 59 deletions(-) diff --git a/app/core/gimpdrawable-stroke.c b/app/core/gimpdrawable-stroke.c index d631ae2f43..44a782e385 100644 --- a/app/core/gimpdrawable-stroke.c +++ b/app/core/gimpdrawable-stroke.c @@ -39,6 +39,7 @@ #include "gimpchannel.h" #include "gimpcontext.h" #include "gimpdrawable-stroke.h" +#include "gimperror.h" #include "gimpimage.h" #include "gimppattern.h" #include "gimpscanconvert.h" @@ -59,7 +60,8 @@ static GimpScanConvert * gimp_drawable_render_boundary (GimpDrawable *dra gint offset_y); static GimpScanConvert * gimp_drawable_render_vectors (GimpDrawable *drawable, GimpVectors *vectors, - gboolean do_stroke); + gboolean do_stroke, + GError **error); static void gimp_drawable_stroke_scan_convert (GimpDrawable *drawable, GimpFillOptions *options, GimpScanConvert *scan_convert, @@ -129,54 +131,68 @@ gimp_drawable_stroke_boundary (GimpDrawable *drawable, } } -void -gimp_drawable_fill_vectors (GimpDrawable *drawable, - GimpFillOptions *options, - GimpVectors *vectors, - gboolean push_undo) +gboolean +gimp_drawable_fill_vectors (GimpDrawable *drawable, + GimpFillOptions *options, + GimpVectors *vectors, + gboolean push_undo, + GError **error) { GimpScanConvert *scan_convert; - g_return_if_fail (GIMP_IS_DRAWABLE (drawable)); - g_return_if_fail (gimp_item_is_attached (GIMP_ITEM (drawable))); - g_return_if_fail (GIMP_IS_FILL_OPTIONS (options)); - g_return_if_fail (GIMP_IS_VECTORS (vectors)); - g_return_if_fail (options->style != GIMP_FILL_STYLE_PATTERN || - gimp_context_get_pattern (GIMP_CONTEXT (options)) != NULL); + g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), FALSE); + g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (drawable)), FALSE); + g_return_val_if_fail (GIMP_IS_FILL_OPTIONS (options), FALSE); + g_return_val_if_fail (GIMP_IS_VECTORS (vectors), FALSE); + g_return_val_if_fail (options->style != GIMP_FILL_STYLE_PATTERN || + gimp_context_get_pattern (GIMP_CONTEXT (options)) != NULL, + FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - scan_convert = gimp_drawable_render_vectors (drawable, vectors, FALSE); + scan_convert = gimp_drawable_render_vectors (drawable, vectors, FALSE, error); if (scan_convert) { gimp_drawable_stroke_scan_convert (drawable, options, scan_convert, FALSE, push_undo); gimp_scan_convert_free (scan_convert); + + return TRUE; } + + return FALSE; } -void -gimp_drawable_stroke_vectors (GimpDrawable *drawable, - GimpStrokeOptions *options, - GimpVectors *vectors, - gboolean push_undo) +gboolean +gimp_drawable_stroke_vectors (GimpDrawable *drawable, + GimpStrokeOptions *options, + GimpVectors *vectors, + gboolean push_undo, + GError **error) { GimpScanConvert *scan_convert; - g_return_if_fail (GIMP_IS_DRAWABLE (drawable)); - g_return_if_fail (gimp_item_is_attached (GIMP_ITEM (drawable))); - g_return_if_fail (GIMP_IS_STROKE_OPTIONS (options)); - g_return_if_fail (GIMP_IS_VECTORS (vectors)); - g_return_if_fail (GIMP_FILL_OPTIONS (options)->style != GIMP_FILL_STYLE_PATTERN || - gimp_context_get_pattern (GIMP_CONTEXT (options)) != NULL); + g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), FALSE); + g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (drawable)), FALSE); + g_return_val_if_fail (GIMP_IS_STROKE_OPTIONS (options), FALSE); + g_return_val_if_fail (GIMP_IS_VECTORS (vectors), FALSE); + g_return_val_if_fail (GIMP_FILL_OPTIONS (options)->style != GIMP_FILL_STYLE_PATTERN || + gimp_context_get_pattern (GIMP_CONTEXT (options)) != NULL, + FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - scan_convert = gimp_drawable_render_vectors (drawable, vectors, TRUE); + scan_convert = gimp_drawable_render_vectors (drawable, vectors, TRUE, error); if (scan_convert) { gimp_drawable_stroke_scan_convert (drawable, GIMP_FILL_OPTIONS (options), scan_convert, TRUE, push_undo); gimp_scan_convert_free (scan_convert); + + return TRUE; } + + return FALSE; } @@ -254,9 +270,10 @@ gimp_drawable_render_boundary (GimpDrawable *drawable, } static GimpScanConvert * -gimp_drawable_render_vectors (GimpDrawable *drawable, - GimpVectors *vectors, - gboolean do_stroke) +gimp_drawable_render_vectors (GimpDrawable *drawable, + GimpVectors *vectors, + gboolean do_stroke, + GError **error) { GimpScanConvert *scan_convert; GimpStroke *stroke; @@ -306,6 +323,9 @@ gimp_drawable_render_vectors (GimpDrawable *drawable, gimp_scan_convert_free (scan_convert); + g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED, + _("Not enough points to stroke")); + return NULL; } diff --git a/app/core/gimpdrawable-stroke.h b/app/core/gimpdrawable-stroke.h index cbca55a60b..9096143e5e 100644 --- a/app/core/gimpdrawable-stroke.h +++ b/app/core/gimpdrawable-stroke.h @@ -22,29 +22,31 @@ #define __GIMP_DRAWABLE_STROKE_H__ -void gimp_drawable_fill_boundary (GimpDrawable *drawable, - GimpFillOptions *options, - const BoundSeg *bound_segs, - gint n_bound_segs, - gint offset_x, - gint offset_y, - gboolean push_undo); -void gimp_drawable_stroke_boundary (GimpDrawable *drawable, - GimpStrokeOptions *options, - const BoundSeg *bound_segs, - gint n_bound_segs, - gint offset_x, - gint offset_y, - gboolean push_undo); +void gimp_drawable_fill_boundary (GimpDrawable *drawable, + GimpFillOptions *options, + const BoundSeg *bound_segs, + gint n_bound_segs, + gint offset_x, + gint offset_y, + gboolean push_undo); +void gimp_drawable_stroke_boundary (GimpDrawable *drawable, + GimpStrokeOptions *options, + const BoundSeg *bound_segs, + gint n_bound_segs, + gint offset_x, + gint offset_y, + gboolean push_undo); -void gimp_drawable_fill_vectors (GimpDrawable *drawable, - GimpFillOptions *options, - GimpVectors *vectors, - gboolean push_undo); -void gimp_drawable_stroke_vectors (GimpDrawable *drawable, - GimpStrokeOptions *options, - GimpVectors *vectors, - gboolean push_undo); +gboolean gimp_drawable_fill_vectors (GimpDrawable *drawable, + GimpFillOptions *options, + GimpVectors *vectors, + gboolean push_undo, + GError **error); +gboolean gimp_drawable_stroke_vectors (GimpDrawable *drawable, + GimpStrokeOptions *options, + GimpVectors *vectors, + gboolean push_undo, + GError **error); #endif /* __GIMP_DRAWABLE_STROKE_H__ */ diff --git a/app/tools/gimprectangletool.c b/app/tools/gimprectangletool.c index 0a82e5d0b7..1cd0123dc7 100644 --- a/app/tools/gimprectangletool.c +++ b/app/tools/gimprectangletool.c @@ -1165,7 +1165,7 @@ gimp_rectangle_tool_motion (GimpTool *tool, aspect_text = g_strdup_printf (" (%.2f:1)", w / (gdouble) h); gimp_tool_push_status_coords (tool, display, - GIMP_CURSOR_PRECISION_PIXEL_BORDER, + gimp_tool_control_get_precision (tool->control), _("Rectangle: "), w, " × ", h, aspect_text); g_free (aspect_text); @@ -2161,7 +2161,7 @@ gimp_rectangle_tool_start (GimpRectangleTool *rect_tool, /* initialize the statusbar display */ gimp_tool_push_status_coords (tool, tool->display, - GIMP_CURSOR_PRECISION_PIXEL_BORDER, + gimp_tool_control_get_precision (tool->control), _("Rectangle: "), 0, " × ", 0, NULL); gimp_draw_tool_start (GIMP_DRAW_TOOL (tool), tool->display); diff --git a/app/vectors/gimpvectors.c b/app/vectors/gimpvectors.c index d8e0ded963..e930974100 100644 --- a/app/vectors/gimpvectors.c +++ b/app/vectors/gimpvectors.c @@ -29,11 +29,12 @@ #include "vectors-types.h" #include "core/gimp.h" +#include "core/gimp-transform-utils.h" #include "core/gimpchannel-select.h" #include "core/gimpcontainer.h" #include "core/gimpcontext.h" #include "core/gimpdrawable-stroke.h" -#include "core/gimp-transform-utils.h" +#include "core/gimperror.h" #include "core/gimpimage.h" #include "core/gimpimage-undo-push.h" #include "core/gimpmarshal.h" @@ -550,17 +551,19 @@ gimp_vectors_stroke (GimpItem *item, GimpVectors *vectors = GIMP_VECTORS (item); gboolean retval = FALSE; - /* return successfully on an empty path, there's nothing to stroke */ if (! vectors->strokes) - return TRUE; + { + g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED, + _("Not enough points to stroke")); + return FALSE; + } switch (stroke_options->method) { case GIMP_STROKE_METHOD_LIBART: - gimp_drawable_stroke_vectors (drawable, - stroke_options, - vectors, push_undo); - retval = TRUE; + retval = gimp_drawable_stroke_vectors (drawable, + stroke_options, + vectors, push_undo, error); break; case GIMP_STROKE_METHOD_PAINT_CORE: