aboutsummaryrefslogtreecommitdiff
path: root/generic
diff options
context:
space:
mode:
Diffstat (limited to 'generic')
-rw-r--r--generic/Track.c76
1 files changed, 42 insertions, 34 deletions
diff --git a/generic/Track.c b/generic/Track.c
index 9af4cee..0d18c27 100644
--- a/generic/Track.c
+++ b/generic/Track.c
@@ -795,7 +795,6 @@ ComputeCoordinates(ZnItem item,
*/
c_item = item->connected_item;
if ((c_item != ZN_NO_ITEM) && (track->connection_width > 0)) {
- ZnResetBBox(&bbox);
w2 = (int) track->connection_width/2;
ZnAddPointToBBox(&item->item_bounding_box, track->dev.x-w2, track->dev.y-w2);
ZnAddPointToBBox(&item->item_bounding_box, ((TrackItem)c_item)->dev.x+w2,
@@ -823,35 +822,17 @@ ComputeCoordinates(ZnItem item,
/* Compute the new label bounding box. */
if (field_set->label_format && field_set->num_fields) {
- ZnDim bb_width, bb_height, dist;
+ ZnDim bb_width, bb_height;
+ ZnReal rho, dist;
ZnPoint leader_end;
+ int it;
ZnFIELD.GetLabelBBox(field_set, &bb_width, &bb_height);
/*
* Compute the label position.
*/
if (ISSET(track->flags, POLAR_BIT)) {
-#ifdef DP
- /* Alternative on ne calcule pas une distance minimum mais
- * on fait confiance à la distance effective track->label_distance
- * attention aux problemes d'arrondi de ZnPointPolarToCartesian !!!
- */
- dist = track->label_distance ;
-#else
- /*
- * Adjust the min dist spec given in label_distance by
- * the size of the label.
- */
- if ((track->label_anchor == TK_ANCHOR_N) ||
- (track->label_anchor == TK_ANCHOR_CENTER) ||
- (track->label_anchor == TK_ANCHOR_S)) {
- dist = sqrt(bb_width*bb_width/4+bb_height*bb_height/4);
- }
- else {
- dist = sqrt(bb_width*bb_width+bb_height*bb_height);
- }
- dist += track->label_distance;
-#endif
+ rho = track->label_distance;
/*
* Compute heading after applying the transform.
*/
@@ -860,22 +841,49 @@ ComputeCoordinates(ZnItem item,
ZnProjectionToAngle(track->speed_vector.x, track->speed_vector.y),
track->label_angle);*/
rotation = ZnProjectionToAngle(track->speed_vector.x, track->speed_vector.y)-rotation;
- ZnPointPolarToCartesian(rotation, dist, (ZnReal) track->label_angle,
- &track->label_dx, &track->label_dy);
+ it = 0;
+ while (1) {
+ ZnPointPolarToCartesian(rotation, rho, (ZnReal) track->label_angle,
+ &track->label_dx, &track->label_dy);
+ field_set->label_pos.x = track->dev.x + track->label_dx;
+ field_set->label_pos.y = track->dev.y - track->label_dy;
+ ZnAnchor2Origin(&field_set->label_pos, bb_width, bb_height,
+ track->label_anchor, &field_set->label_pos);
+ ZnResetBBox(&bbox);
+ ZnAddPointToBBox(&bbox, field_set->label_pos.x, field_set->label_pos.y);
+ ZnAddPointToBBox(&bbox, field_set->label_pos.x + bb_width, field_set->label_pos.y + bb_height);
+ dist = ZnRectangleToPointDist(&bbox, &track->dev);
+ dist = track->label_distance - dist;
+ if (ABS(dist) < 1.0 || it > 5) {
+ break;
+ }
+ it++;
+ rho += dist;
+ }
+ }
+ else {
+ field_set->label_pos.x = track->dev.x + track->label_dx;
+ field_set->label_pos.y = track->dev.y - track->label_dy;
+ ZnAnchor2Origin(&field_set->label_pos, bb_width, bb_height,
+ track->label_anchor, &field_set->label_pos);
}
- field_set->label_pos.x = track->dev.x + track->label_dx;
- field_set->label_pos.y = track->dev.y - track->label_dy;
- ZnAnchor2Origin(&field_set->label_pos, bb_width, bb_height,
- track->label_anchor, &field_set->label_pos);
field_set->label_pos.x = ZnNearestInt(field_set->label_pos.x);
field_set->label_pos.y = ZnNearestInt(field_set->label_pos.y);
- ZnAddPointToBBox(&item->item_bounding_box, field_set->label_pos.x,
- field_set->label_pos.y);
+ /*
+ * Need to compensate for GL thicke lines
+ */
+#ifdef GL
+#define CORR 1
+#else
+#define CORR 0
+#endif
+ ZnAddPointToBBox(&item->item_bounding_box, field_set->label_pos.x - CORR, field_set->label_pos.y - CORR);
ZnAddPointToBBox(&item->item_bounding_box,
- field_set->label_pos.x + (ZnPos) bb_width,
- field_set->label_pos.y + (ZnPos) bb_height);
-
+ field_set->label_pos.x + (ZnPos) bb_width + CORR,
+ field_set->label_pos.y + (ZnPos) bb_height + CORR);
+#undef CORR
+
/*
* Process the leader.
*/