Skip to content

Commit

Permalink
adg: modernize geometry computation for radial dimensions
Browse files Browse the repository at this point in the history
Adopt the new behavior (explained in commit 21ba042) on AdgRDim.
  • Loading branch information
ntd committed Mar 31, 2017
1 parent 12a4c04 commit 857f04d
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 42 deletions.
1 change: 0 additions & 1 deletion src/adg/adg-rdim-private.h
Expand Up @@ -43,7 +43,6 @@ struct _AdgRDimPrivate {
AdgTrail *trail;
AdgMarker *marker;

gboolean geometry_arranged;
gdouble radius;
gdouble angle;

Expand Down
76 changes: 35 additions & 41 deletions src/adg/adg-rdim.c
Expand Up @@ -76,7 +76,7 @@ static void _adg_arrange (AdgEntity *entity);
static void _adg_render (AdgEntity *entity,
cairo_t *cr);
static gchar * _adg_default_value (AdgDim *dim);
static gboolean _adg_update_geometry (AdgRDim *rdim);
static gboolean _adg_compute_geometry (AdgDim *dim);
static void _adg_update_entities (AdgRDim *rdim);
static void _adg_clear_trail (AdgRDim *rdim);
static void _adg_dispose_trail (AdgRDim *rdim);
Expand Down Expand Up @@ -107,6 +107,7 @@ adg_rdim_class_init(AdgRDimClass *klass)
entity_class->render = _adg_render;

dim_class->default_value = _adg_default_value;
dim_class->compute_geometry = _adg_compute_geometry;
}

static void
Expand All @@ -125,7 +126,6 @@ adg_rdim_init(AdgRDim *rdim)

data->trail = NULL;
data->marker = NULL;
data->geometry_arranged = FALSE;
data->radius = -1.;
data->shift.base.x = data->shift.base.y = 0;
cairo_matrix_init_identity(&data->quote.global_map);
Expand Down Expand Up @@ -315,15 +315,10 @@ _adg_local_changed(AdgEntity *entity)
static void
_adg_invalidate(AdgEntity *entity)
{
AdgRDim *rdim;
AdgRDimPrivate *data;

rdim = (AdgRDim *) entity;
data = rdim->data;
AdgRDim *rdim = (AdgRDim *) entity;

_adg_dispose_trail(rdim);
_adg_dispose_marker(rdim);
data->geometry_arranged = FALSE;
_adg_clear_trail(rdim);

if (_ADG_OLD_ENTITY_CLASS->invalidate)
Expand All @@ -347,15 +342,16 @@ _adg_arrange(AdgEntity *entity)
if (_ADG_OLD_ENTITY_CLASS->arrange != NULL)
_ADG_OLD_ENTITY_CLASS->arrange(entity);

dim = (AdgDim *) entity;

if (! adg_dim_compute_geometry(dim))
return;

rdim = (AdgRDim *) entity;
dim = (AdgDim *) rdim;
data = rdim->data;
quote = adg_dim_get_quote(dim);
quote_entity = (AdgEntity *) quote;

if (! _adg_update_geometry(rdim))
return;

_adg_update_entities(rdim);

/* Check for cached result */
Expand Down Expand Up @@ -453,22 +449,22 @@ _adg_arrange(AdgEntity *entity)
static void
_adg_render(AdgEntity *entity, cairo_t *cr)
{
AdgRDim *rdim;
AdgDim *dim;
AdgRDim *rdim;
AdgRDimPrivate *data;
AdgDimStyle *dim_style;
AdgDress dress;
const cairo_path_t *cairo_path;

rdim = (AdgRDim *) entity;
data = rdim->data;
dim = (AdgDim *) entity;

if (!data->geometry_arranged) {
if (! adg_dim_compute_geometry(dim)) {
/* Entity not arranged, probably due to undefined pair found */
return;
}

dim = (AdgDim *) entity;
rdim = (AdgRDim *) entity;
data = rdim->data;
dim_style = _ADG_GET_DIM_STYLE(dim);

adg_style_apply((AdgStyle *) dim_style, entity, cr);
Expand All @@ -492,54 +488,54 @@ _adg_default_value(AdgDim *dim)
AdgRDim *rdim;
AdgRDimPrivate *data;

if (! adg_dim_compute_geometry(dim))
return g_strdup("undef");

rdim = (AdgRDim *) dim;
data = rdim->data;

if (! _adg_update_geometry(rdim))
return g_strdup("undef");

return adg_dim_get_text(dim, data->radius);
}

static gboolean
_adg_update_geometry(AdgRDim *rdim)
_adg_compute_geometry(AdgDim *dim)
{
AdgRDim *rdim;
AdgRDimPrivate *data;
AdgDim *dim;
AdgDimStyle *dim_style;
AdgPoint *ref1_point, *ref2_point, *pos_point;
const CpmlPair *ref1, *ref2, *pos;
gdouble spacing, level, pos_distance;
CpmlVector vector;

data = rdim->data;

/* Check for cached results */
if (data->geometry_arranged)
return TRUE;

dim = (AdgDim *) rdim;
ref1_point = adg_dim_get_ref1(dim);
if (! adg_point_update(ref1_point)) {
adg_dim_geometry_missing(dim, "ref1");
return FALSE;
}

ref2_point = adg_dim_get_ref2(dim);
pos_point = adg_dim_get_pos(dim);
if (! adg_point_update(ref2_point)) {
adg_dim_geometry_missing(dim, "ref2");
return FALSE;
}

/* Check if the needed points are all properly defined */
if (! adg_point_update(ref1_point) ||
! adg_point_update(ref2_point) ||
! adg_point_update(pos_point))
pos_point = adg_dim_get_pos(dim);
if (! adg_point_update(pos_point)) {
adg_dim_geometry_missing(dim, "pos");
return FALSE;
}

ref1 = (CpmlPair *) ref1_point;
ref2 = (CpmlPair *) ref2_point;
pos = (CpmlPair *) pos_point;

/* Check if the given points have valid coordinates */
if (cpml_pair_equal(ref1, ref2)) {
g_warning(_("%s: ref1 and ref2 cannot be coincidents (%lf, %lf)"),
G_STRLOC, ref1->x, ref1->y);
adg_dim_geometry_coincident(dim, "ref1", "ref2", ref1);
return FALSE;
}

rdim = (AdgRDim *) dim;
data = rdim->data;
pos = (CpmlPair *) pos_point;
dim_style = _ADG_GET_DIM_STYLE(rdim);
spacing = adg_dim_style_get_baseline_spacing(dim_style);
level = adg_dim_get_level(dim);
Expand Down Expand Up @@ -569,8 +565,6 @@ _adg_update_geometry(AdgRDim *rdim)
cpml_pair_copy(&data->shift.base, &vector);
cpml_vector_set_length(&data->shift.base, spacing * level);

data->geometry_arranged = TRUE;

return TRUE;
}

Expand Down

0 comments on commit 857f04d

Please sign in to comment.