1 /* ADG - Automatic Drawing Generation
2 * Copyright (C) 2007,2008,2009,2010 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-dim-style
23 * @short_description: Dimension style related stuff
25 * Contains parameters on how to build dimensions such as the different font
26 * styles (for value and limits), line style, offsets of the various
27 * dimension components etc...
33 * All fields are private and should not be used directly.
34 * Use its public methods instead.
38 #include "adg-internal.h"
39 #include "adg-dim-style.h"
40 #include "adg-dim-style-private.h"
41 #include "adg-dress-builtins.h"
42 #include "adg-font-style.h"
43 #include "adg-line-style.h"
59 PROP_BASELINE_SPACING
,
68 static void finalize (GObject
*object
);
69 static void get_property (GObject
*object
,
73 static void set_property (GObject
*object
,
77 static void apply (AdgStyle
*style
,
80 static void set_limits_shift (AdgDimStyle
*dim_style
,
81 const AdgPair
*shift
);
82 static void set_number_format (AdgDimStyle
*dim_style
,
84 static void set_number_tag (AdgDimStyle
*dim_style
,
86 static AdgMarker
* marker_new (const AdgMarkerData
88 static void use_marker (AdgMarkerData
*marker_data
,
90 static void free_marker (AdgMarkerData
*marker_data
);
93 G_DEFINE_TYPE(AdgDimStyle
, adg_dim_style
, ADG_TYPE_STYLE
);
97 adg_dim_style_class_init(AdgDimStyleClass
*klass
)
99 GObjectClass
*gobject_class
;
100 AdgStyleClass
*style_class
;
103 gobject_class
= (GObjectClass
*) klass
;
104 style_class
= (AdgStyleClass
*) klass
;
106 g_type_class_add_private(klass
, sizeof(AdgDimStylePrivate
));
108 gobject_class
->finalize
= finalize
;
109 gobject_class
->get_property
= get_property
;
110 gobject_class
->set_property
= set_property
;
112 style_class
->apply
= apply
;
114 param
= g_param_spec_object("marker1",
116 P_("The template entity to use as first marker"),
119 g_object_class_install_property(gobject_class
, PROP_MARKER1
, param
);
121 param
= g_param_spec_object("marker2",
123 P_("The template entity to use as second marker"),
126 g_object_class_install_property(gobject_class
, PROP_MARKER2
, param
);
128 param
= adg_param_spec_dress("color-dress",
130 P_("Color dress for the whole dimension"),
131 ADG_DRESS_COLOR_DIMENSION
,
133 g_object_class_install_property(gobject_class
, PROP_COLOR_DRESS
, param
);
135 param
= adg_param_spec_dress("value-dress",
137 P_("Font dress for the nominal value of the dimension"),
138 ADG_DRESS_TEXT_VALUE
,
140 g_object_class_install_property(gobject_class
, PROP_VALUE_DRESS
, param
);
142 param
= adg_param_spec_dress("min-dress",
143 P_("Minimum Limit Dress"),
144 P_("Font dress for the lower limit value"),
145 ADG_DRESS_TEXT_LIMIT
,
147 g_object_class_install_property(gobject_class
, PROP_MIN_DRESS
, param
);
149 param
= adg_param_spec_dress("max-dress",
150 P_("Maximum Limit Dress"),
151 P_("Font dress for the upper limit value"),
152 ADG_DRESS_TEXT_LIMIT
,
154 g_object_class_install_property(gobject_class
, PROP_MAX_DRESS
, param
);
156 param
= adg_param_spec_dress("line-dress",
158 P_("Line dress for the baseline and the extension lines"),
159 ADG_DRESS_LINE_THINNER
,
161 g_object_class_install_property(gobject_class
, PROP_LINE_DRESS
, param
);
163 param
= g_param_spec_double("from-offset",
165 P_("Offset (in global space) of the extension lines from the path to the quote"),
168 g_object_class_install_property(gobject_class
, PROP_FROM_OFFSET
, param
);
170 param
= g_param_spec_double("to-offset",
172 P_("How many extend (in global space) the extension lines after hitting the baseline"),
175 g_object_class_install_property(gobject_class
, PROP_TO_OFFSET
, param
);
177 param
= g_param_spec_double("beyond",
179 P_("How much the baseline should be extended (in global space) beyond the extension lines on dimensions with outside markers"),
182 g_object_class_install_property(gobject_class
, PROP_BEYOND
, param
);
184 param
= g_param_spec_double("baseline-spacing",
185 P_("Baseline Spacing"),
186 P_("Distance between two consecutive baselines while stacking dimensions"),
189 g_object_class_install_property(gobject_class
, PROP_BASELINE_SPACING
, param
);
191 param
= g_param_spec_double("limits-spacing",
192 P_("Limits Spacing"),
193 P_("Distance between limits/tolerances"),
196 g_object_class_install_property(gobject_class
, PROP_LIMITS_SPACING
, param
);
198 param
= g_param_spec_boxed("quote-shift",
200 P_("Used to specify a smooth displacement (in global space) of the quote by taking as reference the perfect compact position (the middle of the baseline on common linear dimension, for instance)"),
201 ADG_TYPE_PAIR
, G_PARAM_READWRITE
);
202 g_object_class_install_property(gobject_class
, PROP_QUOTE_SHIFT
, param
);
204 param
= g_param_spec_boxed("limits-shift",
206 P_("Used to specify a smooth displacement (in global space) for the limits/tolerances by taking as reference the perfect compact position"),
207 ADG_TYPE_PAIR
, G_PARAM_READWRITE
);
208 g_object_class_install_property(gobject_class
, PROP_LIMITS_SHIFT
,
211 param
= g_param_spec_string("number-format",
213 P_("The format (in printf style) of the numeric component of the basic value"),
214 "%-.7g", G_PARAM_READWRITE
);
215 g_object_class_install_property(gobject_class
, PROP_NUMBER_FORMAT
,
218 param
= g_param_spec_string("number-tag",
220 P_("The tag to substitute inside the basic value pattern"),
221 "<>", G_PARAM_READWRITE
);
222 g_object_class_install_property(gobject_class
, PROP_NUMBER_TAG
, param
);
226 adg_dim_style_init(AdgDimStyle
*dim_style
)
228 AdgDimStylePrivate
*data
= G_TYPE_INSTANCE_GET_PRIVATE(dim_style
,
232 data
->marker1
.type
= 0;
233 data
->marker1
.n_parameters
= 0;
234 data
->marker1
.parameters
= NULL
;
235 data
->marker2
.type
= 0;
236 data
->marker2
.n_parameters
= 0;
237 data
->marker2
.parameters
= NULL
;
238 data
->color_dress
= ADG_DRESS_COLOR_DIMENSION
;
239 data
->value_dress
= ADG_DRESS_TEXT_VALUE
;
240 data
->min_dress
= ADG_DRESS_TEXT_LIMIT
;
241 data
->max_dress
= ADG_DRESS_TEXT_LIMIT
;
242 data
->line_dress
= ADG_DRESS_LINE_THINNER
;
243 data
->marker_dress
= ADG_DRESS_UNDEFINED
;
244 data
->from_offset
= 6;
247 data
->baseline_spacing
= 30;
248 data
->limits_spacing
= 1;
249 data
->quote_shift
.x
= 0;
250 data
->quote_shift
.y
= -4;
251 data
->limits_shift
.x
= +2;
252 data
->limits_shift
.y
= -2;
253 data
->number_format
= g_strdup("%-.7g");
254 data
->number_tag
= g_strdup("<>");
256 dim_style
->data
= data
;
260 finalize(GObject
*object
)
262 AdgDimStylePrivate
*data
= ((AdgDimStyle
*) object
)->data
;
264 free_marker(&data
->marker1
);
265 free_marker(&data
->marker2
);
267 g_free(data
->number_format
);
268 data
->number_format
= NULL
;
270 g_free(data
->number_tag
);
271 data
->number_tag
= NULL
;
275 get_property(GObject
*object
, guint prop_id
, GValue
*value
, GParamSpec
*pspec
)
277 AdgDimStylePrivate
*data
= ((AdgDimStyle
*) object
)->data
;
280 case PROP_COLOR_DRESS
:
281 g_value_set_int(value
, data
->color_dress
);
283 case PROP_VALUE_DRESS
:
284 g_value_set_int(value
, data
->value_dress
);
287 g_value_set_int(value
, data
->min_dress
);
290 g_value_set_int(value
, data
->max_dress
);
292 case PROP_LINE_DRESS
:
293 g_value_set_int(value
, data
->line_dress
);
295 case PROP_FROM_OFFSET
:
296 g_value_set_double(value
, data
->from_offset
);
299 g_value_set_double(value
, data
->to_offset
);
302 g_value_set_double(value
, data
->beyond
);
304 case PROP_BASELINE_SPACING
:
305 g_value_set_double(value
, data
->baseline_spacing
);
307 case PROP_LIMITS_SPACING
:
308 g_value_set_double(value
, data
->limits_spacing
);
310 case PROP_QUOTE_SHIFT
:
311 g_value_set_boxed(value
, &data
->quote_shift
);
313 case PROP_LIMITS_SHIFT
:
314 g_value_set_boxed(value
, &data
->limits_shift
);
316 case PROP_NUMBER_FORMAT
:
317 g_value_set_string(value
, data
->number_format
);
319 case PROP_NUMBER_TAG
:
320 g_value_set_string(value
, data
->number_tag
);
323 G_OBJECT_WARN_INVALID_PROPERTY_ID(object
, prop_id
, pspec
);
329 set_property(GObject
*object
,
330 guint prop_id
, const GValue
*value
, GParamSpec
*pspec
)
332 AdgDimStyle
*dim_style
;
333 AdgDimStylePrivate
*data
;
335 dim_style
= (AdgDimStyle
*) object
;
336 data
= dim_style
->data
;
340 use_marker(&data
->marker1
, g_value_get_object(value
));
343 use_marker(&data
->marker2
, g_value_get_object(value
));
345 case PROP_COLOR_DRESS
:
346 adg_dress_set(&data
->color_dress
, g_value_get_int(value
));
348 case PROP_VALUE_DRESS
:
349 adg_dress_set(&data
->value_dress
, g_value_get_int(value
));
352 adg_dress_set(&data
->min_dress
, g_value_get_int(value
));
355 adg_dress_set(&data
->max_dress
, g_value_get_int(value
));
357 case PROP_LINE_DRESS
:
358 adg_dress_set(&data
->line_dress
, g_value_get_int(value
));
360 case PROP_FROM_OFFSET
:
361 data
->from_offset
= g_value_get_double(value
);
364 data
->to_offset
= g_value_get_double(value
);
367 data
->beyond
= g_value_get_double(value
);
369 case PROP_BASELINE_SPACING
:
370 data
->baseline_spacing
= g_value_get_double(value
);
372 case PROP_LIMITS_SPACING
:
373 data
->limits_spacing
= g_value_get_double(value
);
375 case PROP_QUOTE_SHIFT
:
376 cpml_pair_copy(&data
->quote_shift
, g_value_get_boxed(value
));
378 case PROP_LIMITS_SHIFT
:
379 set_limits_shift(dim_style
, g_value_get_boxed(value
));
381 case PROP_NUMBER_FORMAT
:
382 set_number_format(dim_style
, g_value_get_string(value
));
384 case PROP_NUMBER_TAG
:
385 set_number_tag(dim_style
, g_value_get_string(value
));
388 G_OBJECT_WARN_INVALID_PROPERTY_ID(object
, prop_id
, pspec
);
397 * Constructs a new dimension style initialized with default params.
399 * Returns: a new dimension style
402 adg_dim_style_new(void)
404 return g_object_new(ADG_TYPE_DIM_STYLE
, NULL
);
408 * adg_dim_style_marker1_new:
409 * @dim_style: an #AdgDimStyle
411 * Creates a new #AdgMarker entity accordling to the template marker
412 * stored with the #AdgDimStyle:marker1 property of @dim_style.
414 * Returns: a newly created #AdgMarker derived entity or %NULL if
415 * @dim_style has the #AdgDimStyle:marker1 property unset
418 adg_dim_style_marker1_new(AdgDimStyle
*dim_style
)
420 AdgDimStylePrivate
*data
;
422 g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style
), NULL
);
424 data
= dim_style
->data
;
426 return marker_new(&data
->marker1
);
430 * adg_dim_style_marker2_new:
431 * @dim_style: an #AdgDimStyle
433 * Creates a new #AdgMarker entity accordling to the template marker
434 * stored with the #AdgDimStyle:marker2 property of @dim_style.
436 * Returns: a newly created #AdgMarker derived entity or %NULL if
437 * @dim_style has the #AdgDimStyle:marker2 property unset
440 adg_dim_style_marker2_new(AdgDimStyle
*dim_style
)
442 AdgDimStylePrivate
*data
;
444 g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style
), NULL
);
446 data
= dim_style
->data
;
448 return marker_new(&data
->marker2
);
452 * adg_dim_style_use_marker1:
453 * @dim_style: an #AdgStyle
454 * @marker: an #AdgMarker derived entity
456 * Uses @marker as entity template to generate a new marker entity
457 * when a call to adg_dim_style_marker1_new() is made.
459 * This method duplicates internally the property values of @marker,
460 * so any further change to @marker does not affect @dim_style anymore.
461 * This also means @marker could be destroyed because @dim_style only
462 * uses its property values and does not add any references to @marker.
465 adg_dim_style_use_marker1(AdgDimStyle
*dim_style
, AdgMarker
*marker
)
467 AdgDimStylePrivate
*data
;
469 g_return_if_fail(ADG_IS_DIM_STYLE(dim_style
));
470 g_return_if_fail(marker
== NULL
|| ADG_IS_MARKER(marker
));
472 data
= dim_style
->data
;
474 use_marker(&data
->marker1
, marker
);
475 g_object_notify((GObject
*) dim_style
, "marker1");
479 * adg_dim_style_use_marker2:
480 * @dim_style: an #AdgStyle
481 * @marker: an #AdgMarker derived entity
483 * Uses @marker as entity template to generate a new marker entity
484 * when a call to adg_dim_style_marker2_new() is made.
486 * This method duplicates internally the property values of @marker,
487 * so any further change to @marker does not affect @dim_style anymore.
488 * This also means @marker could be destroyed because @dim_style only
489 * uses its property values and does not add any references to @marker.
492 adg_dim_style_use_marker2(AdgDimStyle
*dim_style
, AdgMarker
*marker
)
494 AdgDimStylePrivate
*data
;
496 g_return_if_fail(ADG_IS_DIM_STYLE(dim_style
));
497 g_return_if_fail(marker
== NULL
|| ADG_IS_MARKER(marker
));
499 data
= dim_style
->data
;
501 use_marker(&data
->marker2
, marker
);
502 g_object_notify((GObject
*) dim_style
, "marker2");
506 * adg_dim_style_set_color_dress:
507 * @dim_style: an #AdgDimStyle object
508 * @dress: the new color dress
510 * Sets a new color dress on @dim_style.
513 adg_dim_style_set_color_dress(AdgDimStyle
*dim_style
, AdgDress dress
)
515 AdgDimStylePrivate
*data
;
517 g_return_if_fail(ADG_IS_DIM_STYLE(dim_style
));
519 data
= dim_style
->data
;
521 if (adg_dress_set(&data
->color_dress
, dress
))
522 g_object_notify((GObject
*) dim_style
, "color-dress");
526 * adg_dim_style_get_color_dress:
527 * @dim_style: an #AdgDimStyle object
529 * Gets the @dim_style color dress to be used. This dress should be
530 * intended as a fallback color as it could be overriden by more
531 * specific dresses, such as a color explicitely specified on the
532 * #AdgDimStyle:value-dress.
534 * Returns: the color dress
537 adg_dim_style_get_color_dress(AdgDimStyle
*dim_style
)
539 AdgDimStylePrivate
*data
;
541 g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style
), ADG_DRESS_UNDEFINED
);
543 data
= dim_style
->data
;
545 return data
->color_dress
;
549 * adg_dim_style_set_value_dress:
550 * @dim_style: an #AdgDimStyle object
551 * @dress: the new basic value font style
553 * Sets a new dress on @dim_style for the basic value.
556 adg_dim_style_set_value_dress(AdgDimStyle
*dim_style
, AdgDress dress
)
558 AdgDimStylePrivate
*data
;
560 g_return_if_fail(ADG_IS_DIM_STYLE(dim_style
));
562 data
= dim_style
->data
;
564 if (adg_dress_set(&data
->value_dress
, dress
))
565 g_object_notify((GObject
*) dim_style
, "value-dress");
569 * adg_dim_style_get_value_dress:
570 * @dim_style: an #AdgDimStyle object
572 * Gets the font dress to be used for the basic value of dimensions
575 * Returns: the font dress
578 adg_dim_style_get_value_dress(AdgDimStyle
*dim_style
)
580 AdgDimStylePrivate
*data
;
582 g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style
), ADG_DRESS_UNDEFINED
);
584 data
= dim_style
->data
;
586 return data
->value_dress
;
590 * adg_dim_style_set_min_dress:
591 * @dim_style: an #AdgDimStyle object
592 * @dress: the new lower limit dress
594 * Sets a new dress on @dim_style for the lower limit value.
597 adg_dim_style_set_min_dress(AdgDimStyle
*dim_style
, AdgDress dress
)
599 AdgDimStylePrivate
*data
;
601 g_return_if_fail(ADG_IS_DIM_STYLE(dim_style
));
603 data
= dim_style
->data
;
605 if (adg_dress_set(&data
->min_dress
, dress
))
606 g_object_notify((GObject
*) dim_style
, "min-dress");
610 * adg_dim_style_get_min_dress:
611 * @dim_style: an #AdgDimStyle object
613 * Gets the @dim_style dress to be used for the lower limit.
615 * Returns: the lower limit dress
618 adg_dim_style_get_min_dress(AdgDimStyle
*dim_style
)
620 AdgDimStylePrivate
*data
;
622 g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style
), ADG_DRESS_UNDEFINED
);
624 data
= dim_style
->data
;
626 return data
->min_dress
;
630 * adg_dim_style_set_max_dress:
631 * @dim_style: an #AdgDimStyle object
632 * @dress: the new upper limit dress
634 * Sets a new dress on @dim_style for the upper limit value.
637 adg_dim_style_set_max_dress(AdgDimStyle
*dim_style
, AdgDress dress
)
639 AdgDimStylePrivate
*data
;
641 g_return_if_fail(ADG_IS_DIM_STYLE(dim_style
));
643 data
= dim_style
->data
;
645 if (adg_dress_set(&data
->max_dress
, dress
))
646 g_object_notify((GObject
*) dim_style
, "max-dress");
650 * adg_dim_style_get_max_dress:
651 * @dim_style: an #AdgDimStyle object
653 * Gets the @dim_style dress to be used for the upper limit.
655 * Returns: the upper limit dress
658 adg_dim_style_get_max_dress(AdgDimStyle
*dim_style
)
660 AdgDimStylePrivate
*data
;
662 g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style
), ADG_DRESS_UNDEFINED
);
664 data
= dim_style
->data
;
666 return data
->max_dress
;
670 * adg_dim_style_set_line_dress:
671 * @dim_style: an #AdgDimStyle object
672 * @dress: the new line dress
674 * Sets a new line dress on @dim_style.
677 adg_dim_style_set_line_dress(AdgDimStyle
*dim_style
, AdgDress dress
)
679 AdgDimStylePrivate
*data
;
681 g_return_if_fail(ADG_IS_DIM_STYLE(dim_style
));
683 data
= dim_style
->data
;
685 if (adg_dress_set(&data
->line_dress
, dress
))
686 g_object_notify((GObject
*) dim_style
, "line-dress");
690 * adg_dim_style_get_line_dress:
691 * @dim_style: an #AdgDimStyle object
693 * Gets the line dress to be used for rendering the base and
694 * the extension lines with @dim_style.
696 * Returns: the line dress
699 adg_dim_style_get_line_dress(AdgDimStyle
*dim_style
)
701 AdgDimStylePrivate
*data
;
703 g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style
), ADG_DRESS_UNDEFINED
);
705 data
= dim_style
->data
;
707 return data
->line_dress
;
711 * adg_dim_style_set_from_offset:
712 * @dim_style: an #AdgDimStyle object
713 * @offset: the new offset
715 * Sets a new "from-offset" value.
718 adg_dim_style_set_from_offset(AdgDimStyle
*dim_style
, gdouble offset
)
720 AdgDimStylePrivate
*data
;
722 g_return_if_fail(ADG_IS_DIM_STYLE(dim_style
));
724 data
= dim_style
->data
;
725 data
->from_offset
= offset
;
727 g_object_notify((GObject
*) dim_style
, "from-offset");
731 * adg_dim_style_get_from_offset:
732 * @dim_style: an #AdgDimStyle object
734 * Gets the distance (in global space) the extension lines must keep from the
737 * Returns: the requested distance
740 adg_dim_style_get_from_offset(AdgDimStyle
*dim_style
)
742 AdgDimStylePrivate
*data
;
744 g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style
), 0);
746 data
= dim_style
->data
;
748 return data
->from_offset
;
752 * adg_dim_style_set_to_offset:
753 * @dim_style: an #AdgDimStyle object
754 * @offset: the new offset
756 * Sets a new "to-offset" value.
759 adg_dim_style_set_to_offset(AdgDimStyle
*dim_style
, gdouble offset
)
761 AdgDimStylePrivate
*data
;
763 g_return_if_fail(ADG_IS_DIM_STYLE(dim_style
));
765 data
= dim_style
->data
;
766 data
->to_offset
= offset
;
768 g_object_notify((GObject
*) dim_style
, "to-offset");
772 * adg_dim_style_get_to_offset:
773 * @dim_style: an #AdgDimStyle object
775 * Gets how much (in global space) the extension lines must extend after
776 * crossing the baseline.
778 * Returns: the requested distance
781 adg_dim_style_get_to_offset(AdgDimStyle
*dim_style
)
783 AdgDimStylePrivate
*data
;
785 g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style
), 0);
787 data
= dim_style
->data
;
789 return data
->to_offset
;
793 * adg_dim_style_set_beyond:
794 * @dim_style: an #AdgDimStyle object
795 * @length: the new length
797 * Sets a new "beyond" value.
800 adg_dim_style_set_beyond(AdgDimStyle
*dim_style
, gdouble length
)
802 AdgDimStylePrivate
*data
;
804 g_return_if_fail(ADG_IS_DIM_STYLE(dim_style
));
806 data
= dim_style
->data
;
807 data
->beyond
= length
;
809 g_object_notify((GObject
*) dim_style
, "beyond");
813 * adg_dim_style_get_beyond:
814 * @dim_style: an #AdgDimStyle object
816 * Gets how much (in global space) the baseline should extend beyond
817 * the extension lines on dimension with outside markers.
819 * Returns: the requested beyond length
822 adg_dim_style_get_beyond(AdgDimStyle
*dim_style
)
824 AdgDimStylePrivate
*data
;
826 g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style
), 0);
828 data
= dim_style
->data
;
834 * adg_dim_style_set_baseline_spacing:
835 * @dim_style: an #AdgDimStyle object
836 * @spacing: the new spacing
838 * Sets a new "baseline-spacing" value.
841 adg_dim_style_set_baseline_spacing(AdgDimStyle
*dim_style
, gdouble spacing
)
843 AdgDimStylePrivate
*data
;
845 g_return_if_fail(ADG_IS_DIM_STYLE(dim_style
));
847 data
= dim_style
->data
;
848 data
->baseline_spacing
= spacing
;
850 g_object_notify((GObject
*) dim_style
, "baseline-spacing");
854 * adg_dim_style_get_baseline_spacing:
855 * @dim_style: an #AdgDimStyle object
857 * Gets the distance between two consecutive baselines
858 * while stacking dimensions.
860 * Returns: the requested spacing
863 adg_dim_style_get_baseline_spacing(AdgDimStyle
*dim_style
)
865 AdgDimStylePrivate
*data
;
867 g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style
), 0);
869 data
= dim_style
->data
;
871 return data
->baseline_spacing
;
875 * adg_dim_style_set_limits_spacing:
876 * @dim_style: an #AdgDimStyle object
877 * @spacing: the new spacing
879 * Sets a new #AdgDimStyle:limits-spacing value.
882 adg_dim_style_set_limits_spacing(AdgDimStyle
*dim_style
, gdouble spacing
)
884 AdgDimStylePrivate
*data
;
886 g_return_if_fail(ADG_IS_DIM_STYLE(dim_style
));
888 data
= dim_style
->data
;
889 data
->limits_spacing
= spacing
;
891 g_object_notify((GObject
*) dim_style
, "limits-spacing");
895 * adg_dim_style_get_limits_spacing:
896 * @dim_style: an #AdgDimStyle object
898 * Gets the distance (in global space) between the limits/tolerances.
900 * Returns: the requested spacing
903 adg_dim_style_get_limits_spacing(AdgDimStyle
*dim_style
)
905 AdgDimStylePrivate
*data
;
907 g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style
), 0);
909 data
= dim_style
->data
;
911 return data
->limits_spacing
;
915 * adg_dim_style_set_quote_shift:
916 * @dim_style: an #AdgDimStyle object
917 * @shift: the new displacement
919 * Sets a new #AdgDimStyle:quote-shift value.
922 adg_dim_style_set_quote_shift(AdgDimStyle
*dim_style
, const AdgPair
*shift
)
924 AdgDimStylePrivate
*data
;
926 g_return_if_fail(ADG_IS_DIM_STYLE(dim_style
));
927 g_return_if_fail(shift
!= NULL
);
929 data
= dim_style
->data
;
930 cpml_pair_copy(&data
->quote_shift
, shift
);
932 g_object_notify((GObject
*) dim_style
, "quote-shift");
936 * adg_dim_style_get_quote_shift:
937 * @dim_style: an #AdgDimStyle object
939 * Gets the smooth displacement of the quote. The returned pointer refers
940 * to an internal allocated struct and must not be modified or freed.
942 * Returns: the requested shift
945 adg_dim_style_get_quote_shift(AdgDimStyle
*dim_style
)
947 AdgDimStylePrivate
*data
;
949 g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style
), NULL
);
951 data
= dim_style
->data
;
953 return &data
->quote_shift
;
957 * adg_dim_style_set_limits_shift:
958 * @dim_style: an #AdgDimStyle object
959 * @shift: the new displacement
961 * Sets a new #AdgDimStyle:limits-shift value.
964 adg_dim_style_set_limits_shift(AdgDimStyle
*dim_style
, const AdgPair
*shift
)
966 g_return_if_fail(ADG_IS_DIM_STYLE(dim_style
));
968 set_limits_shift(dim_style
, shift
);
969 g_object_notify((GObject
*) dim_style
, "limits-shift");
973 * adg_dim_style_get_limits_shift:
974 * @dim_style: an #AdgDimStyle object
976 * Gets the smooth displacement for the limits. The returned pointer
977 * refers to an internal allocated struct and must not be modified or freed.
979 * Returns: the requested shift
982 adg_dim_style_get_limits_shift(AdgDimStyle
*dim_style
)
984 AdgDimStylePrivate
*data
;
986 g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style
), NULL
);
988 data
= dim_style
->data
;
990 return &data
->limits_shift
;
994 * adg_dim_style_set_number_format:
995 * @dim_style: an #AdgDimStyle object
996 * @format: the new format to adopt
998 * Sets a new "number-format" value.
1001 adg_dim_style_set_number_format(AdgDimStyle
*dim_style
, const gchar
*format
)
1003 g_return_if_fail(ADG_IS_DIM_STYLE(dim_style
));
1005 set_number_format(dim_style
, format
);
1006 g_object_notify((GObject
*) dim_style
, "number-format");
1010 * adg_dim_style_get_number_format:
1011 * @dim_style: an #AdgDimStyle object
1013 * Gets the number format (in printf style) of this quoting style. The
1014 * returned pointer refers to internally managed text that must not be
1015 * modified or freed.
1017 * Returns: the requested format
1020 adg_dim_style_get_number_format(AdgDimStyle
*dim_style
)
1022 AdgDimStylePrivate
*data
;
1024 g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style
), NULL
);
1026 data
= dim_style
->data
;
1028 return data
->number_format
;
1032 * adg_dim_style_set_number_tag:
1033 * @dim_style: an #AdgDimStyle object
1036 * Sets a new "number-tag" value.
1039 adg_dim_style_set_number_tag(AdgDimStyle
*dim_style
, const gchar
*tag
)
1041 g_return_if_fail(ADG_IS_DIM_STYLE(dim_style
));
1043 set_number_tag(dim_style
, tag
);
1044 g_object_notify((GObject
*) dim_style
, "number-tag");
1048 * adg_dim_style_get_number_tag:
1049 * @dim_style: an #AdgDimStyle object
1051 * Gets the number tag to substitute while building the basic value. The
1052 * returned pointer refers to internally managed text that must not be
1053 * modified or freed.
1055 * Returns: the requested tag
1058 adg_dim_style_get_number_tag(AdgDimStyle
*dim_style
)
1060 AdgDimStylePrivate
*data
;
1062 g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style
), NULL
);
1064 data
= dim_style
->data
;
1066 return data
->number_tag
;
1071 apply(AdgStyle
*style
, AdgEntity
*entity
, cairo_t
*cr
)
1073 AdgDimStylePrivate
*data
= ((AdgDimStyle
*) style
)->data
;
1075 adg_entity_apply_dress(entity
, data
->color_dress
, cr
);
1079 set_limits_shift(AdgDimStyle
*dim_style
, const AdgPair
*shift
)
1081 AdgDimStylePrivate
*data
= dim_style
->data
;
1083 cpml_pair_copy(&data
->limits_shift
, shift
);
1087 set_number_format(AdgDimStyle
*dim_style
, const gchar
*format
)
1089 AdgDimStylePrivate
*data
= dim_style
->data
;
1091 g_free(data
->number_format
);
1092 data
->number_format
= g_strdup(format
);
1096 set_number_tag(AdgDimStyle
*dim_style
, const gchar
*tag
)
1098 AdgDimStylePrivate
*data
= dim_style
->data
;
1100 g_free(data
->number_tag
);
1101 data
->number_tag
= g_strdup(tag
);
1105 marker_new(const AdgMarkerData
*marker_data
)
1107 if (marker_data
->type
== 0)
1110 return g_object_newv(marker_data
->type
,
1111 marker_data
->n_parameters
,
1112 marker_data
->parameters
);
1116 use_marker(AdgMarkerData
*marker_data
, AdgMarker
*marker
)
1121 GParameter
*parameter
;
1124 /* Free the previous marker data, if any */
1125 free_marker(marker_data
);
1130 object
= (GObject
*) marker
;
1131 specs
= g_object_class_list_properties(G_OBJECT_GET_CLASS(marker
),
1132 &marker_data
->n_parameters
);
1134 marker_data
->type
= G_TYPE_FROM_INSTANCE(marker
);
1135 marker_data
->parameters
= g_new0(GParameter
, marker_data
->n_parameters
);
1137 for (n
= 0; n
< marker_data
->n_parameters
; ++n
) {
1139 parameter
= &marker_data
->parameters
[n
];
1141 /* Using intern strings because GParameter:name is const.
1142 * GObject properties are internally managed using non-static
1143 * GQuark, so g_intern_string() is the way to go */
1144 parameter
->name
= g_intern_string(spec
->name
);
1146 g_value_init(¶meter
->value
, spec
->value_type
);
1147 g_object_get_property(object
, spec
->name
, ¶meter
->value
);
1154 free_marker(AdgMarkerData
*marker_data
)
1158 for (n
= 0; n
< marker_data
->n_parameters
; ++n
)
1159 g_value_unset(&marker_data
->parameters
[n
].value
);
1161 marker_data
->type
= 0;
1162 marker_data
->n_parameters
= 0;
1163 marker_data
->parameters
= NULL
;