]> git.sur5r.net Git - glabels/blob - src/label-box.c
Organized master branch to be top-level directory for glabels, instead of
[glabels] / src / label-box.c
1 /*
2  *  label-box.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-box.h"
22
23 #include <glib.h>
24
25 #include "debug.h"
26
27
28 /*========================================================*/
29 /* Private types.                                         */
30 /*========================================================*/
31
32 struct _glLabelBoxPrivate {
33         gdouble          line_width;
34         glColorNode      *line_color_node;
35         glColorNode      *fill_color_node;
36 };
37
38
39 /*========================================================*/
40 /* Private globals.                                       */
41 /*========================================================*/
42
43
44 /*========================================================*/
45 /* Private function prototypes.                           */
46 /*========================================================*/
47
48 static void    gl_label_box_finalize      (GObject         *object);
49
50 static void    copy                       (glLabelObject   *dst_object,
51                                            glLabelObject   *src_object);
52
53 static void    set_fill_color             (glLabelObject   *object,
54                                            glColorNode     *fill_color_node);
55
56 static void    set_line_color             (glLabelObject   *object,
57                                            glColorNode     *line_color_node);
58
59 static void    set_line_width             (glLabelObject   *object,
60                                            gdouble          line_width);
61
62 static glColorNode*   get_fill_color      (glLabelObject   *object);
63
64 static glColorNode*   get_line_color      (glLabelObject   *object);
65
66 static gdouble get_line_width             (glLabelObject   *object);
67
68 static void    draw_object                (glLabelObject     *object,
69                                            cairo_t           *cr,
70                                            gboolean           screen_flag,
71                                            glMergeRecord     *record);
72
73 static void    draw_shadow                (glLabelObject     *object,
74                                            cairo_t           *cr,
75                                            gboolean           screen_flag,
76                                            glMergeRecord     *record);
77
78
79 /*****************************************************************************/
80 /* Boilerplate object stuff.                                                 */
81 /*****************************************************************************/
82 G_DEFINE_TYPE (glLabelBox, gl_label_box, GL_TYPE_LABEL_OBJECT);
83
84
85 static void
86 gl_label_box_class_init (glLabelBoxClass *class)
87 {
88         GObjectClass       *object_class       = G_OBJECT_CLASS (class);
89         glLabelObjectClass *label_object_class = GL_LABEL_OBJECT_CLASS (class);
90
91         gl_label_box_parent_class = g_type_class_peek_parent (class);
92
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;
102
103         object_class->finalize = gl_label_box_finalize;
104 }
105
106
107 static void
108 gl_label_box_init (glLabelBox *lbox)
109 {
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 ();
113 }
114
115
116 static void
117 gl_label_box_finalize (GObject *object)
118 {
119         glLabelBox *lbox = GL_LABEL_BOX (object);
120
121         g_return_if_fail (object && GL_IS_LABEL_BOX (object));
122
123         gl_color_node_free (&(lbox->priv->fill_color_node));
124         gl_color_node_free (&(lbox->priv->line_color_node));
125         g_free (lbox->priv);
126
127         G_OBJECT_CLASS (gl_label_box_parent_class)->finalize (object);
128 }
129
130
131 /*****************************************************************************/
132 /* NEW label "box" object.                                                   */
133 /*****************************************************************************/
134 GObject *
135 gl_label_box_new (glLabel *label)
136 {
137         glLabelBox *lbox;
138
139         lbox = g_object_new (gl_label_box_get_type(), NULL);
140
141         gl_label_object_set_parent (GL_LABEL_OBJECT(lbox), label);
142
143         return G_OBJECT (lbox);
144 }
145
146
147 /*****************************************************************************/
148 /* Copy object contents.                                                     */
149 /*****************************************************************************/
150 static void
151 copy (glLabelObject *dst_object,
152       glLabelObject *src_object)
153 {
154         glLabelBox  *lbox     = (glLabelBox *)src_object;
155         glLabelBox  *new_lbox = (glLabelBox *)dst_object;
156         gdouble      line_width;
157         glColorNode *line_color_node;
158         glColorNode *fill_color_node;
159
160         gl_debug (DEBUG_LABEL, "START");
161
162         g_return_if_fail (lbox && GL_IS_LABEL_BOX (lbox));
163         g_return_if_fail (new_lbox && GL_IS_LABEL_BOX (new_lbox));
164
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);
168
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);
172         
173         gl_color_node_free (&line_color_node);
174         gl_color_node_free (&fill_color_node);
175
176         gl_debug (DEBUG_LABEL, "END");
177 }
178
179
180 /*---------------------------------------------------------------------------*/
181 /* PRIVATE.  Set fill color method.                                          */
182 /*---------------------------------------------------------------------------*/
183 static void
184 set_fill_color (glLabelObject *object,
185                 glColorNode   *fill_color_node)
186 {
187         glLabelBox *lbox = (glLabelBox *)object;
188         
189         gl_debug (DEBUG_LABEL, "START");
190
191         g_return_if_fail (lbox && GL_IS_LABEL_BOX (lbox));
192
193         if (!gl_color_node_equal (lbox->priv->fill_color_node, fill_color_node)) {
194
195                 gl_color_node_free (&(lbox->priv->fill_color_node));
196                 lbox->priv->fill_color_node = gl_color_node_dup (fill_color_node);
197
198                 gl_label_object_emit_changed (GL_LABEL_OBJECT(lbox));
199         }
200         gl_debug (DEBUG_LABEL, "END");
201 }
202
203
204 /*---------------------------------------------------------------------------*/
205 /* PRIVATE.  Set line color method.                                          */
206 /*---------------------------------------------------------------------------*/
207 static void
208 set_line_color (glLabelObject *object,
209                 glColorNode   *line_color_node)
210 {
211         glLabelBox *lbox = (glLabelBox *)object;
212
213         g_return_if_fail (lbox && GL_IS_LABEL_BOX (lbox));
214
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));
219         }
220 }
221
222
223 /*---------------------------------------------------------------------------*/
224 /* PRIVATE.  Set line width method.                                          */
225 /*---------------------------------------------------------------------------*/
226 static void
227 set_line_width (glLabelObject *object,
228                 gdouble        line_width)
229 {
230         glLabelBox *lbox = (glLabelBox *)object;
231
232         g_return_if_fail (lbox && GL_IS_LABEL_BOX (lbox));
233
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));
237         }
238 }
239
240
241 /*---------------------------------------------------------------------------*/
242 /* PRIVATE.  Get fill color method.                                          */
243 /*---------------------------------------------------------------------------*/
244 static gdouble
245 get_line_width (glLabelObject *object)
246 {
247         glLabelBox *lbox = (glLabelBox *)object;
248
249         g_return_val_if_fail (lbox && GL_IS_LABEL_BOX (lbox), 0.0);
250
251         return lbox->priv->line_width;
252 }
253
254
255 /*---------------------------------------------------------------------------*/
256 /* PRIVATE.  Get line color method.                                          */
257 /*---------------------------------------------------------------------------*/
258 static glColorNode*
259 get_line_color (glLabelObject *object)
260 {
261         glLabelBox *lbox = (glLabelBox *)object;
262
263         g_return_val_if_fail (lbox && GL_IS_LABEL_BOX (lbox), 0);
264
265         return gl_color_node_dup (lbox->priv->line_color_node);
266 }
267
268
269 /*---------------------------------------------------------------------------*/
270 /* PRIVATE.  Get line width method.                                          */
271 /*---------------------------------------------------------------------------*/
272 static glColorNode*
273 get_fill_color (glLabelObject *object)
274 {
275         glLabelBox *lbox = (glLabelBox *)object;
276
277         g_return_val_if_fail (lbox && GL_IS_LABEL_BOX (lbox), 0);
278
279         return gl_color_node_dup (lbox->priv->fill_color_node);
280 }
281
282
283 /*****************************************************************************/
284 /* Draw object method.                                                       */
285 /*****************************************************************************/
286 static void
287 draw_object (glLabelObject *object,
288              cairo_t       *cr,
289              gboolean       screen_flag,
290              glMergeRecord *record)
291 {
292         gdouble        w, h;
293         gdouble        line_width;
294         glColorNode   *line_color_node;
295         glColorNode   *fill_color_node;
296         guint          line_color;
297         guint          fill_color;
298
299         gl_debug (DEBUG_LABEL, "START");
300
301         gl_label_object_get_size (object, &w, &h);
302
303         line_width = gl_label_object_get_line_width (object);
304         
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)
310         {
311                 line_color = GL_COLOR_MERGE_DEFAULT;
312         }
313         if (fill_color_node->field_flag && screen_flag)
314         {
315                 fill_color = GL_COLOR_FILL_MERGE_DEFAULT;
316         }
317
318
319         cairo_rectangle (cr, 0.0, 0.0, w, h);
320
321         /* Paint fill color */
322         cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (fill_color));
323         cairo_fill_preserve (cr);
324
325         /* Draw outline */
326         cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (line_color));
327         cairo_set_line_width (cr, line_width);
328         cairo_stroke (cr);
329
330         gl_color_node_free (&line_color_node);
331         gl_color_node_free (&fill_color_node);
332
333         gl_debug (DEBUG_LABEL, "END");
334 }
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, shadow_opacity, line_color_node->color);
385         shadow_fill_color = gl_color_shadow (shadow_color, shadow_opacity, fill_color_node->color);
386         
387
388         cairo_rectangle (cr, 0.0, 0.0, w, h);
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
408
409
410
411 /*
412  * Local Variables:       -- emacs
413  * mode: C                -- emacs
414  * c-basic-offset: 8      -- emacs
415  * tab-width: 8           -- emacs
416  * indent-tabs-mode: nil  -- emacs
417  * End:                   -- emacs
418  */