1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
4 * (GLABELS) Label and Business Card Creation program for GNOME
6 * label_ellipse.c: GLabels label ellipse object
8 * Copyright (C) 2001-2007 Jim Evins <evins@snaught.com>.
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.
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.
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
25 #include "label-ellipse.h"
27 #include <glib/gmem.h>
28 #include <glib/gstrfuncs.h>
29 #include <glib/gmessages.h>
32 #include "cairo-ellipse-path.h"
36 /*========================================================*/
37 /* Private macros and constants. */
38 /*========================================================*/
40 /*========================================================*/
42 /*========================================================*/
44 struct _glLabelEllipsePrivate {
46 glColorNode *line_color_node;
47 glColorNode *fill_color_node;
50 /*========================================================*/
51 /* Private globals. */
52 /*========================================================*/
54 /*========================================================*/
55 /* Private function prototypes. */
56 /*========================================================*/
58 static void gl_label_ellipse_finalize (GObject *object);
60 static void copy (glLabelObject *dst_object,
61 glLabelObject *src_object);
63 static void set_fill_color (glLabelObject *object,
64 glColorNode *fill_color_node);
66 static void set_line_color (glLabelObject *object,
67 glColorNode *line_color_node);
69 static void set_line_width (glLabelObject *object,
72 static glColorNode* get_fill_color (glLabelObject *object);
74 static glColorNode* get_line_color (glLabelObject *object);
76 static gdouble get_line_width (glLabelObject *object);
78 static void draw_object (glLabelObject *object,
81 glMergeRecord *record);
83 static void draw_shadow (glLabelObject *object,
86 glMergeRecord *record);
91 /*****************************************************************************/
92 /* Boilerplate object stuff. */
93 /*****************************************************************************/
94 G_DEFINE_TYPE (glLabelEllipse, gl_label_ellipse, GL_TYPE_LABEL_OBJECT);
97 gl_label_ellipse_class_init (glLabelEllipseClass *class)
99 GObjectClass *object_class = G_OBJECT_CLASS (class);
100 glLabelObjectClass *label_object_class = GL_LABEL_OBJECT_CLASS (class);
102 gl_label_ellipse_parent_class = g_type_class_peek_parent (class);
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;
114 object_class->finalize = gl_label_ellipse_finalize;
118 gl_label_ellipse_init (glLabelEllipse *lellipse)
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 ();
126 gl_label_ellipse_finalize (GObject *object)
128 glLabelEllipse *lellipse = GL_LABEL_ELLIPSE (object);
130 g_return_if_fail (object && GL_IS_LABEL_ELLIPSE (object));
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);
136 G_OBJECT_CLASS (gl_label_ellipse_parent_class)->finalize (object);
139 /*****************************************************************************/
140 /* NEW label "ellipse" object. */
141 /*****************************************************************************/
143 gl_label_ellipse_new (glLabel *label)
145 glLabelEllipse *lellipse;
147 lellipse = g_object_new (gl_label_ellipse_get_type(), NULL);
149 gl_label_object_set_parent (GL_LABEL_OBJECT(lellipse), label);
151 return G_OBJECT (lellipse);
154 /*****************************************************************************/
155 /* Copy object contents. */
156 /*****************************************************************************/
158 copy (glLabelObject *dst_object,
159 glLabelObject *src_object)
161 glLabelEllipse *lellipse = (glLabelEllipse *)src_object;
162 glLabelEllipse *new_lellipse = (glLabelEllipse *)dst_object;
164 glColorNode *line_color_node;
165 glColorNode *fill_color_node;
167 gl_debug (DEBUG_LABEL, "START");
169 g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse));
170 g_return_if_fail (new_lellipse && GL_IS_LABEL_ELLIPSE (new_lellipse));
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);
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);
180 gl_color_node_free (&line_color_node);
181 gl_color_node_free (&fill_color_node);
183 gl_debug (DEBUG_LABEL, "END");
187 /*---------------------------------------------------------------------------*/
188 /* PRIVATE. Set fill color method. */
189 /*---------------------------------------------------------------------------*/
191 set_fill_color (glLabelObject *object,
192 glColorNode *fill_color_node)
194 glLabelEllipse *lellipse = (glLabelEllipse *)object;
196 g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse));
198 if (!gl_color_node_equal (lellipse->priv->fill_color_node, fill_color_node)) {
200 gl_color_node_free (&(lellipse->priv->fill_color_node));
201 lellipse->priv->fill_color_node = gl_color_node_dup (fill_color_node);
203 gl_label_object_emit_changed (GL_LABEL_OBJECT(lellipse));
207 /*---------------------------------------------------------------------------*/
208 /* PRIVATE. Set line color method. */
209 /*---------------------------------------------------------------------------*/
211 set_line_color (glLabelObject *object,
212 glColorNode *line_color_node)
214 glLabelEllipse *lellipse = (glLabelEllipse *)object;
216 g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse));
218 if ( !gl_color_node_equal (lellipse->priv->line_color_node, line_color_node) ) {
220 gl_color_node_free (&(lellipse->priv->line_color_node));
221 lellipse->priv->line_color_node = gl_color_node_dup (line_color_node);
223 gl_label_object_emit_changed (GL_LABEL_OBJECT(lellipse));
227 /*---------------------------------------------------------------------------*/
228 /* PRIVATE. Set line width method. */
229 /*---------------------------------------------------------------------------*/
231 set_line_width (glLabelObject *object,
234 glLabelEllipse *lellipse = (glLabelEllipse *)object;
236 g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse));
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));
245 /*---------------------------------------------------------------------------*/
246 /* PRIVATE. Get fill color method. */
247 /*---------------------------------------------------------------------------*/
249 get_line_width (glLabelObject *object)
251 glLabelEllipse *lellipse = (glLabelEllipse *)object;
253 g_return_val_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse), 0.0);
255 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);
271 /*---------------------------------------------------------------------------*/
272 /* PRIVATE. Get line width method. */
273 /*---------------------------------------------------------------------------*/
275 get_fill_color (glLabelObject *object)
277 glLabelEllipse *lellipse = (glLabelEllipse *)object;
279 g_return_val_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse), 0);
281 return gl_color_node_dup (lellipse->priv->fill_color_node);
284 /*****************************************************************************/
285 /* Draw object method. */
286 /*****************************************************************************/
288 draw_object (glLabelObject *object,
290 gboolean screen_flag,
291 glMergeRecord *record)
295 glColorNode *line_color_node;
296 glColorNode *fill_color_node;
300 gl_debug (DEBUG_LABEL, "START");
302 gl_label_object_get_size (object, &w, &h);
304 line_width = gl_label_object_get_line_width (object);
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)
312 line_color = GL_COLOR_MERGE_DEFAULT;
314 if (fill_color_node->field_flag && screen_flag)
316 fill_color = GL_COLOR_FILL_MERGE_DEFAULT;
320 gl_cairo_ellipse_path (cr, w/2, h/2);
322 /* Paint fill color */
323 cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (fill_color));
324 cairo_fill_preserve (cr);
327 cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (line_color));
328 cairo_set_line_width (cr, line_width);
331 gl_color_node_free (&line_color_node);
332 gl_color_node_free (&fill_color_node);
334 gl_debug (DEBUG_LABEL, "END");
337 /*****************************************************************************/
338 /* Draw shadow method. */
339 /*****************************************************************************/
341 draw_shadow (glLabelObject *object,
343 gboolean screen_flag,
344 glMergeRecord *record)
348 glColorNode *line_color_node;
349 glColorNode *fill_color_node;
352 glColorNode *shadow_color_node;
354 gdouble shadow_opacity;
355 guint shadow_line_color;
356 guint shadow_fill_color;
358 gl_debug (DEBUG_LABEL, "START");
360 gl_label_object_get_size (object, &w, &h);
362 line_width = gl_label_object_get_line_width (object);
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)
370 line_color = GL_COLOR_MERGE_DEFAULT;
372 if (fill_color_node->field_flag && screen_flag)
374 fill_color = GL_COLOR_FILL_MERGE_DEFAULT;
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)
381 shadow_color = GL_COLOR_SHADOW_MERGE_DEFAULT;
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);
388 gl_cairo_ellipse_path (cr, w/2, h/2);
391 /* Draw fill shadow */
392 cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (shadow_fill_color));
393 cairo_fill_preserve (cr);
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);
401 gl_color_node_free (&line_color_node);
402 gl_color_node_free (&fill_color_node);
403 gl_color_node_free (&shadow_color_node);
405 gl_debug (DEBUG_LABEL, "END");