]> git.sur5r.net Git - glabels/blobdiff - src/label-ellipse.c
Imported Upstream version 3.0.0
[glabels] / src / label-ellipse.c
index fb21cbf2cafedfb4fca286045ec03e6dc9ab41ac..5b89f3b8f6fcf6a99717be1ea012d5b6b907f2fb 100644 (file)
@@ -1,32 +1,27 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
-
 /*
- *  (GLABELS) Label and Business Card Creation program for GNOME
- *
- *  label_ellipse.c:  GLabels label ellipse object
+ *  label-ellipse.c
+ *  Copyright (C) 2001-2009  Jim Evins <evins@snaught.com>.
  *
- *  Copyright (C) 2001-2007  Jim Evins <evins@snaught.com>.
+ *  This file is part of gLabels.
  *
- *  This program is free software; you can redistribute it and/or modify
+ *  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 2 of the License, or
+ *  the Free Software Foundation, either version 3 of the License, or
  *  (at your option) any later version.
  *
- *  This program is distributed in the hope that it will be useful,
+ *  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 this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *  along with gLabels.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "label-ellipse.h"
 
-#include <glib/gmem.h>
-#include <glib/gstrfuncs.h>
-#include <glib/gmessages.h>
+#include <glib/gi18n.h>
+#include <glib.h>
 #include <math.h>
 
 #include "cairo-ellipse-path.h"
@@ -55,25 +50,28 @@ struct _glLabelEllipsePrivate {
 /* Private function prototypes.                           */
 /*========================================================*/
 
-static void    gl_label_ellipse_finalize      (GObject             *object);
+static void    gl_label_ellipse_finalize  (GObject           *object);
 
-static void    copy                           (glLabelObject       *dst_object,
-                                              glLabelObject       *src_object);
+static void    copy                       (glLabelObject     *dst_object,
+                                           glLabelObject     *src_object);
 
-static void    set_fill_color                 (glLabelObject       *object,
-                                              glColorNode         *fill_color_node);
+static void    set_fill_color             (glLabelObject     *object,
+                                           glColorNode       *fill_color_node,
+                                           gboolean           checkpoint);
 
-static void    set_line_color                 (glLabelObject       *object,
-                                              glColorNode         *line_color_node);
+static void    set_line_color             (glLabelObject     *object,
+                                           glColorNode       *line_color_node,
+                                           gboolean           checkpoint);
 
-static void    set_line_width                 (glLabelObject       *object,
-                                              gdouble              line_width);
+static void    set_line_width             (glLabelObject     *object,
+                                           gdouble            line_width,
+                                           gboolean           checkpoint);
 
-static glColorNode*   get_fill_color          (glLabelObject       *object);
+static glColorNode*   get_fill_color      (glLabelObject     *object);
 
-static glColorNode*   get_line_color          (glLabelObject       *object);
+static glColorNode*   get_line_color      (glLabelObject     *object);
 
-static gdouble get_line_width                 (glLabelObject       *object);
+static gdouble get_line_width             (glLabelObject     *object);
 
 static void    draw_object                (glLabelObject     *object,
                                            cairo_t           *cr,
@@ -85,13 +83,17 @@ static void    draw_shadow                (glLabelObject     *object,
                                            gboolean           screen_flag,
                                            glMergeRecord     *record);
 
+static gboolean object_at                 (glLabelObject     *object,
+                                           cairo_t           *cr,
+                                           gdouble            x_pixels,
+                                           gdouble            y_pixels);
 
 
-\f
 /*****************************************************************************/
 /* Boilerplate object stuff.                                                 */
 /*****************************************************************************/
-G_DEFINE_TYPE (glLabelEllipse, gl_label_ellipse, GL_TYPE_LABEL_OBJECT);
+G_DEFINE_TYPE (glLabelEllipse, gl_label_ellipse, GL_TYPE_LABEL_OBJECT)
+
 
 static void
 gl_label_ellipse_class_init (glLabelEllipseClass *class)
@@ -110,18 +112,19 @@ gl_label_ellipse_class_init (glLabelEllipseClass *class)
        label_object_class->get_line_width = get_line_width;
         label_object_class->draw_object    = draw_object;
         label_object_class->draw_shadow    = draw_shadow;
+        label_object_class->object_at      = object_at;
 
        object_class->finalize = gl_label_ellipse_finalize;
 }
 
+
 static void
 gl_label_ellipse_init (glLabelEllipse *lellipse)
 {
        lellipse->priv = g_new0 (glLabelEllipsePrivate, 1);
-       lellipse->priv->line_color_node = gl_color_node_new_default ();
-       lellipse->priv->fill_color_node = gl_color_node_new_default ();
 }
 
+
 static void
 gl_label_ellipse_finalize (GObject *object)
 {
@@ -136,21 +139,45 @@ gl_label_ellipse_finalize (GObject *object)
        G_OBJECT_CLASS (gl_label_ellipse_parent_class)->finalize (object);
 }
 
+
 /*****************************************************************************/
 /* NEW label "ellipse" object.                                               */
 /*****************************************************************************/
 GObject *
-gl_label_ellipse_new (glLabel *label)
+gl_label_ellipse_new (glLabel *label,
+                      gboolean checkpoint)
 {
-       glLabelEllipse *lellipse;
+       glLabelEllipse      *lellipse;
+       glColorNode         *fill_color_node;
+       glColorNode         *line_color_node;
 
        lellipse = g_object_new (gl_label_ellipse_get_type(), NULL);
 
-       gl_label_object_set_parent (GL_LABEL_OBJECT(lellipse), label);
+        if (label != NULL)
+        {
+                if ( checkpoint )
+                {
+                        gl_label_checkpoint (label, _("Create ellipse object"));
+                }
+
+                fill_color_node = gl_color_node_new_default ();
+                line_color_node = gl_color_node_new_default ();
+
+                line_color_node->color = gl_label_get_default_line_color(label);
+                fill_color_node->color = gl_label_get_default_fill_color(label);
+
+                lellipse->priv->line_width      = gl_label_get_default_line_width(label);
+                lellipse->priv->line_color_node = line_color_node;
+                lellipse->priv->fill_color_node = fill_color_node;
+
+                gl_label_add_object (label, GL_LABEL_OBJECT (lellipse));
+                gl_label_object_set_parent (GL_LABEL_OBJECT (lellipse), label);
+        }
 
        return G_OBJECT (lellipse);
 }
 
+
 /*****************************************************************************/
 /* Copy object contents.                                                     */
 /*****************************************************************************/
@@ -173,9 +200,9 @@ copy (glLabelObject *dst_object,
        line_color_node = get_line_color (src_object);
        fill_color_node = get_fill_color (src_object);
 
-       set_line_width (dst_object, line_width);
-       set_line_color (dst_object, line_color_node);
-       set_fill_color (dst_object, fill_color_node);
+       set_line_width (dst_object, line_width, FALSE);
+       set_line_color (dst_object, line_color_node, FALSE);
+       set_fill_color (dst_object, fill_color_node, FALSE);
 
        gl_color_node_free (&line_color_node);
        gl_color_node_free (&fill_color_node);
@@ -189,13 +216,21 @@ copy (glLabelObject *dst_object,
 /*---------------------------------------------------------------------------*/
 static void
 set_fill_color (glLabelObject *object,
-               glColorNode   *fill_color_node)
+               glColorNode   *fill_color_node,
+                gboolean       checkpoint)
 {
        glLabelEllipse *lellipse = (glLabelEllipse *)object;
+        glLabel        *label;
 
        g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse));
 
-       if (!gl_color_node_equal (lellipse->priv->fill_color_node, fill_color_node)) {
+       if (!gl_color_node_equal (lellipse->priv->fill_color_node, fill_color_node))
+        {
+                if ( checkpoint )
+                {
+                        label = gl_label_object_get_parent (GL_LABEL_OBJECT (lellipse));
+                        gl_label_checkpoint (label, _("Fill color"));
+                }
 
                gl_color_node_free (&(lellipse->priv->fill_color_node));
                lellipse->priv->fill_color_node = gl_color_node_dup (fill_color_node);
@@ -204,19 +239,28 @@ set_fill_color (glLabelObject *object,
        }       
 }
 
+
 /*---------------------------------------------------------------------------*/
 /* PRIVATE.  Set line color method.                                          */
 /*---------------------------------------------------------------------------*/
 static void
 set_line_color (glLabelObject *object,
-               glColorNode   *line_color_node)
+               glColorNode   *line_color_node,
+                gboolean       checkpoint)
 {
        glLabelEllipse *lellipse = (glLabelEllipse *)object;
+        glLabel        *label;
 
        g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse));
 
-       if ( !gl_color_node_equal (lellipse->priv->line_color_node, line_color_node) ) {
-               
+       if ( !gl_color_node_equal (lellipse->priv->line_color_node, line_color_node) )
+        {
+                if ( checkpoint )
+                {
+                        label = gl_label_object_get_parent (GL_LABEL_OBJECT (lellipse));
+                        gl_label_checkpoint (label, _("Line color"));
+                }
+
                gl_color_node_free (&(lellipse->priv->line_color_node));
                lellipse->priv->line_color_node = gl_color_node_dup (line_color_node);
                
@@ -224,18 +268,28 @@ set_line_color (glLabelObject *object,
        }
 }
 
+
 /*---------------------------------------------------------------------------*/
 /* PRIVATE.  Set line width method.                                          */
 /*---------------------------------------------------------------------------*/
 static void
 set_line_width (glLabelObject *object,
-               gdouble        line_width)
+               gdouble        line_width,
+                gboolean       checkpoint)
 {
        glLabelEllipse *lellipse = (glLabelEllipse *)object;
+        glLabel        *label;
 
        g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse));
 
-       if ( lellipse->priv->line_width != line_width ) {
+       if ( lellipse->priv->line_width != line_width )
+        {
+                if ( checkpoint )
+                {
+                        label = gl_label_object_get_parent (GL_LABEL_OBJECT (lellipse));
+                        gl_label_checkpoint (label, _("Line width"));
+                }
+
                lellipse->priv->line_width = line_width;
                gl_label_object_emit_changed (GL_LABEL_OBJECT(lellipse));
        }
@@ -255,6 +309,7 @@ get_line_width (glLabelObject *object)
        return lellipse->priv->line_width;
 }
 
+
 /*---------------------------------------------------------------------------*/
 /* PRIVATE.  Get line color method.                                          */
 /*---------------------------------------------------------------------------*/
@@ -268,6 +323,7 @@ get_line_color (glLabelObject *object)
        return gl_color_node_dup (lellipse->priv->line_color_node);
 }
 
+
 /*---------------------------------------------------------------------------*/
 /* PRIVATE.  Get line width method.                                          */
 /*---------------------------------------------------------------------------*/
@@ -281,6 +337,7 @@ get_fill_color (glLabelObject *object)
        return gl_color_node_dup (lellipse->priv->fill_color_node);
 }
 
+
 /*****************************************************************************/
 /* Draw object method.                                                       */
 /*****************************************************************************/
@@ -334,6 +391,7 @@ draw_object (glLabelObject *object,
        gl_debug (DEBUG_LABEL, "END");
 }
 
+
 /*****************************************************************************/
 /* Draw shadow method.                                                       */
 /*****************************************************************************/
@@ -352,11 +410,11 @@ draw_shadow (glLabelObject *object,
        glColorNode   *shadow_color_node;
         guint          shadow_color;
        gdouble        shadow_opacity;
-       guint          shadow_line_color;
-       guint          shadow_fill_color;
 
        gl_debug (DEBUG_LABEL, "START");
 
+        cairo_save (cr);
+
         gl_label_object_get_size (object, &w, &h);
 
        line_width = gl_label_object_get_line_width (object);
@@ -381,27 +439,93 @@ draw_shadow (glLabelObject *object,
                shadow_color = GL_COLOR_SHADOW_MERGE_DEFAULT;
        }
        shadow_opacity = gl_label_object_get_shadow_opacity (object);
-       shadow_line_color = gl_color_shadow (shadow_color_node->color, shadow_opacity, line_color_node->color);
-       shadow_fill_color = gl_color_shadow (shadow_color_node->color, shadow_opacity, fill_color_node->color);
+       shadow_color = gl_color_set_opacity (shadow_color, shadow_opacity);
        
 
-        gl_cairo_ellipse_path (cr, w/2, h/2);
-
-
-        /* Draw fill shadow */
-        cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (shadow_fill_color));
-        cairo_fill_preserve (cr);
+        cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (shadow_color));
 
-        /* Draw outline shadow */
-        cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (shadow_line_color));
-        cairo_set_line_width (cr, line_width);
-        cairo_stroke (cr);
+        if ( GL_COLOR_F_ALPHA (fill_color) )
+        {
+                if ( GL_COLOR_F_ALPHA (line_color) )
+                {
+                        /* Has FILL and OUTLINE: adjust size to account for line width. */
+                        cairo_translate (cr, -line_width/2, -line_width/2);
+                        gl_cairo_ellipse_path (cr, (w+line_width)/2, (h+line_width)/2);
+
+                }
+                else
+                {
+                        /* Has FILL but no OUTLINE. */
+                        gl_cairo_ellipse_path (cr, w/2, h/2);
+                }
+
+                /* Draw shadow */
+                cairo_fill (cr);
+        }
+        else
+        {
+                if ( GL_COLOR_F_ALPHA (line_color) )
+                {
+                        /* Has only OUTLINE. */
+                        gl_cairo_ellipse_path (cr, w/2, h/2);
+
+                        /* Draw shadow of outline */
+                        cairo_set_line_width (cr, line_width);
+                        cairo_stroke (cr);
+                }
+        }
 
 
        gl_color_node_free (&line_color_node);
        gl_color_node_free (&fill_color_node);
        gl_color_node_free (&shadow_color_node);
 
+        cairo_restore (cr);
+
        gl_debug (DEBUG_LABEL, "END");
 }
 
+
+/*****************************************************************************/
+/* Is object at coordinates?                                                 */
+/*****************************************************************************/
+static gboolean
+object_at (glLabelObject *object,
+           cairo_t       *cr,
+           gdouble        x,
+           gdouble        y)
+{
+        gdouble           w, h;
+        gdouble           line_width;
+
+        gl_label_object_get_size (object, &w, &h);
+
+        cairo_new_path (cr);
+        gl_cairo_ellipse_path (cr, w/2, h/2);
+
+        if (cairo_in_fill (cr, x, y))
+        {
+                return TRUE;
+        }
+
+        line_width = gl_label_object_get_line_width (object);
+        cairo_set_line_width (cr, line_width);
+        if (cairo_in_stroke (cr, x, y))
+        {
+                return TRUE;
+        }
+
+        return FALSE;
+}
+
+
+
+
+/*
+ * Local Variables:       -- emacs
+ * mode: C                -- emacs
+ * c-basic-offset: 8      -- emacs
+ * tab-width: 8           -- emacs
+ * indent-tabs-mode: nil  -- emacs
+ * End:                   -- emacs
+ */