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-box.h"
28 /*========================================================*/
30 /*========================================================*/
32 struct _glLabelBoxPrivate {
34 glColorNode *line_color_node;
35 glColorNode *fill_color_node;
39 /*========================================================*/
40 /* Private globals. */
41 /*========================================================*/
44 /*========================================================*/
45 /* Private function prototypes. */
46 /*========================================================*/
48 static void gl_label_box_finalize (GObject *object);
50 static void copy (glLabelObject *dst_object,
51 glLabelObject *src_object);
53 static void set_fill_color (glLabelObject *object,
54 glColorNode *fill_color_node);
56 static void set_line_color (glLabelObject *object,
57 glColorNode *line_color_node);
59 static void set_line_width (glLabelObject *object,
62 static glColorNode* get_fill_color (glLabelObject *object);
64 static glColorNode* get_line_color (glLabelObject *object);
66 static gdouble get_line_width (glLabelObject *object);
68 static void draw_object (glLabelObject *object,
71 glMergeRecord *record);
73 static void draw_shadow (glLabelObject *object,
76 glMergeRecord *record);
79 /*****************************************************************************/
80 /* Boilerplate object stuff. */
81 /*****************************************************************************/
82 G_DEFINE_TYPE (glLabelBox, gl_label_box, GL_TYPE_LABEL_OBJECT);
86 gl_label_box_class_init (glLabelBoxClass *class)
88 GObjectClass *object_class = G_OBJECT_CLASS (class);
89 glLabelObjectClass *label_object_class = GL_LABEL_OBJECT_CLASS (class);
91 gl_label_box_parent_class = g_type_class_peek_parent (class);
93 label_object_class->copy = copy;
94 label_object_class->set_fill_color = set_fill_color;
95 label_object_class->set_line_color = set_line_color;
96 label_object_class->set_line_width = set_line_width;
97 label_object_class->get_fill_color = get_fill_color;
98 label_object_class->get_line_color = get_line_color;
99 label_object_class->get_line_width = get_line_width;
100 label_object_class->draw_object = draw_object;
101 label_object_class->draw_shadow = draw_shadow;
103 object_class->finalize = gl_label_box_finalize;
108 gl_label_box_init (glLabelBox *lbox)
110 lbox->priv = g_new0 (glLabelBoxPrivate, 1);
111 lbox->priv->line_color_node = gl_color_node_new_default ();
112 lbox->priv->fill_color_node = gl_color_node_new_default ();
117 gl_label_box_finalize (GObject *object)
119 glLabelBox *lbox = GL_LABEL_BOX (object);
121 g_return_if_fail (object && GL_IS_LABEL_BOX (object));
123 gl_color_node_free (&(lbox->priv->fill_color_node));
124 gl_color_node_free (&(lbox->priv->line_color_node));
127 G_OBJECT_CLASS (gl_label_box_parent_class)->finalize (object);
131 /*****************************************************************************/
132 /* NEW label "box" object. */
133 /*****************************************************************************/
135 gl_label_box_new (glLabel *label)
139 lbox = g_object_new (gl_label_box_get_type(), NULL);
141 gl_label_object_set_parent (GL_LABEL_OBJECT(lbox), label);
143 return G_OBJECT (lbox);
147 /*****************************************************************************/
148 /* Copy object contents. */
149 /*****************************************************************************/
151 copy (glLabelObject *dst_object,
152 glLabelObject *src_object)
154 glLabelBox *lbox = (glLabelBox *)src_object;
155 glLabelBox *new_lbox = (glLabelBox *)dst_object;
157 glColorNode *line_color_node;
158 glColorNode *fill_color_node;
160 gl_debug (DEBUG_LABEL, "START");
162 g_return_if_fail (lbox && GL_IS_LABEL_BOX (lbox));
163 g_return_if_fail (new_lbox && GL_IS_LABEL_BOX (new_lbox));
165 line_width = get_line_width (src_object);
166 line_color_node = get_line_color (src_object);
167 fill_color_node = get_fill_color (src_object);
169 set_line_width (dst_object, line_width);
170 set_line_color (dst_object, line_color_node);
171 set_fill_color (dst_object, fill_color_node);
173 gl_color_node_free (&line_color_node);
174 gl_color_node_free (&fill_color_node);
176 gl_debug (DEBUG_LABEL, "END");
180 /*---------------------------------------------------------------------------*/
181 /* PRIVATE. Set fill color method. */
182 /*---------------------------------------------------------------------------*/
184 set_fill_color (glLabelObject *object,
185 glColorNode *fill_color_node)
187 glLabelBox *lbox = (glLabelBox *)object;
189 gl_debug (DEBUG_LABEL, "START");
191 g_return_if_fail (lbox && GL_IS_LABEL_BOX (lbox));
193 if (!gl_color_node_equal (lbox->priv->fill_color_node, fill_color_node)) {
195 gl_color_node_free (&(lbox->priv->fill_color_node));
196 lbox->priv->fill_color_node = gl_color_node_dup (fill_color_node);
198 gl_label_object_emit_changed (GL_LABEL_OBJECT(lbox));
200 gl_debug (DEBUG_LABEL, "END");
204 /*---------------------------------------------------------------------------*/
205 /* PRIVATE. Set line color method. */
206 /*---------------------------------------------------------------------------*/
208 set_line_color (glLabelObject *object,
209 glColorNode *line_color_node)
211 glLabelBox *lbox = (glLabelBox *)object;
213 g_return_if_fail (lbox && GL_IS_LABEL_BOX (lbox));
215 if ( !gl_color_node_equal (lbox->priv->line_color_node, line_color_node )) {
216 gl_color_node_free (&(lbox->priv->line_color_node));
217 lbox->priv->line_color_node = gl_color_node_dup (line_color_node);
218 gl_label_object_emit_changed (GL_LABEL_OBJECT(lbox));
223 /*---------------------------------------------------------------------------*/
224 /* PRIVATE. Set line width method. */
225 /*---------------------------------------------------------------------------*/
227 set_line_width (glLabelObject *object,
230 glLabelBox *lbox = (glLabelBox *)object;
232 g_return_if_fail (lbox && GL_IS_LABEL_BOX (lbox));
234 if ( lbox->priv->line_width != line_width ) {
235 lbox->priv->line_width = line_width;
236 gl_label_object_emit_changed (GL_LABEL_OBJECT(lbox));
241 /*---------------------------------------------------------------------------*/
242 /* PRIVATE. Get fill color method. */
243 /*---------------------------------------------------------------------------*/
245 get_line_width (glLabelObject *object)
247 glLabelBox *lbox = (glLabelBox *)object;
249 g_return_val_if_fail (lbox && GL_IS_LABEL_BOX (lbox), 0.0);
251 return lbox->priv->line_width;
255 /*---------------------------------------------------------------------------*/
256 /* PRIVATE. Get line color method. */
257 /*---------------------------------------------------------------------------*/
259 get_line_color (glLabelObject *object)
261 glLabelBox *lbox = (glLabelBox *)object;
263 g_return_val_if_fail (lbox && GL_IS_LABEL_BOX (lbox), 0);
265 return gl_color_node_dup (lbox->priv->line_color_node);
269 /*---------------------------------------------------------------------------*/
270 /* PRIVATE. Get line width method. */
271 /*---------------------------------------------------------------------------*/
273 get_fill_color (glLabelObject *object)
275 glLabelBox *lbox = (glLabelBox *)object;
277 g_return_val_if_fail (lbox && GL_IS_LABEL_BOX (lbox), 0);
279 return gl_color_node_dup (lbox->priv->fill_color_node);
283 /*****************************************************************************/
284 /* Draw object method. */
285 /*****************************************************************************/
287 draw_object (glLabelObject *object,
289 gboolean screen_flag,
290 glMergeRecord *record)
294 glColorNode *line_color_node;
295 glColorNode *fill_color_node;
299 gl_debug (DEBUG_LABEL, "START");
301 gl_label_object_get_size (object, &w, &h);
303 line_width = gl_label_object_get_line_width (object);
305 line_color_node = gl_label_object_get_line_color (object);
306 fill_color_node = gl_label_object_get_fill_color (object);
307 line_color = gl_color_node_expand (line_color_node, record);
308 fill_color = gl_color_node_expand (fill_color_node, record);
309 if (line_color_node->field_flag && screen_flag)
311 line_color = GL_COLOR_MERGE_DEFAULT;
313 if (fill_color_node->field_flag && screen_flag)
315 fill_color = GL_COLOR_FILL_MERGE_DEFAULT;
319 cairo_rectangle (cr, 0.0, 0.0, w, h);
321 /* Paint fill color */
322 cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (fill_color));
323 cairo_fill_preserve (cr);
326 cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (line_color));
327 cairo_set_line_width (cr, line_width);
330 gl_color_node_free (&line_color_node);
331 gl_color_node_free (&fill_color_node);
333 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, shadow_opacity, line_color_node->color);
385 shadow_fill_color = gl_color_shadow (shadow_color, shadow_opacity, fill_color_node->color);
388 cairo_rectangle (cr, 0.0, 0.0, w, h);
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");
412 * Local Variables: -- emacs
414 * c-basic-offset: 8 -- emacs
415 * tab-width: 8 -- emacs
416 * indent-tabs-mode: nil -- emacs