]> git.sur5r.net Git - glabels/blobdiff - glabels2/src/label-object.c
Organized master branch to be top-level directory for glabels, instead of
[glabels] / glabels2 / src / label-object.c
diff --git a/glabels2/src/label-object.c b/glabels2/src/label-object.c
deleted file mode 100644 (file)
index 89cefc9..0000000
+++ /dev/null
@@ -1,1594 +0,0 @@
-/*
- *  label-object.c
- *  Copyright (C) 2001-2009  Jim Evins <evins@snaught.com>.
- *
- *  This file is part of gLabels.
- *
- *  gLabels is free software: you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation, either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  gLabels is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with gLabels.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <config.h>
-
-#include "label-object.h"
-
-#include <glib.h>
-#include <math.h>
-
-#include "marshal.h"
-
-#include "debug.h"
-
-
-/*========================================================*/
-/* Private defines.                                       */
-/*========================================================*/
-
-#define DEFAULT_SHADOW_X_OFFSET (3.6)
-#define DEFAULT_SHADOW_Y_OFFSET (3.6)
-#define DEFAULT_SHADOW_OPACITY  (0.5)
-
-
-/*========================================================*/
-/* Private types.                                         */
-/*========================================================*/
-
-struct _glLabelObjectPrivate {
-       gchar             *name;
-       gdouble            x, y;
-       gdouble            w, h;
-        cairo_matrix_t     matrix;
-
-       gdouble            aspect_ratio;
-
-       gboolean           shadow_state;
-       gdouble            shadow_x;
-       gdouble            shadow_y;
-       glColorNode       *shadow_color_node;
-       gdouble            shadow_opacity;
-};
-
-enum {
-       CHANGED,
-       MOVED,
-       FLIP_ROTATE,
-       TOP,
-       BOTTOM,
-        REMOVED,
-       LAST_SIGNAL
-};
-
-
-/*========================================================*/
-/* Private globals.                                       */
-/*========================================================*/
-
-static guint signals[LAST_SIGNAL] = {0};
-
-static guint instance = 0;
-
-
-/*========================================================*/
-/* Private function prototypes.                           */
-/*========================================================*/
-
-static void gl_label_object_finalize      (GObject            *object);
-
-static void merge_changed_cb              (glLabel            *label,
-                                          glLabelObject      *object);
-
-static void set_size                      (glLabelObject      *object,
-                                          gdouble             w,
-                                          gdouble             h);
-
-
-/*****************************************************************************/
-/* Boilerplate object stuff.                                                 */
-/*****************************************************************************/
-G_DEFINE_TYPE (glLabelObject, gl_label_object, G_TYPE_OBJECT);
-
-
-static void
-gl_label_object_class_init (glLabelObjectClass *class)
-{
-       GObjectClass       *object_class = G_OBJECT_CLASS (class);
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       gl_label_object_parent_class = g_type_class_peek_parent (class);
-
-       object_class->finalize = gl_label_object_finalize;
-
-       class->set_size = set_size;
-
-       signals[CHANGED] =
-               g_signal_new ("changed",
-                             G_OBJECT_CLASS_TYPE (object_class),
-                             G_SIGNAL_RUN_LAST,
-                             G_STRUCT_OFFSET (glLabelObjectClass, changed),
-                             NULL, NULL,
-                             gl_marshal_VOID__VOID,
-                             G_TYPE_NONE,
-                             0);
-
-       signals[MOVED] =
-               g_signal_new ("moved",
-                             G_OBJECT_CLASS_TYPE (object_class),
-                             G_SIGNAL_RUN_LAST,
-                             G_STRUCT_OFFSET (glLabelObjectClass, moved),
-                             NULL, NULL,
-                             gl_marshal_VOID__DOUBLE_DOUBLE,
-                             G_TYPE_NONE,
-                             2, G_TYPE_DOUBLE, G_TYPE_DOUBLE);
-       signals[FLIP_ROTATE] =
-               g_signal_new ("flip_rotate",
-                             G_OBJECT_CLASS_TYPE (object_class),
-                             G_SIGNAL_RUN_LAST,
-                             G_STRUCT_OFFSET (glLabelObjectClass, flip_rotate),
-                             NULL, NULL,
-                             gl_marshal_VOID__VOID,
-                             G_TYPE_NONE,
-                             0);
-       signals[TOP] =
-               g_signal_new ("top",
-                             G_OBJECT_CLASS_TYPE (object_class),
-                             G_SIGNAL_RUN_LAST,
-                             G_STRUCT_OFFSET (glLabelObjectClass, top),
-                             NULL, NULL,
-                             gl_marshal_VOID__VOID,
-                             G_TYPE_NONE,
-                             0);
-
-       signals[BOTTOM] =
-               g_signal_new ("bottom",
-                             G_OBJECT_CLASS_TYPE (object_class),
-                             G_SIGNAL_RUN_LAST,
-                             G_STRUCT_OFFSET (glLabelObjectClass, bottom),
-                             NULL, NULL,
-                             gl_marshal_VOID__VOID,
-                             G_TYPE_NONE,
-                             0);
-       signals[REMOVED] =
-               g_signal_new ("removed",
-                             G_OBJECT_CLASS_TYPE (object_class),
-                             G_SIGNAL_RUN_LAST,
-                             G_STRUCT_OFFSET (glLabelObjectClass, removed),
-                             NULL, NULL,
-                             gl_marshal_VOID__VOID,
-                             G_TYPE_NONE,
-                             0);
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-static void
-gl_label_object_init (glLabelObject *object)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       object->priv = g_new0 (glLabelObjectPrivate, 1);
-
-       object->priv->name = g_strdup_printf ("object%d", instance++);
-
-       cairo_matrix_init_identity (&object->priv->matrix);
-
-       object->priv->shadow_state = FALSE;
-       object->priv->shadow_x = DEFAULT_SHADOW_X_OFFSET;
-       object->priv->shadow_y = DEFAULT_SHADOW_Y_OFFSET;
-       object->priv->shadow_color_node = gl_color_node_new_default ();
-       object->priv->shadow_opacity = DEFAULT_SHADOW_OPACITY;
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-static void
-gl_label_object_finalize (GObject *object)
-{
-        glLabelObject *label_object = GL_LABEL_OBJECT (object);
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       g_free (label_object->priv->name);
-       g_free (label_object->priv);
-
-       G_OBJECT_CLASS (gl_label_object_parent_class)->finalize (object);
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/*****************************************************************************/
-/* New label object.                                                         */
-/*****************************************************************************/
-GObject *
-gl_label_object_new (glLabel *label)
-{
-       glLabelObject *object;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       object = g_object_new (gl_label_object_get_type(), NULL);
-
-       gl_label_object_set_parent (object, label);
-
-       gl_debug (DEBUG_LABEL, "END");
-
-       return G_OBJECT (object);
-}
-
-
-/*****************************************************************************/
-/* Duplicate object.                                                         */
-/*****************************************************************************/
-glLabelObject *
-gl_label_object_dup (glLabelObject *src_object,
-                    glLabel       *label)
-{
-       glLabelObject    *dst_object;
-       gdouble           x, y, w, h;
-        cairo_matrix_t    matrix;
-       gboolean          shadow_state;
-       gdouble           shadow_x, shadow_y;
-       glColorNode      *shadow_color_node;
-       gdouble           shadow_opacity;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_val_if_fail (src_object && GL_IS_LABEL_OBJECT (src_object), NULL);
-
-       dst_object = g_object_new (G_OBJECT_TYPE(src_object), NULL);
-
-       gl_label_object_set_parent (dst_object, label);
-
-       gl_label_object_get_position      (src_object, &x, &y);
-       gl_label_object_get_size          (src_object, &w, &h);
-       gl_label_object_get_matrix        (src_object, &matrix);
-       gl_label_object_get_shadow_offset (src_object, &shadow_x, &shadow_y);
-       shadow_color_node = gl_label_object_get_shadow_color   (src_object);
-       shadow_opacity    = gl_label_object_get_shadow_opacity (src_object);
-       shadow_state      = gl_label_object_get_shadow_state   (src_object);
-
-       gl_label_object_set_position (dst_object, x, y);
-       gl_label_object_set_size     (dst_object, w, h);
-       gl_label_object_set_matrix   (dst_object, &matrix);
-       gl_label_object_set_shadow_offset  (dst_object, shadow_x, shadow_y);
-       gl_label_object_set_shadow_color   (dst_object, shadow_color_node);
-       gl_label_object_set_shadow_opacity (dst_object, shadow_opacity);
-       gl_label_object_set_shadow_state   (dst_object, shadow_state);
-
-       gl_color_node_free (&shadow_color_node);
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(src_object)->copy != NULL ) {
-
-               /* We have an object specific method, use it */
-               GL_LABEL_OBJECT_GET_CLASS(src_object)->copy (dst_object, src_object);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-
-       return dst_object;
-}
-
-
-/*****************************************************************************/
-/* Emit "changed" signal (for derived objects).                              */
-/*****************************************************************************/
-void
-gl_label_object_emit_changed (glLabelObject *object)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/*****************************************************************************/
-/* Set parent label of object.                                               */
-/*****************************************************************************/
-void
-gl_label_object_set_parent (glLabelObject *object,
-                           glLabel       *label)
-{
-       glLabel *old_parent;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-       g_return_if_fail (label && GL_IS_LABEL (label));
-
-       old_parent = object->parent;
-       if ( old_parent != NULL ) {
-               g_signal_handlers_disconnect_by_func (old_parent,
-                                                     G_CALLBACK(merge_changed_cb),
-                                                     object);
-               gl_label_remove_object( old_parent, object );
-       }
-       gl_label_add_object( label, object );
-
-       g_signal_connect (G_OBJECT(label), "merge_changed",
-                         G_CALLBACK(merge_changed_cb), object);
-
-       g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/*****************************************************************************/
-/* Get parent label of object.                                               */
-/*****************************************************************************/
-glLabel *
-gl_label_object_get_parent (glLabelObject *object)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), NULL);
-
-       gl_debug (DEBUG_LABEL, "END");
-
-       return object->parent;
-}
-
-
-/*****************************************************************************/
-/* Set remove object from parent.                                            */
-/*****************************************************************************/
-void
-gl_label_object_remove (glLabelObject *object)
-{
-       glLabel *parent;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       parent = object->parent;
-       if ( parent != NULL ) {
-               g_signal_handlers_disconnect_by_func (parent,
-                                                     G_CALLBACK(merge_changed_cb),
-                                                     object);
-               gl_label_remove_object (parent, object);
-
-                g_signal_emit (G_OBJECT(object), signals[REMOVED], 0);
-
-                g_object_unref (G_OBJECT(object));
-       }
-
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/*****************************************************************************/
-/* Set name of object.                                                       */
-/*****************************************************************************/
-void
-gl_label_object_set_name (glLabelObject *object,
-                         gchar         *name)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       g_free(object->priv->name);
-       object->priv->name = name;
-
-       g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/*****************************************************************************/
-/* Get name of object.                                                       */
-/*****************************************************************************/
-gchar *
-gl_label_object_get_name (glLabelObject *object)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), NULL);
-
-       gl_debug (DEBUG_LABEL, "END");
-
-       return g_strdup(object->priv->name);
-}
-
-
-/*****************************************************************************/
-/* Set position of object.                                                   */
-/*****************************************************************************/
-void
-gl_label_object_set_position (glLabelObject *object,
-                             gdouble        x,
-                             gdouble        y)
-{
-       gdouble dx, dy;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( (x != object->priv->x) || (y != object->priv->y) ) {
-
-               dx = x - object->priv->x;
-               dy = y - object->priv->y;
-
-               object->priv->x = x;
-               object->priv->y = y;
-
-               g_signal_emit (G_OBJECT(object), signals[MOVED], 0, dx, dy);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/*****************************************************************************/
-/* Set position of object relative to old position.                          */
-/*****************************************************************************/
-void
-gl_label_object_set_position_relative (glLabelObject *object,
-                                      gdouble        dx,
-                                      gdouble        dy)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( (dx != 0.0) || (dy != 0.0) ) {
-
-               object->priv->x += dx;
-               object->priv->y += dy;
-
-               gl_debug (DEBUG_LABEL, "       x = %f, y= %f",
-                         object->priv->x,
-                         object->priv->y);
-
-               g_signal_emit (G_OBJECT(object), signals[MOVED], 0, dx, dy);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/*****************************************************************************/
-/* Get position of object.                                                   */
-/*****************************************************************************/
-void
-gl_label_object_get_position (glLabelObject *object,
-                             gdouble       *x,
-                             gdouble       *y)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       *x = object->priv->x;
-       *y = object->priv->y;
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/*---------------------------------------------------------------------------*/
-/* PRIVATE.  Default set size method.                                        */
-/*---------------------------------------------------------------------------*/
-static void
-set_size (glLabelObject *object,
-         gdouble        w,
-         gdouble        h)
-{
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( (object->priv->w != w) || (object->priv->h != h) ) {
-
-               object->priv->w = w;
-               object->priv->h = h;
-
-               g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
-       }
-}
-
-
-/*****************************************************************************/
-/* Set size of object.                                                       */
-/*****************************************************************************/
-void
-gl_label_object_set_size (glLabelObject *object,
-                         gdouble        w,
-                         gdouble        h)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_size != NULL ) {
-
-               /* We have an object specific method, use it */
-               GL_LABEL_OBJECT_GET_CLASS(object)->set_size (object, w, h);
-
-               object->priv->aspect_ratio = h / w;
-
-       }
-
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/*****************************************************************************/
-/* Set size of object honoring current aspect ratio.                         */
-/*****************************************************************************/
-void
-gl_label_object_set_size_honor_aspect (glLabelObject *object,
-                                      gdouble        w,
-                                      gdouble        h)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( h > w*object->priv->aspect_ratio ) {
-
-               h = w * object->priv->aspect_ratio;
-
-       } else {
-
-               w = h / object->priv->aspect_ratio;
-
-       }
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_size != NULL ) {
-
-               /* We have an object specific method, use it */
-               GL_LABEL_OBJECT_GET_CLASS(object)->set_size (object, w, h);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/*****************************************************************************/
-/* Get raw size method (don't let object content adjust size).               */
-/*****************************************************************************/
-void
-gl_label_object_get_raw_size (glLabelObject *object,
-                              gdouble       *w,
-                              gdouble       *h)
-{
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       *w = object->priv->w;
-       *h = object->priv->h;
-}
-
-
-/*****************************************************************************/
-/* Get size of object.                                                       */
-/*****************************************************************************/
-void
-gl_label_object_get_size (glLabelObject *object,
-                         gdouble       *w,
-                         gdouble       *h)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_size != NULL ) {
-
-               /* We have an object specific method, use it */
-               GL_LABEL_OBJECT_GET_CLASS(object)->get_size (object, w, h);
-
-       } else {
-
-               gl_label_object_get_raw_size (object, w, h);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/*****************************************************************************/
-/* Get extent of object.                                                     */
-/*****************************************************************************/
-void
-gl_label_object_get_extent (glLabelObject *object,
-                            glLabelRegion *region)
-{
-       gdouble        w, h;
-        gdouble        line_w;
-       gdouble        xa1, ya1, xa2, ya2, xa3, ya3, xa4, ya4;
-        cairo_matrix_t matrix;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       gl_label_object_get_size (object, &w, &h);
-        line_w = gl_label_object_get_line_width (object);
-
-       /* setup untransformed corners of bounding box, account for line width */
-       xa1 =   - line_w/2;
-       ya1 =   - line_w/2;
-       xa2 = w + line_w/2;
-       ya2 =   - line_w/2;
-       xa3 = w + line_w/2;
-       ya3 = h + line_w/2;
-       xa4 =   - line_w/2;
-       ya4 = h + line_w/2;
-
-       /* transform these points */
-       gl_label_object_get_matrix (object, &matrix);
-        cairo_matrix_transform_point (&matrix, &xa1, &ya1);
-        cairo_matrix_transform_point (&matrix, &xa2, &ya2);
-        cairo_matrix_transform_point (&matrix, &xa3, &ya3);
-        cairo_matrix_transform_point (&matrix, &xa4, &ya4);
-
-       /* now find the maximum extent of these points in x and y */
-       region->x1 = MIN (xa1, MIN (xa2, MIN (xa3, xa4))) + object->priv->x;
-       region->y1 = MIN (ya1, MIN (ya2, MIN (ya3, ya4))) + object->priv->y;
-       region->x2 = MAX (xa1, MAX (xa2, MAX (xa3, xa4))) + object->priv->x;
-       region->y2 = MAX (ya1, MAX (ya2, MAX (ya3, ya4))) + object->priv->y;
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/*****************************************************************************/
-/* Can text properties be set for this object?                               */
-/*****************************************************************************/
-gboolean
-gl_label_object_can_text (glLabelObject     *object)
-{
-       gl_debug (DEBUG_LABEL, "");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE);
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_font_family != NULL ) {
-
-               return TRUE;
-
-       } else {
-
-               return FALSE;
-
-       }
-
-}
-
-
-/*****************************************************************************/
-/* Set font family for all text contained in object.                         */
-/*****************************************************************************/
-void
-gl_label_object_set_font_family (glLabelObject     *object,
-                                const gchar       *font_family)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_font_family != NULL ) {
-
-               /* We have an object specific method, use it */
-               GL_LABEL_OBJECT_GET_CLASS(object)->set_font_family (object, font_family);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Set font size for all text contained in object.                          */
-/****************************************************************************/
-void
-gl_label_object_set_font_size (glLabelObject     *object,
-                              gdouble            font_size)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_font_size != NULL ) {
-
-               /* We have an object specific method, use it */
-               GL_LABEL_OBJECT_GET_CLASS(object)->set_font_size (object, font_size);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Set font weight for all text contained in object.                        */
-/****************************************************************************/
-void
-gl_label_object_set_font_weight (glLabelObject     *object,
-                                PangoWeight        font_weight)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_font_weight != NULL ) {
-
-               /* We have an object specific method, use it */
-               GL_LABEL_OBJECT_GET_CLASS(object)->set_font_weight (object, font_weight);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Set font italic flag for all text contained in object.                   */
-/****************************************************************************/
-void
-gl_label_object_set_font_italic_flag (glLabelObject     *object,
-                                     gboolean           font_italic_flag)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_font_italic_flag != NULL ) {
-
-               /* We have an object specific method, use it */
-               GL_LABEL_OBJECT_GET_CLASS(object)->set_font_italic_flag (object,
-                                                                        font_italic_flag);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Set text alignment for all text contained in object.                     */
-/****************************************************************************/
-void
-gl_label_object_set_text_alignment (glLabelObject     *object,
-                                   PangoAlignment     text_alignment)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_text_alignment != NULL ) {
-
-               /* We have an object specific method, use it */
-               GL_LABEL_OBJECT_GET_CLASS(object)->set_text_alignment (object,
-                                                                      text_alignment);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Set text line spacing for all text contained in object.                  */
-/****************************************************************************/
-void
-gl_label_object_set_text_line_spacing (glLabelObject     *object,
-                                      gdouble            text_line_spacing)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_text_line_spacing != NULL ) {
-
-               /* We have an object specific method, use it */
-               GL_LABEL_OBJECT_GET_CLASS(object)->set_text_line_spacing (object, text_line_spacing);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Set text color for all text contained in object.                         */
-/****************************************************************************/
-void
-gl_label_object_set_text_color (glLabelObject     *object,
-                               glColorNode       *text_color_node)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_text_color != NULL ) {
-
-               /* We have an object specific method, use it */
-               GL_LABEL_OBJECT_GET_CLASS(object)->set_text_color (object, text_color_node);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/*****************************************************************************/
-/* Get font family for all text contained in object.                         */
-/*****************************************************************************/
-gchar *
-gl_label_object_get_font_family (glLabelObject     *object)
-{
-       gchar *ret = NULL;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), NULL);
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_font_family != NULL ) {
-
-               /* We have an object specific method, use it */
-               ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_font_family (object);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-
-       return ret;
-}
-
-
-/****************************************************************************/
-/* Get font size for all text contained in object.                          */
-/****************************************************************************/
-gdouble
-gl_label_object_get_font_size (glLabelObject     *object)
-{
-       gdouble ret = 0.0;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0.0);
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_font_size != NULL ) {
-
-               /* We have an object specific method, use it */
-               ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_font_size (object);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-
-       return ret;
-}
-
-
-/****************************************************************************/
-/* Get font weight for all text contained in object.                        */
-/****************************************************************************/
-PangoWeight    
-gl_label_object_get_font_weight (glLabelObject     *object)
-{
-       PangoWeight     ret = PANGO_WEIGHT_NORMAL;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), PANGO_WEIGHT_NORMAL);
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_font_weight != NULL ) {
-
-               /* We have an object specific method, use it */
-               ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_font_weight (object);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-
-       return ret;
-}
-
-
-/****************************************************************************/
-/* Get font italic flag for all text contained in object.                   */
-/****************************************************************************/
-gboolean
-gl_label_object_get_font_italic_flag (glLabelObject     *object)
-{
-       gboolean ret = FALSE;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE);
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_font_italic_flag != NULL ) {
-
-               /* We have an object specific method, use it */
-               ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_font_italic_flag (object);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-
-       return ret;
-}
-
-
-/****************************************************************************/
-/* Get text alignment for all text contained in object.                     */
-/****************************************************************************/
-PangoAlignment
-gl_label_object_get_text_alignment (glLabelObject     *object)
-{
-       PangoAlignment ret = PANGO_ALIGN_LEFT;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), PANGO_ALIGN_LEFT);
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_text_alignment != NULL ) {
-
-               /* We have an object specific method, use it */
-               ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_text_alignment (object);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-
-       return ret;
-}
-
-
-/****************************************************************************/
-/* Get text line spacing for all text contained in object.                  */
-/****************************************************************************/
-gdouble
-gl_label_object_get_text_line_spacing (glLabelObject     *object)
-{
-       gdouble ret = 0.0;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0.0);
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_text_line_spacing != NULL ) {
-
-               /* We have an object specific method, use it */
-               ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_text_line_spacing (object);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-
-       return ret;
-}
-
-
-/****************************************************************************/
-/* Get text color for all text contained in object.                         */
-/****************************************************************************/
-glColorNode*
-gl_label_object_get_text_color (glLabelObject     *object)
-{
-       glColorNode *ret = NULL;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0);
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_text_color != NULL ) {
-
-               /* We have an object specific method, use it */
-               ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_text_color (object);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-
-       return ret;
-}
-
-
-/*****************************************************************************/
-/* Can fill properties be set for this object?                               */
-/*****************************************************************************/
-gboolean
-gl_label_object_can_fill (glLabelObject     *object)
-{
-       gl_debug (DEBUG_LABEL, "");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE);
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_fill_color != NULL ) {
-
-               return TRUE;
-
-       } else {
-
-               return FALSE;
-
-       }
-
-}
-
-
-/****************************************************************************/
-/* Set fill color for object.                                               */
-/****************************************************************************/
-void
-gl_label_object_set_fill_color (glLabelObject     *object,
-                               glColorNode       *fill_color_node)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_fill_color != NULL ) {
-
-               /* We have an object specific method, use it */
-               GL_LABEL_OBJECT_GET_CLASS(object)->set_fill_color (object, fill_color_node);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Get fill color for object.                                               */
-/****************************************************************************/
-glColorNode*
-gl_label_object_get_fill_color (glLabelObject     *object)
-{
-       glColorNode *ret = NULL;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0);
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_fill_color != NULL ) {
-
-               /* We have an object specific method, use it */
-               ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_fill_color (object);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-
-       return ret;
-}
-
-
-/*****************************************************************************/
-/* Can line color property be set for this object?                           */
-/*****************************************************************************/
-gboolean
-gl_label_object_can_line_color (glLabelObject     *object)
-{
-       gl_debug (DEBUG_LABEL, "");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE);
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_line_color != NULL ) {
-
-               return TRUE;
-
-       } else {
-
-               return FALSE;
-
-       }
-
-}
-
-
-/****************************************************************************/
-/* Set line color for object.                                               */
-/****************************************************************************/
-void
-gl_label_object_set_line_color (glLabelObject     *object,
-                               glColorNode       *line_color_node)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_line_color != NULL ) {
-
-               /* We have an object specific method, use it */
-               GL_LABEL_OBJECT_GET_CLASS(object)->set_line_color (object, line_color_node);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Get line color for object.                                               */
-/****************************************************************************/
-glColorNode*
-gl_label_object_get_line_color (glLabelObject     *object)
-{
-       glColorNode *ret = NULL;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0);
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_line_color != NULL ) {
-
-               /* We have an object specific method, use it */
-               ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_line_color (object);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-
-       return ret;
-}
-
-
-/*****************************************************************************/
-/* Can line width property be set for this object?                           */
-/*****************************************************************************/
-gboolean
-gl_label_object_can_line_width (glLabelObject     *object)
-{
-       gl_debug (DEBUG_LABEL, "");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE);
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_line_width != NULL ) {
-
-               return TRUE;
-
-       } else {
-
-               return FALSE;
-
-       }
-
-}
-
-
-/****************************************************************************/
-/* Set line width for object.                                               */
-/****************************************************************************/
-void
-gl_label_object_set_line_width (glLabelObject     *object,
-                               gdouble            line_width)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_line_width != NULL ) {
-
-               /* We have an object specific method, use it */
-               GL_LABEL_OBJECT_GET_CLASS(object)->set_line_width (object, line_width);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Get line width for object.                                               */
-/****************************************************************************/
-gdouble
-gl_label_object_get_line_width (glLabelObject     *object)
-{
-       gdouble ret = 0.0;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0.0);
-
-       if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_line_width != NULL ) {
-
-               /* We have an object specific method, use it */
-               ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_line_width (object);
-
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-
-       return ret;
-}
-
-
-/****************************************************************************/
-/* Set shadow state of object.                                              */
-/****************************************************************************/
-void
-gl_label_object_set_shadow_state (glLabelObject     *object,
-                                 gboolean           state)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if (object->priv->shadow_state != state)
-       {
-               object->priv->shadow_state = state;
-               gl_label_object_emit_changed (object);
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Get shadow state of object.                                              */
-/****************************************************************************/
-gboolean
-gl_label_object_get_shadow_state (glLabelObject     *object)
-{
-       gl_debug (DEBUG_LABEL, "");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE);
-
-       return object->priv->shadow_state;
-}
-
-
-/****************************************************************************/
-/* Set offset of object's shadow.                                           */
-/****************************************************************************/
-void
-gl_label_object_set_shadow_offset (glLabelObject     *object,
-                                  gdouble            x,
-                                  gdouble            y)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( (x != object->priv->shadow_x) || (y != object->priv->shadow_y) )
-       {
-               object->priv->shadow_x = x;
-               object->priv->shadow_y = y;
-
-               gl_label_object_emit_changed (object);
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Get offset of object's shadow.                                           */
-/****************************************************************************/
-void
-gl_label_object_get_shadow_offset (glLabelObject     *object,
-                                  gdouble           *x,
-                                  gdouble           *y)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       *x = object->priv->shadow_x;
-       *y = object->priv->shadow_y;
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Set color of object's shadow.                                            */
-/****************************************************************************/
-void
-gl_label_object_set_shadow_color (glLabelObject     *object,
-                                 glColorNode       *color_node)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if ( !gl_color_node_equal (object->priv->shadow_color_node, color_node ))
-       {
-               gl_color_node_free (&(object->priv->shadow_color_node));
-               object->priv->shadow_color_node = gl_color_node_dup (color_node);
-               gl_label_object_emit_changed (GL_LABEL_OBJECT(object));
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Get color of object's shadow.                                            */
-/****************************************************************************/
-glColorNode*
-gl_label_object_get_shadow_color (glLabelObject     *object)
-{
-       gl_debug (DEBUG_LABEL, "");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), NULL);
-
-       return gl_color_node_dup (object->priv->shadow_color_node);
-}
-
-
-/****************************************************************************/
-/* Set opacity of object's shadow.                                          */
-/****************************************************************************/
-void
-gl_label_object_set_shadow_opacity (glLabelObject     *object,
-                                   gdouble            alpha)
-{
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-       if (object->priv->shadow_opacity != alpha)
-       {
-               object->priv->shadow_opacity = alpha;
-               gl_label_object_emit_changed (object);
-       }
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Get opacity of object's shadow.                                          */
-/****************************************************************************/
-gdouble
-gl_label_object_get_shadow_opacity (glLabelObject     *object)
-{
-       gl_debug (DEBUG_LABEL, "");
-
-       g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE);
-
-       return object->priv->shadow_opacity;
-}
-
-
-/****************************************************************************/
-/* Flip object horizontally.                                                */
-/****************************************************************************/
-void
-gl_label_object_flip_horiz (glLabelObject *object)
-{
-        cairo_matrix_t flip_matrix;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-        cairo_matrix_init_scale (&flip_matrix, -1.0, 1.0);
-        cairo_matrix_multiply (&object->priv->matrix, &object->priv->matrix, &flip_matrix);
-
-       g_signal_emit (G_OBJECT(object), signals[FLIP_ROTATE], 0);
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Flip object vertically.                                                  */
-/****************************************************************************/
-void
-gl_label_object_flip_vert (glLabelObject *object)
-{
-        cairo_matrix_t flip_matrix;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-        cairo_matrix_init_scale (&flip_matrix, 1.0, -1.0);
-        cairo_matrix_multiply (&object->priv->matrix, &object->priv->matrix, &flip_matrix);
-
-       g_signal_emit (G_OBJECT(object), signals[FLIP_ROTATE], 0);
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Rotate object.                                                           */
-/****************************************************************************/
-void
-gl_label_object_rotate (glLabelObject *object,
-                       gdouble        theta_degs)
-{
-        cairo_matrix_t rotate_matrix;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-        cairo_matrix_init_rotate (&rotate_matrix, theta_degs*(G_PI/180.));
-        cairo_matrix_multiply (&object->priv->matrix, &object->priv->matrix, &rotate_matrix);
-
-       g_signal_emit (G_OBJECT(object), signals[FLIP_ROTATE], 0);
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Set raw affine                                                           */
-/****************************************************************************/
-void
-gl_label_object_set_matrix (glLabelObject  *object,
-                            cairo_matrix_t *matrix)
-{
-       gl_debug (DEBUG_LABEL, "");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-        object->priv->matrix = *matrix;
-}
-
-
-/****************************************************************************/
-/* Get raw affine                                                           */
-/****************************************************************************/
-void
-gl_label_object_get_matrix (glLabelObject  *object,
-                            cairo_matrix_t *matrix)
-{
-       gl_debug (DEBUG_LABEL, "");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-        *matrix = object->priv->matrix;
-}
-
-
-/****************************************************************************/
-/* Bring label object to front/top.                                         */
-/****************************************************************************/
-void
-gl_label_object_raise_to_top (glLabelObject *object)
-{
-       glLabel *label;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       label = object->parent;
-
-       gl_label_raise_object_to_top (label, object);
-
-       g_signal_emit (G_OBJECT(object), signals[TOP], 0);
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/****************************************************************************/
-/* Send label object to rear/bottom.                                        */
-/****************************************************************************/
-void
-gl_label_object_lower_to_bottom (glLabelObject *object)
-{
-       glLabel *label;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       label = object->parent;
-
-       gl_label_lower_object_to_bottom (label, object);
-
-       g_signal_emit (G_OBJECT(object), signals[BOTTOM], 0);
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-/*--------------------------------------------------------------------------*/
-/* PRIVATE.  Label's merge data changed callback.                           */
-/*--------------------------------------------------------------------------*/
-static void
-merge_changed_cb (glLabel       *label,
-                 glLabelObject *object)
-{
-       gl_label_object_emit_changed (object);
-}
-
-
-/*****************************************************************************/
-/* Draw object                                                               */
-/*****************************************************************************/
-void
-gl_label_object_draw (glLabelObject *object,
-                      cairo_t       *cr,
-                      gboolean       screen_flag,
-                      glMergeRecord *record)
-
-{
-        gdouble        x0, y0;
-        cairo_matrix_t matrix;
-       gboolean       shadow_state;
-       gdouble        shadow_x, shadow_y;
-
-       gl_debug (DEBUG_LABEL, "START");
-
-       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
-
-        gl_label_object_get_position (object, &x0, &y0);
-        gl_label_object_get_matrix (object, &matrix);
-
-        cairo_save (cr);
-        cairo_translate (cr, x0, y0);
-
-        if ( GL_LABEL_OBJECT_GET_CLASS(object)->draw_shadow != NULL ) {
-
-                shadow_state = gl_label_object_get_shadow_state (object);
-
-                if ( shadow_state )
-                {
-                        gl_label_object_get_shadow_offset (object, &shadow_x, &shadow_y);
-
-                        cairo_save (cr);
-                        cairo_translate (cr, shadow_x, shadow_y);
-                        cairo_transform (cr, &matrix);
-
-                        GL_LABEL_OBJECT_GET_CLASS(object)->draw_shadow (object,
-                                                                        cr,
-                                                                        screen_flag,
-                                                                        record);
-
-                        cairo_restore (cr);
-                }
-        }
-
-        if ( GL_LABEL_OBJECT_GET_CLASS(object)->draw_object != NULL ) {
-
-                cairo_save (cr);
-                cairo_transform (cr, &matrix);
-
-                GL_LABEL_OBJECT_GET_CLASS(object)->draw_object (object,
-                                                                cr,
-                                                                screen_flag,
-                                                                record);
-
-                cairo_restore (cr);
-        }
-
-        cairo_restore (cr);
-
-       gl_debug (DEBUG_LABEL, "END");
-}
-
-
-
-
-/*
- * Local Variables:       -- emacs
- * mode: C                -- emacs
- * c-basic-offset: 8      -- emacs
- * tab-width: 8           -- emacs
- * indent-tabs-mode: nil  -- emacs
- * End:                   -- emacs
- */