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.
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
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].type = GIMP_CURVE_POINT_SMOOTH;
|
||||
|
||||
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,7 +743,7 @@ 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++)
|
||||
{
|
||||
|
@ -659,10 +752,12 @@ gimp_curve_set_curve_type (GimpCurve *curve,
|
|||
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,7 +890,7 @@ gimp_curve_add_point (GimpCurve *curve,
|
|||
gdouble x,
|
||||
gdouble y)
|
||||
{
|
||||
GimpVector2 *points;
|
||||
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].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,7 +1124,7 @@ gimp_curve_calculate (GimpCurve *curve)
|
|||
/* Initialize boundary curve points */
|
||||
if (curve->n_points > 0)
|
||||
{
|
||||
GimpVector2 point;
|
||||
GimpCurvePoint point;
|
||||
gint boundary;
|
||||
|
||||
point = curve->points[0];
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -30,8 +30,17 @@
|
|||
#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;
|
||||
|
@ -39,7 +48,7 @@ struct _GimpCurve
|
|||
GimpCurveType curve_type;
|
||||
|
||||
gint n_points;
|
||||
GimpVector2 *points;
|
||||
GimpCurvePoint *points;
|
||||
|
||||
gint n_samples;
|
||||
gdouble *samples;
|
||||
|
@ -94,6 +103,11 @@ 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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -46,6 +46,7 @@ struct _GimpCurvesTool
|
|||
GtkWidget *point_box;
|
||||
GtkWidget *point_input;
|
||||
GtkWidget *point_output;
|
||||
GtkWidget *point_type;
|
||||
GtkWidget *curve_type;
|
||||
|
||||
/* export dialog */
|
||||
|
|
|
@ -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)
|
||||
|
||||
switch (gimp_curve_get_point_type (view->curve, i))
|
||||
{
|
||||
case GIMP_CURVE_POINT_SMOOTH:
|
||||
cairo_move_to (cr,
|
||||
border + (gdouble) (width - 1) * x + RADIUS,
|
||||
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,
|
||||
RADIUS,
|
||||
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
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
BIN
icons/Color/16/gimp-curve-point-corner.png
Normal file
After Width: | Height: | Size: 422 B |
BIN
icons/Color/16/gimp-curve-point-smooth.png
Normal file
After Width: | Height: | Size: 541 B |
|
@ -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 \
|
||||
|
|
113
icons/Color/scalable/gimp-curve-point-corner.svg
Normal file
|
@ -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>
|
After Width: | Height: | Size: 3.5 KiB |
115
icons/Color/scalable/gimp-curve-point-smooth.svg
Normal file
|
@ -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>
|
After Width: | Height: | Size: 3.5 KiB |
BIN
icons/Legacy/16/gimp-curve-point-corner.png
Normal file
After Width: | Height: | Size: 124 B |
BIN
icons/Legacy/16/gimp-curve-point-smooth.png
Normal file
After Width: | Height: | Size: 155 B |
BIN
icons/Symbolic/16/gimp-curve-point-corner.png
Normal file
After Width: | Height: | Size: 306 B |
BIN
icons/Symbolic/16/gimp-curve-point-smooth.png
Normal file
After Width: | Height: | Size: 387 B |
94
icons/Symbolic/scalable/gimp-curve-point-corner.svg
Normal file
|
@ -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>
|
After Width: | Height: | Size: 2.9 KiB |
95
icons/Symbolic/scalable/gimp-curve-point-smooth.svg
Normal file
|
@ -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>
|
After Width: | Height: | Size: 2.9 KiB |