[AdgLineStyle] Removed embedded color dress
[adg.git] / adg / adg-line-style.c
blobe24395b4f6f87ce3668ee9fffa36736af880226c
1 /* ADG - Automatic Drawing Generation
2 * Copyright (C) 2007,2008,2009 Nicola Fontana <ntd at entidi.it>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
21 /**
22 * SECTION:adg-line-style
23 * @short_description: Line style related stuff
25 * Contains parameters on how to draw lines such as width, cap mode, join mode
26 * and dash composition, if used.
27 **/
29 /**
30 * AdgLineStyle:
32 * All fields are private and should not be used directly.
33 * Use its public methods instead.
34 **/
37 #include "adg-line-style.h"
38 #include "adg-line-style-private.h"
39 #include "adg-intl.h"
41 #define PARENT_STYLE_CLASS ((AdgStyleClass *) adg_line_style_parent_class)
44 enum {
45 PROP_0,
46 PROP_WIDTH,
47 PROP_CAP,
48 PROP_JOIN,
49 PROP_MITER_LIMIT,
50 PROP_ANTIALIAS,
51 PROP_DASH
55 static void get_property (GObject *object,
56 guint prop_id,
57 GValue *value,
58 GParamSpec *pspec);
59 static void set_property (GObject *object,
60 guint prop_id,
61 const GValue *value,
62 GParamSpec *pspec);
63 static void apply (AdgStyle *style,
64 cairo_t *cr);
67 G_DEFINE_TYPE(AdgLineStyle, adg_line_style, ADG_TYPE_STYLE);
70 static void
71 adg_line_style_class_init(AdgLineStyleClass *klass)
73 GObjectClass *gobject_class;
74 AdgStyleClass *style_class;
75 GParamSpec *param;
77 gobject_class = (GObjectClass *) klass;
78 style_class = (AdgStyleClass *) klass;
80 g_type_class_add_private(klass, sizeof(AdgLineStylePrivate));
82 gobject_class->get_property = get_property;
83 gobject_class->set_property = set_property;
85 style_class->apply = apply;
87 param = g_param_spec_double("width",
88 P_("Line Width"),
89 P_("The line thickness in device unit"),
90 0., G_MAXDOUBLE, 2., G_PARAM_READWRITE);
91 g_object_class_install_property(gobject_class, PROP_WIDTH, param);
93 param = g_param_spec_int("cap",
94 P_("Line Cap"),
95 P_("The line cap mode"),
96 G_MININT, G_MAXINT, CAIRO_LINE_CAP_ROUND,
97 G_PARAM_READWRITE);
98 g_object_class_install_property(gobject_class, PROP_CAP, param);
100 param = g_param_spec_int("join",
101 P_("Line Join"),
102 P_("The line join mode"),
103 G_MININT, G_MAXINT, CAIRO_LINE_JOIN_MITER,
104 G_PARAM_READWRITE);
105 g_object_class_install_property(gobject_class, PROP_JOIN, param);
107 param = g_param_spec_double("miter-limit",
108 P_("Miter Limit"),
109 P_("Whether the lines should be joined with a bevel instead of a miter"),
110 0., G_MAXDOUBLE, 10., G_PARAM_READWRITE);
111 g_object_class_install_property(gobject_class, PROP_MITER_LIMIT,
112 param);
114 param = g_param_spec_int("antialias",
115 P_("Antialiasing Mode"),
116 P_("Type of antialiasing to do when rendering lines"),
117 G_MININT, G_MAXINT, CAIRO_ANTIALIAS_DEFAULT,
118 G_PARAM_READWRITE);
119 g_object_class_install_property(gobject_class, PROP_ANTIALIAS, param);
121 /* TODO: PROP_DASH (PROP_DASHES, PROP_NUM_DASHES, PROP_DASH_OFFSET) */
124 static void
125 adg_line_style_init(AdgLineStyle *line_style)
127 AdgLineStylePrivate *data = G_TYPE_INSTANCE_GET_PRIVATE(line_style,
128 ADG_TYPE_LINE_STYLE,
129 AdgLineStylePrivate);
131 data->width = 2.;
132 data->cap = CAIRO_LINE_CAP_ROUND;
133 data->join = CAIRO_LINE_JOIN_MITER;
134 data->miter_limit = 10.;
135 data->antialias = CAIRO_ANTIALIAS_DEFAULT;
136 data->dashes = NULL;
137 data->num_dashes = 0;
138 data->dash_offset = 0.;
140 line_style->data = data;
143 static void
144 get_property(GObject *object,
145 guint prop_id, GValue *value, GParamSpec *pspec)
147 AdgLineStylePrivate *data = ((AdgLineStyle *) object)->data;
149 switch (prop_id) {
150 case PROP_WIDTH:
151 g_value_set_double(value, data->width);
152 break;
153 case PROP_CAP:
154 g_value_set_int(value, data->cap);
155 break;
156 case PROP_JOIN:
157 g_value_set_int(value, data->join);
158 break;
159 case PROP_MITER_LIMIT:
160 g_value_set_double(value, data->miter_limit);
161 break;
162 case PROP_ANTIALIAS:
163 g_value_set_int(value, data->antialias);
164 break;
165 case PROP_DASH:
166 /* TODO */
167 break;
168 default:
169 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
170 break;
174 static void
175 set_property(GObject *object,
176 guint prop_id, const GValue *value, GParamSpec *pspec)
178 AdgLineStylePrivate *data = ((AdgLineStyle *) object)->data;
180 switch (prop_id) {
181 case PROP_WIDTH:
182 data->width = g_value_get_double(value);
183 break;
184 case PROP_CAP:
185 data->cap = g_value_get_int(value);
186 break;
187 case PROP_JOIN:
188 data->join = g_value_get_int(value);
189 break;
190 case PROP_MITER_LIMIT:
191 data->miter_limit = g_value_get_double(value);
192 break;
193 case PROP_ANTIALIAS:
194 data->antialias = g_value_get_int(value);
195 break;
196 case PROP_DASH:
197 /* TODO */
198 break;
199 default:
200 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
201 break;
207 * adg_line_style_new:
209 * Constructs a new line style initialized with default params.
211 * Returns: a new line style
213 AdgLineStyle *
214 adg_line_style_new(void)
216 return g_object_new(ADG_TYPE_LINE_STYLE, NULL);
220 * adg_line_style_get_width:
221 * @line_style: an #AdgLineStyle object
223 * Gets the line thickness value (in global space).
225 * Returns: the requested width
227 gdouble
228 adg_line_style_get_width(AdgLineStyle *line_style)
230 AdgLineStylePrivate *data;
232 g_return_val_if_fail(ADG_IS_LINE_STYLE(line_style), 0.);
234 data = line_style->data;
236 return data->width;
240 * adg_line_style_set_width:
241 * @line_style: an #AdgLineStyle object
242 * @width: the new width
244 * Sets a new line thickness value.
246 void
247 adg_line_style_set_width(AdgLineStyle *line_style, gdouble width)
249 AdgLineStylePrivate *data;
251 g_return_if_fail(ADG_IS_LINE_STYLE(line_style));
253 data = line_style->data;
254 data->width = width;
256 g_object_notify((GObject *) line_style, "width");
260 * adg_line_style_get_cap:
261 * @line_style: an #AdgLineStyle object
263 * Gets the line cap mode.
265 * Returns: the requested line cap mode
267 cairo_line_cap_t
268 adg_line_style_get_cap(AdgLineStyle *line_style)
270 AdgLineStylePrivate *data;
272 g_return_val_if_fail(ADG_IS_LINE_STYLE(line_style),
273 CAIRO_LINE_CAP_BUTT);
275 data = line_style->data;
277 return data->cap;
281 * adg_line_style_set_cap:
282 * @line_style: an #AdgLineStyle object
283 * @cap: the new cap mode
285 * Sets a new line cap mode.
287 void
288 adg_line_style_set_cap(AdgLineStyle *line_style, cairo_line_cap_t cap)
290 AdgLineStylePrivate *data;
292 g_return_if_fail(ADG_IS_LINE_STYLE(line_style));
294 data = line_style->data;
295 data->cap = cap;
297 g_object_notify((GObject *) line_style, "cap");
301 * adg_line_style_get_join:
302 * @line_style: an #AdgLineStyle object
304 * Gets the line join mode.
306 * Returns: the requested line join mode
308 cairo_line_join_t
309 adg_line_style_get_join(AdgLineStyle *line_style)
311 AdgLineStylePrivate *data;
313 g_return_val_if_fail(ADG_IS_LINE_STYLE(line_style),
314 CAIRO_LINE_JOIN_MITER);
316 data = line_style->data;
318 return data->join;
322 * adg_line_style_set_join:
323 * @line_style: an #AdgLineStyle object
324 * @join: the new join mode
326 * Sets a new line join mode.
328 void
329 adg_line_style_set_join(AdgLineStyle *line_style, cairo_line_join_t join)
331 AdgLineStylePrivate *data;
333 g_return_if_fail(ADG_IS_LINE_STYLE(line_style));
335 data->join = join;
336 data = line_style->data;
338 g_object_notify((GObject *) line_style, "join");
342 * adg_line_style_get_miter_limit:
343 * @line_style: an #AdgLineStyle object
345 * Gets the line miter limit value. The miter limit is used to determine
346 * whether the lines should be joined with a bevel instead of a miter.
348 * Returns: the requested miter limit
350 gdouble
351 adg_line_style_get_miter_limit(AdgLineStyle *line_style)
353 AdgLineStylePrivate *data;
355 g_return_val_if_fail(ADG_IS_LINE_STYLE(line_style), 0.);
357 data = line_style->data;
359 return data->miter_limit;
363 * adg_line_style_set_miter_limit:
364 * @line_style: an #AdgLineStyle object
365 * @miter_limit: the new miter limit
367 * Sets a new miter limit value.
369 void
370 adg_line_style_set_miter_limit(AdgLineStyle *line_style,
371 gdouble miter_limit)
373 AdgLineStylePrivate *data;
375 g_return_if_fail(ADG_IS_LINE_STYLE(line_style));
377 data = line_style->data;
378 data->miter_limit = miter_limit;
380 g_object_notify((GObject *) line_style, "miter-limit");
384 * adg_line_style_get_antialias:
385 * @line_style: an #AdgLineStyle object
387 * Gets the antialias mode used.
389 * Returns: the requested antialias mode
391 cairo_antialias_t
392 adg_line_style_get_antialias(AdgLineStyle *line_style)
394 AdgLineStylePrivate *data;
396 g_return_val_if_fail(ADG_IS_LINE_STYLE(line_style),
397 CAIRO_ANTIALIAS_DEFAULT);
399 data = line_style->data;
401 return data->antialias;
405 * adg_line_style_set_antialias:
406 * @line_style: an #AdgLineStyle object
407 * @antialias: the new antialias mode
409 * Sets a new antialias mode.
411 void
412 adg_line_style_set_antialias(AdgLineStyle *line_style,
413 cairo_antialias_t antialias)
415 AdgLineStylePrivate *data;
417 g_return_if_fail(ADG_IS_LINE_STYLE(line_style));
419 data = line_style->data;
420 data->antialias = antialias;
422 g_object_notify((GObject *) line_style, "antialias");
425 static void
426 apply(AdgStyle *style, cairo_t *cr)
428 AdgLineStylePrivate *data = ((AdgLineStyle *) style)->data;
430 cairo_set_line_width(cr, data->width);
431 cairo_set_line_cap(cr, data->cap);
432 cairo_set_line_join(cr, data->join);
433 cairo_set_miter_limit(cr, data->miter_limit);
434 cairo_set_antialias(cr, data->antialias);
436 if (data->num_dashes > 0) {
437 g_return_if_fail(data->dashes != NULL);
439 cairo_set_dash(cr, data->dashes, data->num_dashes, data->dash_offset);