3 * Copyright (C) 2001-2009 Jim Evins <evins@snaught.com>.
5 * This file is part of gLabels.
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.
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.
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/>.
21 #include "label-ellipse.h"
26 #include "cairo-ellipse-path.h"
30 /*========================================================*/
31 /* Private macros and constants. */
32 /*========================================================*/
34 /*========================================================*/
36 /*========================================================*/
38 struct _glLabelEllipsePrivate {
40 glColorNode *line_color_node;
41 glColorNode *fill_color_node;
44 /*========================================================*/
45 /* Private globals. */
46 /*========================================================*/
48 /*========================================================*/
49 /* Private function prototypes. */
50 /*========================================================*/
52 static void gl_label_ellipse_finalize (GObject *object);
54 static void copy (glLabelObject *dst_object,
55 glLabelObject *src_object);
57 static void set_fill_color (glLabelObject *object,
58 glColorNode *fill_color_node);
60 static void set_line_color (glLabelObject *object,
61 glColorNode *line_color_node);
63 static void set_line_width (glLabelObject *object,
66 static glColorNode* get_fill_color (glLabelObject *object);
68 static glColorNode* get_line_color (glLabelObject *object);
70 static gdouble get_line_width (glLabelObject *object);
72 static void draw_object (glLabelObject *object,
75 glMergeRecord *record);
77 static void draw_shadow (glLabelObject *object,
80 glMergeRecord *record);
83 /*****************************************************************************/
84 /* Boilerplate object stuff. */
85 /*****************************************************************************/
86 G_DEFINE_TYPE (glLabelEllipse, gl_label_ellipse, GL_TYPE_LABEL_OBJECT);
90 gl_label_ellipse_class_init (glLabelEllipseClass *class)
92 GObjectClass *object_class = G_OBJECT_CLASS (class);
93 glLabelObjectClass *label_object_class = GL_LABEL_OBJECT_CLASS (class);
95 gl_label_ellipse_parent_class = g_type_class_peek_parent (class);
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;
107 object_class->finalize = gl_label_ellipse_finalize;
112 gl_label_ellipse_init (glLabelEllipse *lellipse)
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 ();
121 gl_label_ellipse_finalize (GObject *object)
123 glLabelEllipse *lellipse = GL_LABEL_ELLIPSE (object);
125 g_return_if_fail (object && GL_IS_LABEL_ELLIPSE (object));
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);
131 G_OBJECT_CLASS (gl_label_ellipse_parent_class)->finalize (object);
135 /*****************************************************************************/
136 /* NEW label "ellipse" object. */
137 /*****************************************************************************/
139 gl_label_ellipse_new (glLabel *label)
141 glLabelEllipse *lellipse;
143 lellipse = g_object_new (gl_label_ellipse_get_type(), NULL);
145 gl_label_object_set_parent (GL_LABEL_OBJECT(lellipse), label);
147 return G_OBJECT (lellipse);
151 /*****************************************************************************/
152 /* Copy object contents. */
153 /*****************************************************************************/
155 copy (glLabelObject *dst_object,
156 glLabelObject *src_object)
158 glLabelEllipse *lellipse = (glLabelEllipse *)src_object;
159 glLabelEllipse *new_lellipse = (glLabelEllipse *)dst_object;
161 glColorNode *line_color_node;
162 glColorNode *fill_color_node;
164 gl_debug (DEBUG_LABEL, "START");
166 g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse));
167 g_return_if_fail (new_lellipse && GL_IS_LABEL_ELLIPSE (new_lellipse));
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);
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);
177 gl_color_node_free (&line_color_node);
178 gl_color_node_free (&fill_color_node);
180 gl_debug (DEBUG_LABEL, "END");
184 /*---------------------------------------------------------------------------*/
185 /* PRIVATE. Set fill color method. */
186 /*---------------------------------------------------------------------------*/
188 set_fill_color (glLabelObject *object,
189 glColorNode *fill_color_node)
191 glLabelEllipse *lellipse = (glLabelEllipse *)object;
193 g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse));
195 if (!gl_color_node_equal (lellipse->priv->fill_color_node, fill_color_node)) {
197 gl_color_node_free (&(lellipse->priv->fill_color_node));
198 lellipse->priv->fill_color_node = gl_color_node_dup (fill_color_node);
200 gl_label_object_emit_changed (GL_LABEL_OBJECT(lellipse));
205 /*---------------------------------------------------------------------------*/
206 /* PRIVATE. Set line color method. */
207 /*---------------------------------------------------------------------------*/
209 set_line_color (glLabelObject *object,
210 glColorNode *line_color_node)
212 glLabelEllipse *lellipse = (glLabelEllipse *)object;
214 g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse));
216 if ( !gl_color_node_equal (lellipse->priv->line_color_node, line_color_node) ) {
218 gl_color_node_free (&(lellipse->priv->line_color_node));
219 lellipse->priv->line_color_node = gl_color_node_dup (line_color_node);
221 gl_label_object_emit_changed (GL_LABEL_OBJECT(lellipse));
226 /*---------------------------------------------------------------------------*/
227 /* PRIVATE. Set line width method. */
228 /*---------------------------------------------------------------------------*/
230 set_line_width (glLabelObject *object,
233 glLabelEllipse *lellipse = (glLabelEllipse *)object;
235 g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse));
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));
244 /*---------------------------------------------------------------------------*/
245 /* PRIVATE. Get fill color method. */
246 /*---------------------------------------------------------------------------*/
248 get_line_width (glLabelObject *object)
250 glLabelEllipse *lellipse = (glLabelEllipse *)object;
252 g_return_val_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse), 0.0);
254 return lellipse->priv->line_width;
258 /*---------------------------------------------------------------------------*/
259 /* PRIVATE. Get line color method. */
260 /*---------------------------------------------------------------------------*/
262 get_line_color (glLabelObject *object)
264 glLabelEllipse *lellipse = (glLabelEllipse *)object;
266 g_return_val_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse), 0);
268 return gl_color_node_dup (lellipse->priv->line_color_node);
272 /*---------------------------------------------------------------------------*/
273 /* PRIVATE. Get line width method. */
274 /*---------------------------------------------------------------------------*/
276 get_fill_color (glLabelObject *object)
278 glLabelEllipse *lellipse = (glLabelEllipse *)object;
280 g_return_val_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse), 0);
282 return gl_color_node_dup (lellipse->priv->fill_color_node);
286 /*****************************************************************************/
287 /* Draw object method. */
288 /*****************************************************************************/
290 draw_object (glLabelObject *object,
292 gboolean screen_flag,
293 glMergeRecord *record)
297 glColorNode *line_color_node;
298 glColorNode *fill_color_node;
302 gl_debug (DEBUG_LABEL, "START");
304 gl_label_object_get_size (object, &w, &h);
306 line_width = gl_label_object_get_line_width (object);
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)
314 line_color = GL_COLOR_MERGE_DEFAULT;
316 if (fill_color_node->field_flag && screen_flag)
318 fill_color = GL_COLOR_FILL_MERGE_DEFAULT;
322 gl_cairo_ellipse_path (cr, w/2, h/2);
324 /* Paint fill color */
325 cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (fill_color));
326 cairo_fill_preserve (cr);
329 cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (line_color));
330 cairo_set_line_width (cr, line_width);
333 gl_color_node_free (&line_color_node);
334 gl_color_node_free (&fill_color_node);
336 gl_debug (DEBUG_LABEL, "END");
340 /*****************************************************************************/
341 /* Draw shadow method. */
342 /*****************************************************************************/
344 draw_shadow (glLabelObject *object,
346 gboolean screen_flag,
347 glMergeRecord *record)
351 glColorNode *line_color_node;
352 glColorNode *fill_color_node;
355 glColorNode *shadow_color_node;
357 gdouble shadow_opacity;
358 guint shadow_line_color;
359 guint shadow_fill_color;
361 gl_debug (DEBUG_LABEL, "START");
363 gl_label_object_get_size (object, &w, &h);
365 line_width = gl_label_object_get_line_width (object);
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)
373 line_color = GL_COLOR_MERGE_DEFAULT;
375 if (fill_color_node->field_flag && screen_flag)
377 fill_color = GL_COLOR_FILL_MERGE_DEFAULT;
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)
384 shadow_color = GL_COLOR_SHADOW_MERGE_DEFAULT;
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);
391 gl_cairo_ellipse_path (cr, w/2, h/2);
394 /* Draw fill shadow */
395 cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (shadow_fill_color));
396 cairo_fill_preserve (cr);
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);
404 gl_color_node_free (&line_color_node);
405 gl_color_node_free (&fill_color_node);
406 gl_color_node_free (&shadow_color_node);
408 gl_debug (DEBUG_LABEL, "END");
415 * Local Variables: -- emacs
417 * c-basic-offset: 8 -- emacs
418 * tab-width: 8 -- emacs
419 * indent-tabs-mode: nil -- emacs