From 97171d667f1ac194fb37a3324a2f8210b531d889 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20DORIN?= Date: Wed, 22 May 2019 14:43:28 +0200 Subject: [PATCH] Fix a rendering bug for text on path using very large font. --- Source/Text/GdiFontDefn.cs | 6 ++++-- Tests/W3CTestSuite/png/text-fonts-06-t.png | Bin 0 -> 6869 bytes Tests/W3CTestSuite/svg/text-fonts-06-t.svg | 6 ++++++ 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 Tests/W3CTestSuite/png/text-fonts-06-t.png create mode 100644 Tests/W3CTestSuite/svg/text-fonts-06-t.svg diff --git a/Source/Text/GdiFontDefn.cs b/Source/Text/GdiFontDefn.cs index 2e95ceb81..2da806b41 100644 --- a/Source/Text/GdiFontDefn.cs +++ b/Source/Text/GdiFontDefn.cs @@ -47,11 +47,13 @@ public IList MeasureCharacters(ISvgRenderer renderer, string text) StringFormat format; for (int s = 0; s <= (text.Length - 1) / 32; s++) { + int numberOfChar = Math.Min(32, text.Length - 32 * s); + format = StringFormat.GenericTypographic; format.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces; - format.SetMeasurableCharacterRanges((from r in Enumerable.Range(32 * s, Math.Min(32, text.Length - 32 * s)) + format.SetMeasurableCharacterRanges((from r in Enumerable.Range(32 * s, numberOfChar) select new CharacterRange(r, 1)).ToArray()); - regions.AddRange(from r in g.MeasureCharacterRanges(text, _font, new Rectangle(0, 0, 1000, 1000), format) + regions.AddRange(from r in g.MeasureCharacterRanges(text, _font, new Rectangle(0, 0, numberOfChar * _font.Height, 1000), format) select r.GetBounds(g)); } return regions; diff --git a/Tests/W3CTestSuite/png/text-fonts-06-t.png b/Tests/W3CTestSuite/png/text-fonts-06-t.png new file mode 100644 index 0000000000000000000000000000000000000000..224953a435055adb85634811b58bebd814d06e38 GIT binary patch literal 6869 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 + + + A long text + +