Preinitialize macOS AppKit fonts before static graphics
This commit is contained in:
1 parent
a357d32bc2
commit
37d6798862
6 files changed
+100
-1
No files matched your search
@@ -45,6 +45,9 @@ jobs:
|
|||||||
- name: Build macOS static graphics libraries
|
- name: Build macOS static graphics libraries
|
||||||
run: bash ./scripts/build-macos-static-graphics.sh all
|
run: bash ./scripts/build-macos-static-graphics.sh all
|
||||||
|
|
||||||
|
- name: Build macOS font preinit object
|
||||||
|
run: bash ./scripts/build-macos-font-preinit.sh
|
||||||
|
|
||||||
- name: List native outputs
|
- name: List native outputs
|
||||||
run: find "External/NativeStatic/${{ matrix.rid }}/native" -maxdepth 1 -type f -print
|
run: find "External/NativeStatic/${{ matrix.rid }}/native" -maxdepth 1 -type f -print
|
||||||
|
|
||||||
|
|||||||
@@ -136,6 +136,11 @@ jobs:
|
|||||||
TARGET_CPU: ${{ matrix.target_cpu }}
|
TARGET_CPU: ${{ matrix.target_cpu }}
|
||||||
run: scripts/build-macos-static-graphics.sh all
|
run: scripts/build-macos-static-graphics.sh all
|
||||||
|
|
||||||
|
- name: Build macOS font preinit object
|
||||||
|
env:
|
||||||
|
RID: ${{ matrix.rid }}
|
||||||
|
run: bash scripts/build-macos-font-preinit.sh
|
||||||
|
|
||||||
- name: Upload macOS static archives
|
- name: Upload macOS static archives
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<IncludeBuildOutput>false</IncludeBuildOutput>
|
<IncludeBuildOutput>false</IncludeBuildOutput>
|
||||||
<SuppressDependenciesWhenPacking>false</SuppressDependenciesWhenPacking>
|
<SuppressDependenciesWhenPacking>false</SuppressDependenciesWhenPacking>
|
||||||
<PackageId>Shiroka.Avalonia.StaticLink</PackageId>
|
<PackageId>Shiroka.Avalonia.StaticLink</PackageId>
|
||||||
<Version>3.119.2-7151.7</Version>
|
<Version>3.119.2-7151.9</Version>
|
||||||
<Authors>greepar</Authors>
|
<Authors>greepar</Authors>
|
||||||
<Company>greepar</Company>
|
<Company>greepar</Company>
|
||||||
<Description>Static SkiaSharp, HarfBuzzSharp, and ANGLE libraries for Avalonia NativeAOT single-file publishing.</Description>
|
<Description>Static SkiaSharp, HarfBuzzSharp, and ANGLE libraries for Avalonia NativeAOT single-file publishing.</Description>
|
||||||
@@ -27,6 +27,7 @@
|
|||||||
<None Include="lib/net10.0/_._" Pack="true" PackagePath="lib/net10.0/_._" />
|
<None Include="lib/net10.0/_._" Pack="true" PackagePath="lib/net10.0/_._" />
|
||||||
<None Include="buildTransitive/Shiroka.Avalonia.StaticLink.props" Pack="true" PackagePath="buildTransitive/$(PackageId).props" />
|
<None Include="buildTransitive/Shiroka.Avalonia.StaticLink.props" Pack="true" PackagePath="buildTransitive/$(PackageId).props" />
|
||||||
<None Include="buildTransitive/Shiroka.Avalonia.StaticLink.targets" Pack="true" PackagePath="buildTransitive/$(PackageId).targets" />
|
<None Include="buildTransitive/Shiroka.Avalonia.StaticLink.targets" Pack="true" PackagePath="buildTransitive/$(PackageId).targets" />
|
||||||
|
<None Include="buildTransitive/Shiroka.Avalonia.StaticLink.MacOSFontWarmup.cs" Pack="true" PackagePath="buildTransitive/Shiroka.Avalonia.StaticLink.MacOSFontWarmup.cs" />
|
||||||
<None Include="../../External/NativeStatic/win-x64/*" Pack="true" PackagePath="static/win-x64/native/" />
|
<None Include="../../External/NativeStatic/win-x64/*" Pack="true" PackagePath="static/win-x64/native/" />
|
||||||
<None Include="../../External/NativeStatic/win-arm64/*" Pack="true" PackagePath="static/win-arm64/native/" />
|
<None Include="../../External/NativeStatic/win-arm64/*" Pack="true" PackagePath="static/win-arm64/native/" />
|
||||||
<None Include="../../External/NativeStatic/linux-x64/*" Pack="true" PackagePath="static/linux-x64/native/" />
|
<None Include="../../External/NativeStatic/linux-x64/*" Pack="true" PackagePath="static/linux-x64/native/" />
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Shiroka.Avalonia.StaticLink;
|
||||||
|
|
||||||
|
internal static class MacOSFontWarmup
|
||||||
|
{
|
||||||
|
[ModuleInitializer]
|
||||||
|
internal static void Initialize()
|
||||||
|
{
|
||||||
|
if (!OperatingSystem.IsMacOS())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var nsApplication = objc_getClass("NSApplication");
|
||||||
|
var sharedApplication = sel_registerName("sharedApplication");
|
||||||
|
_ = objc_msgSend(nsApplication, sharedApplication);
|
||||||
|
|
||||||
|
var nsFont = objc_getClass("NSFont");
|
||||||
|
var systemFontOfSize = sel_registerName("systemFontOfSize:");
|
||||||
|
var systemFontOfSizeWidth = sel_registerName("systemFontOfSize:width:");
|
||||||
|
|
||||||
|
_ = objc_msgSend(nsFont, systemFontOfSize, 13.0);
|
||||||
|
_ = objc_msgSend(nsFont, systemFontOfSizeWidth, 13.0, 0.0);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Never fail application startup from the defensive macOS font-cache warmup.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[DllImport("/usr/lib/libobjc.A.dylib", EntryPoint = "objc_getClass")]
|
||||||
|
private static extern IntPtr objc_getClass([MarshalAs(UnmanagedType.LPUTF8Str)] string name);
|
||||||
|
|
||||||
|
[DllImport("/usr/lib/libobjc.A.dylib", EntryPoint = "sel_registerName")]
|
||||||
|
private static extern IntPtr sel_registerName([MarshalAs(UnmanagedType.LPUTF8Str)] string name);
|
||||||
|
|
||||||
|
[DllImport("/usr/lib/libobjc.A.dylib", EntryPoint = "objc_msgSend")]
|
||||||
|
private static extern IntPtr objc_msgSend(IntPtr receiver, IntPtr selector);
|
||||||
|
|
||||||
|
[DllImport("/usr/lib/libobjc.A.dylib", EntryPoint = "objc_msgSend")]
|
||||||
|
private static extern IntPtr objc_msgSend(IntPtr receiver, IntPtr selector, double value);
|
||||||
|
|
||||||
|
[DllImport("/usr/lib/libobjc.A.dylib", EntryPoint = "objc_msgSend")]
|
||||||
|
private static extern IntPtr objc_msgSend(IntPtr receiver, IntPtr selector, double value, double width);
|
||||||
|
}
|
||||||
@@ -49,9 +49,11 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup Condition="'$(PublishAot)' == 'true' and ('$(RuntimeIdentifier)' == 'osx-x64' or '$(RuntimeIdentifier)' == 'osx-arm64') and '$(_ShirokaAvaloniaStaticLinkNativeRoot)' != ''">
|
<ItemGroup Condition="'$(PublishAot)' == 'true' and ('$(RuntimeIdentifier)' == 'osx-x64' or '$(RuntimeIdentifier)' == 'osx-arm64') and '$(_ShirokaAvaloniaStaticLinkNativeRoot)' != ''">
|
||||||
|
<Compile Include="$(MSBuildThisFileDirectory)Shiroka.Avalonia.StaticLink.MacOSFontWarmup.cs" Link="Shiroka.Avalonia.StaticLink.MacOSFontWarmup.cs" Condition="Exists('$(MSBuildThisFileDirectory)Shiroka.Avalonia.StaticLink.MacOSFontWarmup.cs')" />
|
||||||
<DirectPInvoke Include="libAvaloniaNative" Condition="Exists('$(_ShirokaAvaloniaStaticLinkNativeRoot)/libAvaloniaNative.a')" />
|
<DirectPInvoke Include="libAvaloniaNative" Condition="Exists('$(_ShirokaAvaloniaStaticLinkNativeRoot)/libAvaloniaNative.a')" />
|
||||||
<DirectPInvoke Include="libHarfBuzzSharp" Condition="Exists('$(_ShirokaAvaloniaStaticLinkNativeRoot)/libHarfBuzzSharp.a')" />
|
<DirectPInvoke Include="libHarfBuzzSharp" Condition="Exists('$(_ShirokaAvaloniaStaticLinkNativeRoot)/libHarfBuzzSharp.a')" />
|
||||||
<DirectPInvoke Include="libSkiaSharp" Condition="Exists('$(_ShirokaAvaloniaStaticLinkNativeRoot)/libSkiaSharp.a')" />
|
<DirectPInvoke Include="libSkiaSharp" Condition="Exists('$(_ShirokaAvaloniaStaticLinkNativeRoot)/libSkiaSharp.a')" />
|
||||||
|
<NativeLibrary Include="$(_ShirokaAvaloniaStaticLinkNativeRoot)/macos_font_preinit.o" Condition="Exists('$(_ShirokaAvaloniaStaticLinkNativeRoot)/macos_font_preinit.o')" />
|
||||||
<NativeLibrary Include="$(_ShirokaAvaloniaStaticLinkNativeRoot)/libAvaloniaNative.a" Condition="Exists('$(_ShirokaAvaloniaStaticLinkNativeRoot)/libAvaloniaNative.a')" />
|
<NativeLibrary Include="$(_ShirokaAvaloniaStaticLinkNativeRoot)/libAvaloniaNative.a" Condition="Exists('$(_ShirokaAvaloniaStaticLinkNativeRoot)/libAvaloniaNative.a')" />
|
||||||
<NativeLibrary Include="$(_ShirokaAvaloniaStaticLinkNativeRoot)/libHarfBuzzSharp.a" Condition="Exists('$(_ShirokaAvaloniaStaticLinkNativeRoot)/libHarfBuzzSharp.a')" />
|
<NativeLibrary Include="$(_ShirokaAvaloniaStaticLinkNativeRoot)/libHarfBuzzSharp.a" Condition="Exists('$(_ShirokaAvaloniaStaticLinkNativeRoot)/libHarfBuzzSharp.a')" />
|
||||||
<NativeLibrary Include="$(_ShirokaAvaloniaStaticLinkNativeRoot)/libskia.a" Condition="Exists('$(_ShirokaAvaloniaStaticLinkNativeRoot)/libskia.a')" />
|
<NativeLibrary Include="$(_ShirokaAvaloniaStaticLinkNativeRoot)/libskia.a" Condition="Exists('$(_ShirokaAvaloniaStaticLinkNativeRoot)/libskia.a')" />
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
RID="${RID:-osx-arm64}"
|
||||||
|
OUTPUT_DIR="${OUTPUT_DIR:-$PWD/External/NativeStatic/$RID/native}"
|
||||||
|
|
||||||
|
case "$RID" in
|
||||||
|
osx-arm64) ARCH="arm64" ;;
|
||||||
|
osx-x64) ARCH="x86_64" ;;
|
||||||
|
*) echo "Unsupported RID: $RID" >&2; exit 2 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
mkdir -p "$OUTPUT_DIR"
|
||||||
|
|
||||||
|
src="$OUTPUT_DIR/macos_font_preinit.m"
|
||||||
|
cat > "$src" <<'OBJC'
|
||||||
|
#import <AppKit/AppKit.h>
|
||||||
|
|
||||||
|
__attribute__((constructor(101)))
|
||||||
|
static void ShirokaAvaloniaStaticLinkPreinitializeAppKitFonts(void)
|
||||||
|
{
|
||||||
|
@autoreleasepool
|
||||||
|
{
|
||||||
|
[NSApplication sharedApplication];
|
||||||
|
[NSFont systemFontOfSize:13.0];
|
||||||
|
[NSFont systemFontOfSize:13.0 width:0.0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OBJC
|
||||||
|
|
||||||
|
clang -arch "$ARCH" \
|
||||||
|
-mmacosx-version-min=12.0 \
|
||||||
|
-fobjc-arc \
|
||||||
|
-c "$src" \
|
||||||
|
-o "$OUTPUT_DIR/macos_font_preinit.o"
|
||||||
|
|
||||||
|
rm -f "$src"
|
||||||
|
echo "Wrote $OUTPUT_DIR/macos_font_preinit.o"
|
||||||
Reference in new issue
Block a user