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