60
static void gimp_vectors_class_init (GimpVectorsClass *klass);
61
static void gimp_vectors_init (GimpVectors *vectors);
63
61
static void gimp_vectors_finalize (GObject *object);
65
63
static gint64 gimp_vectors_get_memsize (GimpObject *object,
106
104
GimpInterpolationType interp_type,
107
105
gboolean supersample,
108
106
gint recursion_level,
109
gboolean clip_result,
107
GimpTransformResize clip_result,
110
108
GimpProgress *progress);
111
109
static gboolean gimp_vectors_stroke (GimpItem *item,
112
110
GimpDrawable *drawable,
113
GimpContext *context,
114
111
GimpStrokeDesc *stroke_desc);
116
113
static void gimp_vectors_real_thaw (GimpVectors *vectors);
141
138
static GimpVectors * gimp_vectors_real_make_bezier (const GimpVectors *vectors);
144
/* private variables */
141
G_DEFINE_TYPE (GimpVectors, gimp_vectors, GIMP_TYPE_ITEM)
143
#define parent_class gimp_vectors_parent_class
146
145
static guint gimp_vectors_signals[LAST_SIGNAL] = { 0 };
148
static GimpItemClass *parent_class = NULL;
152
gimp_vectors_get_type (void)
154
static GType vectors_type = 0;
158
static const GTypeInfo vectors_info =
160
sizeof (GimpVectorsClass),
161
(GBaseInitFunc) NULL,
162
(GBaseFinalizeFunc) NULL,
163
(GClassInitFunc) gimp_vectors_class_init,
164
NULL, /* class_finalize */
165
NULL, /* class_data */
166
sizeof (GimpVectors),
168
(GInstanceInitFunc) gimp_vectors_init,
171
vectors_type = g_type_register_static (GIMP_TYPE_ITEM,
180
149
gimp_vectors_class_init (GimpVectorsClass *klass)
182
GObjectClass *object_class;
183
GimpObjectClass *gimp_object_class;
184
GimpViewableClass *viewable_class;
185
GimpItemClass *item_class;
187
object_class = G_OBJECT_CLASS (klass);
188
gimp_object_class = GIMP_OBJECT_CLASS (klass);
189
viewable_class = GIMP_VIEWABLE_CLASS (klass);
190
item_class = GIMP_ITEM_CLASS (klass);
192
parent_class = g_type_class_peek_parent (klass);
151
GObjectClass *object_class = G_OBJECT_CLASS (klass);
152
GimpObjectClass *gimp_object_class = GIMP_OBJECT_CLASS (klass);
153
GimpViewableClass *viewable_class = GIMP_VIEWABLE_CLASS (klass);
154
GimpItemClass *item_class = GIMP_ITEM_CLASS (klass);
194
156
gimp_vectors_signals[FREEZE] =
195
157
g_signal_new ("freeze",
261
223
GimpItem *item = GIMP_ITEM (vectors);
263
item->visible = FALSE;
264
vectors->strokes = NULL;
265
vectors->freeze_count = 0;
225
item->visible = FALSE;
226
vectors->strokes = NULL;
227
vectors->last_stroke_ID = 0;
228
vectors->freeze_count = 0;
229
vectors->precision = 0.2;
302
266
gimp_vectors_is_attached (GimpItem *item)
304
return (GIMP_IS_IMAGE (item->gimage) &&
305
gimp_container_have (item->gimage->vectors, GIMP_OBJECT (item)));
268
return (GIMP_IS_IMAGE (item->image) &&
269
gimp_container_have (item->image->vectors, GIMP_OBJECT (item)));
308
272
static GimpItem *
311
275
gboolean add_alpha)
313
GimpVectors *vectors;
315
GimpVectors *new_vectors;
317
279
g_return_val_if_fail (g_type_is_a (new_type, GIMP_TYPE_VECTORS), NULL);
319
281
new_item = GIMP_ITEM_CLASS (parent_class)->duplicate (item, new_type,
322
if (! GIMP_IS_VECTORS (new_item))
325
vectors = GIMP_VECTORS (item);
326
new_vectors = GIMP_VECTORS (new_item);
328
gimp_vectors_copy_strokes (vectors, new_vectors);
284
if (GIMP_IS_VECTORS (new_item))
286
GimpVectors *vectors = GIMP_VECTORS (item);
287
GimpVectors *new_vectors = GIMP_VECTORS (new_item);
289
gimp_vectors_copy_strokes (vectors, new_vectors);
382
344
gimp_vectors_freeze (vectors);
384
gimp_image_undo_push_vectors_mod (image, NULL, vectors);
346
if (gimp_item_is_attached (item))
347
gimp_image_undo_push_vectors_mod (image, NULL, vectors);
386
349
for (list = vectors->strokes; list; list = g_list_next (list))
414
377
gimp_vectors_freeze (vectors);
416
gimp_image_undo_push_vectors_mod (image, NULL, vectors);
379
if (gimp_item_is_attached (item))
380
gimp_image_undo_push_vectors_mod (image, NULL, vectors);
418
382
for (list = vectors->strokes; list; list = g_list_next (list))
440
404
GimpMatrix3 matrix;
442
gimp_transform_matrix_flip (flip_type, axis, &matrix);
406
gimp_matrix3_identity (&matrix);
407
gimp_transform_matrix_flip (&matrix, flip_type, axis);
444
409
gimp_vectors_freeze (vectors);
468
433
GimpVectors *vectors = GIMP_VECTORS (item);
470
435
GimpMatrix3 matrix;
478
case GIMP_ROTATE_180:
481
case GIMP_ROTATE_270:
486
gimp_transform_matrix_rotate_center (center_x, center_y, angle, &matrix);
437
gimp_matrix3_identity (&matrix);
438
gimp_transform_matrix_rotate (&matrix, rotate_type, center_x, center_y);
488
440
gimp_vectors_freeze (vectors);
541
493
gimp_vectors_stroke (GimpItem *item,
542
494
GimpDrawable *drawable,
543
GimpContext *context,
544
495
GimpStrokeDesc *stroke_desc)
546
497
GimpVectors *vectors = GIMP_VECTORS (item);
547
498
gboolean retval = FALSE;
500
/* return successfully on an empty path, there's nothing to stroke */
549
501
if (! vectors->strokes)
551
g_message (_("Cannot stroke empty path."));
555
504
switch (stroke_desc->method)
592
541
/* public functions */
595
gimp_vectors_new (GimpImage *gimage,
544
gimp_vectors_new (GimpImage *image,
596
545
const gchar *name)
598
547
GimpVectors *vectors;
600
g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL);
549
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
602
551
vectors = g_object_new (GIMP_TYPE_VECTORS, NULL);
604
gimp_item_configure (GIMP_ITEM (vectors), gimage,
605
0, 0, gimage->width, gimage->height,
553
gimp_item_configure (GIMP_ITEM (vectors), image,
554
0, 0, image->width, image->height,
672
622
while (current_lstroke)
674
624
current_lstroke->data = gimp_stroke_duplicate (current_lstroke->data);
625
dest_vectors->last_stroke_ID ++;
626
gimp_stroke_set_ID (current_lstroke->data,
627
dest_vectors->last_stroke_ID);
675
628
current_lstroke = g_list_next (current_lstroke);
704
655
/* Don't g_list_prepend() here. See ChangeLog 2003-05-21 --Mitch */
706
657
vectors->strokes = g_list_append (vectors->strokes, stroke);
658
vectors->last_stroke_ID ++;
659
gimp_stroke_set_ID (stroke, vectors->last_stroke_ID);
707
660
g_object_ref (stroke);
693
gimp_vectors_get_n_strokes (const GimpVectors *vectors)
695
g_return_val_if_fail (GIMP_IS_VECTORS (vectors), 0);
697
return g_list_length (vectors->strokes);
741
702
gimp_vectors_stroke_get (const GimpVectors *vectors,
776
737
return minstroke;
741
gimp_vectors_stroke_get_by_ID (const GimpVectors *vectors,
746
g_return_val_if_fail (GIMP_IS_VECTORS (vectors), NULL);
748
for (stroke = vectors->strokes; stroke; stroke = g_list_next (stroke))
750
if (gimp_stroke_get_ID (stroke->data) == id)
781
759
gimp_vectors_stroke_get_next (const GimpVectors *vectors,
811
789
gimp_vectors_stroke_get_length (const GimpVectors *vectors,
812
const GimpStroke *prev)
790
const GimpStroke *stroke)
814
792
g_return_val_if_fail (GIMP_IS_VECTORS (vectors), 0.0);
793
g_return_val_if_fail (GIMP_IS_STROKE (stroke), 0.0);
816
return GIMP_VECTORS_GET_CLASS (vectors)->stroke_get_length (vectors, prev);
795
return GIMP_VECTORS_GET_CLASS (vectors)->stroke_get_length (vectors, stroke);
820
799
gimp_vectors_real_stroke_get_length (const GimpVectors *vectors,
821
const GimpStroke *prev)
800
const GimpStroke *stroke)
823
g_printerr ("gimp_vectors_stroke_get_length: default implementation\n");
802
g_return_val_if_fail (GIMP_IS_VECTORS (vectors), 0.0);
803
g_return_val_if_fail (GIMP_IS_STROKE (stroke), 0.0);
805
return (gimp_stroke_get_length (stroke, vectors->precision));