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.
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.
32 * All fields are private and should not be used directly.
33 * Use its public methods instead.
37 #include "adg-line-style.h"
38 #include "adg-line-style-private.h"
41 #define PARENT_STYLE_CLASS ((AdgStyleClass *) adg_line_style_parent_class)
55 static void get_property (GObject
*object
,
59 static void set_property (GObject
*object
,
63 static void apply (AdgStyle
*style
,
67 G_DEFINE_TYPE(AdgLineStyle
, adg_line_style
, ADG_TYPE_STYLE
);
71 adg_line_style_class_init(AdgLineStyleClass
*klass
)
73 GObjectClass
*gobject_class
;
74 AdgStyleClass
*style_class
;
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",
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",
95 P_("The line cap mode"),
96 G_MININT
, G_MAXINT
, CAIRO_LINE_CAP_ROUND
,
98 g_object_class_install_property(gobject_class
, PROP_CAP
, param
);
100 param
= g_param_spec_int("join",
102 P_("The line join mode"),
103 G_MININT
, G_MAXINT
, CAIRO_LINE_JOIN_MITER
,
105 g_object_class_install_property(gobject_class
, PROP_JOIN
, param
);
107 param
= g_param_spec_double("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
,
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
,
119 g_object_class_install_property(gobject_class
, PROP_ANTIALIAS
, param
);
121 /* TODO: PROP_DASH (PROP_DASHES, PROP_NUM_DASHES, PROP_DASH_OFFSET) */
125 adg_line_style_init(AdgLineStyle
*line_style
)
127 AdgLineStylePrivate
*data
= G_TYPE_INSTANCE_GET_PRIVATE(line_style
,
129 AdgLineStylePrivate
);
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
;
137 data
->num_dashes
= 0;
138 data
->dash_offset
= 0.;
140 line_style
->data
= data
;
144 get_property(GObject
*object
,
145 guint prop_id
, GValue
*value
, GParamSpec
*pspec
)
147 AdgLineStylePrivate
*data
= ((AdgLineStyle
*) object
)->data
;
151 g_value_set_double(value
, data
->width
);
154 g_value_set_int(value
, data
->cap
);
157 g_value_set_int(value
, data
->join
);
159 case PROP_MITER_LIMIT
:
160 g_value_set_double(value
, data
->miter_limit
);
163 g_value_set_int(value
, data
->antialias
);
169 G_OBJECT_WARN_INVALID_PROPERTY_ID(object
, prop_id
, pspec
);
175 set_property(GObject
*object
,
176 guint prop_id
, const GValue
*value
, GParamSpec
*pspec
)
178 AdgLineStylePrivate
*data
= ((AdgLineStyle
*) object
)->data
;
182 data
->width
= g_value_get_double(value
);
185 data
->cap
= g_value_get_int(value
);
188 data
->join
= g_value_get_int(value
);
190 case PROP_MITER_LIMIT
:
191 data
->miter_limit
= g_value_get_double(value
);
194 data
->antialias
= g_value_get_int(value
);
200 G_OBJECT_WARN_INVALID_PROPERTY_ID(object
, prop_id
, pspec
);
207 * adg_line_style_new:
209 * Constructs a new line style initialized with default params.
211 * Returns: a new line style
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
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
;
240 * adg_line_style_set_width:
241 * @line_style: an #AdgLineStyle object
242 * @width: the new width
244 * Sets a new line thickness value.
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
;
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
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
;
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.
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
;
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
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
;
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.
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
));
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
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.
370 adg_line_style_set_miter_limit(AdgLineStyle
*line_style
,
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
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.
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");
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
);