]> git.sur5r.net Git - glabels/blob - src/label-ellipse.c
Imported Upstream version 2.2.8
[glabels] / src / label-ellipse.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
2
3 /*
4  *  (GLABELS) Label and Business Card Creation program for GNOME
5  *
6  *  label_ellipse.c:  GLabels label ellipse object
7  *
8  *  Copyright (C) 2001-2007  Jim Evins <evins@snaught.com>.
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23  */
24
25 #include "label-ellipse.h"
26
27 #include <glib/gmem.h>
28 #include <glib/gstrfuncs.h>
29 #include <glib/gmessages.h>
30 #include <math.h>
31
32 #include "cairo-ellipse-path.h"
33
34 #include "debug.h"
35
36 /*========================================================*/
37 /* Private macros and constants.                          */
38 /*========================================================*/
39
40 /*========================================================*/
41 /* Private types.                                         */
42 /*========================================================*/
43
44 struct _glLabelEllipsePrivate {
45         gdouble          line_width;
46         glColorNode     *line_color_node;
47         glColorNode     *fill_color_node;
48 };
49
50 /*========================================================*/
51 /* Private globals.                                       */
52 /*========================================================*/
53
54 /*========================================================*/
55 /* Private function prototypes.                           */
56 /*========================================================*/
57
58 static void    gl_label_ellipse_finalize      (GObject             *object);
59
60 static void    copy                           (glLabelObject       *dst_object,
61                                                glLabelObject       *src_object);
62
63 static void    set_fill_color                 (glLabelObject       *object,
64                                                glColorNode         *fill_color_node);
65
66 static void    set_line_color                 (glLabelObject       *object,
67                                                glColorNode         *line_color_node);
68
69 static void    set_line_width                 (glLabelObject       *object,
70                                                gdouble              line_width);
71
72 static glColorNode*   get_fill_color          (glLabelObject       *object);
73
74 static glColorNode*   get_line_color          (glLabelObject       *object);
75
76 static gdouble get_line_width                 (glLabelObject       *object);
77
78 static void    draw_object                (glLabelObject     *object,
79                                            cairo_t           *cr,
80                                            gboolean           screen_flag,
81                                            glMergeRecord     *record);
82
83 static void    draw_shadow                (glLabelObject     *object,
84                                            cairo_t           *cr,
85                                            gboolean           screen_flag,
86                                            glMergeRecord     *record);
87
88
89
90 \f
91 /*****************************************************************************/
92 /* Boilerplate object stuff.                                                 */
93 /*****************************************************************************/
94 G_DEFINE_TYPE (glLabelEllipse, gl_label_ellipse, GL_TYPE_LABEL_OBJECT);
95
96 static void
97 gl_label_ellipse_class_init (glLabelEllipseClass *class)
98 {
99         GObjectClass       *object_class       = G_OBJECT_CLASS (class);
100         glLabelObjectClass *label_object_class = GL_LABEL_OBJECT_CLASS (class);
101
102         gl_label_ellipse_parent_class = g_type_class_peek_parent (class);
103
104         label_object_class->copy           = copy;
105         label_object_class->set_fill_color = set_fill_color;
106         label_object_class->set_line_color = set_line_color;
107         label_object_class->set_line_width = set_line_width;
108         label_object_class->get_fill_color = get_fill_color;
109         label_object_class->get_line_color = get_line_color;
110         label_object_class->get_line_width = get_line_width;
111         label_object_class->draw_object    = draw_object;
112         label_object_class->draw_shadow    = draw_shadow;
113
114         object_class->finalize = gl_label_ellipse_finalize;
115 }
116
117 static void
118 gl_label_ellipse_init (glLabelEllipse *lellipse)
119 {
120         lellipse->priv = g_new0 (glLabelEllipsePrivate, 1);
121         lellipse->priv->line_color_node = gl_color_node_new_default ();
122         lellipse->priv->fill_color_node = gl_color_node_new_default ();
123 }
124
125 static void
126 gl_label_ellipse_finalize (GObject *object)
127 {
128         glLabelEllipse *lellipse = GL_LABEL_ELLIPSE (object);
129
130         g_return_if_fail (object && GL_IS_LABEL_ELLIPSE (object));
131
132         gl_color_node_free (&(lellipse->priv->line_color_node));
133         gl_color_node_free (&(lellipse->priv->fill_color_node));
134         g_free (lellipse->priv);
135
136         G_OBJECT_CLASS (gl_label_ellipse_parent_class)->finalize (object);
137 }
138
139 /*****************************************************************************/
140 /* NEW label "ellipse" object.                                               */
141 /*****************************************************************************/
142 GObject *
143 gl_label_ellipse_new (glLabel *label)
144 {
145         glLabelEllipse *lellipse;
146
147         lellipse = g_object_new (gl_label_ellipse_get_type(), NULL);
148
149         gl_label_object_set_parent (GL_LABEL_OBJECT(lellipse), label);
150
151         return G_OBJECT (lellipse);
152 }
153
154 /*****************************************************************************/
155 /* Copy object contents.                                                     */
156 /*****************************************************************************/
157 static void
158 copy (glLabelObject *dst_object,
159       glLabelObject *src_object)
160 {
161         glLabelEllipse *lellipse     = (glLabelEllipse *)src_object;
162         glLabelEllipse *new_lellipse = (glLabelEllipse *)dst_object;
163         gdouble         line_width;
164         glColorNode    *line_color_node;
165         glColorNode    *fill_color_node;
166
167         gl_debug (DEBUG_LABEL, "START");
168
169         g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse));
170         g_return_if_fail (new_lellipse && GL_IS_LABEL_ELLIPSE (new_lellipse));
171
172         line_width = get_line_width (src_object);
173         line_color_node = get_line_color (src_object);
174         fill_color_node = get_fill_color (src_object);
175
176         set_line_width (dst_object, line_width);
177         set_line_color (dst_object, line_color_node);
178         set_fill_color (dst_object, fill_color_node);
179
180         gl_color_node_free (&line_color_node);
181         gl_color_node_free (&fill_color_node);
182         
183         gl_debug (DEBUG_LABEL, "END");
184 }
185
186
187 /*---------------------------------------------------------------------------*/
188 /* PRIVATE.  Set fill color method.                                          */
189 /*---------------------------------------------------------------------------*/
190 static void
191 set_fill_color (glLabelObject *object,
192                 glColorNode   *fill_color_node)
193 {
194         glLabelEllipse *lellipse = (glLabelEllipse *)object;
195
196         g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse));
197
198         if (!gl_color_node_equal (lellipse->priv->fill_color_node, fill_color_node)) {
199
200                 gl_color_node_free (&(lellipse->priv->fill_color_node));
201                 lellipse->priv->fill_color_node = gl_color_node_dup (fill_color_node);
202
203                 gl_label_object_emit_changed (GL_LABEL_OBJECT(lellipse));
204         }       
205 }
206
207 /*---------------------------------------------------------------------------*/
208 /* PRIVATE.  Set line color method.                                          */
209 /*---------------------------------------------------------------------------*/
210 static void
211 set_line_color (glLabelObject *object,
212                 glColorNode   *line_color_node)
213 {
214         glLabelEllipse *lellipse = (glLabelEllipse *)object;
215
216         g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse));
217
218         if ( !gl_color_node_equal (lellipse->priv->line_color_node, line_color_node) ) {
219                 
220                 gl_color_node_free (&(lellipse->priv->line_color_node));
221                 lellipse->priv->line_color_node = gl_color_node_dup (line_color_node);
222                 
223                 gl_label_object_emit_changed (GL_LABEL_OBJECT(lellipse));
224         }
225 }
226
227 /*---------------------------------------------------------------------------*/
228 /* PRIVATE.  Set line width method.                                          */
229 /*---------------------------------------------------------------------------*/
230 static void
231 set_line_width (glLabelObject *object,
232                 gdouble        line_width)
233 {
234         glLabelEllipse *lellipse = (glLabelEllipse *)object;
235
236         g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse));
237
238         if ( lellipse->priv->line_width != line_width ) {
239                 lellipse->priv->line_width = line_width;
240                 gl_label_object_emit_changed (GL_LABEL_OBJECT(lellipse));
241         }
242 }
243
244
245 /*---------------------------------------------------------------------------*/
246 /* PRIVATE.  Get fill color method.                                          */
247 /*---------------------------------------------------------------------------*/
248 static gdouble
249 get_line_width (glLabelObject *object)
250 {
251         glLabelEllipse *lellipse = (glLabelEllipse *)object;
252
253         g_return_val_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse), 0.0);
254
255         return lellipse->priv->line_width;
256 }
257
258 /*---------------------------------------------------------------------------*/
259 /* PRIVATE.  Get line color method.                                          */
260 /*---------------------------------------------------------------------------*/
261 static glColorNode*
262 get_line_color (glLabelObject *object)
263 {
264         glLabelEllipse *lellipse = (glLabelEllipse *)object;
265
266         g_return_val_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse), 0);
267
268         return gl_color_node_dup (lellipse->priv->line_color_node);
269 }
270
271 /*---------------------------------------------------------------------------*/
272 /* PRIVATE.  Get line width method.                                          */
273 /*---------------------------------------------------------------------------*/
274 static glColorNode*
275 get_fill_color (glLabelObject *object)
276 {
277         glLabelEllipse *lellipse = (glLabelEllipse *)object;
278
279         g_return_val_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse), 0);
280
281         return gl_color_node_dup (lellipse->priv->fill_color_node);
282 }
283
284 /*****************************************************************************/
285 /* Draw object method.                                                       */
286 /*****************************************************************************/
287 static void
288 draw_object (glLabelObject *object,
289              cairo_t       *cr,
290              gboolean       screen_flag,
291              glMergeRecord *record)
292 {
293         gdouble        w, h;
294         gdouble        line_width;
295         glColorNode   *line_color_node;
296         glColorNode   *fill_color_node;
297         guint          line_color;
298         guint          fill_color;
299
300         gl_debug (DEBUG_LABEL, "START");
301
302         gl_label_object_get_size (object, &w, &h);
303
304         line_width = gl_label_object_get_line_width (object);
305         
306         line_color_node = gl_label_object_get_line_color (object);
307         fill_color_node = gl_label_object_get_fill_color (object);
308         line_color = gl_color_node_expand (line_color_node, record);
309         fill_color = gl_color_node_expand (fill_color_node, record);
310         if (line_color_node->field_flag && screen_flag)
311         {
312                 line_color = GL_COLOR_MERGE_DEFAULT;
313         }
314         if (fill_color_node->field_flag && screen_flag)
315         {
316                 fill_color = GL_COLOR_FILL_MERGE_DEFAULT;
317         }
318
319
320         gl_cairo_ellipse_path (cr, w/2, h/2);
321
322         /* Paint fill color */
323         cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (fill_color));
324         cairo_fill_preserve (cr);
325
326         /* Draw outline */
327         cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (line_color));
328         cairo_set_line_width (cr, line_width);
329         cairo_stroke (cr);
330
331         gl_color_node_free (&line_color_node);
332         gl_color_node_free (&fill_color_node);
333
334         gl_debug (DEBUG_LABEL, "END");
335 }
336
337 /*****************************************************************************/
338 /* Draw shadow method.                                                       */
339 /*****************************************************************************/
340 static void
341 draw_shadow (glLabelObject *object,
342              cairo_t       *cr,
343              gboolean       screen_flag,
344              glMergeRecord *record)
345 {
346         gdouble        w, h;
347         gdouble        line_width;
348         glColorNode   *line_color_node;
349         glColorNode   *fill_color_node;
350         guint          line_color;
351         guint          fill_color;
352         glColorNode   *shadow_color_node;
353         guint          shadow_color;
354         gdouble        shadow_opacity;
355         guint          shadow_line_color;
356         guint          shadow_fill_color;
357
358         gl_debug (DEBUG_LABEL, "START");
359
360         gl_label_object_get_size (object, &w, &h);
361
362         line_width = gl_label_object_get_line_width (object);
363         
364         line_color_node = gl_label_object_get_line_color (object);
365         fill_color_node = gl_label_object_get_fill_color (object);
366         line_color = gl_color_node_expand (line_color_node, record);
367         fill_color = gl_color_node_expand (fill_color_node, record);
368         if (line_color_node->field_flag && screen_flag)
369         {
370                 line_color = GL_COLOR_MERGE_DEFAULT;
371         }
372         if (fill_color_node->field_flag && screen_flag)
373         {
374                 fill_color = GL_COLOR_FILL_MERGE_DEFAULT;
375         }
376
377         shadow_color_node = gl_label_object_get_shadow_color (object);
378         shadow_color = gl_color_node_expand (shadow_color_node, record);
379         if (shadow_color_node->field_flag && screen_flag)
380         {
381                 shadow_color = GL_COLOR_SHADOW_MERGE_DEFAULT;
382         }
383         shadow_opacity = gl_label_object_get_shadow_opacity (object);
384         shadow_line_color = gl_color_shadow (shadow_color_node->color, shadow_opacity, line_color_node->color);
385         shadow_fill_color = gl_color_shadow (shadow_color_node->color, shadow_opacity, fill_color_node->color);
386         
387
388         gl_cairo_ellipse_path (cr, w/2, h/2);
389
390
391         /* Draw fill shadow */
392         cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (shadow_fill_color));
393         cairo_fill_preserve (cr);
394
395         /* Draw outline shadow */
396         cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (shadow_line_color));
397         cairo_set_line_width (cr, line_width);
398         cairo_stroke (cr);
399
400
401         gl_color_node_free (&line_color_node);
402         gl_color_node_free (&fill_color_node);
403         gl_color_node_free (&shadow_color_node);
404
405         gl_debug (DEBUG_LABEL, "END");
406 }
407