Bounds not correctly computed for texts and groups
Both text elements with multiple child tspan elements, and group elements, incorrectly compute the bounding box. Have not tested other elements.
Example: creating a text element with three tspans internally (using the dy property to simulate newlines) and calling .Bounds will return a box that does not fit the entire text nor is positioned correctly. Putting the text element inside a group will act likewise. Atleast this is the case when trying to render the box via a rect element in an SVG file.
In my case font-size is set to 15 with Sans-Serif font family. Using text-anchor or dominant-baseline does not seem to help either.
Using SVG v3.4.6 and .NET 7.
@Moggel12 It will help a lot if you provide a sample.
Sure, something like this? @paulushub
using Svg;
var document = new SvgDocument()
{
Width = new SvgUnit(SvgUnitType.Inch, 10),
Height = new SvgUnit(SvgUnitType.Inch, 10),
FontSize = 15,
FontFamily = "Sans-Serif",
};
var svgGroup = new SvgGroup();
float x = 100, y = 100;
var xLocation = new SvgUnitCollection();
var yLocation = new SvgUnitCollection();
xLocation.Add(x);
yLocation.Add(y);
var textBox = new SvgText
{
X = xLocation,
Y = yLocation
};
var lines = new List<string>()
{
"This is",
"a multiline",
"test"
};
float offset = 0;
foreach (var line in lines)
{
var unit = new SvgUnit(SvgUnitType.Em, offset);
var yOffset = new SvgUnitCollection
{
unit
};
var textSpan = new SvgTextSpan
{
Text = line,
Dy = yOffset,
X = xLocation,
};
textBox.Children.Add(textSpan);
offset += 1F;
}
textBox.AddStyle("fill", "black", 0);
textBox.AddStyle("font-size", "inherit", 0);
svgGroup.Children.Add(textBox);
var boundingBox = new SvgRectangle
{
X = textBox.Bounds.X,
Y = textBox.Bounds.Y,
Width = textBox.Bounds.Width,
Height = textBox.Bounds.Height
};
boundingBox.AddStyle("fill", "none", 0);
boundingBox.AddStyle("stroke", "black", 0);
svgGroup.Children.Add(boundingBox);
document.Children.Add(svgGroup);
var completePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "test.svg");
document.Write(completePath, false);
Alright, just spotted that the problem only occurs when elements are added to a group prior to being added to an SvgDocument. I edited the previous comment so that the problem actually occurs. Sorry!
@Moggel12 Thanks for the illustration. Please, is this related to #946 ?
@Moggel12 Thanks for the illustration. Please, is this related to #946 ?
It may be an extension to it, but I don't believe it to be the same. In my case, no transformations have been added to the group. However, it does look like #946 adds elements to the group first and then adds the group to the document, so maybe the same root cause?