Fixes #4453. Regression in wide glyph rendering on all drivers (#4458)

This commit is contained in:
BDisp
2025-12-07 18:40:43 +00:00
committed by GitHub
parent dd12df7fb7
commit 0270183686
6 changed files with 212 additions and 22 deletions

View File

@@ -0,0 +1,129 @@
#nullable enable
using System.Text;
namespace UICatalog.Scenarios;
[ScenarioMetadata ("WideGlyphs", "Demonstrates wide glyphs with overlapped views & clipping")]
[ScenarioCategory ("Unicode")]
[ScenarioCategory ("Drawing")]
public sealed class WideGlyphs : Scenario
{
private Rune [,]? _codepoints;
public override void Main ()
{
// Init
Application.Init ();
// Setup - Create a top-level application window and configure it.
Window appWindow = new ()
{
Title = GetQuitKeyAndName (),
BorderStyle = LineStyle.None
};
// Build the array of codepoints once when subviews are laid out
appWindow.SubViewsLaidOut += (s, e) =>
{
View? view = s as View;
if (view is null)
{
return;
}
// Only rebuild if size changed or array is null
if (_codepoints is null ||
_codepoints.GetLength (0) != view.Viewport.Height ||
_codepoints.GetLength (1) != view.Viewport.Width)
{
_codepoints = new Rune [view.Viewport.Height, view.Viewport.Width];
for (int r = 0; r < view.Viewport.Height; r++)
{
for (int c = 0; c < view.Viewport.Width; c += 2)
{
_codepoints [r, c] = GetRandomWideCodepoint ();
}
}
}
};
// Fill the window with the pre-built codepoints array
appWindow.DrawingContent += (s, e) =>
{
View? view = s as View;
if (view is null || _codepoints is null)
{
return;
}
// Traverse the Viewport, using the pre-built array
for (int r = 0; r < view.Viewport.Height && r < _codepoints.GetLength (0); r++)
{
for (int c = 0; c < view.Viewport.Width && c < _codepoints.GetLength (1); c += 2)
{
Rune codepoint = _codepoints [r, c];
if (codepoint != default (Rune))
{
view.AddRune (c, r, codepoint);
}
}
}
};
Line verticalLineAtEven = new Line ()
{
X = 10,
Orientation = Orientation.Vertical,
Length = Dim.Fill ()
};
appWindow.Add (verticalLineAtEven);
Line verticalLineAtOdd = new Line ()
{
X = 25,
Orientation = Orientation.Vertical,
Length = Dim.Fill ()
};
appWindow.Add (verticalLineAtOdd);
View arrangeableViewAtEven = new ()
{
CanFocus = true,
Arrangement = ViewArrangement.Movable | ViewArrangement.Resizable,
X = 30,
Y = 5,
Width = 15,
Height = 5,
BorderStyle = LineStyle.Dashed,
};
appWindow.Add (arrangeableViewAtEven);
View arrangeableViewAtOdd = new ()
{
CanFocus = true,
Arrangement = ViewArrangement.Movable | ViewArrangement.Resizable,
X = 31,
Y = 11,
Width = 15,
Height = 5,
BorderStyle = LineStyle.Dashed,
};
appWindow.Add (arrangeableViewAtOdd);
// Run - Start the application.
Application.Run (appWindow);
appWindow.Dispose ();
// Shutdown - Calling Application.Shutdown is required.
Application.Shutdown ();
}
private Rune GetRandomWideCodepoint ()
{
Random random = new ();
int codepoint = random.Next (0x4E00, 0x9FFF);
return new Rune (codepoint);
}
}