yaozhenx/mscgen

Inconsistent spacing between arcs

Closed this issue · 23 comments

What steps will reproduce the problem?

Difference between the two MSC's below (Note the change in order of the arcs in 
the following MSC's).

msc {
    a, b;
    a => b [label="Single line"];
    a => b [label="Two\nline"];
}

msc {
    a, b;
    a => b [label="Two\nline"];
    a => b [label="Single line"];
}

What is the expected output? What do you see instead?

It is expected that spacing between arcs is consistent, but it is not. There is 
space between arcs in first msc and no space in second msc. Also single line of 
text is NOT centered vertically, whereas multi-line text is centered vertically.

Analysis:

Initially mscgen was designed to have constant arc height. But later when 
multi-line text issue is fixed, arc height became variable, subjected to a 
minimum height. This minimum height (arc spacing parameter in code) was 
probably a requirement to retain the legacy view and spacing of msc's. It is 
the source of the current issue.

Possible solution:

One way to fix the problem is to have a consistent/constant spacing between 
variable-height arcs. By default we can have a non-zero spacing between arcs. 
Remove the minimum height parameter in code and introduce the 
SpacingBetweenArcs parameter. This spacing between arcs parameter shall be 
controlled through as an msc attribute.

Using ||| is not a solution, because it is explicitly needed between every 
multi-line arc or needed whereever there is a box and also spacing is still 
inconsistent and NOT controllable.

With SpacingBetweenArcs parameter introduced, |||, ... can add more space 
between arcs i.e. they serve as additional space arc. This additional space 
amount introduced by ||| and ... can also be an attribute.

Original issue reported on code.google.com by v.arunmo...@gmail.com on 10 Sep 2010 at 9:38

  • Blocked on: #50
I've checked this, and the output I get is consistent with how it's always been 
and is by design.

For a single row of text output, the text is just a above the arc line to 
prevent the line type (dotted, dashed, double etc..) being obscured.  To keep 
multiple lines more compact and keep regular spacing of the lines (according to 
the minimum height), a second row of text is then under the arc line.

In the case that >2 lines of text are used, then the strategy changes as more 
space is needed between the arc lines to accommodate the text, so the line 
becomes vertically centred on text.

So basically the arc line spacing will always be regular if each arc has <=2 
rows of text.  If you go above that, the spacing will expand as required.

So I don't think this is really a bug as such - just that you'd like it to 
behave differently when using multi-row text?  If that's the case, please 
supply a an image of the problematic output (with markup if you like) and mark 
this bug an enhancement.

Original comment by Michael....@gmail.com on 14 Sep 2010 at 9:23

Attachments:

The main problem according to this bug is that there is no vertical gap between 
the last line of text of previous arc and the first line of text of next arc. 
If the previous arc has one line of text, there is enough vertical gap to the 
next arc. If the previous arc has two lines of text, it looks as if the 
vertical gap to the next arc is much smaller than in the first case. If the 
previous arc has >2 lines of text, there seems to be no gap at all. Here the 
term gap implies vertical white space.

I would like to have a constant look and feel of arcs regardless of number of 
lines of text and also I would like to avoid introducing ||| unnecessarily.

Regarding alignment of text vertically, all the line arcs can have the text 
completely above the line regardless of single or multi-line text (As you told 
this will NOT obscure the line).  For a box arc, the text can be within the box 
as it is now.

Regarding white space between arcs, every arc should be followed by 
configurable amount of white space. As we can see from the attached pdf, every 
arc is followed by a 15pt vertical space. Attached pdf is the desired ouput of 
the following msc.

msc {
    A [label="Entity A\n(Entity Info)"], B [label="Entity B"];
    A => B [label="Single Line Text"];
    A << B [label="Two Line\nText"];
    A <<= B [label="Three\nLine\nText"];
    --- [label="Multi\nLine\nText\nin\nDivider"];
    A box B [label="Single-line inside box"];
    A abox B [label="This\nis\nmulti-line\ninside\nbox"];
    ... [label="Space generated by ..."];
    A -> B [label="Four\nLines\nof\nText"];
    ||| [label="Space generated by |||"];
}

Original comment by arunmozh...@gmail.com on 17 Sep 2010 at 5:31

Attachments:

Attached png is what is currently generated by mscgen

Original comment by arunmozh...@gmail.com on 17 Sep 2010 at 5:36

Is there a way to change this bug to enhancement. I am using firefox and I do 
not find an option to do the same :-(. Please change this bug to enhancement.

Original comment by arunmozh...@gmail.com on 17 Sep 2010 at 5:55

Original comment by NThykier@gmail.com on 17 Sep 2010 at 11:13

  • Added labels: OpSys-All, Type-Enhancement
  • Removed labels: Type-Defect
I can point to some location in code which might be the source of the issue. In 
the codebase of version 0.18, lines 596 and 1469 has the following code

ymax = ymin + gOpts.arcSpacing;

if(arcLabelLines > 1)
{
    ymax += (arcLabelLines - 2) * textHeight;
}

I am doubting that "arcLabelLines - 2" is probably some hack to center the text 
vertically. Probably this should be "arcLabelLines - 1", because for the first 
line of text gOpts.arcSpacing has been added and for each further line 
textHeight should be added. "arcLabelLines - 2" implies we are removing 
vertical white space of one textHeight provided by gOpts.arcSpacing.

I do not have Cygwin or linux to verify if this is the case. May be someone can 
try this out.

Original comment by arunmozh...@gmail.com on 17 Sep 2010 at 3:35

Here is the output from changing arcLabelLines - 2 into arcLabelLines -1.

Note that this also affects test7; I have attached those as well.

Original comment by NThykier@gmail.com on 17 Sep 2010 at 4:15

Attachments:

Hmm... at a first glance it looks like -2 for boxes and -1 for others might 
make sense. Anyhow this appears very related to issue 50, so marking this 
dependent on 50.

Original comment by NThykier@gmail.com on 17 Sep 2010 at 4:37

[deleted comment]
Hi NThykier, Thanks for the images. With these images, we can conclude that 
"arcLabelLines - 2" is incorrect.

Assuming we change it to "arcLabelLines - 1",

    Total Vertical Space allocated for an arc = gOpts.arcSpacing + ((Number Of Lines of Text - 1) * textHeight)

    Out of this vertical space, White Space available = gOpts.arcSpacing - textHeight - any line thickness of line arc or box arc

    The following are the observations

    (1) Every line arc is centered within the vertical space allocated for the arc.

    (2) Every box arc is drawn occupying the complete vertical space

    (3) Text is always drawn top aligned except for few cases where it is shifted down a little to give an impression of center alignment. This hack is at line 803 in main.c (y += textHeight / 2)

    (4) Divider text looks vertically centered because the divider line is drawn only when rendering middle line of the text.

The following changes are needed to keep the spacing and alignment consistent

    (1) Meaning of gOpts.arcSpacing configuration is not consistent in code currently. Instead a more appropriate configuration gOpts.verticalGap can be used. With this change,

    Total Vertical Space allocated for an arc = gOpts.verticalGap + (Number Of Lines of Text * textHeight) + any line thickness of line arc or box arc

    Out of this vertical space, White Space available = gOpts.verticalGap

    (2) For line arcs, text can be above the line. So the vertical components of line arc are Single/Multi-line Text followed by line followed by white space (gOpts.verticalGap).

    (3) For divider, text can be vertically centered. So the vertical components of divider are Single/Multi-line Text followed by white space (gOpts.verticalGap). Divider line is drawn in the vertical middle of text as it is now and so it does not occupy any additional vertical space.

    (4) Space provided by ... & ||| has the text vertically centered. In this case the total vertical space occupied will be MAX(Total Text Height, gOpts.minimumSpace) + gOpts.verticalGap.

    (5) For box arcs, text will be within box. So the vertical components of box arc are top line of box followed by Single/Multi-line Text followed by bottom line of box followed by white space (gOpts.verticalGap).

    (6) In case of curved line arc, text is left/right aligned with the  top of the text aligned to the top of the arc. In this case the total vertical space occupied will be MAX(Total Text Height, ellipse minor axis length) + gOpts.verticalGap.

Original comment by arunmozh...@gmail.com on 18 Sep 2010 at 9:35

Original comment by Michael....@gmail.com on 4 Oct 2010 at 8:59

  • Changed state: Accepted
I can give patch for the problems 44, 46, 48 and 50 in one or two days for you 
to verify.

Original comment by arunmozh...@gmail.com on 7 Oct 2010 at 3:01

SVN patch containing the fix for the issues 44, 46, 48, 50 attached.

Changes Summary

(1) A bottom-up level iterator for MSC has been added. This is required for the 
calculation of size of levels bottom-up. This approach takes care of arc skips.

(2) Function to calculate the arc span along Y direction is added. There are 
mainly two output values of the function: span above mid and span below mid. 
These two variables allows to align parallel arcs along their middles.

(3) Computation of canvas size modified and information related to each level 
(size of each level) is stored during the computation. This is required for arc 
skip computation.

(4) Line/Box/Tex drawing functions do not change much. Only the parameters with 
which they are invoked changes in main().

Original comment by arunmozh...@gmail.com on 8 Oct 2010 at 1:41

Attachments:

Same patch merged with the current SVN head revision as there were some 
conflicts.

Original comment by v.arunmo...@gmail.com on 12 Oct 2010 at 2:28

Attachments:

Thanks for the patch.

I took a look at it, and took some of the ideas for issue #50 which is now 
fixed.  The code produces a lookup of row heights (or 'shelves' in your 
parlance) which simplifies the layout one the 2nd pass.

These issues are still open however!

Original comment by Michael....@gmail.com on 17 Oct 2010 at 10:32

I do not understand what you mean by issues are still open. Did you apply this 
patch correctly? I have attached the pictures taken after the attached patch 
got applied.

If you find any issues, please let me know.

Original comment by v.arunmo...@gmail.com on 18 Oct 2010 at 2:28

Attachments:

Sorry - to clarify, I've not taken the patch.  Instead I fixed issue 50 in a 
different way, and will subsequently work on the remaining open issues.

Original comment by Michael....@gmail.com on 19 Oct 2010 at 8:03

Not a problem. Hope u will come to the same logic used in the patch ;-). Just 
that I wanted to make sure that my expectations are met.

Original comment by arunmozh...@gmail.com on 20 Oct 2010 at 1:31

This issue was closed by revision r161.

Original comment by Michael....@gmail.com on 26 Oct 2010 at 8:17

  • Changed state: Fixed
Thanks Michael for fixing the issue. Some minor issues still remain.

(1) The problem mentioned in the first msc's of the bug still remain (See the 
initially attached b1.msc.png  & b2.msc.png). That is, Space is more following 
a line arc with single line of text.

    Don't you think the following code is a hack to make sure enough space is available above a line arc with a single line of text? (See the 2 in the code below). It introduces more space below the line arc with single line of text.

    main.c:870: ymax = ymin + gOpts.arcSpacing;
    main.c:871: ymax += (M_Max(rowHeight[row].maxTextLines, 2) * textHeight);

    The problem will be much more obvious if a font of higher size is used.

(2) What is the necessity to vertically center the text of line arcs having 
text more than 2 lines? You had already commented that this will obscure the 
arc itself. Hope you did not think that there is a compatibility issue. Nobody 
cares where label is positioned, as there is no explicit control/documentation 
given in previous revisions.

The basic issue is that you have aligned the parallel arcs assuming that the 
span is equal above and below the mid line. It is required to consider these 
two spans different as mentioned in point 2 of the patch above. Not only it 
solves the above problems, it will help later when labels of arc skipped line 
arcs is positioned and when introducing new arcs.

You already seemed to have introduced the required variables, ymin, ymid and 
ymax. Just that the ymid need not be (ymin + ymax)/2.

Original comment by arunmozh...@gmail.com on 27 Oct 2010 at 2:30

Hi arunmozhi.v,

There's no hacks ;)

The spacing is as per the original design whereby each arc always has space for 
1 line of text above the arc line and 1 line below it.  This keeps the spacing 
regular in the case that each arc has less than 3 lines of text.  If an arc has 
more than 2 lines of text, those lines get vertically centered on the line.

This harks back to the original mscgen which only allowed 1 line of text per 
arc.

The change now is that there is also a small gap left between each row to 
prevent lines of text on the bottom of one arc rolling into the first line of 
the next arc.  This is present very consistently, whether using arcs or boxes.

> (2) What is the necessity to vertically center the text of line arcs having 
text more than 2 lines?

Given an even number of lines, you get half above and half below the arc.  I 
think that's neater and uses less space than putting them all above the arc.

> Nobody cares where label is positioned,

So did you check with everybody ;-D

Original comment by Michael....@gmail.com on 27 Oct 2010 at 7:07

Hi Michael, I do not agree with the explanation you have given. There is 
clearly a problem that you do not want to appreciate. The problem is that, the 
text obscures the arc, if vertically centered. If arc line is not visible, what 
is the use of text (See the output of testinput17.msc)? Does the Mscgen has 
responsibility to make sure there is no obscuring or overlapping? By default 
Mscgen should make sure that the arcs are not obscured and if required, there 
should be a valign=<top or center or bottom>, halign=<left or center or right> 
and textpos=<0 to 1> attribute which the user can use to position the text at 
his will. It is the user who should decide which positioning will make the MSC 
neater, and the tool should provide options. It is also the responsibility of 
tool to make it as much compact as possible, but not at the cost of something 
else.

Secondly, there is no reason to make sure that the spacing is regular when the 
the number of lines of text is below 2 and irregular when above 2 lines of 
text, just because it was like this before. You see it as a regular spacing, 
but I see it as irregular vertical gaps. If required, this spacing regularity 
might be provided through a separate user configurable variable e.g. Minimum 
arc height and by default it can be configured to have the existing behavior. 

> So did you check with everybody ;-D

I checked with your documentation which everybody reads i.e. I meant the change 
did not conflict with the documentation in any way.

Only by making sure that there are two variables (above span and below span), 
it is possible to provide any kind of vertical alignment and that is the 
difference between the patch and you design. I do not want to interfere in your 
design decisions, but just wanted to rationalize what I have done. It should be 
accepted that it is required for solving other problems and future enhancements 
(e.g. inline expression/frames, arc skips/gradients etc.).

Original comment by arunmozh...@gmail.com on 28 Oct 2010 at 4:47

Thanks for your comments, and your contributions.

I think we have a difference in vision here as I'm happy with the changes I've 
made and don't feel the need to make further alterations in this area at 
present.  Most productive now is probably to mop up any regressions and corner 
cases and then push for the next release.

Original comment by Michael....@gmail.com on 2 Nov 2010 at 10:11