2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * label_object.c: GLabels label object base class
6 * Copyright (C) 2001-2002 Jim Evins <evins@snaught.com>.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #include <libart_lgpl/libart.h>
27 #include "label-object.h"
32 /*========================================================*/
34 /*========================================================*/
36 struct _glLabelObjectPrivate {
52 /*========================================================*/
53 /* Private globals. */
54 /*========================================================*/
56 static GObjectClass *parent_class = NULL;
58 static guint signals[LAST_SIGNAL] = {0};
60 static guint instance = 0;
62 /*========================================================*/
63 /* Private function prototypes. */
64 /*========================================================*/
66 static void gl_label_object_class_init (glLabelObjectClass *klass);
67 static void gl_label_object_instance_init (glLabelObject *object);
68 static void gl_label_object_finalize (GObject *object);
70 static void merge_changed_cb (glLabel *label,
71 glLabelObject *object);
73 static void set_size (glLabelObject *object,
77 static void get_size (glLabelObject *object,
82 /*****************************************************************************/
83 /* Boilerplate object stuff. */
84 /*****************************************************************************/
86 gl_label_object_get_type (void)
88 static GType type = 0;
92 sizeof (glLabelObjectClass),
95 (GClassInitFunc) gl_label_object_class_init,
98 sizeof (glLabelObject),
100 (GInstanceInitFunc) gl_label_object_instance_init,
103 type = g_type_register_static (G_TYPE_OBJECT,
104 "glLabelObject", &info, 0);
111 gl_label_object_class_init (glLabelObjectClass *klass)
113 GObjectClass *gobject_class = (GObjectClass *) klass;
114 glLabelObjectClass *object_class = (glLabelObjectClass *) klass;
116 gl_debug (DEBUG_LABEL, "START");
118 parent_class = g_type_class_peek_parent (klass);
120 gobject_class->finalize = gl_label_object_finalize;
122 object_class->set_size = set_size;
123 object_class->get_size = get_size;
126 g_signal_new ("changed",
127 G_OBJECT_CLASS_TYPE (gobject_class),
129 G_STRUCT_OFFSET (glLabelObjectClass, changed),
131 gl_marshal_VOID__VOID,
136 g_signal_new ("moved",
137 G_OBJECT_CLASS_TYPE (gobject_class),
139 G_STRUCT_OFFSET (glLabelObjectClass, moved),
141 gl_marshal_VOID__DOUBLE_DOUBLE,
143 2, G_TYPE_DOUBLE, G_TYPE_DOUBLE);
144 signals[FLIP_ROTATE] =
145 g_signal_new ("flip_rotate",
146 G_OBJECT_CLASS_TYPE (gobject_class),
148 G_STRUCT_OFFSET (glLabelObjectClass, flip_rotate),
150 gl_marshal_VOID__VOID,
155 G_OBJECT_CLASS_TYPE (gobject_class),
157 G_STRUCT_OFFSET (glLabelObjectClass, top),
159 gl_marshal_VOID__VOID,
164 g_signal_new ("bottom",
165 G_OBJECT_CLASS_TYPE (gobject_class),
167 G_STRUCT_OFFSET (glLabelObjectClass, bottom),
169 gl_marshal_VOID__VOID,
173 gl_debug (DEBUG_LABEL, "END");
177 gl_label_object_instance_init (glLabelObject *object)
179 gl_debug (DEBUG_LABEL, "START");
181 object->private = g_new0 (glLabelObjectPrivate, 1);
183 object->private->name = g_strdup_printf ("object%d", instance++);
185 art_affine_identity (object->private->affine);
187 gl_debug (DEBUG_LABEL, "END");
191 gl_label_object_finalize (GObject *object)
195 gl_debug (DEBUG_LABEL, "START");
197 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
199 parent = GL_LABEL_OBJECT(object)->parent;
200 gl_label_remove_object (parent, GL_LABEL_OBJECT(object));
202 g_free (GL_LABEL_OBJECT(object)->private->name);
203 g_free (GL_LABEL_OBJECT(object)->private);
205 G_OBJECT_CLASS (parent_class)->finalize (object);
207 gl_debug (DEBUG_LABEL, "END");
210 /*****************************************************************************/
211 /* New label object. */
212 /*****************************************************************************/
214 gl_label_object_new (glLabel *label)
216 glLabelObject *object;
218 gl_debug (DEBUG_LABEL, "START");
220 object = g_object_new (gl_label_object_get_type(), NULL);
222 gl_label_object_set_parent (object, label);
224 gl_debug (DEBUG_LABEL, "END");
226 return G_OBJECT (object);
229 /*****************************************************************************/
230 /* Duplicate object. */
231 /*****************************************************************************/
233 gl_label_object_dup (glLabelObject *src_object,
236 glLabelObject *dst_object;
240 gl_debug (DEBUG_LABEL, "START");
242 g_return_if_fail (src_object && GL_IS_LABEL_OBJECT (src_object));
244 dst_object = g_object_new (G_OBJECT_TYPE(src_object), NULL);
246 gl_label_object_set_parent (dst_object, label);
248 gl_label_object_get_position (src_object, &x, &y);
249 gl_label_object_get_size (src_object, &w, &h);
250 gl_label_object_get_affine (src_object, affine);
252 gl_label_object_set_position (dst_object, x, y);
253 gl_label_object_set_size (dst_object, w, h);
254 gl_label_object_set_affine (dst_object, affine);
256 if ( GL_LABEL_OBJECT_GET_CLASS(src_object)->copy != NULL ) {
258 /* We have an object specific method, use it */
259 GL_LABEL_OBJECT_GET_CLASS(src_object)->copy (dst_object, src_object);
263 gl_debug (DEBUG_LABEL, "END");
268 /*****************************************************************************/
269 /* Emit "changed" signal (for derived objects). */
270 /*****************************************************************************/
272 gl_label_object_emit_changed (glLabelObject *object)
274 gl_debug (DEBUG_LABEL, "START");
276 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
278 g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
280 gl_debug (DEBUG_LABEL, "END");
283 /*****************************************************************************/
284 /* Set parent label of object. */
285 /*****************************************************************************/
287 gl_label_object_set_parent (glLabelObject *object,
292 gl_debug (DEBUG_LABEL, "START");
294 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
295 g_return_if_fail (label && GL_IS_LABEL (label));
297 old_parent = object->parent;
298 if ( old_parent != NULL ) {
299 g_signal_handlers_disconnect_by_func (old_parent,
300 G_CALLBACK(merge_changed_cb),
302 gl_label_remove_object( old_parent, object );
304 gl_label_add_object( label, object );
306 g_signal_connect (G_OBJECT(label), "merge_changed",
307 G_CALLBACK(merge_changed_cb), object);
309 g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
311 gl_debug (DEBUG_LABEL, "END");
314 /*****************************************************************************/
315 /* Get parent label of object. */
316 /*****************************************************************************/
318 gl_label_object_get_parent (glLabelObject *object)
320 gl_debug (DEBUG_LABEL, "START");
322 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
324 gl_debug (DEBUG_LABEL, "END");
326 return object->parent;
329 /*****************************************************************************/
330 /* Set name of object. */
331 /*****************************************************************************/
333 gl_label_object_set_name (glLabelObject *object,
336 gl_debug (DEBUG_LABEL, "START");
338 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
340 g_free(object->private->name);
341 object->private->name = name;
343 g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
345 gl_debug (DEBUG_LABEL, "END");
348 /*****************************************************************************/
349 /* Get name of object. */
350 /*****************************************************************************/
352 gl_label_object_get_name (glLabelObject *object)
354 gl_debug (DEBUG_LABEL, "START");
356 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
358 gl_debug (DEBUG_LABEL, "END");
360 return g_strdup(object->private->name);
363 /*****************************************************************************/
364 /* Set position of object. */
365 /*****************************************************************************/
367 gl_label_object_set_position (glLabelObject *object,
373 gl_debug (DEBUG_LABEL, "START");
375 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
377 dx = x - object->private->x;
378 dy = y - object->private->y;
380 object->private->x = x;
381 object->private->y = y;
383 g_signal_emit (G_OBJECT(object), signals[MOVED], 0, dx, dy);
385 gl_debug (DEBUG_LABEL, "END");
388 /*****************************************************************************/
389 /* Set position of object relative to old position. */
390 /*****************************************************************************/
392 gl_label_object_set_position_relative (glLabelObject *object,
396 gl_debug (DEBUG_LABEL, "START");
398 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
400 object->private->x += dx;
401 object->private->y += dy;
403 gl_debug (DEBUG_LABEL, " x = %f, y= %f",
407 g_signal_emit (G_OBJECT(object), signals[MOVED], 0, dx, dy);
409 gl_debug (DEBUG_LABEL, "END");
412 /*****************************************************************************/
413 /* Get position of object. */
414 /*****************************************************************************/
416 gl_label_object_get_position (glLabelObject *object,
420 gl_debug (DEBUG_LABEL, "START");
422 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
424 *x = object->private->x;
425 *y = object->private->y;
427 gl_debug (DEBUG_LABEL, "END");
430 /*---------------------------------------------------------------------------*/
431 /* PRIVATE. Default set size method. */
432 /*---------------------------------------------------------------------------*/
434 set_size (glLabelObject *object,
438 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
440 object->private->w = w;
441 object->private->h = h;
444 /*****************************************************************************/
445 /* Set size of object. */
446 /*****************************************************************************/
448 gl_label_object_set_size (glLabelObject *object,
452 gl_debug (DEBUG_LABEL, "START");
454 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
456 if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_size != NULL ) {
458 /* We have an object specific method, use it */
459 GL_LABEL_OBJECT_GET_CLASS(object)->set_size (object, w, h);
463 set_size (object, w, h);
467 g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
469 gl_debug (DEBUG_LABEL, "END");
472 /*---------------------------------------------------------------------------*/
473 /* PRIVATE. Default get size method. */
474 /*---------------------------------------------------------------------------*/
476 get_size (glLabelObject *object,
480 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
482 *w = object->private->w;
483 *h = object->private->h;
486 /*****************************************************************************/
487 /* Get size of object. */
488 /*****************************************************************************/
490 gl_label_object_get_size (glLabelObject *object,
494 gl_debug (DEBUG_LABEL, "START");
496 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
498 if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_size != NULL ) {
500 /* We have an object specific method, use it */
501 GL_LABEL_OBJECT_GET_CLASS(object)->get_size (object, w, h);
505 get_size (object, w, h);
509 gl_debug (DEBUG_LABEL, "END");
512 /*****************************************************************************/
513 /* Get extent of object. */
514 /*****************************************************************************/
516 gl_label_object_get_extent (glLabelObject *object,
523 ArtPoint a1, a2, a3, a4, b1, b2, b3, b4;
526 gl_debug (DEBUG_LABEL, "START");
528 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
530 gl_label_object_get_size (object, &w, &h);
532 /* setup untransformed corners of bounding box */
542 /* transform these points */
543 gl_label_object_get_affine (object, affine);
544 art_affine_point (&b1, &a1, affine);
545 art_affine_point (&b2, &a2, affine);
546 art_affine_point (&b3, &a3, affine);
547 art_affine_point (&b4, &a4, affine);
549 /* now find the maximum extent of these points in x and y */
550 *x1 = MIN (b1.x, MIN (b2.x, MIN (b3.x, b4.x))) + object->private->x;
551 *y1 = MIN (b1.y, MIN (b2.y, MIN (b3.y, b4.y))) + object->private->y;
552 *x2 = MAX (b1.x, MAX (b2.x, MAX (b3.x, b4.x))) + object->private->x;
553 *y2 = MAX (b1.y, MAX (b2.y, MAX (b3.y, b4.y))) + object->private->y;
555 gl_debug (DEBUG_LABEL, "END");
558 /*****************************************************************************/
559 /* Can text properties be set for this object? */
560 /*****************************************************************************/
562 gl_label_object_can_text (glLabelObject *object)
564 gl_debug (DEBUG_LABEL, "");
566 g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE);
568 if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_font_family != NULL ) {
580 /*****************************************************************************/
581 /* Set font family for all text contained in object. */
582 /*****************************************************************************/
584 gl_label_object_set_font_family (glLabelObject *object,
585 const gchar *font_family)
587 gl_debug (DEBUG_LABEL, "START");
589 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
591 if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_font_family != NULL ) {
593 /* We have an object specific method, use it */
594 GL_LABEL_OBJECT_GET_CLASS(object)->set_font_family (object, font_family);
598 gl_debug (DEBUG_LABEL, "END");
601 /****************************************************************************/
602 /* Set font size for all text contained in object. */
603 /****************************************************************************/
605 gl_label_object_set_font_size (glLabelObject *object,
608 gl_debug (DEBUG_LABEL, "START");
610 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
612 if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_font_size != NULL ) {
614 /* We have an object specific method, use it */
615 GL_LABEL_OBJECT_GET_CLASS(object)->set_font_size (object, font_size);
619 gl_debug (DEBUG_LABEL, "END");
622 /****************************************************************************/
623 /* Set font weight for all text contained in object. */
624 /****************************************************************************/
626 gl_label_object_set_font_weight (glLabelObject *object,
627 GnomeFontWeight font_weight)
629 gl_debug (DEBUG_LABEL, "START");
631 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
633 if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_font_weight != NULL ) {
635 /* We have an object specific method, use it */
636 GL_LABEL_OBJECT_GET_CLASS(object)->set_font_weight (object, font_weight);
640 gl_debug (DEBUG_LABEL, "END");
643 /****************************************************************************/
644 /* Set font italic flag for all text contained in object. */
645 /****************************************************************************/
647 gl_label_object_set_font_italic_flag (glLabelObject *object,
648 gboolean font_italic_flag)
650 gl_debug (DEBUG_LABEL, "START");
652 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
654 if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_font_italic_flag != NULL ) {
656 /* We have an object specific method, use it */
657 GL_LABEL_OBJECT_GET_CLASS(object)->set_font_italic_flag (object,
662 gl_debug (DEBUG_LABEL, "END");
665 /****************************************************************************/
666 /* Set text alignment for all text contained in object. */
667 /****************************************************************************/
669 gl_label_object_set_text_alignment (glLabelObject *object,
670 GtkJustification text_alignment)
672 gl_debug (DEBUG_LABEL, "START");
674 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
676 if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_text_alignment != NULL ) {
678 /* We have an object specific method, use it */
679 GL_LABEL_OBJECT_GET_CLASS(object)->set_text_alignment (object,
684 gl_debug (DEBUG_LABEL, "END");
687 /****************************************************************************/
688 /* Set text line spacing for all text contained in object. */
689 /****************************************************************************/
691 gl_label_object_set_text_line_spacing (glLabelObject *object,
692 gdouble text_line_spacing)
694 gl_debug (DEBUG_LABEL, "START");
696 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
698 if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_text_line_spacing != NULL ) {
700 /* We have an object specific method, use it */
701 GL_LABEL_OBJECT_GET_CLASS(object)->set_text_line_spacing (object, text_line_spacing);
705 gl_debug (DEBUG_LABEL, "END");
708 /****************************************************************************/
709 /* Set text color for all text contained in object. */
710 /****************************************************************************/
712 gl_label_object_set_text_color (glLabelObject *object,
715 gl_debug (DEBUG_LABEL, "START");
717 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
719 if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_text_color != NULL ) {
721 /* We have an object specific method, use it */
722 GL_LABEL_OBJECT_GET_CLASS(object)->set_text_color (object, text_color);
726 gl_debug (DEBUG_LABEL, "END");
729 /*****************************************************************************/
730 /* Get font family for all text contained in object. */
731 /*****************************************************************************/
733 gl_label_object_get_font_family (glLabelObject *object)
737 gl_debug (DEBUG_LABEL, "START");
739 g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), NULL);
741 if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_font_family != NULL ) {
743 /* We have an object specific method, use it */
744 ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_font_family (object);
748 gl_debug (DEBUG_LABEL, "END");
753 /****************************************************************************/
754 /* Get font size for all text contained in object. */
755 /****************************************************************************/
757 gl_label_object_get_font_size (glLabelObject *object)
761 gl_debug (DEBUG_LABEL, "START");
763 g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0.0);
765 if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_font_size != NULL ) {
767 /* We have an object specific method, use it */
768 ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_font_size (object);
772 gl_debug (DEBUG_LABEL, "END");
777 /****************************************************************************/
778 /* Get font weight for all text contained in object. */
779 /****************************************************************************/
781 gl_label_object_get_font_weight (glLabelObject *object)
783 GnomeFontWeight ret = GNOME_FONT_BOOK;
785 gl_debug (DEBUG_LABEL, "START");
787 g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), GNOME_FONT_BOOK);
789 if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_font_weight != NULL ) {
791 /* We have an object specific method, use it */
792 ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_font_weight (object);
796 gl_debug (DEBUG_LABEL, "END");
801 /****************************************************************************/
802 /* Get font italic flag for all text contained in object. */
803 /****************************************************************************/
805 gl_label_object_get_font_italic_flag (glLabelObject *object)
807 gboolean ret = FALSE;
809 gl_debug (DEBUG_LABEL, "START");
811 g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE);
813 if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_font_italic_flag != NULL ) {
815 /* We have an object specific method, use it */
816 ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_font_italic_flag (object);
820 gl_debug (DEBUG_LABEL, "END");
825 /****************************************************************************/
826 /* Get text alignment for all text contained in object. */
827 /****************************************************************************/
829 gl_label_object_get_text_alignment (glLabelObject *object)
831 GtkJustification ret = GTK_JUSTIFY_LEFT;
833 gl_debug (DEBUG_LABEL, "START");
835 g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), GTK_JUSTIFY_LEFT);
837 if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_text_alignment != NULL ) {
839 /* We have an object specific method, use it */
840 ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_text_alignment (object);
844 gl_debug (DEBUG_LABEL, "END");
849 /****************************************************************************/
850 /* Get text line spacing for all text contained in object. */
851 /****************************************************************************/
853 gl_label_object_get_text_line_spacing (glLabelObject *object)
857 gl_debug (DEBUG_LABEL, "START");
859 g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0.0);
861 if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_text_line_spacing != NULL ) {
863 /* We have an object specific method, use it */
864 ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_text_line_spacing (object);
868 gl_debug (DEBUG_LABEL, "END");
873 /****************************************************************************/
874 /* Get text color for all text contained in object. */
875 /****************************************************************************/
877 gl_label_object_get_text_color (glLabelObject *object)
881 gl_debug (DEBUG_LABEL, "START");
883 g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0);
885 if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_text_color != NULL ) {
887 /* We have an object specific method, use it */
888 ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_text_color (object);
892 gl_debug (DEBUG_LABEL, "END");
897 /*****************************************************************************/
898 /* Can fill properties be set for this object? */
899 /*****************************************************************************/
901 gl_label_object_can_fill (glLabelObject *object)
903 gl_debug (DEBUG_LABEL, "");
905 g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE);
907 if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_fill_color != NULL ) {
919 /****************************************************************************/
920 /* Set fill color for object. */
921 /****************************************************************************/
923 gl_label_object_set_fill_color (glLabelObject *object,
926 gl_debug (DEBUG_LABEL, "START");
928 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
930 if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_fill_color != NULL ) {
932 /* We have an object specific method, use it */
933 GL_LABEL_OBJECT_GET_CLASS(object)->set_fill_color (object, fill_color);
937 gl_debug (DEBUG_LABEL, "END");
940 /****************************************************************************/
941 /* Get fill color for object. */
942 /****************************************************************************/
944 gl_label_object_get_fill_color (glLabelObject *object)
948 gl_debug (DEBUG_LABEL, "START");
950 g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0);
952 if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_fill_color != NULL ) {
954 /* We have an object specific method, use it */
955 ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_fill_color (object);
959 gl_debug (DEBUG_LABEL, "END");
964 /*****************************************************************************/
965 /* Can line color property be set for this object? */
966 /*****************************************************************************/
968 gl_label_object_can_line_color (glLabelObject *object)
970 gl_debug (DEBUG_LABEL, "");
972 g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE);
974 if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_line_color != NULL ) {
986 /****************************************************************************/
987 /* Set line color for object. */
988 /****************************************************************************/
990 gl_label_object_set_line_color (glLabelObject *object,
993 gl_debug (DEBUG_LABEL, "START");
995 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
997 if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_line_color != NULL ) {
999 /* We have an object specific method, use it */
1000 GL_LABEL_OBJECT_GET_CLASS(object)->set_line_color (object, line_color);
1004 gl_debug (DEBUG_LABEL, "END");
1007 /****************************************************************************/
1008 /* Get line color for object. */
1009 /****************************************************************************/
1011 gl_label_object_get_line_color (glLabelObject *object)
1015 gl_debug (DEBUG_LABEL, "START");
1017 g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0);
1019 if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_line_color != NULL ) {
1021 /* We have an object specific method, use it */
1022 ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_line_color (object);
1026 gl_debug (DEBUG_LABEL, "END");
1031 /*****************************************************************************/
1032 /* Can line width property be set for this object? */
1033 /*****************************************************************************/
1035 gl_label_object_can_line_width (glLabelObject *object)
1037 gl_debug (DEBUG_LABEL, "");
1039 g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE);
1041 if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_line_width != NULL ) {
1053 /****************************************************************************/
1054 /* Set line width for object. */
1055 /****************************************************************************/
1057 gl_label_object_set_line_width (glLabelObject *object,
1060 gl_debug (DEBUG_LABEL, "START");
1062 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
1064 if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_line_width != NULL ) {
1066 /* We have an object specific method, use it */
1067 GL_LABEL_OBJECT_GET_CLASS(object)->set_line_width (object, line_width);
1071 gl_debug (DEBUG_LABEL, "END");
1074 /****************************************************************************/
1075 /* Get line width for object. */
1076 /****************************************************************************/
1078 gl_label_object_get_line_width (glLabelObject *object)
1082 gl_debug (DEBUG_LABEL, "START");
1084 g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0.0);
1086 if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_line_width != NULL ) {
1088 /* We have an object specific method, use it */
1089 ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_line_width (object);
1093 gl_debug (DEBUG_LABEL, "END");
1098 /****************************************************************************/
1099 /* Flip object horizontally. */
1100 /****************************************************************************/
1102 gl_label_object_flip_horiz (glLabelObject *object)
1104 gdouble flip_affine[6];
1106 gl_debug (DEBUG_LABEL, "START");
1108 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
1110 art_affine_scale (flip_affine, -1.0, 1.0);
1111 art_affine_multiply (object->private->affine, object->private->affine, flip_affine);
1113 g_signal_emit (G_OBJECT(object), signals[FLIP_ROTATE], 0);
1115 gl_debug (DEBUG_LABEL, "END");
1118 /****************************************************************************/
1119 /* Flip object vertically. */
1120 /****************************************************************************/
1122 gl_label_object_flip_vert (glLabelObject *object)
1124 gdouble flip_affine[6];
1126 gl_debug (DEBUG_LABEL, "START");
1128 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
1130 art_affine_scale (flip_affine, 1.0, -1.0);
1131 art_affine_multiply (object->private->affine, object->private->affine, flip_affine);
1133 g_signal_emit (G_OBJECT(object), signals[FLIP_ROTATE], 0);
1135 gl_debug (DEBUG_LABEL, "END");
1138 /****************************************************************************/
1139 /* Rotate object. */
1140 /****************************************************************************/
1142 gl_label_object_rotate (glLabelObject *object,
1145 gdouble rotate_affine[6];
1147 gl_debug (DEBUG_LABEL, "START");
1149 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
1151 art_affine_rotate (rotate_affine, theta_degs);
1152 art_affine_multiply (object->private->affine, object->private->affine, rotate_affine);
1154 g_signal_emit (G_OBJECT(object), signals[FLIP_ROTATE], 0);
1156 gl_debug (DEBUG_LABEL, "END");
1159 /****************************************************************************/
1160 /* Set raw affine */
1161 /****************************************************************************/
1163 gl_label_object_set_affine (glLabelObject *object,
1166 gl_debug (DEBUG_LABEL, "");
1168 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
1170 object->private->affine[0] = affine[0];
1171 object->private->affine[1] = affine[1];
1172 object->private->affine[2] = affine[2];
1173 object->private->affine[3] = affine[3];
1174 object->private->affine[4] = affine[4];
1175 object->private->affine[5] = affine[5];
1178 /****************************************************************************/
1179 /* Get raw affine */
1180 /****************************************************************************/
1182 gl_label_object_get_affine (glLabelObject *object,
1185 gl_debug (DEBUG_LABEL, "");
1187 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
1189 affine[0] = object->private->affine[0];
1190 affine[1] = object->private->affine[1];
1191 affine[2] = object->private->affine[2];
1192 affine[3] = object->private->affine[3];
1193 affine[4] = object->private->affine[4];
1194 affine[5] = object->private->affine[5];
1197 /****************************************************************************/
1198 /* Get i2w affine, i.e. applied affine + translation. */
1199 /****************************************************************************/
1201 gl_label_object_get_i2w_affine (glLabelObject *object,
1205 gdouble translation[6];
1207 gl_debug (DEBUG_LABEL, "");
1209 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
1211 gl_label_object_get_affine (object, affine);
1212 gl_label_object_get_position (object, &x, &y);
1214 art_affine_translate (translation, x, y);
1215 art_affine_multiply (affine, affine, translation);
1218 /****************************************************************************/
1219 /* Get w2i affine, i.e. inverse of applied affine + translation. */
1220 /****************************************************************************/
1222 gl_label_object_get_w2i_affine (glLabelObject *object,
1226 gl_debug (DEBUG_LABEL, "");
1228 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
1230 gl_label_object_get_i2w_affine (object, i2w);
1231 art_affine_invert (affine, i2w);
1234 /****************************************************************************/
1235 /* Bring label object to front/top. */
1236 /****************************************************************************/
1238 gl_label_object_raise_to_top (glLabelObject *object)
1242 gl_debug (DEBUG_LABEL, "START");
1244 label = object->parent;
1246 gl_label_raise_object_to_top (label, object);
1248 g_signal_emit (G_OBJECT(object), signals[TOP], 0);
1250 gl_debug (DEBUG_LABEL, "END");
1253 /****************************************************************************/
1254 /* Send label object to rear/bottom. */
1255 /****************************************************************************/
1257 gl_label_object_lower_to_bottom (glLabelObject *object)
1261 gl_debug (DEBUG_LABEL, "START");
1263 label = object->parent;
1265 gl_label_lower_object_to_bottom (label, object);
1267 g_signal_emit (G_OBJECT(object), signals[BOTTOM], 0);
1269 gl_debug (DEBUG_LABEL, "END");
1272 /*--------------------------------------------------------------------------*/
1273 /* PRIVATE. Label's merge data changed callback. */
1274 /*--------------------------------------------------------------------------*/
1276 merge_changed_cb (glLabel *label,
1277 glLabelObject *object)
1279 gl_label_object_emit_changed (object);