aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlecoanet2004-10-13 09:07:25 +0000
committerlecoanet2004-10-13 09:07:25 +0000
commit5446ec45635920bbbca77ad68010bfefa5c58299 (patch)
tree00e326e95f709e6f50e4b2fba1c1614397044162
parentf75efe1b8d2537ca913cea3a5b779d4a74617cbc (diff)
downloadtkzinc-5446ec45635920bbbca77ad68010bfefa5c58299.zip
tkzinc-5446ec45635920bbbca77ad68010bfefa5c58299.tar.gz
tkzinc-5446ec45635920bbbca77ad68010bfefa5c58299.tar.bz2
tkzinc-5446ec45635920bbbca77ad68010bfefa5c58299.tar.xz
Fixed a label bounding box error under GL:
the borders being drawn with a thick line the bbox need to be increased in all directions by 1. The label is now maintained at the requested distance regardless of its angular position. Doing so, the leader length is less prone to huge variations especially with longish labels.
-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.
*/