Browse Source

Add AppBuilder.UseTextShapingSubsystem (#20761)

* Add AppBuilder.UseTextShapingSubsystem

* Add subsystem defaults to error messages

* Use HarfBuzz in IntegrationTests.Win32
pull/19747/merge
Julien Lebosquain 3 weeks ago
committed by GitHub
parent
commit
a2b1149227
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 31
      src/Avalonia.Controls/AppBuilder.cs
  2. 4
      src/HarfBuzz/Avalonia.HarfBuzz/HarfBuzzApplicationExtensions.cs
  3. 3
      src/Headless/Avalonia.Headless/AvaloniaHeadlessPlatform.cs
  4. 9
      src/Headless/Avalonia.Headless/HeadlessUnitTestSession.cs
  5. 1
      tests/Avalonia.IntegrationTests.Win32/Avalonia.IntegrationTests.Win32.csproj
  6. 1
      tests/Avalonia.IntegrationTests.Win32/Infrastructure/AppManager.cs

31
src/Avalonia.Controls/AppBuilder.cs

@ -60,6 +60,16 @@ namespace Avalonia
/// </summary> /// </summary>
public string? RenderingSubsystemName { get; private set; } public string? RenderingSubsystemName { get; private set; }
/// <summary>
/// Gets or sets a method to call the initialize the text shaping subsystem.
/// </summary>
public Action? TextShapingSubsystemInitializer { get; private set; }
/// <summary>
/// Gets the name of the currently selected text shaping subsystem.
/// </summary>
public string? TextShapingSubsystemName { get; private set; }
/// <summary> /// <summary>
/// Gets a method to call after the <see cref="Application"/> is setup. /// Gets a method to call after the <see cref="Application"/> is setup.
/// </summary> /// </summary>
@ -224,6 +234,19 @@ namespace Avalonia
RenderingSubsystemName = name; RenderingSubsystemName = name;
return Self; return Self;
} }
/// <summary>
/// Specifies a text shaping subsystem to use.
/// </summary>
/// <param name="initializer">The method to call to initialize the text shaping subsystem.</param>
/// <param name="name">The name of the text shaping subsystem.</param>
/// <returns>An <see cref="AppBuilder"/> instance.</returns>
public AppBuilder UseTextShapingSubsystem(Action initializer, string name = "")
{
TextShapingSubsystemInitializer = initializer;
TextShapingSubsystemName = name;
return Self;
}
/// <summary> /// <summary>
/// Specifies a runtime platform subsystem to use. /// Specifies a runtime platform subsystem to use.
@ -308,7 +331,12 @@ namespace Avalonia
if (RenderingSubsystemInitializer == null) if (RenderingSubsystemInitializer == null)
{ {
throw new InvalidOperationException("No rendering system configured."); throw new InvalidOperationException("No rendering system configured. Consider calling UseSkia().");
}
if (TextShapingSubsystemInitializer == null)
{
throw new InvalidOperationException("No text shaping system configured. Consider calling UseHarfBuzz().");
} }
if (_appFactory == null) if (_appFactory == null)
@ -333,6 +361,7 @@ namespace Avalonia
{ {
_optionsInitializers?.Invoke(); _optionsInitializers?.Invoke();
RuntimePlatformServicesInitializer?.Invoke(); RuntimePlatformServicesInitializer?.Invoke();
TextShapingSubsystemInitializer?.Invoke();
RenderingSubsystemInitializer?.Invoke(); RenderingSubsystemInitializer?.Invoke();
WindowingSubsystemInitializer?.Invoke(); WindowingSubsystemInitializer?.Invoke();
AfterPlatformServicesSetupCallback?.Invoke(Self); AfterPlatformServicesSetupCallback?.Invoke(Self);

4
src/HarfBuzz/Avalonia.HarfBuzz/HarfBuzzApplicationExtensions.cs

@ -20,7 +20,9 @@ namespace Avalonia
/// <returns>The configured <see cref="AppBuilder"/> instance.</returns> /// <returns>The configured <see cref="AppBuilder"/> instance.</returns>
public static AppBuilder UseHarfBuzz(this AppBuilder builder) public static AppBuilder UseHarfBuzz(this AppBuilder builder)
{ {
return builder.With<ITextShaperImpl>(new HarfBuzzTextShaper()); return builder.UseTextShapingSubsystem(
() => AvaloniaLocator.CurrentMutable.Bind<ITextShaperImpl>().ToConstant(new HarfBuzzTextShaper()),
"HarfBuzz");
} }
} }

3
src/Headless/Avalonia.Headless/AvaloniaHeadlessPlatform.cs

@ -121,7 +121,8 @@ namespace Avalonia.Headless
builder = builder.UseRenderingSubsystem(HeadlessPlatformRenderInterface.Initialize, "Headless"); builder = builder.UseRenderingSubsystem(HeadlessPlatformRenderInterface.Initialize, "Headless");
return builder return builder
.UseStandardRuntimePlatformSubsystem() .UseStandardRuntimePlatformSubsystem()
.UseWindowingSubsystem(() => AvaloniaHeadlessPlatform.Initialize(opts), "Headless"); .UseWindowingSubsystem(() => AvaloniaHeadlessPlatform.Initialize(opts), "Headless")
.UseHarfBuzz();
} }
} }
} }

9
src/Headless/Avalonia.Headless/HeadlessUnitTestSession.cs

@ -236,9 +236,12 @@ public sealed class HeadlessUnitTestSession : IDisposable, IAsyncDisposable
// If windowing subsystem wasn't initialized by user, force headless with default parameters. // If windowing subsystem wasn't initialized by user, force headless with default parameters.
if (appBuilder.WindowingSubsystemName != "Headless") if (appBuilder.WindowingSubsystemName != "Headless")
{ {
appBuilder = appBuilder appBuilder = appBuilder.UseHeadless(new AvaloniaHeadlessPlatformOptions());
.UseHeadless(new AvaloniaHeadlessPlatformOptions()) }
.UseHarfBuzz();
if (appBuilder.TextShapingSubsystemInitializer is null)
{
appBuilder = appBuilder.UseHarfBuzz();
} }
// ReSharper disable once AccessToModifiedClosure // ReSharper disable once AccessToModifiedClosure

1
tests/Avalonia.IntegrationTests.Win32/Avalonia.IntegrationTests.Win32.csproj

@ -9,6 +9,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="../../src/Skia/Avalonia.Skia/Avalonia.Skia.csproj" /> <ProjectReference Include="../../src/Skia/Avalonia.Skia/Avalonia.Skia.csproj" />
<ProjectReference Include="../../src/HarfBuzz/Avalonia.HarfBuzz/Avalonia.HarfBuzz.csproj" />
<ProjectReference Include="../../src/Windows/Avalonia.Win32/Avalonia.Win32.csproj" /> <ProjectReference Include="../../src/Windows/Avalonia.Win32/Avalonia.Win32.csproj" />
<ProjectReference Include="../../src/Avalonia.Themes.Fluent/Avalonia.Themes.Fluent.csproj" /> <ProjectReference Include="../../src/Avalonia.Themes.Fluent/Avalonia.Themes.Fluent.csproj" />
</ItemGroup> </ItemGroup>

1
tests/Avalonia.IntegrationTests.Win32/Infrastructure/AppManager.cs

@ -24,6 +24,7 @@ internal static class AppManager
.Configure<Application>() .Configure<Application>()
.UseWin32() .UseWin32()
.UseSkia() .UseSkia()
.UseHarfBuzz()
.SetupWithoutStarting(); .SetupWithoutStarting();
appBuilder.Instance!.Styles.Add(new FluentTheme()); appBuilder.Instance!.Styles.Add(new FluentTheme());

Loading…
Cancel
Save