diff --git a/src/SixLabors.Fonts/GlyphShapingData.cs b/src/SixLabors.Fonts/GlyphShapingData.cs index 042bfdbf..f5b9f2f2 100644 --- a/src/SixLabors.Fonts/GlyphShapingData.cs +++ b/src/SixLabors.Fonts/GlyphShapingData.cs @@ -17,6 +17,7 @@ internal class GlyphShapingData /// /// Initializes a new instance of the class. /// + /// The text run. public GlyphShapingData(TextRun textRun) => this.TextRun = textRun; /// diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/UniversalShaper.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/UniversalShaper.cs index 5a55edec..d2575439 100644 --- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/UniversalShaper.cs +++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/UniversalShaper.cs @@ -143,7 +143,7 @@ private static void SetupSyllables(IGlyphShapingCollection collection, int index } // Assign rphf feature - int limit = substitutionCollection[match.StartIndex].UniversalShapingEngineInfo!.Category == "R" + int limit = substitutionCollection[match.StartIndex + index].UniversalShapingEngineInfo!.Category == "R" ? 1 : Math.Min(3, match.EndIndex - match.StartIndex); diff --git a/tests/SixLabors.Fonts.Tests/Issues/Issues_388_390.cs b/tests/SixLabors.Fonts.Tests/Issues/Issues_388_390.cs new file mode 100644 index 00000000..d60f3401 --- /dev/null +++ b/tests/SixLabors.Fonts.Tests/Issues/Issues_388_390.cs @@ -0,0 +1,44 @@ +// Copyright (c) Six Labors. +// Licensed under the Six Labors Split License. + +#if OS_WINDOWS +using SixLabors.Fonts.Unicode; + +namespace SixLabors.Fonts.Tests.Issues; +public class Issues_388_390 +{ + [Fact] + public void UniversalShaper_NullReferenceException_388() + { + CodePoint taiLeCharacter = new(0x195C); // ᥜ + CodePoint sundaneseCharacter = new(0x1B9B); // ᮛ + CodePoint tifinaghCharacter = new(0x2D43); // ⵃ + CodePoint chamCharacter = new(0xAA43); // ꩃ + + CodePoint latainCharacter = new(0x0041); // A + CodePoint hiraganaCharacter = new(0x3042); // あ + + FontFamily fontFamily = SystemFonts.Get("Yu Gothic"); + Font font = fontFamily.CreateFont(20.0F); + TextOptions textOption = new(font); + + _ = TextMeasurer.MeasureBounds($"{latainCharacter}{taiLeCharacter}", textOption); + _ = TextMeasurer.MeasureBounds($"{hiraganaCharacter}{taiLeCharacter}", textOption); + _ = TextMeasurer.MeasureBounds($"{latainCharacter}{sundaneseCharacter}", textOption); + _ = TextMeasurer.MeasureBounds($"{hiraganaCharacter}{sundaneseCharacter}", textOption); + _ = TextMeasurer.MeasureBounds($"{latainCharacter}{tifinaghCharacter}", textOption); + _ = TextMeasurer.MeasureBounds($"{hiraganaCharacter}{tifinaghCharacter}", textOption); + _ = TextMeasurer.MeasureBounds($"{latainCharacter}{chamCharacter}", textOption); + _ = TextMeasurer.MeasureBounds($"{hiraganaCharacter}{chamCharacter}", textOption); + } + + [Fact] + public void UniversalShaper_NullReferenceException_390() + { + const string s = " 꿹ꓴ/ꥀ냘"; + FontFamily fontFamily = SystemFonts.Get("Arial"); + Font font = new(fontFamily, 10f); + _ = TextMeasurer.MeasureBounds(s, new TextOptions(font)); + } +} +#endif