[gimp] app: add smooth/corner curve-point types
- From: Ell <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: add smooth/corner curve-point types
- Date: Fri, 19 Apr 2019 14:37:55 +0000 (UTC)
commit 33e47c85a21dddccf67b4aa83692f5d372886884
Author: Ell <ell_se yahoo com>
Date: Fri Apr 19 10:09:08 2019 -0400
app: add smooth/corner curve-point types
Allow setting the type of GimpCurve control-points to either SMOOTH
or CORNER. Smooth points produce a smooth curve, while corner
points produce a sharp curve (previously, all points were smooth).
In GimpCureView, display corner points using a diamond shape,
instead of a circle.
In the Curves tool, allow changing the curve's point types.
app/core/core-enums.c | 29 +++
app/core/core-enums.h | 11 ++
app/core/gimpcurve.c | 206 +++++++++++++++++----
app/core/gimpcurve.h | 132 +++++++------
app/tools/gimpcurvestool.c | 75 +++++++-
app/tools/gimpcurvestool.h | 1 +
app/widgets/gimpcurveview.c | 52 +++++-
app/widgets/gimpcurveview.h | 1 +
icons/Color/16/gimp-curve-point-corner.png | Bin 0 -> 422 bytes
icons/Color/16/gimp-curve-point-smooth.png | Bin 0 -> 541 bytes
icons/Color/icon-list.mk | 4 +
icons/Color/scalable/gimp-curve-point-corner.svg | 113 +++++++++++
icons/Color/scalable/gimp-curve-point-smooth.svg | 115 ++++++++++++
icons/Legacy/16/gimp-curve-point-corner.png | Bin 0 -> 124 bytes
icons/Legacy/16/gimp-curve-point-smooth.png | Bin 0 -> 155 bytes
icons/Symbolic/16/gimp-curve-point-corner.png | Bin 0 -> 306 bytes
icons/Symbolic/16/gimp-curve-point-smooth.png | Bin 0 -> 387 bytes
.../Symbolic/scalable/gimp-curve-point-corner.svg | 94 ++++++++++
.../Symbolic/scalable/gimp-curve-point-smooth.svg | 95 ++++++++++
19 files changed, 820 insertions(+), 108 deletions(-)
---
diff --git a/app/core/core-enums.c b/app/core/core-enums.c
index 90646ec1f5..222d678915 100644
--- a/app/core/core-enums.c
+++ b/app/core/core-enums.c
@@ -360,6 +360,35 @@ gimp_convolution_type_get_type (void)
return type;
}
+GType
+gimp_curve_point_type_get_type (void)
+{
+ static const GEnumValue values[] =
+ {
+ { GIMP_CURVE_POINT_SMOOTH, "GIMP_CURVE_POINT_SMOOTH", "smooth" },
+ { GIMP_CURVE_POINT_CORNER, "GIMP_CURVE_POINT_CORNER", "corner" },
+ { 0, NULL, NULL }
+ };
+
+ static const GimpEnumDesc descs[] =
+ {
+ { GIMP_CURVE_POINT_SMOOTH, NC_("curve-point-type", "Smooth"), NULL },
+ { GIMP_CURVE_POINT_CORNER, NC_("curve-point-type", "Corner"), NULL },
+ { 0, NULL, NULL }
+ };
+
+ static GType type = 0;
+
+ if (G_UNLIKELY (! type))
+ {
+ type = g_enum_register_static ("GimpCurvePointType", values);
+ gimp_type_set_translation_context (type, "curve-point-type");
+ gimp_enum_set_value_descriptions (type, descs);
+ }
+
+ return type;
+}
+
GType
gimp_curve_type_get_type (void)
{
diff --git a/app/core/core-enums.h b/app/core/core-enums.h
index 2f7c53ab7c..d10068c6b3 100644
--- a/app/core/core-enums.h
+++ b/app/core/core-enums.h
@@ -196,6 +196,17 @@ typedef enum /*< pdb-skip >*/
} GimpConvolutionType;
+#define GIMP_TYPE_CURVE_POINT_TYPE (gimp_curve_point_type_get_type ())
+
+GType gimp_curve_point_type_get_type (void) G_GNUC_CONST;
+
+typedef enum /*< pdb-skip >*/
+{
+ GIMP_CURVE_POINT_SMOOTH, /*< desc="Smooth" >*/
+ GIMP_CURVE_POINT_CORNER /*< desc="Corner" >*/
+} GimpCurvePointType;
+
+
#define GIMP_TYPE_CURVE_TYPE (gimp_curve_type_get_type ())
GType gimp_curve_type_get_type (void) G_GNUC_CONST;
diff --git a/app/core/gimpcurve.c b/app/core/gimpcurve.c
index 2a8e1f4302..ae12d15af3 100644
--- a/app/core/gimpcurve.c
+++ b/app/core/gimpcurve.c
@@ -46,6 +46,7 @@ enum
PROP_CURVE_TYPE,
PROP_N_POINTS,
PROP_POINTS,
+ PROP_POINT_TYPES,
PROP_N_SAMPLES,
PROP_SAMPLES
};
@@ -171,6 +172,17 @@ gimp_curve_class_init (GimpCurveClass *klass)
GIMP_PARAM_STATIC_STRINGS |
GIMP_CONFIG_PARAM_FLAGS));
+ array_spec = g_param_spec_enum ("point-type", NULL, NULL,
+ GIMP_TYPE_CURVE_POINT_TYPE,
+ GIMP_CURVE_POINT_SMOOTH,
+ GIMP_PARAM_READWRITE);
+ g_object_class_install_property (object_class, PROP_POINT_TYPES,
+ gimp_param_spec_value_array ("point-types",
+ NULL, NULL,
+ array_spec,
+ GIMP_PARAM_STATIC_STRINGS |
+ GIMP_CONFIG_PARAM_FLAGS));
+
GIMP_CONFIG_PROP_INT (object_class, PROP_N_SAMPLES,
"n-samples",
"Number of Samples",
@@ -248,18 +260,22 @@ gimp_curve_set_property (GObject *object,
case PROP_POINTS:
{
GimpValueArray *array = g_value_get_boxed (value);
+ GimpCurvePoint *points;
gint length;
+ gint n_points;
gint i;
- curve->n_points = 0;
- g_clear_pointer (&curve->points, g_free);
-
if (! array)
- break;
+ {
+ gimp_curve_clear_points (curve);
+
+ break;
+ }
length = gimp_value_array_length (array) / 2;
- curve->points = g_new (GimpVector2, length);
+ n_points = 0;
+ points = g_new (GimpCurvePoint, length);
for (i = 0; i < length; i++)
{
@@ -270,22 +286,76 @@ gimp_curve_set_property (GObject *object,
if (g_value_get_double (x) < 0.0)
continue;
- curve->points[curve->n_points].x = CLAMP (g_value_get_double (x),
- 0.0, 1.0);
- curve->points[curve->n_points].y = CLAMP (g_value_get_double (y),
- 0.0, 1.0);
+ points[n_points].x = CLAMP (g_value_get_double (x), 0.0, 1.0);
+ points[n_points].y = CLAMP (g_value_get_double (y), 0.0, 1.0);
- if (curve->n_points > 0)
+ if (n_points > 0)
{
- curve->points[curve->n_points].x = MAX (
- curve->points[curve->n_points].x,
- curve->points[curve->n_points - 1].x);
+ points[n_points].x = MAX (points[n_points].x,
+ points[n_points - 1].x);
}
- curve->n_points++;
+ if (n_points < curve->n_points)
+ points[n_points].type = curve->points[n_points].type;
+ else
+ points[n_points].type = GIMP_CURVE_POINT_SMOOTH;
+
+ n_points++;
}
+ g_free (curve->points);
+
+ curve->n_points = n_points;
+ curve->points = points;
+
g_object_notify (object, "n-points");
+ g_object_notify (object, "point-types");
+ }
+ break;
+
+ case PROP_POINT_TYPES:
+ {
+ GimpValueArray *array = g_value_get_boxed (value);
+ GimpCurvePoint *points;
+ gint length;
+ gdouble x = 0.0;
+ gdouble y = 0.0;
+ gint i;
+
+ if (! array)
+ {
+ gimp_curve_clear_points (curve);
+
+ break;
+ }
+
+ length = gimp_value_array_length (array);
+
+ points = g_new (GimpCurvePoint, length);
+
+ for (i = 0; i < length; i++)
+ {
+ GValue *type = gimp_value_array_index (array, i);
+
+ points[i].type = g_value_get_enum (type);
+
+ if (i < curve->n_points)
+ {
+ x = curve->points[i].x;
+ y = curve->points[i].y;
+ }
+
+ points[i].x = x;
+ points[i].y = y;
+ }
+
+ g_free (curve->points);
+
+ curve->n_points = length;
+ curve->points = points;
+
+ g_object_notify (object, "n-points");
+ g_object_notify (object, "points");
}
break;
@@ -360,6 +430,26 @@ gimp_curve_get_property (GObject *object,
}
break;
+ case PROP_POINT_TYPES:
+ {
+ GimpValueArray *array = gimp_value_array_new (curve->n_points);
+ GValue v = G_VALUE_INIT;
+ gint i;
+
+ g_value_init (&v, GIMP_TYPE_CURVE_POINT_TYPE);
+
+ for (i = 0; i < curve->n_points; i++)
+ {
+ g_value_set_enum (&v, curve->points[i].type);
+ gimp_value_array_append (array, &v);
+ }
+
+ g_value_unset (&v);
+
+ g_value_take_boxed (value, array);
+ }
+ break;
+
case PROP_N_SAMPLES:
g_value_set_int (value, curve->n_samples);
break;
@@ -397,7 +487,7 @@ gimp_curve_get_memsize (GimpObject *object,
GimpCurve *curve = GIMP_CURVE (object);
gint64 memsize = 0;
- memsize += curve->n_points * sizeof (GimpVector2);
+ memsize += curve->n_points * sizeof (GimpCurvePoint);
memsize += curve->n_samples * sizeof (gdouble);
return memsize + GIMP_OBJECT_CLASS (parent_class)->get_memsize (object,
@@ -513,7 +603,7 @@ gimp_curve_equal (GimpConfig *a,
if (a_curve->n_points != b_curve->n_points ||
memcmp (a_curve->points, b_curve->points,
- sizeof (GimpVector2) * a_curve->n_points))
+ sizeof (GimpCurvePoint) * a_curve->n_points))
{
return FALSE;
}
@@ -602,16 +692,19 @@ gimp_curve_reset (GimpCurve *curve,
g_free (curve->points);
curve->n_points = 2;
- curve->points = g_new (GimpVector2, 2);
+ curve->points = g_new (GimpCurvePoint, 2);
- curve->points[0].x = 0.0;
- curve->points[0].y = 0.0;
+ curve->points[0].x = 0.0;
+ curve->points[0].y = 0.0;
+ curve->points[0].type = GIMP_CURVE_POINT_SMOOTH;
- curve->points[1].x = 1.0;
- curve->points[1].y = 1.0;
+ curve->points[1].x = 1.0;
+ curve->points[1].y = 1.0;
+ curve->points[1].type = GIMP_CURVE_POINT_SMOOTH;
g_object_notify (G_OBJECT (curve), "n-points");
g_object_notify (G_OBJECT (curve), "points");
+ g_object_notify (G_OBJECT (curve), "point-types");
if (reset_type)
{
@@ -650,19 +743,21 @@ gimp_curve_set_curve_type (GimpCurve *curve,
* points
*/
curve->n_points = 9;
- curve->points = g_new (GimpVector2, 9);
+ curve->points = g_new (GimpCurvePoint, 9);
for (i = 0; i < curve->n_points; i++)
{
gint sample = i * (curve->n_samples - 1) / (curve->n_points - 1);
- curve->points[i].x = (gdouble) sample /
- (gdouble) (curve->n_samples - 1);
- curve->points[i].y = curve->samples[sample];
+ curve->points[i].x = (gdouble) sample /
+ (gdouble) (curve->n_samples - 1);
+ curve->points[i].y = curve->samples[sample];
+ curve->points[i].type = GIMP_CURVE_POINT_SMOOTH;
}
g_object_notify (G_OBJECT (curve), "n-points");
g_object_notify (G_OBJECT (curve), "points");
+ g_object_notify (G_OBJECT (curve), "point-types");
}
else
{
@@ -795,8 +890,8 @@ gimp_curve_add_point (GimpCurve *curve,
gdouble x,
gdouble y)
{
- GimpVector2 *points;
- gint point;
+ GimpCurvePoint *points;
+ gint point;
g_return_val_if_fail (GIMP_IS_CURVE (curve), -1);
@@ -812,15 +907,16 @@ gimp_curve_add_point (GimpCurve *curve,
break;
}
- points = g_new (GimpVector2, curve->n_points + 1);
+ points = g_new (GimpCurvePoint, curve->n_points + 1);
memcpy (points, curve->points,
- point * sizeof (GimpVector2));
+ point * sizeof (GimpCurvePoint));
memcpy (points + point + 1, curve->points + point,
- (curve->n_points - point) * sizeof (GimpVector2));
+ (curve->n_points - point) * sizeof (GimpCurvePoint));
- points[point].x = x;
- points[point].y = y;
+ points[point].x = x;
+ points[point].y = y;
+ points[point].type = GIMP_CURVE_POINT_SMOOTH;
g_free (curve->points);
@@ -829,6 +925,7 @@ gimp_curve_add_point (GimpCurve *curve,
g_object_notify (G_OBJECT (curve), "n-points");
g_object_notify (G_OBJECT (curve), "points");
+ g_object_notify (G_OBJECT (curve), "point-types");
gimp_data_dirty (GIMP_DATA (curve));
@@ -839,17 +936,17 @@ void
gimp_curve_delete_point (GimpCurve *curve,
gint point)
{
- GimpVector2 *points;
+ GimpCurvePoint *points;
g_return_if_fail (GIMP_IS_CURVE (curve));
g_return_if_fail (point >= 0 && point < curve->n_points);
- points = g_new (GimpVector2, curve->n_points - 1);
+ points = g_new (GimpCurvePoint, curve->n_points - 1);
memcpy (points, curve->points,
- point * sizeof (GimpVector2));
+ point * sizeof (GimpCurvePoint));
memcpy (points + point, curve->points + point + 1,
- (curve->n_points - point - 1) * sizeof (GimpVector2));
+ (curve->n_points - point - 1) * sizeof (GimpCurvePoint));
g_free (curve->points);
@@ -858,6 +955,7 @@ gimp_curve_delete_point (GimpCurve *curve,
g_object_notify (G_OBJECT (curve), "n-points");
g_object_notify (G_OBJECT (curve), "points");
+ g_object_notify (G_OBJECT (curve), "point-types");
gimp_data_dirty (GIMP_DATA (curve));
}
@@ -913,6 +1011,31 @@ gimp_curve_get_point (GimpCurve *curve,
if (y) *y = curve->points[point].y;
}
+void
+gimp_curve_set_point_type (GimpCurve *curve,
+ gint point,
+ GimpCurvePointType type)
+{
+ g_return_if_fail (GIMP_IS_CURVE (curve));
+ g_return_if_fail (point >= 0 && point < curve->n_points);
+
+ curve->points[point].type = type;
+
+ g_object_notify (G_OBJECT (curve), "point-types");
+
+ gimp_data_dirty (GIMP_DATA (curve));
+}
+
+GimpCurvePointType
+gimp_curve_get_point_type (GimpCurve *curve,
+ gint point)
+{
+ g_return_val_if_fail (GIMP_IS_CURVE (curve), GIMP_CURVE_POINT_SMOOTH);
+ g_return_val_if_fail (point >= 0 && point < curve->n_points, GIMP_CURVE_POINT_SMOOTH);
+
+ return curve->points[point].type;
+}
+
void
gimp_curve_clear_points (GimpCurve *curve)
{
@@ -925,6 +1048,7 @@ gimp_curve_clear_points (GimpCurve *curve)
g_object_notify (G_OBJECT (curve), "n-points");
g_object_notify (G_OBJECT (curve), "points");
+ g_object_notify (G_OBJECT (curve), "point-types");
gimp_data_dirty (GIMP_DATA (curve));
}
@@ -1000,8 +1124,8 @@ gimp_curve_calculate (GimpCurve *curve)
/* Initialize boundary curve points */
if (curve->n_points > 0)
{
- GimpVector2 point;
- gint boundary;
+ GimpCurvePoint point;
+ gint boundary;
point = curve->points[0];
boundary = ROUND (point.x * (gdouble) (curve->n_samples - 1));
@@ -1023,6 +1147,12 @@ gimp_curve_calculate (GimpCurve *curve)
p3 = i + 1;
p4 = MIN (i + 2, curve->n_points - 1);
+ if (curve->points[p2].type == GIMP_CURVE_POINT_CORNER)
+ p1 = p2;
+
+ if (curve->points[p3].type == GIMP_CURVE_POINT_CORNER)
+ p4 = p3;
+
gimp_curve_plot (curve, p1, p2, p3, p4);
}
diff --git a/app/core/gimpcurve.h b/app/core/gimpcurve.h
index b41794c168..71654aa184 100644
--- a/app/core/gimpcurve.h
+++ b/app/core/gimpcurve.h
@@ -30,21 +30,30 @@
#define GIMP_CURVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_CURVE, GimpCurveClass))
+typedef struct _GimpCurvePoint GimpCurvePoint;
typedef struct _GimpCurveClass GimpCurveClass;
+struct _GimpCurvePoint
+{
+ gdouble x;
+ gdouble y;
+
+ GimpCurvePointType type;
+};
+
struct _GimpCurve
{
- GimpData parent_instance;
+ GimpData parent_instance;
- GimpCurveType curve_type;
+ GimpCurveType curve_type;
- gint n_points;
- GimpVector2 *points;
+ gint n_points;
+ GimpCurvePoint *points;
- gint n_samples;
- gdouble *samples;
+ gint n_samples;
+ gdouble *samples;
- gboolean identity; /* whether the curve is an identity mapping */
+ gboolean identity; /* whether the curve is an identity mapping */
};
struct _GimpCurveClass
@@ -53,58 +62,63 @@ struct _GimpCurveClass
};
-GType gimp_curve_get_type (void) G_GNUC_CONST;
-
-GimpData * gimp_curve_new (const gchar *name);
-GimpData * gimp_curve_get_standard (void);
-
-void gimp_curve_reset (GimpCurve *curve,
- gboolean reset_type);
-
-void gimp_curve_set_curve_type (GimpCurve *curve,
- GimpCurveType curve_type);
-GimpCurveType gimp_curve_get_curve_type (GimpCurve *curve);
-
-gint gimp_curve_get_n_points (GimpCurve *curve);
-
-void gimp_curve_set_n_samples (GimpCurve *curve,
- gint n_samples);
-gint gimp_curve_get_n_samples (GimpCurve *curve);
-
-gint gimp_curve_get_point_at (GimpCurve *curve,
- gdouble x);
-gint gimp_curve_get_closest_point (GimpCurve *curve,
- gdouble x,
- gdouble y,
- gdouble max_distance);
-
-gint gimp_curve_add_point (GimpCurve *curve,
- gdouble x,
- gdouble y);
-void gimp_curve_delete_point (GimpCurve *curve,
- gint point);
-void gimp_curve_set_point (GimpCurve *curve,
- gint point,
- gdouble x,
- gdouble y);
-void gimp_curve_move_point (GimpCurve *curve,
- gint point,
- gdouble y);
-void gimp_curve_get_point (GimpCurve *curve,
- gint point,
- gdouble *x,
- gdouble *y);
-void gimp_curve_clear_points (GimpCurve *curve);
-
-void gimp_curve_set_curve (GimpCurve *curve,
- gdouble x,
- gdouble y);
-
-gboolean gimp_curve_is_identity (GimpCurve *curve);
-
-void gimp_curve_get_uchar (GimpCurve *curve,
- gint n_samples,
- guchar *samples);
+GType gimp_curve_get_type (void) G_GNUC_CONST;
+
+GimpData * gimp_curve_new (const gchar *name);
+GimpData * gimp_curve_get_standard (void);
+
+void gimp_curve_reset (GimpCurve *curve,
+ gboolean reset_type);
+
+void gimp_curve_set_curve_type (GimpCurve *curve,
+ GimpCurveType curve_type);
+GimpCurveType gimp_curve_get_curve_type (GimpCurve *curve);
+
+gint gimp_curve_get_n_points (GimpCurve *curve);
+
+void gimp_curve_set_n_samples (GimpCurve *curve,
+ gint n_samples);
+gint gimp_curve_get_n_samples (GimpCurve *curve);
+
+gint gimp_curve_get_point_at (GimpCurve *curve,
+ gdouble x);
+gint gimp_curve_get_closest_point (GimpCurve *curve,
+ gdouble x,
+ gdouble y,
+ gdouble max_distance);
+
+gint gimp_curve_add_point (GimpCurve *curve,
+ gdouble x,
+ gdouble y);
+void gimp_curve_delete_point (GimpCurve *curve,
+ gint point);
+void gimp_curve_set_point (GimpCurve *curve,
+ gint point,
+ gdouble x,
+ gdouble y);
+void gimp_curve_move_point (GimpCurve *curve,
+ gint point,
+ gdouble y);
+void gimp_curve_get_point (GimpCurve *curve,
+ gint point,
+ gdouble *x,
+ gdouble *y);
+void gimp_curve_set_point_type (GimpCurve *curve,
+ gint point,
+ GimpCurvePointType type);
+GimpCurvePointType gimp_curve_get_point_type (GimpCurve *curve,
+ gint point);
+void gimp_curve_clear_points (GimpCurve *curve);
+
+void gimp_curve_set_curve (GimpCurve *curve,
+ gdouble x,
+ gdouble y);
+
+gboolean gimp_curve_is_identity (GimpCurve *curve);
+
+void gimp_curve_get_uchar (GimpCurve *curve,
+ gint n_samples,
+ guchar *samples);
#endif /* __GIMP_CURVE_H__ */
diff --git a/app/tools/gimpcurvestool.c b/app/tools/gimpcurvestool.c
index 8f20bd0824..47eecc3808 100644
--- a/app/tools/gimpcurvestool.c
+++ b/app/tools/gimpcurvestool.c
@@ -124,6 +124,8 @@ static void curves_graph_selection_callback (GtkWidget *widget
static void curves_point_coords_callback (GtkWidget *widget,
GimpCurvesTool *tool);
+static void curves_point_type_callback (GtkWidget *widget,
+ GimpCurvesTool *tool);
static void curves_curve_type_callback (GtkWidget *widget,
GimpCurvesTool *tool);
@@ -268,9 +270,19 @@ gimp_curves_tool_button_release (GimpTool *tool,
if (point < 0)
{
+ GimpCurvePointType type = GIMP_CURVE_POINT_SMOOTH;
+
+ point = gimp_curve_view_get_selected (
+ GIMP_CURVE_VIEW (c_tool->graph));
+
+ if (point >= 0)
+ type = gimp_curve_get_point_type (curve, point);
+
point = gimp_curve_add_point (
curve,
value, gimp_curve_map_value (curve, value));
+
+ gimp_curve_set_point_type (curve, point, type);
}
gimp_curve_view_set_selected (GIMP_CURVE_VIEW (c_tool->graph), point);
@@ -278,6 +290,16 @@ gimp_curves_tool_button_release (GimpTool *tool,
else if (state & gimp_get_toggle_behavior_mask ())
{
GimpHistogramChannel channel;
+ GimpCurvePointType type = GIMP_CURVE_POINT_SMOOTH;
+ gint point;
+
+ point = gimp_curve_view_get_selected (GIMP_CURVE_VIEW (c_tool->graph));
+
+ if (point >= 0)
+ {
+ type = gimp_curve_get_point_type (config->curve[config->channel],
+ point);
+ }
for (channel = GIMP_HISTOGRAM_VALUE;
channel <= GIMP_HISTOGRAM_ALPHA;
@@ -288,8 +310,6 @@ gimp_curves_tool_button_release (GimpTool *tool,
if (value != -1)
{
- gint point;
-
point = gimp_curve_get_point_at (curve, value);
if (point < 0)
@@ -297,6 +317,8 @@ gimp_curves_tool_button_release (GimpTool *tool,
point = gimp_curve_add_point (
curve,
value, gimp_curve_map_value (curve, value));
+
+ gimp_curve_set_point_type (curve, point, type);
}
if (channel == config->channel)
@@ -600,10 +622,25 @@ gimp_curves_tool_dialog (GimpFilterTool *filter_tool)
gtk_label_set_mnemonic_widget (GTK_LABEL (label), tool->point_output);
+ label = gtk_label_new_with_mnemonic (_("T_ype:"));
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ gtk_widget_show (label);
+
+ hbox2 = gimp_enum_icon_box_new (GIMP_TYPE_CURVE_POINT_TYPE,
+ "gimp-curve-point",
+ GTK_ICON_SIZE_MENU,
+ G_CALLBACK (curves_point_type_callback),
+ tool,
+ &tool->point_type);
+ gtk_box_pack_start (GTK_BOX (hbox), hbox2, FALSE, FALSE, 0);
+ gtk_widget_show (hbox2);
+
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
gtk_box_pack_start (GTK_BOX (frame_vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
+ gtk_label_set_mnemonic_widget (GTK_LABEL (label), tool->point_type);
+
label = gtk_label_new_with_mnemonic (_("Curve _type:"));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
@@ -938,6 +975,18 @@ gimp_curves_tool_update_point (GimpCurvesTool *tool)
g_signal_handlers_unblock_by_func (tool->point_output,
curves_point_coords_callback,
tool);
+
+ g_signal_handlers_block_by_func (tool->point_type,
+ curves_point_type_callback,
+ tool);
+
+ gimp_int_radio_group_set_active (
+ GTK_RADIO_BUTTON (tool->point_type),
+ gimp_curve_get_point_type (curve, point));
+
+ g_signal_handlers_unblock_by_func (tool->point_type,
+ curves_point_type_callback,
+ tool);
}
}
@@ -1045,6 +1094,28 @@ curves_point_coords_callback (GtkWidget *widget,
}
}
+static void
+curves_point_type_callback (GtkWidget *widget,
+ GimpCurvesTool *tool)
+{
+ GimpFilterTool *filter_tool = GIMP_FILTER_TOOL (tool);
+ GimpCurvesConfig *config = GIMP_CURVES_CONFIG (filter_tool->config);
+ GimpCurve *curve = config->curve[config->channel];
+ gint point;
+
+ point = gimp_curve_view_get_selected (GIMP_CURVE_VIEW (tool->graph));
+
+ if (point >= 0 && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
+ {
+ GimpCurvePointType type;
+
+ type = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget),
+ "gimp-item-data"));
+
+ gimp_curve_set_point_type (curve, point, type);
+ }
+}
+
static void
curves_curve_type_callback (GtkWidget *widget,
GimpCurvesTool *tool)
diff --git a/app/tools/gimpcurvestool.h b/app/tools/gimpcurvestool.h
index ba897ec008..e80f776cb7 100644
--- a/app/tools/gimpcurvestool.h
+++ b/app/tools/gimpcurvestool.h
@@ -46,6 +46,7 @@ struct _GimpCurvesTool
GtkWidget *point_box;
GtkWidget *point_input;
GtkWidget *point_output;
+ GtkWidget *point_type;
GtkWidget *curve_type;
/* export dialog */
diff --git a/app/widgets/gimpcurveview.c b/app/widgets/gimpcurveview.c
index bd6c46df10..cf09aa2bc7 100644
--- a/app/widgets/gimpcurveview.c
+++ b/app/widgets/gimpcurveview.c
@@ -440,16 +440,38 @@ gimp_curve_view_draw_point (GimpCurveView *view,
y = 1.0 - y;
-#define RADIUS 3
+#define CIRCLE_RADIUS 3
+#define DIAMOND_RADIUS (G_SQRT2 * CIRCLE_RADIUS)
- cairo_move_to (cr,
- border + (gdouble) (width - 1) * x + RADIUS,
- border + (gdouble) (height - 1) * y);
- cairo_arc (cr,
- border + (gdouble) (width - 1) * x,
- border + (gdouble) (height - 1) * y,
- RADIUS,
- 0, 2 * G_PI);
+ switch (gimp_curve_get_point_type (view->curve, i))
+ {
+ case GIMP_CURVE_POINT_SMOOTH:
+ cairo_move_to (cr,
+ border + (gdouble) (width - 1) * x + CIRCLE_RADIUS,
+ border + (gdouble) (height - 1) * y);
+ cairo_arc (cr,
+ border + (gdouble) (width - 1) * x,
+ border + (gdouble) (height - 1) * y,
+ CIRCLE_RADIUS,
+ 0, 2 * G_PI);
+ break;
+
+ case GIMP_CURVE_POINT_CORNER:
+ cairo_move_to (cr,
+ border + (gdouble) (width - 1) * x,
+ border + (gdouble) (height - 1) * y - DIAMOND_RADIUS);
+ cairo_line_to (cr,
+ border + (gdouble) (width - 1) * x + DIAMOND_RADIUS,
+ border + (gdouble) (height - 1) * y);
+ cairo_line_to (cr,
+ border + (gdouble) (width - 1) * x,
+ border + (gdouble) (height - 1) * y + DIAMOND_RADIUS);
+ cairo_line_to (cr,
+ border + (gdouble) (width - 1) * x - DIAMOND_RADIUS,
+ border + (gdouble) (height - 1) * y);
+ cairo_close_path (cr);
+ break;
+ }
}
static void
@@ -840,10 +862,17 @@ gimp_curve_view_button_press (GtkWidget *widget,
if (point < 0)
{
+ GimpCurvePointType type = GIMP_CURVE_POINT_SMOOTH;
+
if (bevent->state & gimp_get_constrain_behavior_mask ())
y = 1.0 - gimp_curve_map_value (view->orig_curve, x);
+ if (view->selected >= 0)
+ type = gimp_curve_get_point_type (curve, view->selected);
+
point = gimp_curve_add_point (curve, x, 1.0 - y);
+
+ gimp_curve_set_point_type (curve, point, type);
}
if (point > 0)
@@ -862,6 +891,8 @@ gimp_curve_view_button_press (GtkWidget *widget,
view->offset_x = point_x - x;
view->offset_y = (1.0 - point_y) - y;
+
+ view->point_type = gimp_curve_get_point_type (curve, point);
break;
case GIMP_CURVE_FREE:
@@ -975,6 +1006,9 @@ gimp_curve_view_motion_notify (GtkWidget *widget,
gimp_curve_view_set_selected (
view,
gimp_curve_add_point (curve, x, 1.0 - y));
+
+ gimp_curve_set_point_type (curve,
+ view->selected, view->point_type);
}
else
{
diff --git a/app/widgets/gimpcurveview.h b/app/widgets/gimpcurveview.h
index 903c8ec393..add6048b89 100644
--- a/app/widgets/gimpcurveview.h
+++ b/app/widgets/gimpcurveview.h
@@ -50,6 +50,7 @@ struct _GimpCurveView
gint selected;
gdouble offset_x;
gdouble offset_y;
+ GimpCurvePointType point_type;
gdouble last_x;
gdouble last_y;
gdouble leftmost;
diff --git a/icons/Color/16/gimp-curve-point-corner.png b/icons/Color/16/gimp-curve-point-corner.png
new file mode 100644
index 0000000000..2274faa1c8
Binary files /dev/null and b/icons/Color/16/gimp-curve-point-corner.png differ
diff --git a/icons/Color/16/gimp-curve-point-smooth.png b/icons/Color/16/gimp-curve-point-smooth.png
new file mode 100644
index 0000000000..aaf78b74f0
Binary files /dev/null and b/icons/Color/16/gimp-curve-point-smooth.png differ
diff --git a/icons/Color/icon-list.mk b/icons/Color/icon-list.mk
index 1c3edea6c6..8708736f94 100644
--- a/icons/Color/icon-list.mk
+++ b/icons/Color/icon-list.mk
@@ -110,6 +110,8 @@ scalable_images = \
scalable/gimp-convert-rgb.svg \
scalable/gimp-cursor.svg \
scalable/gimp-curve-free.svg \
+ scalable/gimp-curve-point-corner.svg \
+ scalable/gimp-curve-point-smooth.svg \
scalable/gimp-curve-smooth.svg \
scalable/gimp-dashboard.svg \
scalable/gimp-default-colors.svg \
@@ -615,6 +617,8 @@ icons16_images = \
16/gimp-convert-rgb.png \
16/gimp-cursor.png \
16/gimp-curve-free.png \
+ 16/gimp-curve-point-corner.png \
+ 16/gimp-curve-point-smooth.png \
16/gimp-curve-smooth.png \
16/gimp-dashboard.png \
16/gimp-device-status.png \
diff --git a/icons/Color/scalable/gimp-curve-point-corner.svg
b/icons/Color/scalable/gimp-curve-point-corner.svg
new file mode 100644
index 0000000000..0f92e061a1
--- /dev/null
+++ b/icons/Color/scalable/gimp-curve-point-corner.svg
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="16"
+ height="16"
+ id="svg2"
+ viewBox="0 0 16 16"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="gimp-shape-diamond.svg">
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="640"
+ inkscape:window-height="480"
+ id="namedview1695"
+ showgrid="false"
+ inkscape:zoom="14.75"
+ inkscape:cx="-277.86868"
+ inkscape:cy="16.407786"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" />
+ <metadata
+ id="metadata90">
+ <rdf:RDF>
+ <cc:Work>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Gimp Color Icon Theme</dc:title>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>many unknown and unnamed, Andrew Chadwick, Alexandre Prokoudine, Aryeom Han, Benoit
Touchette, Jakub Steiner, Jehan, Johannes Matschke, Kevin Payne, Klaus Staedtler, Marek Dvoroznak, Michael
Natterer</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <dc:description>Enhanced, extended tango-art-libre for GIMP</dc:description>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs7386">
+ <linearGradient
+ gradientTransform="matrix(0,-735328.32,170712.69,0,2464326300,577972450)"
+ osb:paint="solid"
+ id="linearGradient19282">
+ <stop
+ stop-color="#b4b4b4"
+ id="stop19284" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ x1="231.55"
+ x2="320.70001"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6057"
+ gradientTransform="matrix(0.01502614,0,0,0.01468232,2.9686133,1037.3257)">
+ <stop
+ stop-color="#a11f7c"
+ id="stop6053" />
+ <stop
+ stop-opacity="0.984"
+ stop-color="#541f31"
+ offset="1"
+ id="stop6055" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="solid"
+ id="linearGradient5487">
+ <stop
+ id="stop5485"
+ offset="0"
+ style="stop-color:#888a85;stop-opacity:1;" />
+ </linearGradient>
+ </defs>
+ <g
+ style="display:inline"
+ transform="translate(-49.844428,63.91196)"
+ id="stock">
+ <g
+ id="gimp-shape-diamond"
+ style="display:inline"
+ transform="translate(-91.15577,-422.91196)">
+ <rect
+ y="359"
+ x="141.0002"
+ height="16"
+ width="16"
+ id="rect16020"
+ style="fill:none;stroke:none" />
+ <path
+
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m -99,150 7,-7 7,7 -7,7 z"
+ id="path16026-7"
+ transform="translate(241.0002,217)"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+</svg>
diff --git a/icons/Color/scalable/gimp-curve-point-smooth.svg
b/icons/Color/scalable/gimp-curve-point-smooth.svg
new file mode 100644
index 0000000000..cf5806d416
--- /dev/null
+++ b/icons/Color/scalable/gimp-curve-point-smooth.svg
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="16"
+ height="16"
+ id="svg2"
+ viewBox="0 0 16 16"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="gimp-shape-circle.svg">
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="640"
+ inkscape:window-height="480"
+ id="namedview1695"
+ showgrid="false"
+ inkscape:zoom="14.75"
+ inkscape:cx="-278.99683"
+ inkscape:cy="16.506886"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" />
+ <metadata
+ id="metadata90">
+ <rdf:RDF>
+ <cc:Work>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Gimp Color Icon Theme</dc:title>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>many unknown and unnamed, Andrew Chadwick, Alexandre Prokoudine, Aryeom Han, Benoit
Touchette, Jakub Steiner, Jehan, Johannes Matschke, Kevin Payne, Klaus Staedtler, Marek Dvoroznak, Michael
Natterer</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <dc:description>Enhanced, extended tango-art-libre for GIMP</dc:description>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs7386">
+ <linearGradient
+ gradientTransform="matrix(0,-735328.32,170712.69,0,2464326300,577972450)"
+ osb:paint="solid"
+ id="linearGradient19282">
+ <stop
+ stop-color="#b4b4b4"
+ id="stop19284" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="gradient"
+ x1="231.55"
+ x2="320.70001"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6057"
+ gradientTransform="matrix(0.01502614,0,0,0.01468232,2.9686133,1037.3257)">
+ <stop
+ stop-color="#a11f7c"
+ id="stop6053" />
+ <stop
+ stop-opacity="0.984"
+ stop-color="#541f31"
+ offset="1"
+ id="stop6055" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="solid"
+ id="linearGradient5487">
+ <stop
+ id="stop5485"
+ offset="0"
+ style="stop-color:#888a85;stop-opacity:1;" />
+ </linearGradient>
+ </defs>
+ <g
+ style="display:inline"
+ transform="translate(-30.972582,63.81286)"
+ id="stock">
+ <g
+ id="gimp-shape-circle"
+ style="display:inline"
+ transform="translate(-90.027618,-422.81286)">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect15985"
+ width="16"
+ height="16"
+ x="-120"
+ y="142"
+ transform="translate(241.0002,217)" />
+ <circle
+ r="4.5"
+ cy="150.5"
+ cx="-111.5"
+
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.15000007;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path16012-9"
+ transform="matrix(1.3333329,0,0,1.3333327,277.66682,166.33343)" />
+ </g>
+ </g>
+</svg>
diff --git a/icons/Legacy/16/gimp-curve-point-corner.png b/icons/Legacy/16/gimp-curve-point-corner.png
new file mode 100644
index 0000000000..12fc694030
Binary files /dev/null and b/icons/Legacy/16/gimp-curve-point-corner.png differ
diff --git a/icons/Legacy/16/gimp-curve-point-smooth.png b/icons/Legacy/16/gimp-curve-point-smooth.png
new file mode 100644
index 0000000000..c0a8ff41d7
Binary files /dev/null and b/icons/Legacy/16/gimp-curve-point-smooth.png differ
diff --git a/icons/Symbolic/16/gimp-curve-point-corner.png b/icons/Symbolic/16/gimp-curve-point-corner.png
new file mode 100644
index 0000000000..e878973608
Binary files /dev/null and b/icons/Symbolic/16/gimp-curve-point-corner.png differ
diff --git a/icons/Symbolic/16/gimp-curve-point-smooth.png b/icons/Symbolic/16/gimp-curve-point-smooth.png
new file mode 100644
index 0000000000..2bc58cbb87
Binary files /dev/null and b/icons/Symbolic/16/gimp-curve-point-smooth.png differ
diff --git a/icons/Symbolic/scalable/gimp-curve-point-corner.svg
b/icons/Symbolic/scalable/gimp-curve-point-corner.svg
new file mode 100644
index 0000000000..1a74071ecb
--- /dev/null
+++ b/icons/Symbolic/scalable/gimp-curve-point-corner.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ viewBox="0 0 15.999999 16"
+ id="svg7384"
+ height="16"
+ width="16"
+ version="1.1"
+ inkscape:version="0.91+devel r"
+ sodipodi:docname="gimp-shape-diamond.svg">
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1051"
+ inkscape:window-height="432"
+ id="namedview1507"
+ showgrid="false"
+ inkscape:zoom="14.75"
+ inkscape:cx="-313.94434"
+ inkscape:cy="116.92552"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg7384" />
+ <metadata
+ id="metadata90">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Barbara Muraus, Jakub Steiner, Klaus Staedtler</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <dc:description>Images originally created as the "Art Libre" icon set. Extended and
adopted for GIMP</dc:description>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs7386">
+ <linearGradient
+ gradientTransform="matrix(0.34682586,0,0,0.30620888,-13.351872,402.03851)"
+ osb:paint="solid"
+ id="linearGradient19282-4">
+ <stop
+ id="stop19284-0"
+ offset="0"
+ style="stop-color:#bebebe;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(442.70725,172.83693)"
+ gradientUnits="userSpaceOnUse"
+ y2="150"
+ x2="-85"
+ y1="150"
+ x1="-99"
+ id="linearGradient6866"
+ xlink:href="#linearGradient19282-4" />
+ </defs>
+ <g
+ transform="translate(15.103901,-5.80569)"
+ style="display:inline"
+ id="stock">
+ <g
+ id="gimp-shape-diamond"
+ style="display:inline"
+ transform="translate(-156.1041,-353.19431)">
+ <path
+ style="fill:url(#linearGradient6866);fill-opacity:1;stroke:none"
+ d="m -99,150 7,-7 7,7 -7,7 z"
+ id="path16026"
+ transform="translate(241.0002,217)"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+</svg>
diff --git a/icons/Symbolic/scalable/gimp-curve-point-smooth.svg
b/icons/Symbolic/scalable/gimp-curve-point-smooth.svg
new file mode 100644
index 0000000000..aee5c7ecc7
--- /dev/null
+++ b/icons/Symbolic/scalable/gimp-curve-point-smooth.svg
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ viewBox="0 0 15.999999 16"
+ id="svg7384"
+ height="16"
+ width="16"
+ version="1.1"
+ inkscape:version="0.91+devel r"
+ sodipodi:docname="gimp-shape-circle.svg">
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1051"
+ inkscape:window-height="480"
+ id="namedview1507"
+ showgrid="false"
+ inkscape:zoom="14.75"
+ inkscape:cx="-313.13695"
+ inkscape:cy="115.75708"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg7384" />
+ <metadata
+ id="metadata90">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Barbara Muraus, Jakub Steiner, Klaus Staedtler</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <dc:description>Images originally created as the "Art Libre" icon set. Extended and
adopted for GIMP</dc:description>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs7386">
+ <linearGradient
+ gradientTransform="matrix(0.34682586,0,0,0.30620888,-33.35187,402.03851)"
+ osb:paint="solid"
+ id="linearGradient19282-4">
+ <stop
+ id="stop19284-0"
+ offset="0"
+ style="stop-color:#bebebe;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(316.425,128.75143)"
+ gradientUnits="userSpaceOnUse"
+ y2="150.5"
+ x2="-107"
+ y1="150.5"
+ x1="-116"
+ id="linearGradient6860"
+ xlink:href="#linearGradient19282-4" />
+ </defs>
+ <g
+ transform="translate(35.91129,-4.63725)"
+ style="display:inline"
+ id="stock">
+ <g
+ id="gimp-shape-circle"
+ style="display:inline"
+ transform="translate(-156.91149,-354.36275)">
+ <circle
+ r="4.5"
+ cy="150.5"
+ cx="-111.5"
+ style="fill:url(#linearGradient6860);fill-opacity:1;stroke:none"
+ id="path16012"
+ transform="matrix(1.3333329,0,0,1.3333327,277.66682,166.33343)" />
+ </g>
+ </g>
+</svg>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]