From 2f3fe13556ba980854dd274ffed2fdc1529f30eb Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Sun, 29 Oct 2023 14:52:29 +0100 Subject: [PATCH 1/2] Use old-school DllImport to be netstandard2.0 compatible --- lib/dotnet/AlphaSkia/AlphaSkia.csproj | 3 +- lib/dotnet/AlphaSkia/AlphaSkiaPlatform.cs | 45 +++- lib/dotnet/AlphaSkia/NativeMethods.cs | 254 ++++++++++------------ 3 files changed, 151 insertions(+), 151 deletions(-) diff --git a/lib/dotnet/AlphaSkia/AlphaSkia.csproj b/lib/dotnet/AlphaSkia/AlphaSkia.csproj index a99bdb2..edc1daa 100644 --- a/lib/dotnet/AlphaSkia/AlphaSkia.csproj +++ b/lib/dotnet/AlphaSkia/AlphaSkia.csproj @@ -2,7 +2,7 @@ true - net7.0 + netstandard2.0 enable enable README.md @@ -10,6 +10,7 @@ 10 $(ProductDescription) true + true diff --git a/lib/dotnet/AlphaSkia/AlphaSkiaPlatform.cs b/lib/dotnet/AlphaSkia/AlphaSkiaPlatform.cs index cdacb10..2c3f312 100644 --- a/lib/dotnet/AlphaSkia/AlphaSkiaPlatform.cs +++ b/lib/dotnet/AlphaSkia/AlphaSkiaPlatform.cs @@ -1,4 +1,5 @@ -using System.Runtime.InteropServices; +using System.Reflection; +using System.Runtime.InteropServices; namespace AlphaSkia; @@ -40,7 +41,7 @@ private static bool TryLoadManually() NativeMethods.AlphaSkiaNativeLibName + libExtension); if (File.Exists(alphaSkiaPath)) { - if (NativeLibrary.TryLoad(alphaSkiaPath, out _) && CheckNativeLib()) + if (TryLoadLibrary(alphaSkiaPath) && CheckNativeLib()) { return true; } @@ -54,12 +55,42 @@ private static bool TryLoadManually() return false; } + private static bool TryLoadLibrary(string path) + { + // on .net FX or some .netstandard environments the NativeLibrary might not be available + // try to use it if available, otherwise fallback. + var nativeLibraryTryLoadMethod = typeof(DllImportAttribute).Assembly + .GetType("System.Runtime.InteropServices.NativeLibrary") + ?.GetMethod("TryLoad", BindingFlags.Static | BindingFlags.Public); + if (nativeLibraryTryLoadMethod != null) + { + return (bool)nativeLibraryTryLoadMethod.Invoke(null, new object[] + { + path, IntPtr.Zero + })!; + } + + var handle = LoadLibraryWindows(path); + return handle != IntPtr.Zero; + } + + [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode, EntryPoint = "LoadLibraryW", + ExactSpelling = true)] + private static extern nint LoadLibraryWindows(string fileName); + + private static string FallbackRuntimeIdentifier => +#if NETSTANDARD2_0 + "windows-" + RuntimeInformation.OSArchitecture.ToString().ToLowerInvariant(); +#else + RuntimeInformation.RuntimeIdentifier; +#endif + private static string BuildKnownRid(out string libExtension) { - var officialRid = RuntimeInformation.RuntimeIdentifier; + var officialRid = FallbackRuntimeIdentifier; var separator = officialRid.IndexOf('-'); - var officialOs = officialRid[..separator]; - var officialArch = officialRid[(separator + 1)..]; + var officialOs = officialRid.Substring(0, separator); + var officialArch = officialRid.Substring(separator + 1); libExtension = Environment.OSVersion.Platform switch { @@ -68,7 +99,7 @@ private static string BuildKnownRid(out string libExtension) PlatformID.MacOSX => ".dylib", _ => "" }; - + var os = Environment.OSVersion.Platform switch { PlatformID.Unix => "linux", @@ -78,7 +109,7 @@ private static string BuildKnownRid(out string libExtension) }; if (string.IsNullOrEmpty(os)) { - return RuntimeInformation.RuntimeIdentifier; + return FallbackRuntimeIdentifier; } var arch = RuntimeInformation.OSArchitecture switch diff --git a/lib/dotnet/AlphaSkia/NativeMethods.cs b/lib/dotnet/AlphaSkia/NativeMethods.cs index 7434f16..e4a75c7 100644 --- a/lib/dotnet/AlphaSkia/NativeMethods.cs +++ b/lib/dotnet/AlphaSkia/NativeMethods.cs @@ -1,191 +1,159 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; +// ReSharper disable InconsistentNaming -// ReSharper disable InconsistentNaming +using System.Runtime.InteropServices; namespace AlphaSkia; -internal static partial class NativeMethods +internal static class NativeMethods { public const string AlphaSkiaNativeLibName = "libalphaskia"; - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial int alphaskia_get_color_type(); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern alphaskia_data_t alphaskia_data_new_copy(byte[] data, ulong length); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern int alphaskia_get_color_type(); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial alphaskia_data_t alphaskia_data_new_copy(byte[] data, ulong length); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial IntPtr alphaskia_data_get_data(alphaskia_data_t data); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr alphaskia_data_get_data(alphaskia_data_t data); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial ulong alphaskia_data_get_length(alphaskia_data_t data); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern ulong alphaskia_data_get_length(alphaskia_data_t data); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_data_free(alphaskia_data_t data); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_data_free(alphaskia_data_t data); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial alphaskia_typeface_t alphaskia_typeface_register(alphaskia_data_t data); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern alphaskia_typeface_t alphaskia_typeface_register(alphaskia_data_t data); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_typeface_free(alphaskia_typeface_t type_face); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_typeface_free(alphaskia_typeface_t type_face); - [LibraryImport(AlphaSkiaNativeLibName, StringMarshalling = StringMarshalling.Utf8)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial alphaskia_typeface_t alphaskia_typeface_make_from_name(string name, + [DllImport(AlphaSkiaNativeLibName)] + public static extern alphaskia_typeface_t alphaskia_typeface_make_from_name( + #if NETSTANDARD2_0 + [MarshalAs(UnmanagedType.LPStr)] + #else + [MarshalAs(UnmanagedType.LPUTF8Str)] + #endif + string utf8Name, byte bold, byte italic); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_image_free(alphaskia_image_t result); - - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial alphaskia_image_t alphaskia_image_decode(byte[] data, ulong length); - - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial alphaskia_image_t alphaskia_image_from_pixels(int width, int height, byte[] pixels); - - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial int alphaskia_image_get_width(alphaskia_image_t image); - - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial int alphaskia_image_get_height(alphaskia_image_t image); - - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial int alphaskia_image_read_pixels(alphaskia_image_t image, IntPtr pixels, ulong rowBytes); - - - [LibraryImport(AlphaSkiaNativeLibName, EntryPoint = nameof(alphaskia_image_read_pixels))] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial int alphaskia_image_read_pixels_bytes(alphaskia_image_t image, byte[] pixels, ulong rowBytes); - - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial alphaskia_data_t alphaskia_image_encode_png(alphaskia_image_t image); - - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial alphaskia_canvas_t alphaskia_canvas_new(); - - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_free(alphaskia_canvas_t canvas); - - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_set_color(alphaskia_canvas_t canvas, uint color); - - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial uint alphaskia_canvas_get_color(alphaskia_canvas_t canvas); - - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_set_line_width(alphaskia_canvas_t canvas, float line_width); - - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial float alphaskia_canvas_get_line_width(alphaskia_canvas_t canvas); - - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_begin_render(alphaskia_canvas_t canvas, int width, int height, + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_image_free(alphaskia_image_t result); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern alphaskia_image_t alphaskia_image_decode(byte[] data, ulong length); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern alphaskia_image_t alphaskia_image_from_pixels(int width, int height, byte[] pixels); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern int alphaskia_image_get_width(alphaskia_image_t image); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern int alphaskia_image_get_height(alphaskia_image_t image); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern int alphaskia_image_read_pixels(alphaskia_image_t image, IntPtr pixels, ulong rowBytes); + + + [DllImport(AlphaSkiaNativeLibName, EntryPoint = nameof(alphaskia_image_read_pixels))] + public static extern int alphaskia_image_read_pixels_bytes(alphaskia_image_t image, byte[] pixels, ulong rowBytes); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern alphaskia_data_t alphaskia_image_encode_png(alphaskia_image_t image); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern alphaskia_canvas_t alphaskia_canvas_new(); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_free(alphaskia_canvas_t canvas); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_set_color(alphaskia_canvas_t canvas, uint color); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern uint alphaskia_canvas_get_color(alphaskia_canvas_t canvas); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_set_line_width(alphaskia_canvas_t canvas, float line_width); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern float alphaskia_canvas_get_line_width(alphaskia_canvas_t canvas); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_begin_render(alphaskia_canvas_t canvas, int width, int height, float render_scale); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial alphaskia_image_t alphaskia_canvas_end_render(alphaskia_canvas_t canvas); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern alphaskia_image_t alphaskia_canvas_end_render(alphaskia_canvas_t canvas); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_fill_rect(alphaskia_canvas_t canvas, float x, float y, float width, + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_fill_rect(alphaskia_canvas_t canvas, float x, float y, float width, float height); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_stroke_rect(alphaskia_canvas_t canvas, float x, float y, float width, + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_stroke_rect(alphaskia_canvas_t canvas, float x, float y, float width, float height); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_begin_path(alphaskia_canvas_t canvas); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_begin_path(alphaskia_canvas_t canvas); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_close_path(alphaskia_canvas_t canvas); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_close_path(alphaskia_canvas_t canvas); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_move_to(alphaskia_canvas_t canvas, float x, float y); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_move_to(alphaskia_canvas_t canvas, float x, float y); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_line_to(alphaskia_canvas_t canvas, float x, float y); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_line_to(alphaskia_canvas_t canvas, float x, float y); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_quadratic_curve_to(alphaskia_canvas_t canvas, float cpx, float cpy, + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_quadratic_curve_to(alphaskia_canvas_t canvas, float cpx, float cpy, float x, float y); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_bezier_curve_to(alphaskia_canvas_t canvas, float cp1x, float cp1y, + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_bezier_curve_to(alphaskia_canvas_t canvas, float cp1x, float cp1y, float cp2x, float cp2y, float x, float y); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_fill_circle(alphaskia_canvas_t canvas, float x, float y, float radius); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_fill_circle(alphaskia_canvas_t canvas, float x, float y, float radius); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void - alphaskia_canvas_stroke_circle(alphaskia_canvas_t canvas, float x, float y, float radius); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_stroke_circle(alphaskia_canvas_t canvas, float x, float y, float radius); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_fill(alphaskia_canvas_t canvas); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_fill(alphaskia_canvas_t canvas); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_stroke(alphaskia_canvas_t canvas); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_stroke(alphaskia_canvas_t canvas); - [LibraryImport(AlphaSkiaNativeLibName, StringMarshalling = StringMarshalling.Utf16)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_fill_text(alphaskia_canvas_t canvas, string text, + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_fill_text(alphaskia_canvas_t canvas, + [MarshalAs(UnmanagedType.LPWStr)] + string text, alphaskia_typeface_t type_face, float font_size, float x, float y, AlphaSkiaTextAlign text_align, AlphaSkiaTextBaseline baseline); - [LibraryImport(AlphaSkiaNativeLibName, StringMarshalling = StringMarshalling.Utf16)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial float alphaskia_canvas_measure_text(alphaskia_canvas_t canvas, string text, + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern float alphaskia_canvas_measure_text(alphaskia_canvas_t canvas, + [MarshalAs(UnmanagedType.LPWStr)] + string text, alphaskia_typeface_t type_face, float font_size); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_begin_rotate(alphaskia_canvas_t canvas, float center_x, float center_y, + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_begin_rotate(alphaskia_canvas_t canvas, float center_x, float center_y, float angle); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_end_rotate(alphaskia_canvas_t canvas); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_end_rotate(alphaskia_canvas_t canvas); - [LibraryImport(AlphaSkiaNativeLibName)] - [UnmanagedCallConv(CallConvs = new[] { typeof(CallConvCdecl) })] - public static partial void alphaskia_canvas_draw_image(alphaskia_canvas_t canvas, alphaskia_image_t image, float x, + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_canvas_draw_image(alphaskia_canvas_t canvas, alphaskia_image_t image, float x, float y, float w, float h); } \ No newline at end of file From 58dfbcf5a21100b22a8869f2327ede29fd150504 Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Sun, 29 Oct 2023 16:56:41 +0100 Subject: [PATCH 2/2] Extend text matrix --- .github/workflows/build.yml | 11 +++++++--- build/Build.DotNet.cs | 4 ++++ .../AlphaSkia.Test/AlphaSkia.Test.csproj | 3 ++- test/dotnet/AlphaSkia.Test/Program.cs | 21 +++++++++++++------ 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 03804ee..18bceb3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -212,12 +212,17 @@ jobs: include: - runs-on: ubuntu-latest architecture: x64 + framework: net6.0 + - runs-on: macos-latest + architecture: x64 + framework: net6.0 - runs-on: windows-latest architecture: x64 + framework: net6.0 - runs-on: windows-latest - architecture: x86 - - runs-on: macos-latest architecture: x64 + framework: net48 + runs-on: ${{ matrix.runs-on }} needs: [dotnet] steps: @@ -226,7 +231,7 @@ jobs: with: name: nupkgs path: dist/.organize/nupkgs - - run: ./build.cmd DotNetTest --architecture ${{ matrix.architecture }} + - run: ./build.cmd DotNetTest --architecture ${{ matrix.architecture }} --framework ${{ matrix.framework }} - uses: actions/upload-artifact@v3 with: name: DotNet Test Results diff --git a/build/Build.DotNet.cs b/build/Build.DotNet.cs index d2b545d..1b89eb8 100644 --- a/build/Build.DotNet.cs +++ b/build/Build.DotNet.cs @@ -95,14 +95,18 @@ void DotNetWriteVersionInfoProps() (RootDirectory / "lib" / "dotnet" / "Version.props").WriteAllText(props); } + [Parameter] string Framework; + public Target DotNetTest => _ => _ .DependsOn(PrepareGitHubArtifacts) + .Requires(() => Framework) .Executes(() => { DotNetTasks.DotNetRun(_ => _ .SetProcessWorkingDirectory(RootDirectory / "test" / "dotnet" / "AlphaSkia.Test") .SetRuntime(TargetOperatingSystem.Current.DotNetRid + "-" + (Architecture ?? Architecture.Current)) + .SetFramework(Framework) .AddProcessEnvironmentVariable("NUGET_PACKAGES", TemporaryDirectory / "packages") ); }); diff --git a/test/dotnet/AlphaSkia.Test/AlphaSkia.Test.csproj b/test/dotnet/AlphaSkia.Test/AlphaSkia.Test.csproj index ccbf220..2d06468 100644 --- a/test/dotnet/AlphaSkia.Test/AlphaSkia.Test.csproj +++ b/test/dotnet/AlphaSkia.Test/AlphaSkia.Test.csproj @@ -2,9 +2,10 @@ Exe - net7.0 + net6.0;net48 enable enable + 10 diff --git a/test/dotnet/AlphaSkia.Test/Program.cs b/test/dotnet/AlphaSkia.Test/Program.cs index 681f664..7d6db41 100644 --- a/test/dotnet/AlphaSkia.Test/Program.cs +++ b/test/dotnet/AlphaSkia.Test/Program.cs @@ -1,8 +1,6 @@ -using System.Runtime.InteropServices; +namespace AlphaSkia.Test; -namespace AlphaSkia.Test; - -public class Program +public static class Program { private static string FindRepositoryRoot(string current) { @@ -40,7 +38,7 @@ private static AlphaSkiaImage RenderFullImage() var h = AlphaTabGeneratedRenderTest.PartPositions[i, 3]; Console.WriteLine($"Drawing part {i} into full image at {x}/{y}/{w}/{h}"); - fullImageCanvas.DrawImage(part, x, y, w, h); + fullImageCanvas.DrawImage(part!, x, y, w, h); } var fullImage = fullImageCanvas.EndRender(); @@ -58,7 +56,8 @@ public static int Main() // Load all fonts for rendering Console.WriteLine("Loading fonts"); var testDataPath = Path.Combine(repositoryRoot, "test", "test-data"); - AlphaTabGeneratedRenderTest.MusicTypeface = AlphaTabGeneratedRenderTest.LoadTypeface("Bravura", false, false, + AlphaTabGeneratedRenderTest.MusicTypeface = AlphaTabGeneratedRenderTest.LoadTypeface("Bravura", false, + false, Path.Combine(testDataPath, "font", "bravura", "Bravura.ttf")); AlphaTabGeneratedRenderTest.LoadTypeface("Roboto", false, false, Path.Combine(testDataPath, "font", "roboto", "Roboto-Regular.ttf")); @@ -169,6 +168,15 @@ public static int Main() } } +#if NET48 + private static readonly string AlphaSkiaTestRid = Environment.OSVersion.Platform == PlatformID.Win32NT + ? "win" + : Environment.OSVersion.Platform == PlatformID.Unix + ? "linux" + : Environment.OSVersion.Platform == PlatformID.MacOSX + ? "macos" + : throw new PlatformNotSupportedException("Unsupported test platform"); +#else private static readonly string AlphaSkiaTestRid = OperatingSystem.IsWindows() ? "win" : OperatingSystem.IsLinux() @@ -180,4 +188,5 @@ public static int Main() : OperatingSystem.IsIOS() ? "ios" : throw new PlatformNotSupportedException("Unsupported test platform"); +#endif } \ No newline at end of file