diff --git a/README.md b/README.md index 36be4b3..6041b19 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ alphaSkia is a special cross platform [Skia](https://skia.org/) wrapper used in alphaSkia a slightly adapted [Semantic Versioning](https://semver.org/) scheme where the `PATCH` part indicates the Skia milestone version we have integrated. -Currently we are on [Skia m120](https://github.com/CoderLine/alphaSkia/blob/main/.gitmodules#L8) +Currently we are on [Skia m135](https://github.com/CoderLine/alphaSkia/blob/main/.gitmodules#L8) Given a version number `MAJOR.MINOR.SKIA`: diff --git a/build/Build.DotNet.cs b/build/Build.DotNet.cs index c5af7fc..90e9a20 100644 --- a/build/Build.DotNet.cs +++ b/build/Build.DotNet.cs @@ -63,22 +63,31 @@ partial class Build ); }); - void DotNetWriteVersionInfoProps() + private string DotNetVersion { - string semVer; - if (IsLocalBuild) - { - semVer = $"{VersionInfo.FileVersion.ToString(3)}-local.{VersionInfo.FileVersion.Revision}"; - } - else if (!IsReleaseBuild) - { - semVer = $"{VersionInfo.FileVersion.ToString(3)}-alpha.{VersionInfo.FileVersion.Revision}"; - } - else + get { - semVer = $"{VersionInfo.FileVersion.ToString(3)}"; + string semVer; + if (IsLocalBuild) + { + semVer = $"{VersionInfo.FileVersion.ToString(3)}-local.{VersionInfo.FileVersion.Revision}"; + } + else if (!IsReleaseBuild) + { + semVer = $"{VersionInfo.FileVersion.ToString(3)}-alpha.{VersionInfo.FileVersion.Revision}"; + } + else + { + semVer = $"{VersionInfo.FileVersion.ToString(3)}"; + } + + return semVer; } + } + void DotNetWriteVersionInfoProps() + { + var semVer = DotNetVersion; var props = $""" @@ -102,6 +111,7 @@ void DotNetWriteVersionInfoProps() [Parameter] string Framework; + [PublicAPI] public Target DotNetTest => t => t .DependsOn(PrepareGitHubArtifacts) .Requires(() => Framework) @@ -110,6 +120,7 @@ void DotNetWriteVersionInfoProps() Log.Information($"Running DotNet tests on {TargetOperatingSystem.Current.RuntimeIdentifier}-{Architecture.Current} host system (OS fonts)"); DotNetTasks.DotNetRun(t => t .SetProcessWorkingDirectory(RootDirectory / "test" / "dotnet" / "AlphaSkia.Test") + .SetProperty("AlphaSkiaTestVersion", DotNetVersion) .SetRuntime(TargetOperatingSystem.Current.DotNetRid + "-" + (Architecture ?? Architecture.Current)) .SetFramework(Framework) @@ -119,6 +130,7 @@ void DotNetWriteVersionInfoProps() Log.Information($"Running DotNet tests on {TargetOperatingSystem.Current.RuntimeIdentifier}-{Architecture.Current} host system (FreeType fonts)"); DotNetTasks.DotNetRun(t => t .SetProcessWorkingDirectory(RootDirectory / "test" / "dotnet" / "AlphaSkia.Test") + .SetProperty("AlphaSkiaTestVersion", DotNetVersion) .SetRuntime(TargetOperatingSystem.Current.DotNetRid + "-" + (Architecture ?? Architecture.Current)) .SetFramework(Framework) @@ -129,6 +141,7 @@ void DotNetWriteVersionInfoProps() [Parameter] [Secret] readonly string NugetApiKey = GetVariable("NUGET_API_KEY"); + [PublicAPI] public Target DotNetPublish => t => t .DependsOn(PrepareGitHubArtifacts) .Requires(() => IsGitHubActions) diff --git a/build/Build.Java.cs b/build/Build.Java.cs index 2723722..fac4ace 100644 --- a/build/Build.Java.cs +++ b/build/Build.Java.cs @@ -78,6 +78,7 @@ void JavaBuildInternal() workingDirectory: RootDirectory / "lib" / "java"); } + [PublicAPI] public Target JavaTest => t => t .DependsOn(PrepareGitHubArtifacts) .Executes(() => @@ -146,6 +147,7 @@ string JavaVersion } } + [PublicAPI] public Target JavaPublish => t => t .DependsOn(PrepareGitHubArtifacts) .Executes(() => diff --git a/build/Build.LibAlphaSkia.cs b/build/Build.LibAlphaSkia.cs index 591f43c..fbc0273 100644 --- a/build/Build.LibAlphaSkia.cs +++ b/build/Build.LibAlphaSkia.cs @@ -85,6 +85,7 @@ partial class Build "../../wrapper/src/alphaskia_canvas.cpp", "../../wrapper/src/alphaskia_image.cpp", "../../wrapper/src/alphaskia_typeface.cpp", + "../../wrapper/src/alphaskia_textstyle.cpp", "../../wrapper/src/alphaskia_data.cpp", "../../wrapper/src/alphaskia_string.cpp" ] @@ -156,6 +157,7 @@ partial class Build "../../lib/java/jni/src/AlphaSkiaCanvas.cpp", "../../lib/java/jni/src/AlphaSkiaData.cpp", "../../lib/java/jni/src/AlphaSkiaImage.cpp", + "../../lib/java/jni/src/AlphaSkiaTextStyle.cpp", "../../lib/java/jni/src/AlphaSkiaTypeface.cpp" ] } @@ -356,14 +358,14 @@ void CopyBuildOutputTo(AbsolutePath path) { // libs outDir.Copy(path, - ExistsPolicy.MergeAndOverwriteIfNewer, + ExistsPolicy.MergeAndOverwrite, null, file => !libExtensions.Contains(file.Extension) ); // copy header (RootDirectory / "wrapper" / "include" / "alphaskia.h").Copy( DistBasePath / "include" / "alphaskia" / "alphaskia.h", - ExistsPolicy.MergeAndOverwriteIfNewer + ExistsPolicy.MergeAndOverwrite ); } @@ -415,13 +417,13 @@ void BuildAlphaSkiaTest() // copy for artifacts var distPath = DistBasePath / libDir; var exePath = outDir / (buildTarget + exeExtension); - exePath.Copy(distPath / exePath.Name, ExistsPolicy.MergeAndOverwriteIfNewer); + exePath.Copy(distPath / exePath.Name, ExistsPolicy.MergeAndOverwrite); // copy shared lib beside executable var libExtensions = new HashSet(GetLibExtensions(Variant), StringComparer.OrdinalIgnoreCase); foreach (var file in sharedLibPath.GetFiles().Where(f => libExtensions.Contains(f.Extension))) { - file.Copy(outDir / file.Name, ExistsPolicy.MergeAndOverwriteIfNewer); + file.Copy(outDir / file.Name, ExistsPolicy.MergeAndOverwrite); } // run executable @@ -439,6 +441,7 @@ void BuildAlphaSkiaTest() "--freetype", workingDirectory: outDir ); + } else { diff --git a/build/Build.LibSkia.cs b/build/Build.LibSkia.cs index b47b886..fa5e554 100644 --- a/build/Build.LibSkia.cs +++ b/build/Build.LibSkia.cs @@ -31,6 +31,9 @@ partial class Build "third_party/externals/zlib", "third_party/externals/wuffs", "third_party/externals/vulkanmemoryallocator", + "third_party/externals/libgrapheme", + "third_party/externals/icu", + "third_party/externals/unicodetools", // Android font manager "third_party/externals/expat" @@ -63,7 +66,7 @@ partial class Build if (LibSkiaSkip.Value) { - DistBasePath.Copy(ArtifactBasePath, ExistsPolicy.MergeAndOverwriteIfNewer); + DistBasePath.Copy(ArtifactBasePath, ExistsPolicy.MergeAndOverwrite); } else { @@ -87,9 +90,32 @@ partial class Build .After(LibSkiaGitSyncDeps) .Executes(() => { + // add harfbuzz and freetype as dependency as we want it for alphaSkia var buildFile = SkiaPath / "BUILD.gn"; var buildFileSource = buildFile.ReadAllText(); + + + var skiaGniStart = buildFileSource.IndexOf("import(\"gn/skia.gni\")", StringComparison.Ordinal); + if (skiaGniStart == -1) + { + throw new IOException("BUILD.gn of skia changed, cannot patch files"); + } + + var skiaGniEnd = buildFileSource.IndexOf("\n", skiaGniStart, StringComparison.Ordinal); + if (skiaGniEnd == -1) + { + throw new IOException("BUILD.gn of skia changed, cannot patch files"); + } + + buildFileSource = buildFileSource[..skiaGniEnd] + + "import(\"modules/skparagraph/skparagraph.gni\")\n" + + "import(\"third_party/icu/icu.gni\")\n" + + "import(\"modules/skunicode/skunicode.gni\")\n" + + "import(\"modules/skshaper/skshaper.gni\")\n" + + buildFileSource[skiaGniEnd..]; + + var skiaComponentStart = buildFileSource.IndexOf("skia_component(\"skia\")", StringComparison.Ordinal); if (skiaComponentStart == -1) { @@ -114,8 +140,8 @@ partial class Build if (!depsList.Contains("//third_party/harfbuzz")) { var newDepsList = depsList.TrimEnd('\r', '\n', '\t', ' ', ',') - + ", \"//third_party/harfbuzz\", \"//third_party/freetype2\", " - ; + + ", \"//third_party/harfbuzz\", \"//third_party/freetype2\", skia_libgrapheme_third_party_dir, skia_icu_bidi_third_party_dir" + ; buildFileSource = buildFileSource[..depsListStart] + newDepsList + buildFileSource[depsListEnd..]; @@ -135,22 +161,15 @@ partial class Build } var sources = buildFileSource.Substring(sourcesStart, sourcesEnd); - if (!sources.Contains("# AlphaSkia Patch FreeType")) + if (!sources.Contains("# AlphaSkia Patch FreeType and SkParagraph")) { - var newSources = "# AlphaSkia Patch FreeType\n"; + var newSources = "# AlphaSkia Patch FreeType and SkParagraph\n"; // ensure we have freetype available newSources += " include_dirs = [ \"externals/freetype/include\" ]\n"; - newSources += " sources += [\n"; - newSources += " \"src/ports/SkFontHost_FreeType.cpp\",\n"; - newSources += " \"src/ports/SkFontHost_FreeType_common.cpp\",\n"; - newSources += " \"src/ports/SkFontHost_FreeType_common.h\",\n"; - newSources += " ]\n"; + newSources += " sources += skia_ports_freetype_sources\n"; // ensure we have the custom embedded FontMgr available (for in-memory freetype usage) - newSources += " sources += [\n"; - newSources += " \"src/ports/SkFontMgr_custom.h\",\n"; - newSources += " \"src/ports/SkFontMgr_custom.cpp\",\n"; - newSources += " \"src/ports/SkFontMgr_custom_embedded.cpp\",\n"; - newSources += " ]\n"; + newSources += " sources += skia_ports_fontmgr_embedded_sources\n"; + newSources += " sources += skia_ports_fontmgr_custom_sources\n"; // ensure we have the OS specific font managers available newSources += " if (is_win) {\n"; newSources += " sources += skia_ports_windows_fonts_sources\n"; @@ -181,6 +200,38 @@ partial class Build newSources += " sources += skia_ports_fontmgr_coretext_sources\n"; newSources += " }\n"; newSources += " "; + + // Directly add some submodules to the main skia lib + + // SkShaper + newSources += " defines += [ \"SK_SHAPER_HARFBUZZ_AVAILABLE\", \"SK_SHAPER_UNICODE_AVAILABLE\", \"SKSHAPER_IMPLEMENTATION=1\" ]\n"; + newSources += " sources += skia_shaper_primitive_sources\n"; + newSources += " sources += skia_shaper_skunicode_sources\n"; + newSources += " sources += skia_shaper_harfbuzz_sources\n"; + newSources += " public += skia_unicode_public\n"; + + // SkUnicode + newSources += " defines += [\"SK_UNICODE_AVAILABLE\", \"SKUNICODE_IMPLEMENTATION=1\", \"SK_UNICODE_LIBGRAPHEME_IMPLEMENTATION\" ]\n"; + newSources += " configs += [\"//third_party/icu/config:no_cxx\"]\n"; + + newSources += " sources += skia_unicode_sources\n"; + newSources += " sources += skia_unicode_icu_bidi_sources\n"; + newSources += " sources += skia_unicode_bidi_subset_sources\n"; + newSources += " sources += skia_unicode_libgrapheme_sources\n"; + newSources += " public += skia_unicode_public\n"; + newSources += " defines += [\n"; + newSources += " \"U_DISABLE_RENAMING=0\",\n"; + newSources += " \"U_USING_ICU_NAMESPACE=0\",\n"; + newSources += " \"U_LIB_SUFFIX_C_NAME=_skia\",\n"; + newSources += " \"U_HAVE_LIB_SUFFIX=1\",\n"; + newSources += " \"U_DISABLE_VERSION_SUFFIX=1\",\n"; + newSources += " ]\n"; + + // SkParagraph + newSources += " defines += [ \"SK_ENABLE_PARAGRAPH\" ]\n"; + newSources += " sources += skparagraph_sources\n"; + newSources += " public += skparagraph_public\n"; + newSources += " sources += [\n"; newSources += " \"../../wrapper/src/SkFontMgr_alphaskia.cpp\",\n"; newSources += " \"../../wrapper/include/SkFontMgr_alphaskia.h\",\n"; @@ -203,8 +254,8 @@ partial class Build newSources += " }\n"; buildFileSource = buildFileSource[..sourcesEnd] - + newSources - + buildFileSource[sourcesEnd..]; + + newSources + + buildFileSource[sourcesEnd..]; } buildFile.WriteAllText(buildFileSource); @@ -253,7 +304,11 @@ void BuildSkia() gnArgs["skia_use_icu"] = "false"; gnArgs["skia_use_piex"] = "false"; gnArgs["skia_use_sfntly"] = "false"; + gnArgs["skia_use_libgrapheme"] = "true"; gnArgs["skia_enable_skshaper"] = "true"; + gnArgs["skia_enable_skparagraph"] = "true"; + gnArgs["skia_enable_skunicode"] = "true"; + gnArgs["skia_use_harfbuzz"] = "true"; gnArgs["skia_pdf_subset_harfbuzz"] = "false"; gnArgs["skia_enable_pdf"] = "false"; gnArgs["skia_use_dng_sdk"] = "false"; @@ -285,7 +340,7 @@ void BuildSkia() void CopyBuildOutputTo(AbsolutePath path) { // libs - outDir.Copy(path, ExistsPolicy.MergeAndOverwriteIfNewer, null, + outDir.Copy(path, ExistsPolicy.MergeAndOverwrite, null, file => !libExtension.Contains(file.Extension)); } diff --git a/build/Build.Node.cs b/build/Build.Node.cs index a35c95f..7572957 100644 --- a/build/Build.Node.cs +++ b/build/Build.Node.cs @@ -53,7 +53,7 @@ partial class Build foreach (var tgz in (RootDirectory / "lib" / "node").GetFiles("*.tgz", int.MaxValue)) { - tgz.Copy(RootDirectory / "dist" / "nodetars" / tgz.Name, ExistsPolicy.MergeAndOverwriteIfNewer); + tgz.Copy(RootDirectory / "dist" / "nodetars" / tgz.Name, ExistsPolicy.MergeAndOverwrite); } PrepareTgzForTest(); @@ -72,7 +72,7 @@ void PrepareTgzForTest() + tgz.Extension; tgz.Copy(RootDirectory / "dist" / "nodetars" / nameWithoutVersion, - ExistsPolicy.MergeAndOverwriteIfNewer); + ExistsPolicy.MergeAndOverwrite); files.Add(nameWithoutVersion); } @@ -215,7 +215,7 @@ void CopyNodeAddonsToPackages() } subDirectory.Copy(RootDirectory / "lib" / "node" / packageName / "lib" / subDirectory.Name, - ExistsPolicy.MergeAndOverwriteIfNewer, null, fi => fi.Extension != ".node"); + ExistsPolicy.MergeAndOverwrite, null, fi => fi.Extension != ".node"); } } diff --git a/externals/node-api-headers b/externals/node-api-headers index 186e04b..d46edab 160000 --- a/externals/node-api-headers +++ b/externals/node-api-headers @@ -1 +1 @@ -Subproject commit 186e04b5e40e54d7fd1655bc67081cc483f12488 +Subproject commit d46edabd5bbacc08393578eb19fc2eba7021b597 diff --git a/lib/dotnet/AlphaSkia/AlphaSkiaCanvas.cs b/lib/dotnet/AlphaSkia/AlphaSkiaCanvas.cs index 7f7916e..3d214e1 100644 --- a/lib/dotnet/AlphaSkia/AlphaSkiaCanvas.cs +++ b/lib/dotnet/AlphaSkia/AlphaSkiaCanvas.cs @@ -281,31 +281,31 @@ public void Stroke() /// Fills a text with the current color and provided details. /// /// The text to draw. - /// The typeface to use for drawing the text. + /// The text style to use for drawing the text. /// The font size to use when drawing the text. /// The X-position where to draw the text to. /// The Y-position where to draw the text to. /// How to align the text at the given position horizontally. /// How to align the text at the given position vertically. - public void FillText(string text, AlphaSkiaTypeface typeface, float fontSize, float x, float y, + public void FillText(string text, AlphaSkiaTextStyle textStyle, float fontSize, float x, float y, AlphaSkiaTextAlign textAlign, AlphaSkiaTextBaseline baseline) { CheckDisposed(); - NativeMethods.alphaskia_canvas_fill_text(Handle, text, text.Length, typeface.Handle, fontSize, x, y, textAlign, baseline); + NativeMethods.alphaskia_canvas_fill_text(Handle, text, text.Length, textStyle.Handle, fontSize, x, y, textAlign, baseline); } /// /// Measures the given text. /// /// The text to measure. - /// The typeface to use for drawing the text. - /// The font size to use when drawing the text. + /// The text style to use for measuring the text. + /// The font size to use when measuring the text. /// The horizontal width of the text when it would be drawn. - public float MeasureText(string text, AlphaSkiaTypeface typeface, float fontSize) + public float MeasureText(string text, AlphaSkiaTextStyle textStyle, float fontSize) { CheckDisposed(); - return NativeMethods.alphaskia_canvas_measure_text(Handle, text, text.Length, typeface.Handle, fontSize); + return NativeMethods.alphaskia_canvas_measure_text(Handle, text, text.Length, textStyle.Handle, fontSize); } /// diff --git a/lib/dotnet/AlphaSkia/AlphaSkiaTextStyle.cs b/lib/dotnet/AlphaSkia/AlphaSkiaTextStyle.cs new file mode 100644 index 0000000..aca3875 --- /dev/null +++ b/lib/dotnet/AlphaSkia/AlphaSkiaTextStyle.cs @@ -0,0 +1,42 @@ +namespace AlphaSkia; + +/// +/// Represents a text style which can be used to draw or measure texts +/// with support for mixed fonts for fallback character rendering. +/// +/// +/// This structure is designed for good reusability. The same text style might be used +/// with different font sizes, colors and alignments, that's why they are not part of this structure itself. +/// +public sealed class AlphaSkiaTextStyle : AlphaSkiaNative +{ + /// + /// Gets the list of font family names which are consulted for finding + /// typefaces with glyphs for drawing or measuring texts. + /// + public string[] FontFamilies { get; } + + /// + /// Gets the font weight used for finding typefaces. + /// + public ushort Weight { get; } + + /// + /// Gets whether the used typefaces should be italic. + /// + public bool IsItalic { get; } + + /// + /// Initializes a new instance of the class. + /// + /// The list of font family names. + /// The font weight typefaces should have. + /// Whether typefaces should be italic. + public AlphaSkiaTextStyle(string[] fontFamilies, ushort weight, bool isItalic) + : base(NativeMethods.alphaskia_textstyle_new((byte)fontFamilies.Length, fontFamilies, weight, isItalic ? (byte)1 : (byte)0), NativeMethods.alphaskia_textstyle_free) + { + FontFamilies = fontFamilies; + Weight = weight; + IsItalic = isItalic; + } +} \ No newline at end of file diff --git a/lib/dotnet/AlphaSkia/AlphaSkiaTypeface.cs b/lib/dotnet/AlphaSkia/AlphaSkiaTypeface.cs index 111e718..bbb0cda 100644 --- a/lib/dotnet/AlphaSkia/AlphaSkiaTypeface.cs +++ b/lib/dotnet/AlphaSkia/AlphaSkiaTypeface.cs @@ -34,9 +34,14 @@ public string FamilyName } /// - /// Gets a value indicating whether the typeface is bold. + /// Gets a value indicating whether the typeface is bold (weight >= 600, 600=>SemiBold) /// - public bool IsBold => NativeMethods.alphaskia_typeface_is_bold(Handle) != 0; + public bool IsBold => Weight >= 600 /* kSemiBold_Weight */; + + /// + /// Gets the weight of the font. + /// + public ushort Weight => NativeMethods.alphaskia_typeface_get_weight(Handle); /// /// Gets a value indicating whether the typeface is italic. @@ -81,13 +86,13 @@ protected override void Dispose(bool disposing) /// Creates a typeface using the provided information. /// /// The name of the typeface. - /// Whether the bold version of the typeface should be loaded. + /// The weight of the typeface. /// Whether the italic version of the typeface should be loaded. /// The typeface if it can be found in the already loaded fonts or the system fonts, otherwise null. - public static AlphaSkiaTypeface? Create(string name, bool bold, bool italic) + public static AlphaSkiaTypeface? Create(string name, ushort weight, bool italic) { var typeface = - NativeMethods.alphaskia_typeface_make_from_name(name, bold ? (byte)1 : (byte)0, italic ? (byte)1 : (byte)0); + NativeMethods.alphaskia_typeface_make_from_name(name, weight, italic ? (byte)1 : (byte)0); if (typeface == IntPtr.Zero) { return null; @@ -95,4 +100,16 @@ protected override void Dispose(bool disposing) return new AlphaSkiaTypeface(typeface); } + + /// + /// Creates a typeface using the provided information. + /// + /// The name of the typeface. + /// Whether the bold version of the typeface should be loaded. + /// Whether the italic version of the typeface should be loaded. + /// The typeface if it can be found in the already loaded fonts or the system fonts, otherwise null. + public static AlphaSkiaTypeface? Create(string name, bool bold, bool italic) + { + return Create(name, bold ? (ushort)700 : (ushort)400, italic); + } } \ No newline at end of file diff --git a/lib/dotnet/AlphaSkia/GlobalUsings.cs b/lib/dotnet/AlphaSkia/GlobalUsings.cs index 7655401..6ff5c50 100644 --- a/lib/dotnet/AlphaSkia/GlobalUsings.cs +++ b/lib/dotnet/AlphaSkia/GlobalUsings.cs @@ -2,4 +2,5 @@ global using alphaskia_image_t = System.IntPtr; global using alphaskia_canvas_t = System.IntPtr; global using alphaskia_data_t = System.IntPtr; -global using alphaskia_string_t = System.IntPtr; \ No newline at end of file +global using alphaskia_string_t = System.IntPtr; +global using alphaskia_textstyle_t = System.IntPtr; \ No newline at end of file diff --git a/lib/dotnet/AlphaSkia/NativeMethods.cs b/lib/dotnet/AlphaSkia/NativeMethods.cs index 889f916..9c89ce3 100644 --- a/lib/dotnet/AlphaSkia/NativeMethods.cs +++ b/lib/dotnet/AlphaSkia/NativeMethods.cs @@ -41,22 +41,35 @@ internal static class NativeMethods [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern alphaskia_string_t alphaskia_typeface_get_family_name(alphaskia_typeface_t typeface); [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] - public static extern byte alphaskia_typeface_is_bold(alphaskia_typeface_t typeface); + public static extern ushort alphaskia_typeface_get_weight(alphaskia_typeface_t typeface); [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern byte alphaskia_typeface_is_italic(alphaskia_typeface_t typeface); [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void alphaskia_typeface_free(alphaskia_typeface_t type_face); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern alphaskia_textstyle_t alphaskia_textstyle_new(byte family_name_count, string[] family_names, ushort weight, byte italic); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern byte alphaskia_textstyle_get_family_name_count(alphaskia_textstyle_t textstyle); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern alphaskia_string_t alphaskia_textstyle_get_family_name(alphaskia_textstyle_t textstyle, byte index); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern ushort alphaskia_textstyle_get_weight(alphaskia_textstyle_t textstyle); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern byte alphaskia_textstyle_is_italic(alphaskia_textstyle_t textstyle); + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_textstyle_free(alphaskia_textstyle_t textstyle); + [DllImport(AlphaSkiaNativeLibName)] public static extern alphaskia_typeface_t alphaskia_typeface_make_from_name( - #if NETSTANDARD2_0 +#if NETSTANDARD2_0 [MarshalAs(UnmanagedType.LPStr)] - #else +#else [MarshalAs(UnmanagedType.LPUTF8Str)] #endif string utf8Name, - byte bold, byte italic); + ushort weight, byte italic); [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] @@ -151,19 +164,19 @@ public static extern void alphaskia_canvas_bezier_curve_to(alphaskia_canvas_t ca [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] - public static extern void alphaskia_canvas_fill_text(alphaskia_canvas_t canvas, + public static extern void alphaskia_canvas_fill_text(alphaskia_canvas_t canvas, [MarshalAs(UnmanagedType.LPWStr)] string text, int text_length, - alphaskia_typeface_t type_face, float font_size, float x, float y, AlphaSkiaTextAlign text_align, + alphaskia_textstyle_t textstyle, float font_size, float x, float y, AlphaSkiaTextAlign text_align, AlphaSkiaTextBaseline baseline); [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] - public static extern float alphaskia_canvas_measure_text(alphaskia_canvas_t canvas, + public static extern float alphaskia_canvas_measure_text(alphaskia_canvas_t canvas, [MarshalAs(UnmanagedType.LPWStr)] string text, int text_length, - alphaskia_typeface_t type_face, float font_size); + alphaskia_textstyle_t textstyle, float font_size); [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void alphaskia_canvas_begin_rotate(alphaskia_canvas_t canvas, float center_x, float center_y, diff --git a/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaCanvas.h b/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaCanvas.h index dee5d19..386c56c 100644 --- a/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaCanvas.h +++ b/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaCanvas.h @@ -170,7 +170,7 @@ JNIEXPORT void JNICALL Java_alphaTab_alphaSkia_AlphaSkiaCanvas_stroke /* * Class: alphaTab_alphaSkia_AlphaSkiaCanvas * Method: fillText - * Signature: (Ljava/lang/String;LalphaTab/alphaSkia/AlphaSkiaTypeface;FFFLalphaTab/alphaSkia/AlphaSkiaTextAlign;LalphaTab/alphaSkia/AlphaSkiaTextBaseline;)V + * Signature: (Ljava/lang/String;LalphaTab/alphaSkia/AlphaSkiaTextStyle;FFFLalphaTab/alphaSkia/AlphaSkiaTextAlign;LalphaTab/alphaSkia/AlphaSkiaTextBaseline;)V */ JNIEXPORT void JNICALL Java_alphaTab_alphaSkia_AlphaSkiaCanvas_fillText (JNIEnv *, jobject, jstring, jobject, jfloat, jfloat, jfloat, jobject, jobject); @@ -178,7 +178,7 @@ JNIEXPORT void JNICALL Java_alphaTab_alphaSkia_AlphaSkiaCanvas_fillText /* * Class: alphaTab_alphaSkia_AlphaSkiaCanvas * Method: measureText - * Signature: (Ljava/lang/String;LalphaTab/alphaSkia/AlphaSkiaTypeface;F)F + * Signature: (Ljava/lang/String;LalphaTab/alphaSkia/AlphaSkiaTextStyle;F)F */ JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaCanvas_measureText (JNIEnv *, jobject, jstring, jobject, jfloat); diff --git a/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaTextStyle.h b/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaTextStyle.h new file mode 100644 index 0000000..f1510f0 --- /dev/null +++ b/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaTextStyle.h @@ -0,0 +1,29 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class alphaTab_alphaSkia_AlphaSkiaTextStyle */ + +#ifndef _Included_alphaTab_alphaSkia_AlphaSkiaTextStyle +#define _Included_alphaTab_alphaSkia_AlphaSkiaTextStyle +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: alphaTab_alphaSkia_AlphaSkiaTextStyle + * Method: alphaskiaTextStyleNew + * Signature: ([Ljava/lang/String;IZ)J + */ +JNIEXPORT jlong JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextStyle_alphaskiaTextStyleNew + (JNIEnv *, jclass, jobjectArray, jint, jboolean); + +/* + * Class: alphaTab_alphaSkia_AlphaSkiaTextStyle + * Method: close + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextStyle_close + (JNIEnv *, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaTypeface.h b/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaTypeface.h index 542f246..01e5172 100644 --- a/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaTypeface.h +++ b/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaTypeface.h @@ -9,10 +9,10 @@ extern "C" { #endif /* * Class: alphaTab_alphaSkia_AlphaSkiaTypeface - * Method: isBold - * Signature: ()Z + * Method: getWeight + * Signature: ()I */ -JNIEXPORT jboolean JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTypeface_isBold +JNIEXPORT jint JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTypeface_getWeight (JNIEnv *, jobject); /* @@ -50,10 +50,10 @@ JNIEXPORT jlong JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTypeface_register /* * Class: alphaTab_alphaSkia_AlphaSkiaTypeface * Method: makeFromName - * Signature: (Ljava/lang/String;ZZ)J + * Signature: (Ljava/lang/String;IZ)J */ JNIEXPORT jlong JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTypeface_makeFromName - (JNIEnv *, jclass, jstring, jboolean, jboolean); + (JNIEnv *, jclass, jstring, jint, jboolean); #ifdef __cplusplus } diff --git a/lib/java/jni/src/AlphaSkiaCanvas.cpp b/lib/java/jni/src/AlphaSkiaCanvas.cpp index 1692583..481f395 100644 --- a/lib/java/jni/src/AlphaSkiaCanvas.cpp +++ b/lib/java/jni/src/AlphaSkiaCanvas.cpp @@ -172,8 +172,8 @@ extern "C" const jchar *nativeStr = env->GetStringChars(str, nullptr); - alphaskia_typeface_t nativeTypeface = reinterpret_cast(get_handle(env, typeface)); - CHECK_HANDLE(nativeTypeface) + alphaskia_textstyle_t nativeTextStyle = reinterpret_cast(get_handle(env, typeface)); + CHECK_HANDLE(nativeTextStyle) jmethodID textAlignGetValue = env->GetMethodID(env->GetObjectClass(text_align), "getValue", "()I"); if (!textAlignGetValue) @@ -199,7 +199,7 @@ extern "C" alphaskia_text_baseline_t nativeBaseline = static_cast(env->CallIntMethod(baseline, baselineGetValue)); alphaskia_canvas_fill_text(canvas, reinterpret_cast(nativeStr), static_cast(env->GetStringLength(str)), - nativeTypeface, static_cast(font_size), static_cast(x), static_cast(y), + nativeTextStyle, static_cast(font_size), static_cast(x), static_cast(y), nativeTextAlign, nativeBaseline); env->ReleaseStringChars(str, nativeStr); @@ -210,10 +210,10 @@ extern "C" CHECK_HANDLE_RETURN(canvas, 0.0f) const jchar *nativeStr = env->GetStringChars(str, nullptr); - alphaskia_typeface_t nativeTypeface = reinterpret_cast(get_handle(env, typeface)); - CHECK_HANDLE_RETURN(nativeTypeface, 0.0f) + alphaskia_textstyle_t nativeTextStyle = reinterpret_cast(get_handle(env, typeface)); + CHECK_HANDLE_RETURN(nativeTextStyle, 0.0f) - float width = alphaskia_canvas_measure_text(canvas, reinterpret_cast(nativeStr), static_cast(env->GetStringLength(str)), nativeTypeface, static_cast(font_size)); + float width = alphaskia_canvas_measure_text(canvas, reinterpret_cast(nativeStr), static_cast(env->GetStringLength(str)), nativeTextStyle, static_cast(font_size)); env->ReleaseStringChars(str, nativeStr); diff --git a/lib/java/jni/src/AlphaSkiaTextStyle.cpp b/lib/java/jni/src/AlphaSkiaTextStyle.cpp new file mode 100644 index 0000000..6ebfe0f --- /dev/null +++ b/lib/java/jni/src/AlphaSkiaTextStyle.cpp @@ -0,0 +1,42 @@ +#include "../include/alphaTab_alphaSkia_AlphaSkiaTypeface.h" +#include "../include/JniHelper.h" +#include "../../../../wrapper/include/alphaskia.h" +#include + +extern "C" +{ + JNIEXPORT jlong JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextStyle_alphaskiaTextStyleNew(JNIEnv *env, jclass, jobjectArray familyNames, jint weight, jboolean isItalic) + { + uint8_t familyNameLength = static_cast(env->GetArrayLength(familyNames)); + std::vector nativeFamilyNames; + nativeFamilyNames.resize(familyNameLength); + + for (uint8_t i = 0; i < familyNameLength; i++) + { + jstring familyName = static_cast(env->GetObjectArrayElement(familyNames, i)); + nativeFamilyNames[i] = env->GetStringUTFChars(familyName, nullptr); + } + + alphaskia_textstyle_t canvas = alphaskia_textstyle_new( + familyNameLength, + &nativeFamilyNames[0], + static_cast(weight), + isItalic ? 1 : 0); + + for (uint8_t i = 0; i < familyNameLength; i++) + { + jstring familyName = static_cast(env->GetObjectArrayElement(familyNames, i)); + env->ReleaseStringUTFChars(familyName, nativeFamilyNames[i]); + } + return static_cast(reinterpret_cast(canvas)); + } + + JNIEXPORT void JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextStyle_close(JNIEnv *env, jobject instance) + { + alphaskia_textstyle_t textStyle = reinterpret_cast(get_handle(env, instance)); + CHECK_HANDLE(textStyle) + + alphaskia_textstyle_free(textStyle); + set_handle(env, instance, 0); + } +} \ No newline at end of file diff --git a/lib/java/jni/src/AlphaSkiaTypeface.cpp b/lib/java/jni/src/AlphaSkiaTypeface.cpp index b0f5dc0..6a91361 100644 --- a/lib/java/jni/src/AlphaSkiaTypeface.cpp +++ b/lib/java/jni/src/AlphaSkiaTypeface.cpp @@ -15,21 +15,21 @@ extern "C" return static_cast(reinterpret_cast(alphaskia_typeface_register(reinterpret_cast(data)))); } - JNIEXPORT jlong JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTypeface_makeFromName(JNIEnv *env, jclass, jstring name, jboolean bold, jboolean italic) + JNIEXPORT jlong JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTypeface_makeFromName(JNIEnv *env, jclass, jstring name, jint weight, jboolean italic) { const char *nativeName = env->GetStringUTFChars(name, nullptr); - alphaskia_typeface_t typeface = alphaskia_typeface_make_from_name(nativeName, bold, italic); + alphaskia_typeface_t typeface = alphaskia_typeface_make_from_name(nativeName, static_cast(weight), italic); env->ReleaseStringUTFChars(name, nativeName); return static_cast(reinterpret_cast(typeface)); } - JNIEXPORT jboolean JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTypeface_isBold(JNIEnv *env, jobject instance) + JNIEXPORT jint JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTypeface_getWeight(JNIEnv *env, jobject instance) { jlong handle = get_handle(env, instance); - CHECK_HANDLE_RETURN(handle, static_cast(false)) + CHECK_HANDLE_RETURN(handle, static_cast(400)) - uint8_t is_bold = alphaskia_typeface_is_bold(reinterpret_cast(handle)); - return static_cast(is_bold != 0); + uint16_t weight = alphaskia_typeface_get_weight(reinterpret_cast(handle)); + return static_cast(weight); } JNIEXPORT jboolean JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTypeface_isItalic(JNIEnv *env, jobject instance) diff --git a/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaCanvas.java b/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaCanvas.java index 52e4f07..829a21b 100644 --- a/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaCanvas.java +++ b/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaCanvas.java @@ -206,14 +206,14 @@ public void beginRender(int width, int height) * Fills a text with the current color and provided details. * * @param text The text to draw. - * @param typeface The typeface to use for drawing the text. + * @param textStyle The text style to use for drawing the text. * @param fontSize The font size to use when drawing the text. * @param x The X-position where to draw the text to. * @param y The Y-position where to draw the text to. * @param textAlign How to align the text at the given position horizontally. * @param baseline How to align the text at the given position vertically. */ - public native void fillText(String text, AlphaSkiaTypeface typeface, float fontSize, float x, float y, + public native void fillText(String text, AlphaSkiaTextStyle textStyle, float fontSize, float x, float y, AlphaSkiaTextAlign textAlign, AlphaSkiaTextBaseline baseline); @@ -221,14 +221,14 @@ public native void fillText(String text, AlphaSkiaTypeface typeface, float fontS * Measures the given text. * * @param text The text to measure. - * @param typeface The typeface to use for drawing the text. - * @param fontSize The font size to use when drawing the text. + * @param textStyle The text style to use for measuring the text. + * @param fontSize The font size to use when measuring the text. * @return The horizontal width of the text when it would be drawn. */ - public native float measureText(String text, AlphaSkiaTypeface typeface, float fontSize); + public native float measureText(String text, AlphaSkiaTextStyle textStyle, float fontSize); /** - * Rotates the canvas allowing angled drawing. . + * Rotates the canvas allowing angled drawing * * @param centerX The X-position of the center around which to rotate. * @param centerY The Y-position of the center around which to rotate. diff --git a/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaTextStyle.java b/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaTextStyle.java new file mode 100644 index 0000000..3d04dfc --- /dev/null +++ b/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaTextStyle.java @@ -0,0 +1,47 @@ +package alphaTab.alphaSkia; + +/** + * Represents a text style which can be used to draw or measure texts + * with support for mixed fonts for fallback character rendering. + */ +public class AlphaSkiaTextStyle extends AlphaSkiaNative { + private final String[] fontFamilies; + private final int weight; + private final boolean isItalic; + /** + * Gets the list of font family names which are consulted for finding + * typefaces with glyphs for drawing or measuring texts. + * @return The list of font family names + */ + public String[] getFontFamilies() { return this.fontFamilies; } + + /** + * Gets the font weight used for finding typefaces. + * @return The font weight + */ + public int getWeight() { return this.weight; } + + /** + * Gets whether the used typefaces should be italic. + * @return Whether the used typefaces should be italic + */ + public boolean isItalic() { return this.isItalic; } + + /** + * Initializes a new instance of the {@see AlphaSkiaTextStyle} class. + * @param fontFamilies The list of font family names. + * @param weight The font weight typefaces should have.. + * @param isItalic Whether typefaces should be italic. + */ + public AlphaSkiaTextStyle(String[] fontFamilies, int weight, boolean isItalic) { + super(alphaskiaTextStyleNew(fontFamilies, weight, isItalic)); + this.fontFamilies = fontFamilies; + this.weight = weight; + this.isItalic = isItalic; + } + + private native static long alphaskiaTextStyleNew(String[] fontFamilies, int weight, boolean isItalic); + + @Override + public native void close(); +} diff --git a/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaTypeface.java b/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaTypeface.java index b37ee89..551d717 100644 --- a/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaTypeface.java +++ b/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaTypeface.java @@ -21,10 +21,18 @@ public String getFamilyName() { } /** - * Gets a value indicating whether the typeface is bold. + * Gets a value indicating whether the typeface is bold (weight >= 600, 600=>SemiBold). * @return true if the font is bold, otherwise false. */ - public native boolean isBold(); + public boolean isBold() { + return this.getWeight() >= 600 /* kSemiBold_Weight */; + } + + /** + * Gets the weight of the font. + * @return the weight of the font. + */ + public native int getWeight(); /** * Gets a value indicating whether the typeface is italic. @@ -72,18 +80,29 @@ public static AlphaSkiaTypeface register(byte[] data) { * Creates a typeface using the provided information. * * @param name The name of the typeface. - * @param bold Whether the bold version of the typeface should be loaded. + * @param weight The weight of the typeface. * @param italic Whether the italic version of the typeface should be loaded. * @return The typeface if it can be found in the already loaded fonts or the system fonts, otherwise {@code null}. */ - public static AlphaSkiaTypeface create(String name, boolean bold, boolean italic) { - var typeface = makeFromName(name, bold, italic); + public static AlphaSkiaTypeface create(String name, int weight, boolean italic) { + var typeface = makeFromName(name, weight, italic); if (typeface == 0) { return null; } return new AlphaSkiaTypeface(typeface, null); } + /** + * Creates a typeface using the provided information. + * + * @param name The name of the typeface. + * @param bold Whether the bold version of the typeface should be loaded. + * @param italic Whether the italic version of the typeface should be loaded. + * @return The typeface if it can be found in the already loaded fonts or the system fonts, otherwise {@code null}. + */ + public static AlphaSkiaTypeface create(String name, boolean bold, boolean italic) { + return create(name, bold ? 700 : 400, italic); + } - private static native long makeFromName(String name, boolean bold, boolean italic); + private static native long makeFromName(String name, int weight, boolean italic); } diff --git a/lib/node/addon/addon.cpp b/lib/node/addon/addon.cpp index 47f6059..106ae0a 100644 --- a/lib/node/addon/addon.cpp +++ b/lib/node/addon/addon.cpp @@ -21,6 +21,7 @@ static const napi_type_tag alphaskia_data_t_tag = {0x6a960ece6a0c4caf, 0xad61688 static const napi_type_tag alphaskia_typeface_t_tag = {0x0068df0314224b96, 0x8048b968915995f1}; static const napi_type_tag alphaskia_image_t_tag = {0x9372c0f8e8de466f, 0x96a04b6ee0a9394b}; static const napi_type_tag alphaskia_canvas_t_tag = {0xaa77c76772a34052, 0x88ac80d4dc474395}; +static const napi_type_tag alphaskia_textstyle_t_tag = {0x8f2bc41a57024cf4, 0x8b5e1cd26ded5245}; #define RETURN_UNDEFINED() \ { \ @@ -286,10 +287,10 @@ static napi_value node_alphaskia_typeface_make_from_name(napi_env env, napi_call CHECK_ARGS(3); GET_ARGUMENT_UTF8_STRING(0, name); - GET_ARGUMENT_BOOL(1, bold); + GET_ARGUMENT_INT32(1, weight); GET_ARGUMENT_BOOL(2, italic); - alphaskia_typeface_t typeface = alphaskia_typeface_make_from_name(name.c_str(), bold ? 1 : 0, italic ? 1 : 0); + alphaskia_typeface_t typeface = alphaskia_typeface_make_from_name(name.c_str(), static_cast(weight), italic ? 1 : 0); WRAP_HANDLE(alphaskia_typeface_t, wrapped, typeface); return wrapped; } @@ -314,19 +315,19 @@ static napi_value node_alphaskia_typeface_get_family_name(napi_env env, napi_cal return family_name; } -static napi_value node_alphaskia_typeface_is_bold(napi_env env, napi_callback_info info) +static napi_value node_alphaskia_typeface_get_weight(napi_env env, napi_callback_info info) { napi_status status(napi_ok); CHECK_ARGS(1); GET_ARGUMENT_HANDLE(0, alphaskia_typeface_t, typeface); - uint8_t is_bold = alphaskia_typeface_is_bold(typeface); + uint16_t weight = alphaskia_typeface_get_weight(typeface); - napi_value node_is_bold; - status = napi_get_boolean(env, is_bold != 0, &node_is_bold); + napi_value node_weight; + status = napi_create_int32(env, weight, &node_weight); ASSERT_STATUS(); - return node_is_bold; + return node_weight; } static napi_value node_alphaskia_typeface_is_italic(napi_env env, napi_callback_info info) @@ -344,6 +345,76 @@ static napi_value node_alphaskia_typeface_is_italic(napi_env env, napi_callback_ return node_is_italic; } +static napi_value node_alphaskia_textstyle_new(napi_env env, napi_callback_info info) +{ + napi_status status(napi_ok); + + CHECK_ARGS(3); + + // string[] unwrapping + bool is_array(false); + status = napi_is_array(env, node_argv[0], &is_array); + ASSERT_STATUS(); + if (!is_array) + { + napi_throw_type_error(env, NULL, "Wrong argument type at index 0, expected array of strings"); + return nullptr; + } + + uint32_t familyNamesLength = 0; + status = napi_get_array_length(env, node_argv[0], &familyNamesLength); + ASSERT_STATUS(); + + familyNamesLength = static_cast(familyNamesLength); + + std::vector familyNames; + familyNames.resize(familyNamesLength); + std::vector familyNamesRaw; + familyNamesRaw.resize(familyNamesLength); + + for (uint8_t i = 0; i < familyNamesLength; i++) + { + napi_value item; + status = napi_get_element(env, node_argv[0], i, &item); + ASSERT_STATUS(); + + // no need for type checking, we do that in javascript, its less code there. napi functions might still fail + + size_t name_size; + status = napi_get_value_string_utf8(env, item, nullptr, 0, &name_size); + ASSERT_STATUS(); + + familyNames.at(i).assign(name_size, ' '); + status = napi_get_value_string_utf8(env, item, familyNames.at(i).data(), name_size + 1, nullptr); + ASSERT_STATUS(); + + familyNamesRaw[i] = familyNames.at(i).data(); + } + // string[] end + + GET_ARGUMENT_INT32(1, weight); + GET_ARGUMENT_BOOL(2, italic); + + alphaskia_textstyle_t textstyle = alphaskia_textstyle_new(static_cast(familyNamesLength), &familyNamesRaw[0], static_cast(weight), italic ? 1 : 0); + WRAP_HANDLE(alphaskia_textstyle_t, wrapped, textstyle); + return wrapped; +} + +static napi_value node_alphaskia_textstyle_free(napi_env env, napi_callback_info info) +{ + napi_status status(napi_ok); + + CHECK_ARGS(1); + GET_ARGUMENT_HANDLE(0, alphaskia_textstyle_t, textstyle); + + alphaskia_textstyle_free(textstyle); + void *old; + status = napi_remove_wrap(env, node_argv[0], &old); + ASSERT_STATUS(); + + RETURN_UNDEFINED(); +} + static napi_value node_alphaskia_image_get_width(napi_env env, napi_callback_info info) { napi_status status(napi_ok); @@ -772,14 +843,14 @@ static napi_value node_alphaskia_canvas_fill_text(napi_env env, napi_callback_in CHECK_ARGS(8); GET_ARGUMENT_HANDLE(0, alphaskia_canvas_t, canvas); GET_ARGUMENT_UTF16_STRING(1, text); - GET_ARGUMENT_HANDLE(2, alphaskia_typeface_t, typeface); + GET_ARGUMENT_HANDLE(2, alphaskia_textstyle_t, textstyle); GET_ARGUMENT_FLOAT(3, font_size); GET_ARGUMENT_FLOAT(4, x); GET_ARGUMENT_FLOAT(5, y); GET_ARGUMENT_INT32(6, text_align); GET_ARGUMENT_INT32(7, baseline); - alphaskia_canvas_fill_text(canvas, text.c_str(), text.length(), typeface, font_size, x, y, static_cast(text_align), static_cast(baseline)); + alphaskia_canvas_fill_text(canvas, text.c_str(), text.length(), textstyle, font_size, x, y, static_cast(text_align), static_cast(baseline)); RETURN_UNDEFINED(); } @@ -791,10 +862,10 @@ static napi_value node_alphaskia_canvas_measure_text(napi_env env, napi_callback CHECK_ARGS(4); GET_ARGUMENT_HANDLE(0, alphaskia_canvas_t, canvas); GET_ARGUMENT_UTF16_STRING(1, text); - GET_ARGUMENT_HANDLE(2, alphaskia_typeface_t, typeface); + GET_ARGUMENT_HANDLE(2, alphaskia_textstyle_t, textstyle); GET_ARGUMENT_FLOAT(3, font_size); - float width = alphaskia_canvas_measure_text(canvas, text.c_str(), text.length(), typeface, font_size); + float width = alphaskia_canvas_measure_text(canvas, text.c_str(), text.length(), textstyle, font_size); napi_value width_node; status = napi_create_double(env, width, &width_node); ASSERT_STATUS(); @@ -854,9 +925,16 @@ napi_value init(napi_env env, napi_value exports) EXPORT_NODE_FUNCTION(alphaskia_typeface_free); EXPORT_NODE_FUNCTION(alphaskia_typeface_make_from_name); EXPORT_NODE_FUNCTION(alphaskia_typeface_get_family_name); - EXPORT_NODE_FUNCTION(alphaskia_typeface_is_bold); + EXPORT_NODE_FUNCTION(alphaskia_typeface_get_weight); EXPORT_NODE_FUNCTION(alphaskia_typeface_is_italic); + EXPORT_NODE_FUNCTION(alphaskia_textstyle_new); + // EXPORT_NODE_FUNCTION(alphaskia_textstyle_get_family_name_count); + // EXPORT_NODE_FUNCTION(alphaskia_textstyle_get_family_name); + // EXPORT_NODE_FUNCTION(alphaskia_textstyle_get_weight); + // EXPORT_NODE_FUNCTION(alphaskia_textstyle_is_italic); + EXPORT_NODE_FUNCTION(alphaskia_textstyle_free); + EXPORT_NODE_FUNCTION(alphaskia_image_get_width); EXPORT_NODE_FUNCTION(alphaskia_image_get_height); EXPORT_NODE_FUNCTION(alphaskia_image_read_pixels); diff --git a/lib/node/alphaskia-linux/package.json b/lib/node/alphaskia-linux/package.json index bab7eb5..2b4e061 100644 --- a/lib/node/alphaskia-linux/package.json +++ b/lib/node/alphaskia-linux/package.json @@ -1,6 +1,6 @@ { "name": "@coderline/alphaskia-linux", - "version": "2.3.0", + "version": "1.0.120-local.0", "description": "The node addon for alphaSkia enabling it to run on Linux", "engines": { "node": ">=18.0.0" diff --git a/lib/node/alphaskia-macos/package.json b/lib/node/alphaskia-macos/package.json index d66fb58..4ada991 100644 --- a/lib/node/alphaskia-macos/package.json +++ b/lib/node/alphaskia-macos/package.json @@ -1,6 +1,6 @@ { "name": "@coderline/alphaskia-macos", - "version": "2.3.0", + "version": "1.0.120-local.0", "description": "The node addon for alphaSkia enabling it to run on MacOS", "engines": { "node": ">=18.0.0" diff --git a/lib/node/alphaskia-windows/package.json b/lib/node/alphaskia-windows/package.json index 9d429b9..529140e 100644 --- a/lib/node/alphaskia-windows/package.json +++ b/lib/node/alphaskia-windows/package.json @@ -1,6 +1,6 @@ { "name": "@coderline/alphaskia-windows", - "version": "2.3.0", + "version": "1.0.120-local.0", "description": "The node addon for alphaSkia enabling it to run on Windows", "engines": { "node": ">=18.0.0" diff --git a/lib/node/alphaskia/package.json b/lib/node/alphaskia/package.json index da6c644..fea5559 100644 --- a/lib/node/alphaskia/package.json +++ b/lib/node/alphaskia/package.json @@ -1,6 +1,6 @@ { "name": "@coderline/alphaskia", - "version": "2.3.0", + "version": "1.0.120-local.0", "description": "A Skia based rendering backend for alphaTab.", "module": "./dist/alphaskia.mjs", "typings": "./dist/alphaskia.d.ts", diff --git a/lib/node/alphaskia/src/AlphaSkiaCanvas.ts b/lib/node/alphaskia/src/AlphaSkiaCanvas.ts index e266b96..d37a262 100644 --- a/lib/node/alphaskia/src/AlphaSkiaCanvas.ts +++ b/lib/node/alphaskia/src/AlphaSkiaCanvas.ts @@ -1,6 +1,6 @@ import { AlphaSkiaImage } from './AlphaSkiaImage'; import { AlphaSkiaNative } from './AlphaSkiaNative'; -import { AlphaSkiaTypeface } from './AlphaSkiaTypeface'; +import { AlphaSkiaTextStyle } from './AlphaSkiaTextStyle'; import { AlphaSkiaTextBaseline, AlphaSkiaCanvasHandle, AlphaSkiaColorType, AlphaSkiaTextAlign, loadAddon } from './addon'; /** @@ -274,16 +274,16 @@ export class AlphaSkiaCanvas extends AlphaSkiaNative { * Fills a text with the current color and provided details. * * @param text The text to draw. - * @param typeface The typeface to use for drawing the text. + * @param textStyle The typeface to use for drawing the text. * @param fontSize The font size to use when drawing the text. * @param x The X-position where to draw the text to. * @param y The Y-position where to draw the text to. * @param textAlign How to align the text at the given position horizontally. * @param baseline How to align the text at the given position vertically. */ - public fillText(text: string, typeface: AlphaSkiaTypeface, fontSize: number, x: number, y: number, textAlign: AlphaSkiaTextAlign, baseline: AlphaSkiaTextBaseline): void { + public fillText(text: string, textStyle: AlphaSkiaTextStyle, fontSize: number, x: number, y: number, textAlign: AlphaSkiaTextAlign, baseline: AlphaSkiaTextBaseline): void { this.checkDisposed(); - loadAddon().alphaskia_canvas_fill_text(this.handle!, text, typeface.handle!, fontSize, x, y, textAlign as number, baseline as number); + loadAddon().alphaskia_canvas_fill_text(this.handle!, text, textStyle.handle!, fontSize, x, y, textAlign as number, baseline as number); } /** @@ -294,9 +294,9 @@ export class AlphaSkiaCanvas extends AlphaSkiaNative { * @param fontSize The font size to use when drawing the text. * @return The horizontal width of the text when it would be drawn. */ - public measureText(text: string, typeface: AlphaSkiaTypeface, fontSize: number): number { + public measureText(text: string, textStyle: AlphaSkiaTextStyle, fontSize: number): number { this.checkDisposed(); - return loadAddon().alphaskia_canvas_measure_text(this.handle!, text, typeface.handle!, fontSize); + return loadAddon().alphaskia_canvas_measure_text(this.handle!, text, textStyle.handle!, fontSize); } /** diff --git a/lib/node/alphaskia/src/AlphaSkiaTextStyle.ts b/lib/node/alphaskia/src/AlphaSkiaTextStyle.ts new file mode 100644 index 0000000..c947125 --- /dev/null +++ b/lib/node/alphaskia/src/AlphaSkiaTextStyle.ts @@ -0,0 +1,55 @@ +import { AlphaSkiaNative } from './AlphaSkiaNative'; +import { AlphaSkiaTextStyleHandle, loadAddon } from './addon'; + +/** + * Represents a text style which can be used to draw or measure texts + * with support for mixed fonts for fallback character rendering. + */ +export class AlphaSkiaTextStyle extends AlphaSkiaNative { + /** + * Gets the list of font family names which are consulted for finding + * typefaces with glyphs for drawing or measuring texts. + */ + public readonly familyNames: string[]; + + /** + * Gets the font weight used for finding typefaces. + */ + public readonly weight: number; + + /** + * Gets whether the used typefaces should be italic. + */ + public readonly isItalic: boolean; + + /** + * Initializes a new instance of the {@link AlphaSkiaTextStyle} class. + * @param familyNames The list of font family names. + * @param weight The font weight typefaces should have. + * @param isItalic Whether typefaces should be italic. + */ + public constructor(familyNames: string[], weight: number, isItalic: boolean) { + super( + loadAddon().alphaskia_textstyle_new(AlphaSkiaTextStyle.checkFamilyNames(familyNames), weight, isItalic), + loadAddon().alphaskia_textstyle_free, + ) + this.familyNames = familyNames; + this.weight = weight; + this.isItalic = isItalic; + } + + + private static checkFamilyNames(familyNames: unknown): string[] { + if (!Array.isArray(familyNames)) { + throw new TypeError("family names must be a string array, provided value is no array"); + } + + for (let i = 0; i < familyNames.length; i++) { + if (typeof familyNames[i] !== 'string') { + throw new TypeError(`family names must be a string array, provided value at index ${i} is not a string`); + } + } + + return familyNames as string[]; + } +} \ No newline at end of file diff --git a/lib/node/alphaskia/src/AlphaSkiaTypeface.ts b/lib/node/alphaskia/src/AlphaSkiaTypeface.ts index 58b0ed8..e0d8cf9 100644 --- a/lib/node/alphaskia/src/AlphaSkiaTypeface.ts +++ b/lib/node/alphaskia/src/AlphaSkiaTypeface.ts @@ -25,7 +25,14 @@ export class AlphaSkiaTypeface extends AlphaSkiaNative * Gets a value indicating whether the typeface is bold. */ public get isBold(): boolean { - return loadAddon().alphaskia_typeface_is_bold(this.handle!); + return this.weight >= 600; + } + + /** + * Gets the weight of the font. + */ + public get weight(): number { + return loadAddon().alphaskia_typeface_get_weight(this.handle!) } /** @@ -77,8 +84,36 @@ export class AlphaSkiaTypeface extends AlphaSkiaNative * @param italic Whether the italic version of the typeface should be loaded. * @return The typeface if it can be found in the already loaded fonts or the system fonts, otherwise {@code undefined}. */ - public static create(name: string, bold: boolean, italic: boolean): AlphaSkiaTypeface | undefined { - const typeface = loadAddon().alphaskia_typeface_make_from_name(name, bold, italic); + public static create(name: string, bold: boolean, italic: boolean): AlphaSkiaTypeface | undefined; + /** + * Creates a typeface using the provided information. + * @param name The name of the typeface. + * @param weight The weight of the typeface + * @param italic Whether the italic version of the typeface should be loaded. + * @return The typeface if it can be found in the already loaded fonts or the system fonts, otherwise {@code undefined}. + */ + public static create(name: string, weight: boolean, italic: boolean): AlphaSkiaTypeface | undefined; + /** + * Creates a typeface using the provided information. + * @param name The name of the typeface. + * @param weightOrBold The weight of the typeface or a boolean to indicate classical bold fonts. + * @param italic Whether the italic version of the typeface should be loaded. + * @return The typeface if it can be found in the already loaded fonts or the system fonts, otherwise {@code undefined}. + */ + public static create(name: string, weightOrBold: number | boolean, italic: boolean): AlphaSkiaTypeface | undefined { + let weight: number; + switch (typeof weightOrBold) { + case 'number': + weight = weightOrBold | 0; + break; + case 'boolean': + weight = weightOrBold ? 700 : 400; + break; + default: + throw new TypeError('either a numeric weight or a boolean for bold has to be provided'); + } + + const typeface = loadAddon().alphaskia_typeface_make_from_name(name, weight, italic); if (!typeface) { return undefined; } diff --git a/lib/node/alphaskia/src/addon.ts b/lib/node/alphaskia/src/addon.ts index d5d2987..b01ec9d 100644 --- a/lib/node/alphaskia/src/addon.ts +++ b/lib/node/alphaskia/src/addon.ts @@ -6,6 +6,7 @@ export interface AlphaSkiaDataHandle { } export interface AlphaSkiaTypefaceHandle { } export interface AlphaSkiaImageHandle { } export interface AlphaSkiaCanvasHandle { } +export interface AlphaSkiaTextStyleHandle { } /** * Lists all text alignments which can be used to draw text. @@ -79,11 +80,18 @@ export interface AlphaSkiaNodeAddon { alphaskia_typeface_register(data: AlphaSkiaDataHandle): AlphaSkiaTypefaceHandle | undefined; alphaskia_typeface_free(typeface: AlphaSkiaTypefaceHandle): void; - alphaskia_typeface_make_from_name(name: string, bold: boolean, italic: boolean): AlphaSkiaTypefaceHandle | undefined; + alphaskia_typeface_make_from_name(name: string, weight: number, italic: boolean): AlphaSkiaTypefaceHandle | undefined; alphaskia_typeface_get_family_name(typeface: AlphaSkiaTypefaceHandle): string; - alphaskia_typeface_is_bold(typeface: AlphaSkiaTypefaceHandle): boolean; + alphaskia_typeface_get_weight(typeface: AlphaSkiaTypefaceHandle): number; alphaskia_typeface_is_italic(typeface: AlphaSkiaTypefaceHandle): boolean; + alphaskia_textstyle_new(family_names: string[], weight: number, italic: boolean): AlphaSkiaTextStyleHandle; + // AS_API uint8_t alphaskia_textstyle_get_family_name_count(alphaskia_textstyle_t textstyle); + // AS_API alphaskia_string_t alphaskia_textstyle_get_family_name(alphaskia_textstyle_t textstyle, uint8_t index); + // AS_API uint16_t alphaskia_textstyle_get_weight(alphaskia_textstyle_t textstyle); + // AS_API uint8_t alphaskia_textstyle_is_italic(alphaskia_textstyle_t textstyle); + alphaskia_textstyle_free(textstyle: AlphaSkiaTextStyleHandle): void; + alphaskia_image_get_width(image: AlphaSkiaImageHandle): number; alphaskia_image_get_height(image: AlphaSkiaImageHandle): number; alphaskia_image_read_pixels(image: AlphaSkiaImageHandle): ArrayBuffer | undefined; @@ -117,8 +125,8 @@ export interface AlphaSkiaNodeAddon { alphaskia_canvas_stroke(canvas: AlphaSkiaCanvasHandle): void; alphaskia_canvas_draw_image(canvas: AlphaSkiaCanvasHandle, image: AlphaSkiaImageHandle, x: number, y: number, w: number, h: number): void; - alphaskia_canvas_fill_text(canvas: AlphaSkiaCanvasHandle, text: string, typeface: AlphaSkiaTypefaceHandle, font_size: number, x: number, y: number, text_align: AlphaSkiaTextAlign, baseline: AlphaSkiaTextBaseline): void; - alphaskia_canvas_measure_text(canvas: AlphaSkiaCanvasHandle, text: string, typeface: AlphaSkiaTypefaceHandle, font_size: number): number; + alphaskia_canvas_fill_text(canvas: AlphaSkiaCanvasHandle, text: string, textStyle: AlphaSkiaTextStyleHandle, font_size: number, x: number, y: number, text_align: AlphaSkiaTextAlign, baseline: AlphaSkiaTextBaseline): void; + alphaskia_canvas_measure_text(canvas: AlphaSkiaCanvasHandle, text: string, textStyle: AlphaSkiaTextStyleHandle, font_size: number): number; alphaskia_canvas_begin_rotate(canvas: AlphaSkiaCanvasHandle, center_x: number, center_y: number, angle: number): void; alphaskia_canvas_end_rotate(canvas: AlphaSkiaCanvasHandle): void; } diff --git a/lib/node/alphaskia/src/alphaskia.ts b/lib/node/alphaskia/src/alphaskia.ts index d93d3d1..aa2c5fd 100644 --- a/lib/node/alphaskia/src/alphaskia.ts +++ b/lib/node/alphaskia/src/alphaskia.ts @@ -4,4 +4,5 @@ export { AlphaSkiaTextBaseline, AlphaSkiaTextAlign, AlphaSkiaColorType } from '. export { AlphaSkiaCanvas } from './AlphaSkiaCanvas' export { AlphaSkiaTypeface } from './AlphaSkiaTypeface' -export { AlphaSkiaImage } from './AlphaSkiaImage' \ No newline at end of file +export { AlphaSkiaImage } from './AlphaSkiaImage' +export { AlphaSkiaTextStyle } from './AlphaSkiaTextStyle' \ No newline at end of file diff --git a/test/dotnet/.idea/.idea.AlphaSkia.Test/.idea/vcs.xml b/test/dotnet/.idea/.idea.AlphaSkia.Test/.idea/vcs.xml index def3818..f70e4d1 100644 --- a/test/dotnet/.idea/.idea.AlphaSkia.Test/.idea/vcs.xml +++ b/test/dotnet/.idea/.idea.AlphaSkia.Test/.idea/vcs.xml @@ -3,5 +3,8 @@ + + + \ No newline at end of file diff --git a/test/dotnet/AlphaSkia.Test/AlphaSkia.Test.csproj b/test/dotnet/AlphaSkia.Test/AlphaSkia.Test.csproj index bb68c1c..53117f3 100644 --- a/test/dotnet/AlphaSkia.Test/AlphaSkia.Test.csproj +++ b/test/dotnet/AlphaSkia.Test/AlphaSkia.Test.csproj @@ -6,15 +6,16 @@ enable enable 10 + *-* - - - - - - + + + + + + diff --git a/test/dotnet/AlphaSkia.Test/AlphaTabGeneratedRenderTest.cs b/test/dotnet/AlphaSkia.Test/AlphaTabGeneratedRenderTest.cs index f4e5ea1..1404b40 100644 --- a/test/dotnet/AlphaSkia.Test/AlphaTabGeneratedRenderTest.cs +++ b/test/dotnet/AlphaSkia.Test/AlphaTabGeneratedRenderTest.cs @@ -3,43 +3,42 @@ partial class AlphaTabGeneratedRenderTest { public static float RenderScale { get; set; } = 1; - public static AlphaSkiaTypeface MusicTypeface { get; set; } = null!; + public static AlphaSkiaTextStyle MusicTextStyle { get; set; } = null!; public static readonly float MusicFontSize = 34; public static AlphaSkiaTextAlign TextAlign { get; set; } = AlphaSkiaTextAlign.Left; public static AlphaSkiaTextBaseline TextBaseline { get; set; } = AlphaSkiaTextBaseline.Top; - public static AlphaSkiaTypeface Typeface { get; set; } = null!; + public static AlphaSkiaTextStyle TextStyle { get; set; } = null!; public static float FontSize { get; set; } = 12; - private static readonly IDictionary CustomTypefaces = - new Dictionary(StringComparer.OrdinalIgnoreCase); + private static readonly IDictionary CustomTextStyles = + new Dictionary(StringComparer.OrdinalIgnoreCase); - private static string CustomTypefaceKey(string fontFamily, bool isBold, bool isItalic) + private static string CustomTypefaceKey(string[] fontFamily, int weight, bool isItalic) { - return fontFamily.ToLowerInvariant() + "_" + isBold + "_" + isItalic; + return string.Join("_", fontFamily).ToLowerInvariant() + "_" + weight + "_" + isItalic; } - private static AlphaSkiaTypeface GetTypeface(string fontFamily, bool isBold, bool isItalic) + private static AlphaSkiaTextStyle GetTextStyle(string[] fontFamily, int weight, bool isItalic) { - var key = CustomTypefaceKey(fontFamily, isBold, isItalic); - if (!CustomTypefaces.TryGetValue(key, out var typeface)) + var key = CustomTypefaceKey(fontFamily, weight, isItalic); + if (!CustomTextStyles.TryGetValue(key, out var textStyle)) { - throw new InvalidOperationException($"Unknown font requested: {key}"); + textStyle = new AlphaSkiaTextStyle(fontFamily, (ushort)weight, isItalic); + CustomTextStyles[key] = textStyle; } - return typeface; + return textStyle; } - public static AlphaSkiaTypeface LoadTypeface(string name, bool isBold, bool isItalic, string filePath) + public static AlphaSkiaTypeface LoadTypeface(string filePath) { - var key = CustomTypefaceKey(name, isBold, isItalic); - Console.WriteLine($"Loading typeface {key} from {filePath}"); + Console.WriteLine($"Loading typeface from {filePath}"); var data = File.ReadAllBytes(filePath); Console.WriteLine($"Read {data.Length} bytes from file, decoding typeface"); var typeface = AlphaSkiaTypeface.Register(data); - CustomTypefaces[key] = typeface - ?? throw new InvalidOperationException("Could not create typeface from data"); - return typeface; + return typeface + ?? throw new InvalidOperationException("Could not create typeface from data"); } } \ No newline at end of file diff --git a/test/dotnet/AlphaSkia.Test/AlphaTabGeneratedRenderTest.generated.cs b/test/dotnet/AlphaSkia.Test/AlphaTabGeneratedRenderTest.generated.cs index faf92f1..33c879b 100644 --- a/test/dotnet/AlphaSkia.Test/AlphaTabGeneratedRenderTest.generated.cs +++ b/test/dotnet/AlphaSkia.Test/AlphaTabGeneratedRenderTest.generated.cs @@ -9,742 +9,1069 @@ partial class AlphaTabGeneratedRenderTest { private static AlphaSkiaImage? DrawMusicSheetPart1(AlphaSkiaCanvas canvas) { - canvas.BeginRender(1300, 164, (float)(RenderScale)); + canvas.BeginRender(1300, 124, (float)(RenderScale)); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(204), (byte)(30), (byte)(255)); TextAlign = AlphaSkiaTextAlign.Center; - Typeface = GetTypeface("PT Serif", false, false); + TextStyle = GetTextStyle(new []{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(32); TextAlign = AlphaSkiaTextAlign.Center; - canvas.FillText("Title", Typeface, FontSize, (float)(650), (float)(40), TextAlign, TextBaseline); + canvas.FillText("Title", TextStyle, FontSize, (float)(650), (float)(0), TextAlign, TextBaseline); TextAlign = AlphaSkiaTextAlign.Center; - Typeface = GetTypeface("PT Serif", false, false); + TextBaseline = AlphaSkiaTextBaseline.Top; + TextStyle = GetTextStyle(new []{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(20); TextAlign = AlphaSkiaTextAlign.Center; - canvas.FillText("Subtitle", Typeface, FontSize, (float)(650), (float)(72), TextAlign, TextBaseline); + canvas.FillText("Subtitle", TextStyle, FontSize, (float)(650), (float)(32), TextAlign, TextBaseline); TextAlign = AlphaSkiaTextAlign.Center; - Typeface = GetTypeface("PT Serif", false, false); + TextBaseline = AlphaSkiaTextBaseline.Top; + TextStyle = GetTextStyle(new []{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(20); TextAlign = AlphaSkiaTextAlign.Center; - canvas.FillText("Artist", Typeface, FontSize, (float)(650), (float)(92), TextAlign, TextBaseline); + canvas.FillText("Artist", TextStyle, FontSize, (float)(650), (float)(52), TextAlign, TextBaseline); TextAlign = AlphaSkiaTextAlign.Center; - Typeface = GetTypeface("PT Serif", false, false); + TextBaseline = AlphaSkiaTextBaseline.Top; + TextStyle = GetTextStyle(new []{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(20); TextAlign = AlphaSkiaTextAlign.Center; - canvas.FillText("Album", Typeface, FontSize, (float)(650), (float)(112), TextAlign, TextBaseline); + canvas.FillText("Album", TextStyle, FontSize, (float)(650), (float)(72), TextAlign, TextBaseline); TextAlign = AlphaSkiaTextAlign.Center; - Typeface = GetTypeface("PT Serif", false, false); + TextBaseline = AlphaSkiaTextBaseline.Top; + TextStyle = GetTextStyle(new []{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(15); - TextAlign = AlphaSkiaTextAlign.Right; - canvas.FillText("Music by Music", Typeface, FontSize, (float)(1260), (float)(132), TextAlign, TextBaseline); + TextAlign = AlphaSkiaTextAlign.Left; + canvas.FillText("Words by Words", TextStyle, FontSize, (float)(35), (float)(92), TextAlign, TextBaseline); TextAlign = AlphaSkiaTextAlign.Center; - Typeface = GetTypeface("PT Serif", false, false); + TextBaseline = AlphaSkiaTextBaseline.Top; + TextStyle = GetTextStyle(new []{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(15); - TextAlign = AlphaSkiaTextAlign.Left; - canvas.FillText("Words by Words", Typeface, FontSize, (float)(40), (float)(132), TextAlign, TextBaseline); + TextAlign = AlphaSkiaTextAlign.Right; + canvas.FillText("Music by Music", TextStyle, FontSize, (float)(1265), (float)(92), TextAlign, TextBaseline); TextAlign = AlphaSkiaTextAlign.Center; + TextBaseline = AlphaSkiaTextBaseline.Top; return canvas.EndRender(); } private static AlphaSkiaImage? DrawMusicSheetPart2(AlphaSkiaCanvas canvas) { - canvas.BeginRender(1300, 38, (float)(RenderScale)); + canvas.BeginRender(1300, 12, (float)(RenderScale)); TextAlign = AlphaSkiaTextAlign.Center; - Typeface = GetTypeface("PT Serif", false, true); + TextBaseline = AlphaSkiaTextBaseline.Middle; + TextStyle = GetTextStyle(new []{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, true); FontSize = (float)(12); TextAlign = AlphaSkiaTextAlign.Left; - canvas.FillText("Guitar Standard Tuning", Typeface, FontSize, (float)(40), (float)(3), TextAlign, TextBaseline); + canvas.FillText("Guitar Standard Tuning", TextStyle, FontSize, (float)(35), (float)(4.5659942626953125), TextAlign, TextBaseline); TextAlign = AlphaSkiaTextAlign.Center; + TextBaseline = AlphaSkiaTextBaseline.Middle; return canvas.EndRender(); } private static AlphaSkiaImage? DrawMusicSheetPart3(AlphaSkiaCanvas canvas) { - canvas.BeginRender(1300, 6, (float)(RenderScale)); - TextAlign = AlphaSkiaTextAlign.Center; - return canvas.EndRender(); - } - private static AlphaSkiaImage? DrawMusicSheetPart4(AlphaSkiaCanvas canvas) - { - canvas.BeginRender(1300, 373, (float)(RenderScale)); + canvas.BeginRender(1300, 285, (float)(RenderScale)); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); TextAlign = AlphaSkiaTextAlign.Left; - Typeface = GetTypeface("PT Serif", true, false); + TextStyle = GetTextStyle(new []{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 700, false); FontSize = (float)(14); - canvas.FillText("\uE1D5", MusicTypeface, (float)(MusicFontSize * 0.75), (float)(156.6767578125), (float)(40), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("= 120", Typeface, FontSize, (float)(169.1767578125), (float)(27), TextAlign, TextBaseline); - canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); - canvas.FillRect((float)(92), (float)(130), (float)(254), (float)(1.04)); - canvas.FillRect((float)(92), (float)(139), (float)(254), (float)(1.04)); - canvas.FillRect((float)(92), (float)(148), (float)(254), (float)(1.04)); - canvas.FillRect((float)(92), (float)(157), (float)(254), (float)(1.04)); - canvas.FillRect((float)(92), (float)(166), (float)(254), (float)(1.04)); - canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); - canvas.FillText("\uE050", MusicTypeface, (float)(MusicFontSize * 1), (float)(94), (float)(157.52), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE084", MusicTypeface, (float)(MusicFontSize * 1), (float)(127), (float)(139), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE084", MusicTypeface, (float)(MusicFontSize * 1), (float)(127), (float)(157), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + TextBaseline = AlphaSkiaTextBaseline.Top; + canvas.FillText("\uE1D5", MusicTextStyle, (float)(MusicFontSize * 0.5), (float)(117.79200744628906), (float)(25), AlphaSkiaTextAlign.Center, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("= 120", TextStyle, FontSize, (float)(125.79200744628906), (float)(12), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, true); + FontSize = (float)(12); + TextAlign = AlphaSkiaTextAlign.Left; + canvas.FillText("Fallback Font (\U0001D11E \U0001D15F \U0001F3B8 \U0001F918\U0001F3FB)", TextStyle, FontSize, (float)(885.7920074462891), (float)(30), TextAlign, TextBaseline); + TextAlign = AlphaSkiaTextAlign.Left; + TextBaseline = AlphaSkiaTextBaseline.Top; + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(722.7920074462891), (float)(53.5199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(733.592007446289), (float)(53.5199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(744.3920074462891), (float)(53.5199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(755.192007446289), (float)(53.5199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(765.9920074462891), (float)(53.5199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(776.7920074462891), (float)(53.5199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(787.592007446289), (float)(53.5199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(798.3920074462891), (float)(53.5199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(809.192007446289), (float)(53.5199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(819.9920074462891), (float)(53.5199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.FillRect((float)(48), (float)(87), (float)(259), (float)(1.04)); + canvas.FillRect((float)(48), (float)(96), (float)(259), (float)(1.04)); + canvas.FillRect((float)(48), (float)(105), (float)(259), (float)(1.04)); + canvas.FillRect((float)(48), (float)(114), (float)(259), (float)(1.04)); + canvas.FillRect((float)(48), (float)(123), (float)(259), (float)(1.04)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.FillRect((float)(48), (float)(87.9199951171875), (float)(1), (float)(36.000000000000014)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE050", MusicTextStyle, (float)(MusicFontSize * 1), (float)(55), (float)(115.43999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE084", MusicTextStyle, (float)(MusicFontSize * 1), (float)(88), (float)(96.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE084", MusicTextStyle, (float)(MusicFontSize * 1), (float)(88), (float)(114.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(200), (byte)(0), (byte)(0), (byte)(255)); - Typeface = GetTypeface("Roboto", false, false); + TextBaseline = AlphaSkiaTextBaseline.Top; + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("1", Typeface, FontSize, (float)(141), (float)(118.75), TextAlign, TextBaseline); + canvas.FillText("1", TextStyle, FontSize, (float)(102), (float)(76.5699951171875), TextAlign, TextBaseline); + TextBaseline = AlphaSkiaTextBaseline.Top; + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(113.29200744628906), (float)(105.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE272", MusicTextStyle, (float)(MusicFontSize * 0.75), (float)(134.16515249341666), (float)(105.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(152.1767578125), (float)(148), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE272", MusicTypeface, (float)(MusicFontSize * 0.75), (float)(172.86069962449085), (float)(148), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 0.75), (float)(180.86069962449085), (float)(149), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 0.75), (float)(142.16515249341666), (float)(106.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.BeginPath(); - canvas.MoveTo((float)(156.6767578125), (float)(144)); - canvas.LineTo((float)(170.855110706305), (float)(133.50723450810483)); - canvas.LineTo((float)(184.23569962449085), (float)(145)); + canvas.MoveTo((float)(117.79200744628906), (float)(101.91999511718751)); + canvas.LineTo((float)(132.06224568469634), (float)(91.42713139901187)); + canvas.LineTo((float)(145.54015249341666), (float)(102.91999511718751)); canvas.Stroke(); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(192.23569962449085), (float)(148), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 0.75), (float)(220.91964143648167), (float)(144.5), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(153.54015249341666), (float)(105.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 0.75), (float)(182.41329754054425), (float)(102.41999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.BeginPath(); - canvas.MoveTo((float)(196.73569962449085), (float)(144)); - canvas.LineTo((float)(209.12929655256082), (float)(131.33765133817155)); - canvas.LineTo((float)(224.29464143648167), (float)(140.5)); + canvas.MoveTo((float)(158.04015249341666), (float)(101.91999511718751)); + canvas.LineTo((float)(170.53765225640643), (float)(89.25646922337823)); + canvas.LineTo((float)(185.78829754054425), (float)(98.41999511718751)); canvas.Stroke(); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(232.29464143648167), (float)(148), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE262", MusicTypeface, (float)(MusicFontSize * 0.75), (float)(252.9785832484725), (float)(143.5), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 0.75), (float)(260.9785832484725), (float)(144.5), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(193.78829754054425), (float)(105.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE262", MusicTextStyle, (float)(MusicFontSize * 0.75), (float)(214.66144258767181), (float)(101.41999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 0.75), (float)(222.66144258767181), (float)(102.41999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.BeginPath(); - canvas.MoveTo((float)(236.79464143648167), (float)(144)); - canvas.LineTo((float)(249.1882383645516), (float)(131.33765133817155)); - canvas.LineTo((float)(264.3535832484725), (float)(140.5)); + canvas.MoveTo((float)(198.28829754054425), (float)(101.91999511718751)); + canvas.LineTo((float)(210.785797303534), (float)(89.25646922337823)); + canvas.LineTo((float)(226.03644258767181), (float)(98.41999511718751)); canvas.Stroke(); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(272.3535832484725), (float)(148), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 0.75), (float)(294.5517916242362), (float)(140), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(234.03644258767181), (float)(105.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 0.75), (float)(256.3932212938359), (float)(97.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.BeginPath(); - canvas.MoveTo((float)(276.8535832484725), (float)(152)); - canvas.LineTo((float)(292.1060513036615), (float)(156.93783819474976)); - canvas.LineTo((float)(297.9267916242362), (float)(142)); + canvas.MoveTo((float)(238.53644258767181), (float)(109.91999511718751)); + canvas.LineTo((float)(253.8393894465572), (float)(114.87145189181567)); + canvas.LineTo((float)(259.7682212938359), (float)(99.91999511718751)); canvas.Stroke(); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(305.9267916242362), (float)(148), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE262", MusicTypeface, (float)(MusicFontSize * 0.75), (float)(324.625), (float)(139), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 0.75), (float)(332.625), (float)(140), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(267.7682212938359), (float)(105.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE262", MusicTextStyle, (float)(MusicFontSize * 0.75), (float)(286.625), (float)(96.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 0.75), (float)(294.625), (float)(97.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.BeginPath(); - canvas.MoveTo((float)(310.4267916242362), (float)(152)); - canvas.LineTo((float)(327.2193887931866), (float)(157.24460932567123)); - canvas.LineTo((float)(336), (float)(142)); + canvas.MoveTo((float)(272.2682212938359), (float)(109.91999511718751)); + canvas.LineTo((float)(289.1186648773111), (float)(115.17296188710615)); + canvas.LineTo((float)(298), (float)(99.91999511718751)); canvas.Stroke(); - canvas.FillRect((float)(345), (float)(130.1), (float)(1), (float)(36)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.FillRect((float)(306), (float)(87.9199951171875), (float)(1), (float)(36.000000000000014)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); canvas.LineWidth = (float)(0.96); canvas.BeginPath(); - canvas.MoveTo((float)(152.1767578125), (float)(148)); - canvas.LineTo((float)(152.1767578125), (float)(175)); + canvas.MoveTo((float)(113.29200744628906), (float)(105.91999511718751)); + canvas.LineTo((float)(113.29200744628906), (float)(132.9199951171875)); canvas.Stroke(); canvas.LineWidth = (float)(1); canvas.LineWidth = (float)(0.96); canvas.BeginPath(); - canvas.MoveTo((float)(192.23569962449085), (float)(148)); - canvas.LineTo((float)(192.23569962449085), (float)(175)); + canvas.MoveTo((float)(153.54015249341666), (float)(105.91999511718751)); + canvas.LineTo((float)(153.54015249341666), (float)(132.9199951171875)); canvas.Stroke(); canvas.LineWidth = (float)(1); canvas.LineWidth = (float)(0.96); canvas.BeginPath(); - canvas.MoveTo((float)(232.29464143648167), (float)(148)); - canvas.LineTo((float)(232.29464143648167), (float)(175)); + canvas.MoveTo((float)(193.78829754054425), (float)(105.91999511718751)); + canvas.LineTo((float)(193.78829754054425), (float)(132.9199951171875)); canvas.Stroke(); canvas.LineWidth = (float)(1); canvas.LineWidth = (float)(0.96); canvas.BeginPath(); - canvas.MoveTo((float)(281.3535832484725), (float)(148)); - canvas.LineTo((float)(281.3535832484725), (float)(121)); + canvas.MoveTo((float)(243.03644258767181), (float)(105.91999511718751)); + canvas.LineTo((float)(243.03644258767181), (float)(78.91999511718751)); canvas.Stroke(); canvas.LineWidth = (float)(1); canvas.BeginPath(); - canvas.MoveTo((float)(281.3535832484725), (float)(121)); - canvas.LineTo((float)(314.9267916242362), (float)(121)); - canvas.LineTo((float)(314.9267916242362), (float)(125)); - canvas.LineTo((float)(281.3535832484725), (float)(125)); + canvas.MoveTo((float)(243.03644258767181), (float)(78.91999511718751)); + canvas.LineTo((float)(276.7682212938359), (float)(78.91999511718751)); + canvas.LineTo((float)(276.7682212938359), (float)(82.91999511718751)); + canvas.LineTo((float)(243.03644258767181), (float)(82.91999511718751)); canvas.ClosePath(); canvas.Fill(); canvas.LineWidth = (float)(0.96); canvas.BeginPath(); - canvas.MoveTo((float)(314.9267916242362), (float)(148)); - canvas.LineTo((float)(314.9267916242362), (float)(121)); + canvas.MoveTo((float)(276.7682212938359), (float)(105.91999511718751)); + canvas.LineTo((float)(276.7682212938359), (float)(78.91999511718751)); canvas.Stroke(); canvas.LineWidth = (float)(1); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); - canvas.FillRect((float)(346), (float)(130), (float)(126), (float)(1.04)); - canvas.FillRect((float)(346), (float)(139), (float)(126), (float)(1.04)); - canvas.FillRect((float)(346), (float)(148), (float)(126), (float)(1.04)); - canvas.FillRect((float)(346), (float)(157), (float)(126), (float)(1.04)); - canvas.FillRect((float)(346), (float)(166), (float)(126), (float)(1.04)); + canvas.FillRect((float)(307), (float)(87), (float)(126), (float)(1.04)); + canvas.FillRect((float)(307), (float)(96), (float)(126), (float)(1.04)); + canvas.FillRect((float)(307), (float)(105), (float)(126), (float)(1.04)); + canvas.FillRect((float)(307), (float)(114), (float)(126), (float)(1.04)); + canvas.FillRect((float)(307), (float)(123), (float)(126), (float)(1.04)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(200), (byte)(0), (byte)(0), (byte)(255)); - Typeface = GetTypeface("Roboto", false, false); + TextBaseline = AlphaSkiaTextBaseline.Top; + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("2", Typeface, FontSize, (float)(346), (float)(118.75), TextAlign, TextBaseline); + canvas.FillText("2", TextStyle, FontSize, (float)(307), (float)(76.5699951171875), TextAlign, TextBaseline); + TextBaseline = AlphaSkiaTextBaseline.Top; + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(318.29200744628906), (float)(96.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(339.6478115199233), (float)(96.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(361.00361559355764), (float)(119.41999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A3", MusicTextStyle, (float)(MusicFontSize * 1), (float)(388.3056137319853), (float)(114.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.FillRect((float)(432), (float)(87.9199951171875), (float)(1), (float)(36.000000000000014)); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(357.1767578125), (float)(139), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(378.359547484596), (float)(139), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(399.542337156692), (float)(161.5), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A3", MusicTypeface, (float)(MusicFontSize * 1), (float)(426.623147703567), (float)(157), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillRect((float)(471), (float)(130.1), (float)(1), (float)(36)); canvas.LineWidth = (float)(0.96); canvas.BeginPath(); - canvas.MoveTo((float)(366.1767578125), (float)(139)); - canvas.LineTo((float)(366.1767578125), (float)(112)); + canvas.MoveTo((float)(327.29200744628906), (float)(96.91999511718751)); + canvas.LineTo((float)(327.29200744628906), (float)(69.91999511718751)); canvas.Stroke(); canvas.LineWidth = (float)(1); canvas.BeginPath(); - canvas.MoveTo((float)(366.1767578125), (float)(112)); - canvas.LineTo((float)(387.359547484596), (float)(117)); - canvas.LineTo((float)(387.359547484596), (float)(121)); - canvas.LineTo((float)(366.1767578125), (float)(116)); + canvas.MoveTo((float)(327.29200744628906), (float)(69.91999511718751)); + canvas.LineTo((float)(348.6478115199233), (float)(74.91999511718751)); + canvas.LineTo((float)(348.6478115199233), (float)(78.91999511718751)); + canvas.LineTo((float)(327.29200744628906), (float)(73.91999511718751)); canvas.ClosePath(); canvas.Fill(); canvas.BeginPath(); - canvas.MoveTo((float)(366.1767578125), (float)(118)); - canvas.LineTo((float)(387.359547484596), (float)(123)); - canvas.LineTo((float)(387.359547484596), (float)(127)); - canvas.LineTo((float)(366.1767578125), (float)(122)); + canvas.MoveTo((float)(327.29200744628906), (float)(75.91999511718751)); + canvas.LineTo((float)(348.6478115199233), (float)(80.91999511718751)); + canvas.LineTo((float)(348.6478115199233), (float)(84.91999511718751)); + canvas.LineTo((float)(327.29200744628906), (float)(79.91999511718751)); canvas.ClosePath(); canvas.Fill(); canvas.LineWidth = (float)(0.96); canvas.BeginPath(); - canvas.MoveTo((float)(387.359547484596), (float)(139)); - canvas.LineTo((float)(387.359547484596), (float)(117)); + canvas.MoveTo((float)(348.6478115199233), (float)(96.91999511718751)); + canvas.LineTo((float)(348.6478115199233), (float)(74.91999511718751)); canvas.Stroke(); canvas.LineWidth = (float)(1); canvas.BeginPath(); - canvas.MoveTo((float)(387.359547484596), (float)(117)); - canvas.LineTo((float)(408.542337156692), (float)(122)); - canvas.LineTo((float)(408.542337156692), (float)(126)); - canvas.LineTo((float)(387.359547484596), (float)(121)); + canvas.MoveTo((float)(348.6478115199233), (float)(74.91999511718751)); + canvas.LineTo((float)(370.00361559355764), (float)(79.91999511718751)); + canvas.LineTo((float)(370.00361559355764), (float)(83.91999511718751)); + canvas.LineTo((float)(348.6478115199233), (float)(78.91999511718751)); canvas.ClosePath(); canvas.Fill(); canvas.LineWidth = (float)(0.96); canvas.BeginPath(); - canvas.MoveTo((float)(408.542337156692), (float)(161.5)); - canvas.LineTo((float)(408.542337156692), (float)(122)); + canvas.MoveTo((float)(370.00361559355764), (float)(119.41999511718751)); + canvas.LineTo((float)(370.00361559355764), (float)(79.91999511718751)); canvas.Stroke(); canvas.LineWidth = (float)(1); canvas.LineWidth = (float)(0.96); canvas.BeginPath(); - canvas.MoveTo((float)(435.623147703567), (float)(130)); - canvas.LineTo((float)(435.623147703567), (float)(157)); + canvas.MoveTo((float)(397.3056137319853), (float)(87.91999511718751)); + canvas.LineTo((float)(397.3056137319853), (float)(114.91999511718751)); canvas.Stroke(); canvas.LineWidth = (float)(1); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); TextAlign = AlphaSkiaTextAlign.Center; TextBaseline = AlphaSkiaTextBaseline.Middle; - Typeface = GetTypeface("PT Serif", false, true); + TextStyle = GetTextStyle(new []{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, true); FontSize = (float)(12); canvas.BeginPath(); - canvas.MoveTo((float)(366.1767578125), (float)(102)); - canvas.LineTo((float)(366.1767578125), (float)(97)); - canvas.LineTo((float)(394.7559555656507), (float)(104)); + canvas.MoveTo((float)(327.29200744628906), (float)(59)); + canvas.LineTo((float)(327.29200744628906), (float)(54)); + canvas.LineTo((float)(355.9448143122817), (float)(62)); canvas.Stroke(); canvas.BeginPath(); - canvas.MoveTo((float)(407.04394995041633), (float)(107)); - canvas.LineTo((float)(435.623147703567), (float)(115)); - canvas.LineTo((float)(435.623147703567), (float)(120)); + canvas.MoveTo((float)(368.65280686599266), (float)(65)); + canvas.LineTo((float)(397.3056137319853), (float)(72)); + canvas.LineTo((float)(397.3056137319853), (float)(77)); canvas.Stroke(); - canvas.FillText("3", Typeface, FontSize, (float)(400.8999527580335), (float)(106), TextAlign, TextBaseline); + canvas.FillText("3", TextStyle, FontSize, (float)(362.2988105891372), (float)(63.91999511718751), TextAlign, TextBaseline); TextAlign = AlphaSkiaTextAlign.Left; TextBaseline = AlphaSkiaTextBaseline.Top; canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); - canvas.FillRect((float)(472), (float)(130), (float)(206), (float)(1.04)); - canvas.FillRect((float)(472), (float)(139), (float)(206), (float)(1.04)); - canvas.FillRect((float)(472), (float)(148), (float)(206), (float)(1.04)); - canvas.FillRect((float)(472), (float)(157), (float)(206), (float)(1.04)); - canvas.FillRect((float)(472), (float)(166), (float)(206), (float)(1.04)); + canvas.FillRect((float)(433), (float)(87), (float)(192), (float)(1.04)); + canvas.FillRect((float)(433), (float)(96), (float)(192), (float)(1.04)); + canvas.FillRect((float)(433), (float)(105), (float)(192), (float)(1.04)); + canvas.FillRect((float)(433), (float)(114), (float)(192), (float)(1.04)); + canvas.FillRect((float)(433), (float)(123), (float)(192), (float)(1.04)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(200), (byte)(0), (byte)(0), (byte)(255)); - Typeface = GetTypeface("Roboto", false, false); - FontSize = (float)(11); - canvas.FillText("3", Typeface, FontSize, (float)(472), (float)(118.75), TextAlign, TextBaseline); - canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(496.32666015625), (float)(157), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(496.32666015625), (float)(143.5), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(496.32666015625), (float)(134.5), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.BeginRotate((float)(527.8699951171875), (float)(172), (float)(-90)); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(0), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(10.799999999999999), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(21.599999999999998), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(32.4), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + TextBaseline = AlphaSkiaTextBaseline.Top; + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(11); + canvas.FillText("3", TextStyle, FontSize, (float)(433), (float)(76.5699951171875), TextAlign, TextBaseline); + TextBaseline = AlphaSkiaTextBaseline.Top; + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(457.510009765625), (float)(114.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(457.510009765625), (float)(101.41999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(457.510009765625), (float)(92.4199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.BeginRotate((float)(489.00750732421875), (float)(129.9199951171875), (float)(-90)); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(0), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(10.799999999999999), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(21.599999999999998), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(32.4), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.EndRotate(); canvas.BeginPath(); - canvas.MoveTo((float)(527.8699951171875), (float)(180)); - canvas.LineTo((float)(531.8699951171875), (float)(172)); - canvas.LineTo((float)(523.8699951171875), (float)(172)); + canvas.MoveTo((float)(489.00750732421875), (float)(137.9199951171875)); + canvas.LineTo((float)(493.00750732421875), (float)(129.9199951171875)); + canvas.LineTo((float)(485.00750732421875), (float)(129.9199951171875)); canvas.ClosePath(); canvas.Fill(); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); - canvas.FillRect((float)(533.8699951171875), (float)(175), (float)(15), (float)(1)); - canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(536.8699951171875), (float)(175), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(536.8699951171875), (float)(166), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(536.8699951171875), (float)(157), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(536.8699951171875), (float)(143.5), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(536.8699951171875), (float)(134.5), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); - canvas.FillRect((float)(574.413330078125), (float)(175), (float)(15), (float)(1)); - canvas.FillRect((float)(574.413330078125), (float)(184), (float)(15), (float)(1)); - canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(577.413330078125), (float)(184), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(577.413330078125), (float)(166), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(577.413330078125), (float)(152.5), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.BeginRotate((float)(596.9566650390625), (float)(137.5), (float)(90)); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(0), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(10.799999999999999), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(21.599999999999998), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(32.4), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(43.199999999999996), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillRect((float)(495.00750732421875), (float)(132), (float)(15), (float)(1.04)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(498.00750732421875), (float)(132.9199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(498.00750732421875), (float)(123.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(498.00750732421875), (float)(114.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(498.00750732421875), (float)(101.41999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(498.00750732421875), (float)(92.4199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.FillRect((float)(535.5050048828125), (float)(132), (float)(15), (float)(1.04)); + canvas.FillRect((float)(535.5050048828125), (float)(141), (float)(15), (float)(1.04)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(538.5050048828125), (float)(141.9199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(538.5050048828125), (float)(123.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(538.5050048828125), (float)(110.41999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.BeginRotate((float)(558.0025024414062), (float)(95.41999511718751), (float)(90)); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(0), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(10.799999999999999), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(21.599999999999998), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(32.4), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(43.199999999999996), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.EndRotate(); canvas.BeginPath(); - canvas.MoveTo((float)(596.9566650390625), (float)(129.5)); - canvas.LineTo((float)(600.9566650390625), (float)(137.5)); - canvas.LineTo((float)(592.9566650390625), (float)(137.5)); + canvas.MoveTo((float)(558.0025024414062), (float)(87.41999511718751)); + canvas.LineTo((float)(562.0025024414062), (float)(95.41999511718751)); + canvas.LineTo((float)(554.0025024414062), (float)(95.41999511718751)); canvas.ClosePath(); canvas.Fill(); - canvas.FillText("\uE262", MusicTypeface, (float)(MusicFontSize * 1), (float)(607.9566650390625), (float)(143.5), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); - canvas.FillRect((float)(614.9566650390625), (float)(175), (float)(15), (float)(1)); - canvas.FillRect((float)(614.9566650390625), (float)(184), (float)(15), (float)(1)); - canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(617.9566650390625), (float)(184), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(617.9566650390625), (float)(166), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(617.9566650390625), (float)(152.5), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(617.9566650390625), (float)(143.5), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uE0A4", MusicTypeface, (float)(MusicFontSize * 1), (float)(617.9566650390625), (float)(134.5), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillRect((float)(670), (float)(130.1), (float)(1), (float)(36)); - canvas.FillRect((float)(674), (float)(130.1), (float)(4), (float)(36)); + canvas.FillText("\uE262", MusicTextStyle, (float)(MusicFontSize * 1), (float)(569.0025024414062), (float)(101.41999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.FillRect((float)(576.0025024414062), (float)(132), (float)(15), (float)(1.04)); + canvas.FillRect((float)(576.0025024414062), (float)(141), (float)(15), (float)(1.04)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(579.0025024414062), (float)(141.9199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(579.0025024414062), (float)(123.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(579.0025024414062), (float)(110.41999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(579.0025024414062), (float)(101.41999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(579.0025024414062), (float)(92.4199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.FillRect((float)(624), (float)(87.9199951171875), (float)(1), (float)(36.000000000000014)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); canvas.LineWidth = (float)(0.96); canvas.BeginPath(); - canvas.MoveTo((float)(496.32666015625), (float)(134.5)); - canvas.LineTo((float)(496.32666015625), (float)(184)); + canvas.MoveTo((float)(457.510009765625), (float)(92.4199951171875)); + canvas.LineTo((float)(457.510009765625), (float)(141.9199951171875)); canvas.Stroke(); canvas.LineWidth = (float)(1); canvas.LineWidth = (float)(0.96); canvas.BeginPath(); - canvas.MoveTo((float)(545.8699951171875), (float)(107.5)); - canvas.LineTo((float)(545.8699951171875), (float)(175)); + canvas.MoveTo((float)(507.00750732421875), (float)(65.4199951171875)); + canvas.LineTo((float)(507.00750732421875), (float)(132.9199951171875)); canvas.Stroke(); canvas.LineWidth = (float)(1); canvas.LineWidth = (float)(0.96); canvas.BeginPath(); - canvas.MoveTo((float)(586.413330078125), (float)(125.5)); - canvas.LineTo((float)(586.413330078125), (float)(184)); + canvas.MoveTo((float)(547.5050048828125), (float)(83.41999511718751)); + canvas.LineTo((float)(547.5050048828125), (float)(141.9199951171875)); canvas.Stroke(); canvas.LineWidth = (float)(1); canvas.LineWidth = (float)(0.96); canvas.BeginPath(); - canvas.MoveTo((float)(626.9566650390625), (float)(107.5)); - canvas.LineTo((float)(626.9566650390625), (float)(184)); + canvas.MoveTo((float)(588.0025024414062), (float)(65.4199951171875)); + canvas.LineTo((float)(588.0025024414062), (float)(141.9199951171875)); canvas.Stroke(); canvas.LineWidth = (float)(1); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); - canvas.FillRect((float)(92), (float)(284), (float)(254), (float)(1.04)); - canvas.FillRect((float)(92), (float)(295), (float)(254), (float)(1.04)); - canvas.FillRect((float)(92), (float)(306), (float)(254), (float)(1.04)); - canvas.FillRect((float)(92), (float)(317), (float)(61.02685546875), (float)(1.04)); - canvas.FillRect((float)(161.32666015625), (float)(317), (float)(31.759140014648438), (float)(1.04)); - canvas.FillRect((float)(201.38560485839844), (float)(317), (float)(31.759140014648438), (float)(1.04)); - canvas.FillRect((float)(241.44454956054688), (float)(317), (float)(31.759124755859375), (float)(1.04)); - canvas.FillRect((float)(281.50347900390625), (float)(317), (float)(25.273406982421875), (float)(1.04)); - canvas.FillRect((float)(315.0766906738281), (float)(317), (float)(30.923309326171875), (float)(1.04)); - canvas.FillRect((float)(92), (float)(328), (float)(254), (float)(1.04)); - canvas.FillRect((float)(92), (float)(339), (float)(254), (float)(1.04)); - canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); - canvas.FillText("\uE06D", MusicTypeface, (float)(MusicFontSize * 0.9230769230769231), (float)(97), (float)(311.8), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillRect((float)(625), (float)(87), (float)(82), (float)(1.04)); + canvas.FillRect((float)(625), (float)(96), (float)(82), (float)(1.04)); + canvas.FillRect((float)(625), (float)(105), (float)(82), (float)(1.04)); + canvas.FillRect((float)(625), (float)(114), (float)(82), (float)(1.04)); + canvas.FillRect((float)(625), (float)(123), (float)(82), (float)(1.04)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(200), (byte)(0), (byte)(0), (byte)(255)); + TextBaseline = AlphaSkiaTextBaseline.Top; + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(11); + canvas.FillText("4", TextStyle, FontSize, (float)(625), (float)(76.5699951171875), TextAlign, TextBaseline); + TextBaseline = AlphaSkiaTextBaseline.Top; + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE4EF\uE4F0\uE4F0\uE4F0\uE4F1", MusicTextStyle, (float)(MusicFontSize * 1), (float)(636.2920074462891), (float)(105.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uE083", MusicTextStyle, (float)(MusicFontSize * 1), (float)(666.2920074462891), (float)(74), AlphaSkiaTextAlign.Center, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.FillRect((float)(706), (float)(87.9199951171875), (float)(1), (float)(36.000000000000014)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.FillRect((float)(707), (float)(87), (float)(163), (float)(1.04)); + canvas.FillRect((float)(707), (float)(96), (float)(163), (float)(1.04)); + canvas.FillRect((float)(707), (float)(105), (float)(163), (float)(1.04)); + canvas.FillRect((float)(707), (float)(114), (float)(163), (float)(1.04)); + canvas.FillRect((float)(707), (float)(123), (float)(163), (float)(1.04)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(200), (byte)(0), (byte)(0), (byte)(255)); + TextBaseline = AlphaSkiaTextBaseline.Top; + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(11); + canvas.FillText("7", TextStyle, FontSize, (float)(707), (float)(76.5699951171875), TextAlign, TextBaseline); + TextBaseline = AlphaSkiaTextBaseline.Top; + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(718.2920074462891), (float)(96.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(754.8440055847168), (float)(96.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(791.3960037231445), (float)(96.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(827.9480018615723), (float)(96.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.FillRect((float)(869), (float)(87.9199951171875), (float)(1), (float)(36.000000000000014)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.LineWidth = (float)(0.96); + canvas.BeginPath(); + canvas.MoveTo((float)(718.2920074462891), (float)(96.91999511718751)); + canvas.LineTo((float)(718.2920074462891), (float)(123.91999511718751)); + canvas.Stroke(); + canvas.LineWidth = (float)(1); + canvas.LineWidth = (float)(0.96); + canvas.BeginPath(); + canvas.MoveTo((float)(754.8440055847168), (float)(96.91999511718751)); + canvas.LineTo((float)(754.8440055847168), (float)(123.91999511718751)); + canvas.Stroke(); + canvas.LineWidth = (float)(1); + canvas.LineWidth = (float)(0.96); + canvas.BeginPath(); + canvas.MoveTo((float)(791.3960037231445), (float)(96.91999511718751)); + canvas.LineTo((float)(791.3960037231445), (float)(123.91999511718751)); + canvas.Stroke(); + canvas.LineWidth = (float)(1); + canvas.LineWidth = (float)(0.96); + canvas.BeginPath(); + canvas.MoveTo((float)(827.9480018615723), (float)(96.91999511718751)); + canvas.LineTo((float)(827.9480018615723), (float)(123.91999511718751)); + canvas.Stroke(); + canvas.LineWidth = (float)(1); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.FillRect((float)(870), (float)(87), (float)(60), (float)(1.04)); + canvas.FillRect((float)(870), (float)(96), (float)(60), (float)(1.04)); + canvas.FillRect((float)(870), (float)(105), (float)(60), (float)(1.04)); + canvas.FillRect((float)(870), (float)(114), (float)(60), (float)(1.04)); + canvas.FillRect((float)(870), (float)(123), (float)(60), (float)(1.04)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(200), (byte)(0), (byte)(0), (byte)(255)); + TextBaseline = AlphaSkiaTextBaseline.Top; + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(11); + canvas.FillText("8", TextStyle, FontSize, (float)(870), (float)(76.5699951171875), TextAlign, TextBaseline); + TextBaseline = AlphaSkiaTextBaseline.Top; + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE0A4", MusicTextStyle, (float)(MusicFontSize * 1), (float)(881.2920074462891), (float)(96.91999511718751), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.FillRect((float)(922), (float)(87.9199951171875), (float)(1), (float)(36.000000000000014)); + canvas.FillRect((float)(926), (float)(87.9199951171875), (float)(4), (float)(36.000000000000014)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.LineWidth = (float)(0.96); + canvas.BeginPath(); + canvas.MoveTo((float)(881.2920074462891), (float)(96.91999511718751)); + canvas.LineTo((float)(881.2920074462891), (float)(123.91999511718751)); + canvas.Stroke(); + canvas.LineWidth = (float)(1); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(722.7920074462891), (float)(161.4199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(733.592007446289), (float)(161.4199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(744.3920074462891), (float)(161.4199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(755.192007446289), (float)(161.4199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(765.9920074462891), (float)(161.4199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(776.7920074462891), (float)(161.4199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(787.592007446289), (float)(161.4199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(798.3920074462891), (float)(161.4199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(809.192007446289), (float)(161.4199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(819.9920074462891), (float)(161.4199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.FillRect((float)(48), (float)(216), (float)(259), (float)(1.04)); + canvas.FillRect((float)(48), (float)(227), (float)(259), (float)(1.04)); + canvas.FillRect((float)(48), (float)(238), (float)(259), (float)(1.04)); + canvas.FillRect((float)(48), (float)(249), (float)(66.07400512695312), (float)(1.04)); + canvas.FillRect((float)(122.510009765625), (float)(249), (float)(31.81214141845703), (float)(1.04)); + canvas.FillRect((float)(162.7581558227539), (float)(249), (float)(31.81214141845703), (float)(1.04)); + canvas.FillRect((float)(203.0063018798828), (float)(249), (float)(31.8121337890625), (float)(1.04)); + canvas.FillRect((float)(243.2544403076172), (float)(249), (float)(25.2957763671875), (float)(1.04)); + canvas.FillRect((float)(276.98622131347656), (float)(249), (float)(30.013778686523438), (float)(1.04)); + canvas.FillRect((float)(48), (float)(260), (float)(259), (float)(1.04)); + canvas.FillRect((float)(48), (float)(271), (float)(259), (float)(1.04)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.FillRect((float)(48), (float)(216.3199951171875), (float)(1), (float)(54.99999999999994)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.FillText("\uE06D", MusicTextStyle, (float)(MusicFontSize * 0.9230769230769231), (float)(54), (float)(243.8199951171875), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); TextBaseline = AlphaSkiaTextBaseline.Middle; - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(163.32666015625), (float)(317.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(124.510009765625), (float)(249.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("9", Typeface, FontSize, (float)(153.02685546875), (float)(317.3), TextAlign, TextBaseline); + canvas.FillText("9", TextStyle, FontSize, (float)(114.07400512695312), (float)(249.3199951171875), TextAlign, TextBaseline); TextBaseline = AlphaSkiaTextBaseline.Top; canvas.BeginPath(); canvas.BeginPath(); - canvas.MoveTo((float)(188.23569962449085), (float)(274.7)); - canvas.LineTo((float)(185.23569962449085), (float)(280.7)); - canvas.LineTo((float)(191.23569962449085), (float)(280.7)); + canvas.MoveTo((float)(150.32215017408072), (float)(206.7199951171875)); + canvas.LineTo((float)(147.32215017408072), (float)(212.7199951171875)); + canvas.LineTo((float)(153.32215017408072), (float)(212.7199951171875)); canvas.ClosePath(); canvas.Fill(); + canvas.BeginPath(); + canvas.MoveTo((float)(123.510009765625), (float)(249.3199951171875)); + canvas.BezierCurveTo((float)(136.91607996985286), (float)(249.3199951171875), (float)(150.32215017408072), (float)(249.3199951171875), (float)(150.32215017408072), (float)(212.7199951171875)); canvas.Stroke(); - canvas.MoveTo((float)(162.32666015625), (float)(317.3)); - canvas.BezierCurveTo((float)(175.28117989037042), (float)(317.3), (float)(188.23569962449085), (float)(317.3), (float)(188.23569962449085), (float)(280.7)); - canvas.Stroke(); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("\u00BC", Typeface, FontSize, (float)(183.47495743699085), (float)(260.7), TextAlign, TextBaseline); + canvas.FillText("\u00BC", TextStyle, FontSize, (float)(145.47965139478384), (float)(192.7199951171875), TextAlign, TextBaseline); TextBaseline = AlphaSkiaTextBaseline.Middle; - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(203.38560196824085), (float)(317.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(164.7581548127526), (float)(249.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("9", Typeface, FontSize, (float)(193.08579728074085), (float)(317.3), TextAlign, TextBaseline); + canvas.FillText("9", TextStyle, FontSize, (float)(154.32215017408072), (float)(249.3199951171875), TextAlign, TextBaseline); TextBaseline = AlphaSkiaTextBaseline.Top; canvas.BeginPath(); canvas.BeginPath(); - canvas.MoveTo((float)(228.29464143648167), (float)(268.7)); - canvas.LineTo((float)(225.29464143648167), (float)(274.7)); - canvas.LineTo((float)(231.29464143648167), (float)(274.7)); + canvas.MoveTo((float)(190.5702952212083), (float)(200.7199951171875)); + canvas.LineTo((float)(187.5702952212083), (float)(206.7199951171875)); + canvas.LineTo((float)(193.5702952212083), (float)(206.7199951171875)); canvas.ClosePath(); canvas.Fill(); + canvas.BeginPath(); + canvas.MoveTo((float)(163.7581548127526), (float)(249.3199951171875)); + canvas.BezierCurveTo((float)(177.16422501698045), (float)(249.3199951171875), (float)(190.5702952212083), (float)(249.3199951171875), (float)(190.5702952212083), (float)(206.7199951171875)); canvas.Stroke(); - canvas.MoveTo((float)(202.38560196824085), (float)(317.3)); - canvas.BezierCurveTo((float)(215.34012170236127), (float)(317.3), (float)(228.29464143648167), (float)(317.3), (float)(228.29464143648167), (float)(274.7)); - canvas.Stroke(); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("\u00BD", Typeface, FontSize, (float)(223.25142854585667), (float)(254.7), TextAlign, TextBaseline); + canvas.FillText("\u00BD", TextStyle, FontSize, (float)(185.55879772364972), (float)(186.7199951171875), TextAlign, TextBaseline); TextBaseline = AlphaSkiaTextBaseline.Middle; - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(243.44454378023167), (float)(317.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(205.0062998598802), (float)(249.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("9", Typeface, FontSize, (float)(233.14473909273167), (float)(317.3), TextAlign, TextBaseline); + canvas.FillText("9", TextStyle, FontSize, (float)(194.5702952212083), (float)(249.3199951171875), TextAlign, TextBaseline); TextBaseline = AlphaSkiaTextBaseline.Top; canvas.BeginPath(); canvas.BeginPath(); - canvas.MoveTo((float)(268.3535832484725), (float)(256.7)); - canvas.LineTo((float)(265.3535832484725), (float)(262.7)); - canvas.LineTo((float)(271.3535832484725), (float)(262.7)); + canvas.MoveTo((float)(230.81844026833588), (float)(188.7199951171875)); + canvas.LineTo((float)(227.81844026833588), (float)(194.7199951171875)); + canvas.LineTo((float)(233.81844026833588), (float)(194.7199951171875)); canvas.ClosePath(); canvas.Fill(); + canvas.BeginPath(); + canvas.MoveTo((float)(204.0062998598802), (float)(249.3199951171875)); + canvas.BezierCurveTo((float)(217.41237006410802), (float)(249.3199951171875), (float)(230.81844026833588), (float)(249.3199951171875), (float)(230.81844026833588), (float)(194.7199951171875)); canvas.Stroke(); - canvas.MoveTo((float)(242.44454378023167), (float)(317.3)); - canvas.BezierCurveTo((float)(255.39906351435206), (float)(317.3), (float)(268.3535832484725), (float)(317.3), (float)(268.3535832484725), (float)(262.7)); - canvas.Stroke(); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("full", Typeface, FontSize, (float)(259.3589543422225), (float)(242.7), TextAlign, TextBaseline); + canvas.FillText("full", TextStyle, FontSize, (float)(221.2114380100351), (float)(174.7199951171875), TextAlign, TextBaseline); TextBaseline = AlphaSkiaTextBaseline.Middle; - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(283.5034855922225), (float)(317.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(245.25444490700775), (float)(249.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("9", Typeface, FontSize, (float)(273.2036809047225), (float)(317.3), TextAlign, TextBaseline); + canvas.FillText("9", TextStyle, FontSize, (float)(234.81844026833588), (float)(249.3199951171875), TextAlign, TextBaseline); TextBaseline = AlphaSkiaTextBaseline.Top; canvas.BeginPath(); canvas.BeginPath(); - canvas.MoveTo((float)(301.9267916242362), (float)(244.7)); - canvas.LineTo((float)(298.9267916242362), (float)(250.7)); - canvas.LineTo((float)(304.9267916242362), (float)(250.7)); + canvas.MoveTo((float)(264.55021897449996), (float)(176.7199951171875)); + canvas.LineTo((float)(261.55021897449996), (float)(182.7199951171875)); + canvas.LineTo((float)(267.55021897449996), (float)(182.7199951171875)); canvas.ClosePath(); canvas.Fill(); + canvas.BeginPath(); + canvas.MoveTo((float)(244.25444490700775), (float)(249.3199951171875)); + canvas.BezierCurveTo((float)(254.40233194075387), (float)(249.3199951171875), (float)(264.55021897449996), (float)(249.3199951171875), (float)(264.55021897449996), (float)(182.7199951171875)); canvas.Stroke(); - canvas.MoveTo((float)(282.5034855922225), (float)(317.3)); - canvas.BezierCurveTo((float)(292.2151386082294), (float)(317.3), (float)(301.9267916242362), (float)(317.3), (float)(301.9267916242362), (float)(250.7)); - canvas.Stroke(); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("1\u00BD", Typeface, FontSize, (float)(293.2336763898612), (float)(230.7), TextAlign, TextBaseline); + canvas.FillText("1\u00BD", TextStyle, FontSize, (float)(255.82071915760542), (float)(162.7199951171875), TextAlign, TextBaseline); TextBaseline = AlphaSkiaTextBaseline.Middle; - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(317.0766939679862), (float)(317.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(278.98622361317183), (float)(249.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("9", Typeface, FontSize, (float)(306.7768892804862), (float)(317.3), TextAlign, TextBaseline); + canvas.FillText("9", TextStyle, FontSize, (float)(268.55021897449996), (float)(249.3199951171875), TextAlign, TextBaseline); TextBaseline = AlphaSkiaTextBaseline.Top; canvas.BeginPath(); canvas.BeginPath(); - canvas.MoveTo((float)(340), (float)(232.7)); - canvas.LineTo((float)(337), (float)(238.7)); - canvas.LineTo((float)(343), (float)(238.7)); + canvas.MoveTo((float)(302), (float)(164.7199951171875)); + canvas.LineTo((float)(299), (float)(170.7199951171875)); + canvas.LineTo((float)(305), (float)(170.7199951171875)); canvas.ClosePath(); canvas.Fill(); + canvas.BeginPath(); + canvas.MoveTo((float)(277.98622361317183), (float)(249.3199951171875)); + canvas.BezierCurveTo((float)(289.99311180658594), (float)(249.3199951171875), (float)(302), (float)(249.3199951171875), (float)(302), (float)(170.7199951171875)); canvas.Stroke(); - canvas.MoveTo((float)(316.0766939679862), (float)(317.3)); - canvas.BezierCurveTo((float)(328.0383469839931), (float)(317.3), (float)(340), (float)(317.3), (float)(340), (float)(238.7)); - canvas.Stroke(); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("2", Typeface, FontSize, (float)(336.35009765625), (float)(218.7), TextAlign, TextBaseline); - canvas.FillRect((float)(345), (float)(284.3), (float)(1), (float)(54.99999999999994)); + canvas.FillText("2", TextStyle, FontSize, (float)(298.28199768066406), (float)(150.7199951171875), TextAlign, TextBaseline); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.FillRect((float)(306), (float)(216.3199951171875), (float)(1), (float)(54.99999999999994)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); - canvas.FillRect((float)(346), (float)(284), (float)(126), (float)(1.04)); - canvas.FillRect((float)(346), (float)(295), (float)(12.02685546875), (float)(1.04)); - canvas.FillRect((float)(366.32666015625), (float)(295), (float)(12.882984161376953), (float)(1.04)); - canvas.FillRect((float)(387.50944900512695), (float)(295), (float)(84.49055099487305), (float)(1.04)); - canvas.FillRect((float)(346), (float)(306), (float)(126), (float)(1.04)); - canvas.FillRect((float)(346), (float)(317), (float)(54.392433166503906), (float)(1.04)); - canvas.FillRect((float)(408.6922378540039), (float)(317), (float)(18.781005859375), (float)(1.04)); - canvas.FillRect((float)(435.7730484008789), (float)(317), (float)(36.226951599121094), (float)(1.04)); - canvas.FillRect((float)(346), (float)(328), (float)(126), (float)(1.04)); - canvas.FillRect((float)(346), (float)(339), (float)(126), (float)(1.04)); + canvas.FillRect((float)(307), (float)(216), (float)(126), (float)(1.04)); + canvas.FillRect((float)(307), (float)(227), (float)(12.074005126953125), (float)(1.04)); + canvas.FillRect((float)(327.510009765625), (float)(227), (float)(12.9197998046875), (float)(1.04)); + canvas.FillRect((float)(348.8658142089844), (float)(227), (float)(84.13418579101562), (float)(1.04)); + canvas.FillRect((float)(307), (float)(238), (float)(126), (float)(1.04)); + canvas.FillRect((float)(307), (float)(249), (float)(54.785614013671875), (float)(1.04)); + canvas.FillRect((float)(370.22161865234375), (float)(249), (float)(18.865989685058594), (float)(1.04)); + canvas.FillRect((float)(397.5236129760742), (float)(249), (float)(35.47638702392578), (float)(1.04)); + canvas.FillRect((float)(307), (float)(260), (float)(126), (float)(1.04)); + canvas.FillRect((float)(307), (float)(271), (float)(126), (float)(1.04)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); TextBaseline = AlphaSkiaTextBaseline.Middle; - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(368.32666015625), (float)(295.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(329.510009765625), (float)(227.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("3", Typeface, FontSize, (float)(358.02685546875), (float)(295.3), TextAlign, TextBaseline); + canvas.FillText("3", TextStyle, FontSize, (float)(319.0740051269531), (float)(227.3199951171875), TextAlign, TextBaseline); TextBaseline = AlphaSkiaTextBaseline.Top; TextBaseline = AlphaSkiaTextBaseline.Middle; - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(389.509449828346), (float)(295.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(350.86581383925926), (float)(227.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("3", Typeface, FontSize, (float)(379.209645140846), (float)(295.3), TextAlign, TextBaseline); + canvas.FillText("3", TextStyle, FontSize, (float)(340.4298092005874), (float)(227.3199951171875), TextAlign, TextBaseline); TextBaseline = AlphaSkiaTextBaseline.Top; TextBaseline = AlphaSkiaTextBaseline.Middle; - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(410.692239500442), (float)(317.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(372.2216179128936), (float)(249.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("3", Typeface, FontSize, (float)(400.392434812942), (float)(317.3), TextAlign, TextBaseline); + canvas.FillText("3", TextStyle, FontSize, (float)(361.7856132742217), (float)(249.3199951171875), TextAlign, TextBaseline); TextBaseline = AlphaSkiaTextBaseline.Top; TextBaseline = AlphaSkiaTextBaseline.Middle; - Typeface = GetTypeface("Roboto", false, false); - FontSize = (float)(13); - Typeface = GetTypeface("Roboto", false, false); - FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(437.773050047317), (float)(317.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); - FontSize = (float)(13); - canvas.FillText("5", Typeface, FontSize, (float)(427.473245359817), (float)(317.3), TextAlign, TextBaseline); - TextBaseline = AlphaSkiaTextBaseline.Top; - canvas.FillRect((float)(471), (float)(284.3), (float)(1), (float)(54.99999999999994)); - canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); - canvas.FillRect((float)(472), (float)(284), (float)(25.1767578125), (float)(1.04)); - canvas.FillRect((float)(505.4765625), (float)(284), (float)(32.2435302734375), (float)(1.04)); - canvas.FillRect((float)(546.0198974609375), (float)(284), (float)(72.786865234375), (float)(1.04)); - canvas.FillRect((float)(627.1065673828125), (float)(284), (float)(50.8934326171875), (float)(1.04)); - canvas.FillRect((float)(472), (float)(295), (float)(25.1767578125), (float)(1.04)); - canvas.FillRect((float)(505.4765625), (float)(295), (float)(32.2435302734375), (float)(1.04)); - canvas.FillRect((float)(546.0198974609375), (float)(295), (float)(72.786865234375), (float)(1.04)); - canvas.FillRect((float)(627.1065673828125), (float)(295), (float)(50.8934326171875), (float)(1.04)); - canvas.FillRect((float)(472), (float)(306), (float)(25.1767578125), (float)(1.04)); - canvas.FillRect((float)(505.4765625), (float)(306), (float)(32.2435302734375), (float)(1.04)); - canvas.FillRect((float)(546.0198974609375), (float)(306), (float)(32.2435302734375), (float)(1.04)); - canvas.FillRect((float)(586.563232421875), (float)(306), (float)(32.2435302734375), (float)(1.04)); - canvas.FillRect((float)(627.1065673828125), (float)(306), (float)(50.8934326171875), (float)(1.04)); - canvas.FillRect((float)(472), (float)(317), (float)(65.7200927734375), (float)(1.04)); - canvas.FillRect((float)(546.0198974609375), (float)(317), (float)(32.2435302734375), (float)(1.04)); - canvas.FillRect((float)(586.563232421875), (float)(317), (float)(32.2435302734375), (float)(1.04)); - canvas.FillRect((float)(627.1065673828125), (float)(317), (float)(50.8934326171875), (float)(1.04)); - canvas.FillRect((float)(472), (float)(328), (float)(65.7200927734375), (float)(1.04)); - canvas.FillRect((float)(546.0198974609375), (float)(328), (float)(32.2435302734375), (float)(1.04)); - canvas.FillRect((float)(586.563232421875), (float)(328), (float)(32.2435302734375), (float)(1.04)); - canvas.FillRect((float)(627.1065673828125), (float)(328), (float)(50.8934326171875), (float)(1.04)); - canvas.FillRect((float)(472), (float)(339), (float)(206), (float)(1.04)); - canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); - canvas.BeginPath(); - canvas.MoveTo((float)(488), (float)(275.8)); - canvas.LineTo((float)(488), (float)(312.8)); - canvas.Stroke(); - canvas.BeginPath(); - canvas.MoveTo((float)(488), (float)(275.8)); - canvas.LineTo((float)(492), (float)(283.8)); - canvas.LineTo((float)(484), (float)(283.8)); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(13); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(11); + canvas.FillText("", TextStyle, FontSize, (float)(399.52361605132126), (float)(249.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(13); + canvas.FillText("5", TextStyle, FontSize, (float)(389.0876114126494), (float)(249.3199951171875), TextAlign, TextBaseline); + TextBaseline = AlphaSkiaTextBaseline.Top; + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.FillRect((float)(432), (float)(216.3199951171875), (float)(1), (float)(54.99999999999994)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.FillRect((float)(433), (float)(216), (float)(25.292007446289062), (float)(1.04)); + canvas.FillRect((float)(466.72801208496094), (float)(216), (float)(32.061492919921875), (float)(1.04)); + canvas.FillRect((float)(507.2255096435547), (float)(216), (float)(72.55899047851562), (float)(1.04)); + canvas.FillRect((float)(588.2205047607422), (float)(216), (float)(36.77949523925781), (float)(1.04)); + canvas.FillRect((float)(433), (float)(227), (float)(25.292007446289062), (float)(1.04)); + canvas.FillRect((float)(466.72801208496094), (float)(227), (float)(32.061492919921875), (float)(1.04)); + canvas.FillRect((float)(507.2255096435547), (float)(227), (float)(72.55899047851562), (float)(1.04)); + canvas.FillRect((float)(588.2205047607422), (float)(227), (float)(36.77949523925781), (float)(1.04)); + canvas.FillRect((float)(433), (float)(238), (float)(25.292007446289062), (float)(1.04)); + canvas.FillRect((float)(466.72801208496094), (float)(238), (float)(32.061492919921875), (float)(1.04)); + canvas.FillRect((float)(507.2255096435547), (float)(238), (float)(32.061492919921875), (float)(1.04)); + canvas.FillRect((float)(547.7230072021484), (float)(238), (float)(32.061492919921875), (float)(1.04)); + canvas.FillRect((float)(588.2205047607422), (float)(238), (float)(36.77949523925781), (float)(1.04)); + canvas.FillRect((float)(433), (float)(249), (float)(65.78950500488281), (float)(1.04)); + canvas.FillRect((float)(507.2255096435547), (float)(249), (float)(32.061492919921875), (float)(1.04)); + canvas.FillRect((float)(547.7230072021484), (float)(249), (float)(32.061492919921875), (float)(1.04)); + canvas.FillRect((float)(588.2205047607422), (float)(249), (float)(36.77949523925781), (float)(1.04)); + canvas.FillRect((float)(433), (float)(260), (float)(65.78950500488281), (float)(1.04)); + canvas.FillRect((float)(507.2255096435547), (float)(260), (float)(32.061492919921875), (float)(1.04)); + canvas.FillRect((float)(547.7230072021484), (float)(260), (float)(32.061492919921875), (float)(1.04)); + canvas.FillRect((float)(588.2205047607422), (float)(260), (float)(36.77949523925781), (float)(1.04)); + canvas.FillRect((float)(433), (float)(271), (float)(192), (float)(1.04)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.BeginPath(); + canvas.MoveTo((float)(449), (float)(207.8199951171875)); + canvas.LineTo((float)(449), (float)(244.8199951171875)); + canvas.Stroke(); + canvas.BeginPath(); + canvas.MoveTo((float)(449), (float)(207.8199951171875)); + canvas.LineTo((float)(453), (float)(215.8199951171875)); + canvas.LineTo((float)(445), (float)(215.8199951171875)); canvas.ClosePath(); canvas.Fill(); TextBaseline = AlphaSkiaTextBaseline.Middle; - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(507.4765625), (float)(284.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(468.72801208496094), (float)(216.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("0", Typeface, FontSize, (float)(497.1767578125), (float)(284.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("0", TextStyle, FontSize, (float)(458.29200744628906), (float)(216.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(507.4765625), (float)(295.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(468.72801208496094), (float)(227.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("1", Typeface, FontSize, (float)(497.1767578125), (float)(295.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("1", TextStyle, FontSize, (float)(458.29200744628906), (float)(227.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(507.4765625), (float)(306.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(468.72801208496094), (float)(238.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("0", Typeface, FontSize, (float)(497.1767578125), (float)(306.3), TextAlign, TextBaseline); + canvas.FillText("0", TextStyle, FontSize, (float)(458.29200744628906), (float)(238.3199951171875), TextAlign, TextBaseline); TextBaseline = AlphaSkiaTextBaseline.Top; - canvas.BeginRotate((float)(527.7200927734375), (float)(326.8), (float)(-90)); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(0), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(10.799999999999999), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(21.599999999999998), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(32.4), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(43.199999999999996), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.BeginRotate((float)(488.7895050048828), (float)(258.8199951171875), (float)(-90)); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(0), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(10.799999999999999), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(21.599999999999998), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(32.4), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(43.199999999999996), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.EndRotate(); canvas.BeginPath(); - canvas.MoveTo((float)(528), (float)(334.8)); - canvas.LineTo((float)(532), (float)(326.8)); - canvas.LineTo((float)(524), (float)(326.8)); + canvas.MoveTo((float)(489), (float)(266.8199951171875)); + canvas.LineTo((float)(493), (float)(258.8199951171875)); + canvas.LineTo((float)(485), (float)(258.8199951171875)); canvas.ClosePath(); canvas.Fill(); TextBaseline = AlphaSkiaTextBaseline.Middle; - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(548.0198974609375), (float)(284.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(509.2255096435547), (float)(216.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("0", Typeface, FontSize, (float)(537.7200927734375), (float)(284.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("0", TextStyle, FontSize, (float)(498.7895050048828), (float)(216.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(548.0198974609375), (float)(295.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(509.2255096435547), (float)(227.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("1", Typeface, FontSize, (float)(537.7200927734375), (float)(295.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("1", TextStyle, FontSize, (float)(498.7895050048828), (float)(227.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(548.0198974609375), (float)(306.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(509.2255096435547), (float)(238.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("0", Typeface, FontSize, (float)(537.7200927734375), (float)(306.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("0", TextStyle, FontSize, (float)(498.7895050048828), (float)(238.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(548.0198974609375), (float)(317.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(509.2255096435547), (float)(249.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("2", Typeface, FontSize, (float)(537.7200927734375), (float)(317.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("2", TextStyle, FontSize, (float)(498.7895050048828), (float)(249.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(548.0198974609375), (float)(328.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(509.2255096435547), (float)(260.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("3", Typeface, FontSize, (float)(537.7200927734375), (float)(328.3), TextAlign, TextBaseline); + canvas.FillText("3", TextStyle, FontSize, (float)(498.7895050048828), (float)(260.3199951171875), TextAlign, TextBaseline); TextBaseline = AlphaSkiaTextBaseline.Top; canvas.BeginPath(); - canvas.MoveTo((float)(569), (float)(297.8)); - canvas.LineTo((float)(569), (float)(334.8)); + canvas.MoveTo((float)(530), (float)(229.8199951171875)); + canvas.LineTo((float)(530), (float)(266.8199951171875)); canvas.Stroke(); canvas.BeginPath(); - canvas.MoveTo((float)(569), (float)(297.8)); - canvas.LineTo((float)(573), (float)(305.8)); - canvas.LineTo((float)(565), (float)(305.8)); + canvas.MoveTo((float)(530), (float)(229.8199951171875)); + canvas.LineTo((float)(534), (float)(237.8199951171875)); + canvas.LineTo((float)(526), (float)(237.8199951171875)); canvas.ClosePath(); canvas.Fill(); TextBaseline = AlphaSkiaTextBaseline.Middle; - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(588.563232421875), (float)(306.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(549.7230072021484), (float)(238.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("2", Typeface, FontSize, (float)(578.263427734375), (float)(306.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("2", TextStyle, FontSize, (float)(539.2870025634766), (float)(238.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(588.563232421875), (float)(317.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(549.7230072021484), (float)(249.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("2", Typeface, FontSize, (float)(578.263427734375), (float)(317.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("2", TextStyle, FontSize, (float)(539.2870025634766), (float)(249.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(588.563232421875), (float)(328.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(549.7230072021484), (float)(260.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("0", Typeface, FontSize, (float)(578.263427734375), (float)(328.3), TextAlign, TextBaseline); + canvas.FillText("0", TextStyle, FontSize, (float)(539.2870025634766), (float)(260.3199951171875), TextAlign, TextBaseline); TextBaseline = AlphaSkiaTextBaseline.Top; - canvas.BeginRotate((float)(596.8067626953125), (float)(283.8), (float)(90)); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(0), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(10.799999999999999), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(21.599999999999998), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(32.4), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.FillText("\uEAA4", MusicTypeface, (float)(MusicFontSize * 1.2), (float)(43.199999999999996), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.BeginRotate((float)(569.7845001220703), (float)(215.8199951171875), (float)(90)); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(0), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(10.799999999999999), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(21.599999999999998), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(32.4), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.FillText("\uEAA4", MusicTextStyle, (float)(MusicFontSize * 1.2), (float)(43.199999999999996), (float)(10.799999999999999), AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.EndRotate(); canvas.BeginPath(); - canvas.MoveTo((float)(597), (float)(275.8)); - canvas.LineTo((float)(601), (float)(283.8)); - canvas.LineTo((float)(593), (float)(283.8)); + canvas.MoveTo((float)(570), (float)(207.8199951171875)); + canvas.LineTo((float)(574), (float)(215.8199951171875)); + canvas.LineTo((float)(566), (float)(215.8199951171875)); canvas.ClosePath(); canvas.Fill(); TextBaseline = AlphaSkiaTextBaseline.Middle; - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - Typeface = GetTypeface("Roboto", false, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(629.1065673828125), (float)(284.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(590.2205047607422), (float)(216.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("0", Typeface, FontSize, (float)(618.8067626953125), (float)(284.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("0", TextStyle, FontSize, (float)(579.7845001220703), (float)(216.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(629.1065673828125), (float)(295.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(590.2205047607422), (float)(227.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("2", Typeface, FontSize, (float)(618.8067626953125), (float)(295.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("2", TextStyle, FontSize, (float)(579.7845001220703), (float)(227.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(629.1065673828125), (float)(306.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(590.2205047607422), (float)(238.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("2", Typeface, FontSize, (float)(618.8067626953125), (float)(306.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("2", TextStyle, FontSize, (float)(579.7845001220703), (float)(238.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(629.1065673828125), (float)(317.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(590.2205047607422), (float)(249.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("2", Typeface, FontSize, (float)(618.8067626953125), (float)(317.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("2", TextStyle, FontSize, (float)(579.7845001220703), (float)(249.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(11); - canvas.FillText("", Typeface, FontSize, (float)(629.1065673828125), (float)(328.3), TextAlign, TextBaseline); - Typeface = GetTypeface("Roboto", false, false); + canvas.FillText("", TextStyle, FontSize, (float)(590.2205047607422), (float)(260.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); FontSize = (float)(13); - canvas.FillText("0", Typeface, FontSize, (float)(618.8067626953125), (float)(328.3), TextAlign, TextBaseline); + canvas.FillText("0", TextStyle, FontSize, (float)(579.7845001220703), (float)(260.3199951171875), TextAlign, TextBaseline); TextBaseline = AlphaSkiaTextBaseline.Top; - canvas.FillRect((float)(670), (float)(284.3), (float)(1), (float)(54.99999999999994)); - canvas.FillRect((float)(674), (float)(284.3), (float)(4), (float)(54.99999999999994)); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); - canvas.BeginPath(); - canvas.MoveTo((float)(92), (float)(130.1)); - canvas.LineTo((float)(92), (float)(339.3)); - canvas.Stroke(); - Typeface = GetTypeface("PT Serif", false, true); + canvas.FillRect((float)(624), (float)(216.3199951171875), (float)(1), (float)(54.99999999999994)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.FillRect((float)(625), (float)(216), (float)(82), (float)(1.04)); + canvas.FillRect((float)(625), (float)(227), (float)(82), (float)(1.04)); + canvas.FillRect((float)(625), (float)(238), (float)(82), (float)(1.04)); + canvas.FillRect((float)(625), (float)(249), (float)(82), (float)(1.04)); + canvas.FillRect((float)(625), (float)(260), (float)(82), (float)(1.04)); + canvas.FillRect((float)(625), (float)(271), (float)(82), (float)(1.04)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.FillRect((float)(706), (float)(216.3199951171875), (float)(1), (float)(54.99999999999994)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.FillRect((float)(707), (float)(216), (float)(163), (float)(1.04)); + canvas.FillRect((float)(707), (float)(227), (float)(12.074005126953125), (float)(1.04)); + canvas.FillRect((float)(727.510009765625), (float)(227), (float)(28.11599349975586), (float)(1.04)); + canvas.FillRect((float)(764.0620079040527), (float)(227), (float)(28.11599349975586), (float)(1.04)); + canvas.FillRect((float)(800.6140060424805), (float)(227), (float)(28.115989685058594), (float)(1.04)); + canvas.FillRect((float)(837.1660003662109), (float)(227), (float)(32.83399963378906), (float)(1.04)); + canvas.FillRect((float)(707), (float)(238), (float)(163), (float)(1.04)); + canvas.FillRect((float)(707), (float)(249), (float)(163), (float)(1.04)); + canvas.FillRect((float)(707), (float)(260), (float)(163), (float)(1.04)); + canvas.FillRect((float)(707), (float)(271), (float)(163), (float)(1.04)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + TextBaseline = AlphaSkiaTextBaseline.Middle; + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(13); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(11); + canvas.FillText("", TextStyle, FontSize, (float)(729.510009765625), (float)(227.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(13); + canvas.FillText("3", TextStyle, FontSize, (float)(719.0740051269531), (float)(227.3199951171875), TextAlign, TextBaseline); + TextBaseline = AlphaSkiaTextBaseline.Top; + TextBaseline = AlphaSkiaTextBaseline.Middle; + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(13); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(11); + canvas.FillText("", TextStyle, FontSize, (float)(766.0620079040527), (float)(227.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(13); + canvas.FillText("3", TextStyle, FontSize, (float)(755.6260032653809), (float)(227.3199951171875), TextAlign, TextBaseline); + TextBaseline = AlphaSkiaTextBaseline.Top; + TextBaseline = AlphaSkiaTextBaseline.Middle; + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(13); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(11); + canvas.FillText("", TextStyle, FontSize, (float)(802.6140060424805), (float)(227.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(13); + canvas.FillText("3", TextStyle, FontSize, (float)(792.1780014038086), (float)(227.3199951171875), TextAlign, TextBaseline); + TextBaseline = AlphaSkiaTextBaseline.Top; + TextBaseline = AlphaSkiaTextBaseline.Middle; + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(13); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(11); + canvas.FillText("", TextStyle, FontSize, (float)(839.1660041809082), (float)(227.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(13); + canvas.FillText("3", TextStyle, FontSize, (float)(828.7299995422363), (float)(227.3199951171875), TextAlign, TextBaseline); + TextBaseline = AlphaSkiaTextBaseline.Top; + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.FillRect((float)(869), (float)(216.3199951171875), (float)(1), (float)(54.99999999999994)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255)); + canvas.FillRect((float)(870), (float)(216), (float)(60), (float)(1.04)); + canvas.FillRect((float)(870), (float)(227), (float)(12.074005126953125), (float)(1.04)); + canvas.FillRect((float)(890.510009765625), (float)(227), (float)(39.489990234375), (float)(1.04)); + canvas.FillRect((float)(870), (float)(238), (float)(60), (float)(1.04)); + canvas.FillRect((float)(870), (float)(249), (float)(60), (float)(1.04)); + canvas.FillRect((float)(870), (float)(260), (float)(60), (float)(1.04)); + canvas.FillRect((float)(870), (float)(271), (float)(60), (float)(1.04)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + TextBaseline = AlphaSkiaTextBaseline.Middle; + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(13); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(11); + canvas.FillText("", TextStyle, FontSize, (float)(892.510009765625), (float)(227.3199951171875), TextAlign, TextBaseline); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + FontSize = (float)(13); + canvas.FillText("3", TextStyle, FontSize, (float)(882.0740051269531), (float)(227.3199951171875), TextAlign, TextBaseline); + TextBaseline = AlphaSkiaTextBaseline.Top; + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + canvas.FillRect((float)(922), (float)(216.3199951171875), (float)(1), (float)(54.99999999999994)); + canvas.FillRect((float)(926), (float)(216.3199951171875), (float)(4), (float)(54.99999999999994)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100)); + TextStyle = GetTextStyle(new []{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, true); FontSize = (float)(12); - canvas.FillText("s.guit.", Typeface, FontSize, (float)(50), (float)(130.1), TextAlign, TextBaseline); - canvas.FillRect((float)(86), (float)(118.1), (float)(3), (float)(233.20000000000002)); - canvas.BeginPath(); - canvas.MoveTo((float)(86), (float)(118.1)); - canvas.BezierCurveTo((float)(86), (float)(118.1), (float)(86), (float)(118.1), (float)(98), (float)(115.1)); - canvas.BezierCurveTo((float)(92), (float)(121.1), (float)(86), (float)(121.1), (float)(86), (float)(121.1)); - canvas.ClosePath(); - canvas.Fill(); - canvas.BeginPath(); - canvas.MoveTo((float)(86), (float)(351.3)); - canvas.BezierCurveTo((float)(86), (float)(351.3), (float)(92), (float)(351.3), (float)(98), (float)(354.3)); - canvas.BezierCurveTo((float)(92), (float)(348.3), (float)(86), (float)(348.3), (float)(86), (float)(348.3)); - canvas.ClosePath(); - canvas.Fill(); + TextBaseline = AlphaSkiaTextBaseline.Bottom; + TextAlign = AlphaSkiaTextAlign.Center; + canvas.BeginRotate((float)(42), (float)(179.6199951171875), (float)(-90.1)); + canvas.FillText("s.guit.", TextStyle, FontSize, (float)(0), (float)(0), TextAlign, TextBaseline); + canvas.EndRotate(); + TextBaseline = AlphaSkiaTextBaseline.Top; + TextAlign = AlphaSkiaTextAlign.Left; + canvas.FillRect((float)(48), (float)(123.91999511718751), (float)(1), (float)(93)); + return canvas.EndRender(); + } + private static AlphaSkiaImage? DrawMusicSheetPart4(AlphaSkiaCanvas canvas) + { + canvas.BeginRender(709, 14, (float)(RenderScale)); + canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(153), (byte)(204), (byte)(30), (byte)(255)); + TextAlign = AlphaSkiaTextAlign.Left; + TextBaseline = AlphaSkiaTextBaseline.Top; + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 700, false); + FontSize = (float)(12); + TextAlign = AlphaSkiaTextAlign.Center; + canvas.FillText("Copyright", TextStyle, FontSize, (float)(650), (float)(0), TextAlign, TextBaseline); + TextAlign = AlphaSkiaTextAlign.Left; + TextBaseline = AlphaSkiaTextBaseline.Top; return canvas.EndRender(); } private static AlphaSkiaImage? DrawMusicSheetPart5(AlphaSkiaCanvas canvas) { - canvas.BeginRender(116, 24, (float)(RenderScale)); + canvas.BeginRender(779, 12, (float)(RenderScale)); canvas.Color = AlphaSkiaCanvas.RgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255)); - Typeface = GetTypeface("Roboto", true, false); + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 700, false); + FontSize = (float)(12); + TextAlign = AlphaSkiaTextAlign.Left; + TextBaseline = AlphaSkiaTextBaseline.Top; + TextStyle = GetTextStyle(new []{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 700, false); FontSize = (float)(12); + TextAlign = AlphaSkiaTextAlign.Center; + canvas.FillText("rendered by alphaTab", TextStyle, FontSize, (float)(650), (float)(0), TextAlign, TextBaseline); TextAlign = AlphaSkiaTextAlign.Left; - canvas.FillText("rendered by alphaTab", Typeface, FontSize, (float)(0), (float)(12), TextAlign, TextBaseline); + TextBaseline = AlphaSkiaTextBaseline.Top; return canvas.EndRender(); } public static float[,] PartPositions => new float[,] { - {(float)0, (float)0, (float)1300, (float)164}, {(float)0, (float)164, (float)1300, (float)38}, {(float)0, (float)202, (float)1300, (float)6}, {(float)0, (float)208, (float)1300, (float)373}, {(float)591.962890625, (float)581, (float)116.07421875, (float)24} + {(float)0, (float)35, (float)1300, (float)124}, {(float)0, (float)159, (float)1300, (float)12}, {(float)0, (float)171, (float)1300, (float)285}, {(float)0, (float)456, (float)709, (float)14}, {(float)0, (float)470, (float)779.2159881591797, (float)12} }; public static int TotalWidth => (int)1300; - public static int TotalHeight => (int)605; + public static int TotalHeight => (int)482; public static Func[] AllParts => new[] { DrawMusicSheetPart1, DrawMusicSheetPart2, DrawMusicSheetPart3, DrawMusicSheetPart4, DrawMusicSheetPart5 diff --git a/test/dotnet/AlphaSkia.Test/Program.cs b/test/dotnet/AlphaSkia.Test/Program.cs index 61fa377..9d25067 100644 --- a/test/dotnet/AlphaSkia.Test/Program.cs +++ b/test/dotnet/AlphaSkia.Test/Program.cs @@ -63,25 +63,25 @@ public static int Main(string[] args) // Load all fonts for rendering Console.WriteLine("Loading fonts"); var testDataPath = Path.Combine(repositoryRoot, "test", "test-data"); - 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")); - AlphaTabGeneratedRenderTest.LoadTypeface("Roboto", true, false, - Path.Combine(testDataPath, "font", "roboto", "Roboto-Bold.ttf")); - AlphaTabGeneratedRenderTest.LoadTypeface("Roboto", false, true, - Path.Combine(testDataPath, "font", "roboto", "Roboto-Italic.ttf")); - AlphaTabGeneratedRenderTest.LoadTypeface("Roboto", true, true, - Path.Combine(testDataPath, "font", "roboto", "Roboto-BoldItalic.ttf")); - AlphaTabGeneratedRenderTest.LoadTypeface("PT Serif", false, false, - Path.Combine(testDataPath, "font", "ptserif", "PTSerif-Regular.ttf")); - AlphaTabGeneratedRenderTest.LoadTypeface("PT Serif", true, false, - Path.Combine(testDataPath, "font", "ptserif", "PTSerif-Bold.ttf")); - AlphaTabGeneratedRenderTest.LoadTypeface("PT Serif", false, true, - Path.Combine(testDataPath, "font", "ptserif", "PTSerif-Italic.ttf")); - AlphaTabGeneratedRenderTest.LoadTypeface("PT Serif", true, true, - Path.Combine(testDataPath, "font", "ptserif", "PTSerif-BoldItalic.ttf")); + var musicTypeface = AlphaTabGeneratedRenderTest.LoadTypeface(Path.Combine(testDataPath, "font", "bravura", "Bravura.otf")); + + AlphaTabGeneratedRenderTest.MusicTextStyle = new AlphaSkiaTextStyle( + new[] { musicTypeface.FamilyName }, + musicTypeface.Weight, + musicTypeface.IsItalic + ); + + AlphaTabGeneratedRenderTest.LoadTypeface(Path.Combine(testDataPath, "font", "noto-sans", "NotoSans-Regular.otf")); + AlphaTabGeneratedRenderTest.LoadTypeface(Path.Combine(testDataPath, "font", "noto-sans", "NotoSans-Bold.otf")); + AlphaTabGeneratedRenderTest.LoadTypeface(Path.Combine(testDataPath, "font", "noto-sans", "NotoSans-Italic.otf")); + AlphaTabGeneratedRenderTest.LoadTypeface(Path.Combine(testDataPath, "font", "noto-sans", "NotoSans-BoldItalic.otf")); + AlphaTabGeneratedRenderTest.LoadTypeface(Path.Combine(testDataPath, "font", "noto-serif", "NotoSerif-Regular.otf")); + AlphaTabGeneratedRenderTest.LoadTypeface(Path.Combine(testDataPath, "font", "noto-serif", "NotoSerif-Bold.otf")); + AlphaTabGeneratedRenderTest.LoadTypeface(Path.Combine(testDataPath, "font", "noto-serif", "NotoSerif-Italic.otf")); + AlphaTabGeneratedRenderTest.LoadTypeface(Path.Combine(testDataPath, "font", "noto-serif", "NotoSerif-BoldItalic.otf")); + AlphaTabGeneratedRenderTest.LoadTypeface(Path.Combine(testDataPath, "font", "noto-music", "NotoMusic-Regular.otf")); + AlphaTabGeneratedRenderTest.LoadTypeface(Path.Combine(testDataPath, "font", "noto-color-emoji", "NotoColorEmoji_WindowsCompatible.ttf")); + Console.WriteLine("Fonts loaded"); // render full image diff --git a/test/java/build.gradle.kts b/test/java/build.gradle.kts index 8072dac..65216ed 100644 --- a/test/java/build.gradle.kts +++ b/test/java/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "alphaTab.alphaSkia" -version = "2.3.0-LOCAL" +version = "2.3.135-SNAPSHOT" // Use any latest version var alphaSkiaVersion = version diff --git a/test/java/gradle/wrapper/gradle-wrapper.jar b/test/java/gradle/wrapper/gradle-wrapper.jar index 249e583..2c35211 100644 Binary files a/test/java/gradle/wrapper/gradle-wrapper.jar and b/test/java/gradle/wrapper/gradle-wrapper.jar differ diff --git a/test/java/gradle/wrapper/gradle-wrapper.properties b/test/java/gradle/wrapper/gradle-wrapper.properties index 33a06b2..e18bc25 100644 --- a/test/java/gradle/wrapper/gradle-wrapper.properties +++ b/test/java/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ -#Sun Oct 15 12:27:03 CEST 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/test/java/src/main/generated/alphaTab/alphaSkia/test/AlphaTabGeneratedRenderTest.java b/test/java/src/main/generated/alphaTab/alphaSkia/test/AlphaTabGeneratedRenderTest.java index bedcfea..f5f67c5 100644 --- a/test/java/src/main/generated/alphaTab/alphaSkia/test/AlphaTabGeneratedRenderTest.java +++ b/test/java/src/main/generated/alphaTab/alphaSkia/test/AlphaTabGeneratedRenderTest.java @@ -5,742 +5,1069 @@ public class AlphaTabGeneratedRenderTest extends AlphaTabGeneratedRenderTestBase { private static AlphaSkiaImage drawMusicSheetPart1(AlphaSkiaCanvas canvas) { - canvas.beginRender(1300, 164, (float)(getRenderScale())); + canvas.beginRender(1300, 124, (float)(getRenderScale())); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(204), (byte)(30), (byte)(255))); setTextAlign(AlphaSkiaTextAlign.CENTER); - setTypeface(getTypeface("PT Serif", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(32)); setTextAlign(AlphaSkiaTextAlign.CENTER); - canvas.fillText("Title", getTypeface(), getFontSize(), (float)(650), (float)(40), getTextAlign(), getTextBaseline()); + canvas.fillText("Title", getTextStyle(), getFontSize(), (float)(650), (float)(0), getTextAlign(), getTextBaseline()); setTextAlign(AlphaSkiaTextAlign.CENTER); - setTypeface(getTypeface("PT Serif", false, false)); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextStyle(getTextStyle(new String[]{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(20)); setTextAlign(AlphaSkiaTextAlign.CENTER); - canvas.fillText("Subtitle", getTypeface(), getFontSize(), (float)(650), (float)(72), getTextAlign(), getTextBaseline()); + canvas.fillText("Subtitle", getTextStyle(), getFontSize(), (float)(650), (float)(32), getTextAlign(), getTextBaseline()); setTextAlign(AlphaSkiaTextAlign.CENTER); - setTypeface(getTypeface("PT Serif", false, false)); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextStyle(getTextStyle(new String[]{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(20)); setTextAlign(AlphaSkiaTextAlign.CENTER); - canvas.fillText("Artist", getTypeface(), getFontSize(), (float)(650), (float)(92), getTextAlign(), getTextBaseline()); + canvas.fillText("Artist", getTextStyle(), getFontSize(), (float)(650), (float)(52), getTextAlign(), getTextBaseline()); setTextAlign(AlphaSkiaTextAlign.CENTER); - setTypeface(getTypeface("PT Serif", false, false)); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextStyle(getTextStyle(new String[]{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(20)); setTextAlign(AlphaSkiaTextAlign.CENTER); - canvas.fillText("Album", getTypeface(), getFontSize(), (float)(650), (float)(112), getTextAlign(), getTextBaseline()); + canvas.fillText("Album", getTextStyle(), getFontSize(), (float)(650), (float)(72), getTextAlign(), getTextBaseline()); setTextAlign(AlphaSkiaTextAlign.CENTER); - setTypeface(getTypeface("PT Serif", false, false)); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextStyle(getTextStyle(new String[]{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(15)); - setTextAlign(AlphaSkiaTextAlign.RIGHT); - canvas.fillText("Music by Music", getTypeface(), getFontSize(), (float)(1260), (float)(132), getTextAlign(), getTextBaseline()); + setTextAlign(AlphaSkiaTextAlign.LEFT); + canvas.fillText("Words by Words", getTextStyle(), getFontSize(), (float)(35), (float)(92), getTextAlign(), getTextBaseline()); setTextAlign(AlphaSkiaTextAlign.CENTER); - setTypeface(getTypeface("PT Serif", false, false)); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextStyle(getTextStyle(new String[]{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(15)); - setTextAlign(AlphaSkiaTextAlign.LEFT); - canvas.fillText("Words by Words", getTypeface(), getFontSize(), (float)(40), (float)(132), getTextAlign(), getTextBaseline()); + setTextAlign(AlphaSkiaTextAlign.RIGHT); + canvas.fillText("Music by Music", getTextStyle(), getFontSize(), (float)(1265), (float)(92), getTextAlign(), getTextBaseline()); setTextAlign(AlphaSkiaTextAlign.CENTER); + setTextBaseline(AlphaSkiaTextBaseline.TOP); return canvas.endRender(); } private static AlphaSkiaImage drawMusicSheetPart2(AlphaSkiaCanvas canvas) { - canvas.beginRender(1300, 38, (float)(getRenderScale())); + canvas.beginRender(1300, 12, (float)(getRenderScale())); setTextAlign(AlphaSkiaTextAlign.CENTER); - setTypeface(getTypeface("PT Serif", false, true)); + setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); + setTextStyle(getTextStyle(new String[]{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, true)); setFontSize((float)(12)); setTextAlign(AlphaSkiaTextAlign.LEFT); - canvas.fillText("Guitar Standard Tuning", getTypeface(), getFontSize(), (float)(40), (float)(3), getTextAlign(), getTextBaseline()); + canvas.fillText("Guitar Standard Tuning", getTextStyle(), getFontSize(), (float)(35), (float)(4.5659942626953125), getTextAlign(), getTextBaseline()); setTextAlign(AlphaSkiaTextAlign.CENTER); + setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); return canvas.endRender(); } private static AlphaSkiaImage drawMusicSheetPart3(AlphaSkiaCanvas canvas) { - canvas.beginRender(1300, 6, (float)(getRenderScale())); - setTextAlign(AlphaSkiaTextAlign.CENTER); - return canvas.endRender(); - } - private static AlphaSkiaImage drawMusicSheetPart4(AlphaSkiaCanvas canvas) { - canvas.beginRender(1300, 373, (float)(getRenderScale())); + canvas.beginRender(1300, 285, (float)(getRenderScale())); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); setTextAlign(AlphaSkiaTextAlign.LEFT); - setTypeface(getTypeface("PT Serif", true, false)); + setTextStyle(getTextStyle(new String[]{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 700, false)); setFontSize((float)(14)); - canvas.fillText("\uE1D5", getMusicTypeface(), (float)(getMusicFontSize() * 0.75), (float)(156.6767578125), (float)(40), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("= 120", getTypeface(), getFontSize(), (float)(169.1767578125), (float)(27), getTextAlign(), getTextBaseline()); - canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); - canvas.fillRect((float)(92), (float)(130), (float)(254), (float)(1.04)); - canvas.fillRect((float)(92), (float)(139), (float)(254), (float)(1.04)); - canvas.fillRect((float)(92), (float)(148), (float)(254), (float)(1.04)); - canvas.fillRect((float)(92), (float)(157), (float)(254), (float)(1.04)); - canvas.fillRect((float)(92), (float)(166), (float)(254), (float)(1.04)); - canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); - canvas.fillText("\uE050", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(94), (float)(157.52), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE084", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(127), (float)(139), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE084", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(127), (float)(157), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + canvas.fillText("\uE1D5", getMusicTextStyle(), (float)(getMusicFontSize() * 0.5), (float)(117.79200744628906), (float)(25), AlphaSkiaTextAlign.CENTER, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("= 120", getTextStyle(), getFontSize(), (float)(125.79200744628906), (float)(12), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, true)); + setFontSize((float)(12)); + setTextAlign(AlphaSkiaTextAlign.LEFT); + canvas.fillText("Fallback Font (\uD834\uDD1E \uD834\uDD5F \uD83C\uDFB8 \uD83E\uDD18\uD83C\uDFFB)", getTextStyle(), getFontSize(), (float)(885.7920074462891), (float)(30), getTextAlign(), getTextBaseline()); + setTextAlign(AlphaSkiaTextAlign.LEFT); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(722.7920074462891), (float)(53.5199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(733.592007446289), (float)(53.5199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(744.3920074462891), (float)(53.5199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(755.192007446289), (float)(53.5199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(765.9920074462891), (float)(53.5199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(776.7920074462891), (float)(53.5199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(787.592007446289), (float)(53.5199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(798.3920074462891), (float)(53.5199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(809.192007446289), (float)(53.5199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(819.9920074462891), (float)(53.5199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.fillRect((float)(48), (float)(87), (float)(259), (float)(1.04)); + canvas.fillRect((float)(48), (float)(96), (float)(259), (float)(1.04)); + canvas.fillRect((float)(48), (float)(105), (float)(259), (float)(1.04)); + canvas.fillRect((float)(48), (float)(114), (float)(259), (float)(1.04)); + canvas.fillRect((float)(48), (float)(123), (float)(259), (float)(1.04)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.fillRect((float)(48), (float)(87.9199951171875), (float)(1), (float)(36.000000000000014)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE050", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(55), (float)(115.43999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE084", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(88), (float)(96.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE084", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(88), (float)(114.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(200), (byte)(0), (byte)(0), (byte)(255))); - setTypeface(getTypeface("Roboto", false, false)); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("1", getTypeface(), getFontSize(), (float)(141), (float)(118.75), getTextAlign(), getTextBaseline()); + canvas.fillText("1", getTextStyle(), getFontSize(), (float)(102), (float)(76.5699951171875), getTextAlign(), getTextBaseline()); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(113.29200744628906), (float)(105.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE272", getMusicTextStyle(), (float)(getMusicFontSize() * 0.75), (float)(134.16515249341666), (float)(105.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(152.1767578125), (float)(148), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE272", getMusicTypeface(), (float)(getMusicFontSize() * 0.75), (float)(172.86069962449085), (float)(148), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 0.75), (float)(180.86069962449085), (float)(149), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 0.75), (float)(142.16515249341666), (float)(106.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); canvas.beginPath(); - canvas.moveTo((float)(156.6767578125), (float)(144)); - canvas.lineTo((float)(170.855110706305), (float)(133.50723450810483)); - canvas.lineTo((float)(184.23569962449085), (float)(145)); + canvas.moveTo((float)(117.79200744628906), (float)(101.91999511718751)); + canvas.lineTo((float)(132.06224568469634), (float)(91.42713139901187)); + canvas.lineTo((float)(145.54015249341666), (float)(102.91999511718751)); canvas.stroke(); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(192.23569962449085), (float)(148), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 0.75), (float)(220.91964143648167), (float)(144.5), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(153.54015249341666), (float)(105.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 0.75), (float)(182.41329754054425), (float)(102.41999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); canvas.beginPath(); - canvas.moveTo((float)(196.73569962449085), (float)(144)); - canvas.lineTo((float)(209.12929655256082), (float)(131.33765133817155)); - canvas.lineTo((float)(224.29464143648167), (float)(140.5)); + canvas.moveTo((float)(158.04015249341666), (float)(101.91999511718751)); + canvas.lineTo((float)(170.53765225640643), (float)(89.25646922337823)); + canvas.lineTo((float)(185.78829754054425), (float)(98.41999511718751)); canvas.stroke(); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(232.29464143648167), (float)(148), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE262", getMusicTypeface(), (float)(getMusicFontSize() * 0.75), (float)(252.9785832484725), (float)(143.5), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 0.75), (float)(260.9785832484725), (float)(144.5), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(193.78829754054425), (float)(105.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE262", getMusicTextStyle(), (float)(getMusicFontSize() * 0.75), (float)(214.66144258767181), (float)(101.41999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 0.75), (float)(222.66144258767181), (float)(102.41999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); canvas.beginPath(); - canvas.moveTo((float)(236.79464143648167), (float)(144)); - canvas.lineTo((float)(249.1882383645516), (float)(131.33765133817155)); - canvas.lineTo((float)(264.3535832484725), (float)(140.5)); + canvas.moveTo((float)(198.28829754054425), (float)(101.91999511718751)); + canvas.lineTo((float)(210.785797303534), (float)(89.25646922337823)); + canvas.lineTo((float)(226.03644258767181), (float)(98.41999511718751)); canvas.stroke(); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(272.3535832484725), (float)(148), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 0.75), (float)(294.5517916242362), (float)(140), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(234.03644258767181), (float)(105.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 0.75), (float)(256.3932212938359), (float)(97.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); canvas.beginPath(); - canvas.moveTo((float)(276.8535832484725), (float)(152)); - canvas.lineTo((float)(292.1060513036615), (float)(156.93783819474976)); - canvas.lineTo((float)(297.9267916242362), (float)(142)); + canvas.moveTo((float)(238.53644258767181), (float)(109.91999511718751)); + canvas.lineTo((float)(253.8393894465572), (float)(114.87145189181567)); + canvas.lineTo((float)(259.7682212938359), (float)(99.91999511718751)); canvas.stroke(); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(305.9267916242362), (float)(148), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE262", getMusicTypeface(), (float)(getMusicFontSize() * 0.75), (float)(324.625), (float)(139), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 0.75), (float)(332.625), (float)(140), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(267.7682212938359), (float)(105.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE262", getMusicTextStyle(), (float)(getMusicFontSize() * 0.75), (float)(286.625), (float)(96.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 0.75), (float)(294.625), (float)(97.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); canvas.beginPath(); - canvas.moveTo((float)(310.4267916242362), (float)(152)); - canvas.lineTo((float)(327.2193887931866), (float)(157.24460932567123)); - canvas.lineTo((float)(336), (float)(142)); + canvas.moveTo((float)(272.2682212938359), (float)(109.91999511718751)); + canvas.lineTo((float)(289.1186648773111), (float)(115.17296188710615)); + canvas.lineTo((float)(298), (float)(99.91999511718751)); canvas.stroke(); - canvas.fillRect((float)(345), (float)(130.1), (float)(1), (float)(36)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.fillRect((float)(306), (float)(87.9199951171875), (float)(1), (float)(36.000000000000014)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); canvas.setLineWidth((float)(0.96)); canvas.beginPath(); - canvas.moveTo((float)(152.1767578125), (float)(148)); - canvas.lineTo((float)(152.1767578125), (float)(175)); + canvas.moveTo((float)(113.29200744628906), (float)(105.91999511718751)); + canvas.lineTo((float)(113.29200744628906), (float)(132.9199951171875)); canvas.stroke(); canvas.setLineWidth((float)(1)); canvas.setLineWidth((float)(0.96)); canvas.beginPath(); - canvas.moveTo((float)(192.23569962449085), (float)(148)); - canvas.lineTo((float)(192.23569962449085), (float)(175)); + canvas.moveTo((float)(153.54015249341666), (float)(105.91999511718751)); + canvas.lineTo((float)(153.54015249341666), (float)(132.9199951171875)); canvas.stroke(); canvas.setLineWidth((float)(1)); canvas.setLineWidth((float)(0.96)); canvas.beginPath(); - canvas.moveTo((float)(232.29464143648167), (float)(148)); - canvas.lineTo((float)(232.29464143648167), (float)(175)); + canvas.moveTo((float)(193.78829754054425), (float)(105.91999511718751)); + canvas.lineTo((float)(193.78829754054425), (float)(132.9199951171875)); canvas.stroke(); canvas.setLineWidth((float)(1)); canvas.setLineWidth((float)(0.96)); canvas.beginPath(); - canvas.moveTo((float)(281.3535832484725), (float)(148)); - canvas.lineTo((float)(281.3535832484725), (float)(121)); + canvas.moveTo((float)(243.03644258767181), (float)(105.91999511718751)); + canvas.lineTo((float)(243.03644258767181), (float)(78.91999511718751)); canvas.stroke(); canvas.setLineWidth((float)(1)); canvas.beginPath(); - canvas.moveTo((float)(281.3535832484725), (float)(121)); - canvas.lineTo((float)(314.9267916242362), (float)(121)); - canvas.lineTo((float)(314.9267916242362), (float)(125)); - canvas.lineTo((float)(281.3535832484725), (float)(125)); + canvas.moveTo((float)(243.03644258767181), (float)(78.91999511718751)); + canvas.lineTo((float)(276.7682212938359), (float)(78.91999511718751)); + canvas.lineTo((float)(276.7682212938359), (float)(82.91999511718751)); + canvas.lineTo((float)(243.03644258767181), (float)(82.91999511718751)); canvas.closePath(); canvas.fill(); canvas.setLineWidth((float)(0.96)); canvas.beginPath(); - canvas.moveTo((float)(314.9267916242362), (float)(148)); - canvas.lineTo((float)(314.9267916242362), (float)(121)); + canvas.moveTo((float)(276.7682212938359), (float)(105.91999511718751)); + canvas.lineTo((float)(276.7682212938359), (float)(78.91999511718751)); canvas.stroke(); canvas.setLineWidth((float)(1)); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); - canvas.fillRect((float)(346), (float)(130), (float)(126), (float)(1.04)); - canvas.fillRect((float)(346), (float)(139), (float)(126), (float)(1.04)); - canvas.fillRect((float)(346), (float)(148), (float)(126), (float)(1.04)); - canvas.fillRect((float)(346), (float)(157), (float)(126), (float)(1.04)); - canvas.fillRect((float)(346), (float)(166), (float)(126), (float)(1.04)); + canvas.fillRect((float)(307), (float)(87), (float)(126), (float)(1.04)); + canvas.fillRect((float)(307), (float)(96), (float)(126), (float)(1.04)); + canvas.fillRect((float)(307), (float)(105), (float)(126), (float)(1.04)); + canvas.fillRect((float)(307), (float)(114), (float)(126), (float)(1.04)); + canvas.fillRect((float)(307), (float)(123), (float)(126), (float)(1.04)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(200), (byte)(0), (byte)(0), (byte)(255))); - setTypeface(getTypeface("Roboto", false, false)); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("2", getTypeface(), getFontSize(), (float)(346), (float)(118.75), getTextAlign(), getTextBaseline()); + canvas.fillText("2", getTextStyle(), getFontSize(), (float)(307), (float)(76.5699951171875), getTextAlign(), getTextBaseline()); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(318.29200744628906), (float)(96.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(339.6478115199233), (float)(96.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(361.00361559355764), (float)(119.41999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A3", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(388.3056137319853), (float)(114.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.fillRect((float)(432), (float)(87.9199951171875), (float)(1), (float)(36.000000000000014)); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(357.1767578125), (float)(139), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(378.359547484596), (float)(139), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(399.542337156692), (float)(161.5), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A3", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(426.623147703567), (float)(157), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillRect((float)(471), (float)(130.1), (float)(1), (float)(36)); canvas.setLineWidth((float)(0.96)); canvas.beginPath(); - canvas.moveTo((float)(366.1767578125), (float)(139)); - canvas.lineTo((float)(366.1767578125), (float)(112)); + canvas.moveTo((float)(327.29200744628906), (float)(96.91999511718751)); + canvas.lineTo((float)(327.29200744628906), (float)(69.91999511718751)); canvas.stroke(); canvas.setLineWidth((float)(1)); canvas.beginPath(); - canvas.moveTo((float)(366.1767578125), (float)(112)); - canvas.lineTo((float)(387.359547484596), (float)(117)); - canvas.lineTo((float)(387.359547484596), (float)(121)); - canvas.lineTo((float)(366.1767578125), (float)(116)); + canvas.moveTo((float)(327.29200744628906), (float)(69.91999511718751)); + canvas.lineTo((float)(348.6478115199233), (float)(74.91999511718751)); + canvas.lineTo((float)(348.6478115199233), (float)(78.91999511718751)); + canvas.lineTo((float)(327.29200744628906), (float)(73.91999511718751)); canvas.closePath(); canvas.fill(); canvas.beginPath(); - canvas.moveTo((float)(366.1767578125), (float)(118)); - canvas.lineTo((float)(387.359547484596), (float)(123)); - canvas.lineTo((float)(387.359547484596), (float)(127)); - canvas.lineTo((float)(366.1767578125), (float)(122)); + canvas.moveTo((float)(327.29200744628906), (float)(75.91999511718751)); + canvas.lineTo((float)(348.6478115199233), (float)(80.91999511718751)); + canvas.lineTo((float)(348.6478115199233), (float)(84.91999511718751)); + canvas.lineTo((float)(327.29200744628906), (float)(79.91999511718751)); canvas.closePath(); canvas.fill(); canvas.setLineWidth((float)(0.96)); canvas.beginPath(); - canvas.moveTo((float)(387.359547484596), (float)(139)); - canvas.lineTo((float)(387.359547484596), (float)(117)); + canvas.moveTo((float)(348.6478115199233), (float)(96.91999511718751)); + canvas.lineTo((float)(348.6478115199233), (float)(74.91999511718751)); canvas.stroke(); canvas.setLineWidth((float)(1)); canvas.beginPath(); - canvas.moveTo((float)(387.359547484596), (float)(117)); - canvas.lineTo((float)(408.542337156692), (float)(122)); - canvas.lineTo((float)(408.542337156692), (float)(126)); - canvas.lineTo((float)(387.359547484596), (float)(121)); + canvas.moveTo((float)(348.6478115199233), (float)(74.91999511718751)); + canvas.lineTo((float)(370.00361559355764), (float)(79.91999511718751)); + canvas.lineTo((float)(370.00361559355764), (float)(83.91999511718751)); + canvas.lineTo((float)(348.6478115199233), (float)(78.91999511718751)); canvas.closePath(); canvas.fill(); canvas.setLineWidth((float)(0.96)); canvas.beginPath(); - canvas.moveTo((float)(408.542337156692), (float)(161.5)); - canvas.lineTo((float)(408.542337156692), (float)(122)); + canvas.moveTo((float)(370.00361559355764), (float)(119.41999511718751)); + canvas.lineTo((float)(370.00361559355764), (float)(79.91999511718751)); canvas.stroke(); canvas.setLineWidth((float)(1)); canvas.setLineWidth((float)(0.96)); canvas.beginPath(); - canvas.moveTo((float)(435.623147703567), (float)(130)); - canvas.lineTo((float)(435.623147703567), (float)(157)); + canvas.moveTo((float)(397.3056137319853), (float)(87.91999511718751)); + canvas.lineTo((float)(397.3056137319853), (float)(114.91999511718751)); canvas.stroke(); canvas.setLineWidth((float)(1)); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); setTextAlign(AlphaSkiaTextAlign.CENTER); setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); - setTypeface(getTypeface("PT Serif", false, true)); + setTextStyle(getTextStyle(new String[]{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, true)); setFontSize((float)(12)); canvas.beginPath(); - canvas.moveTo((float)(366.1767578125), (float)(102)); - canvas.lineTo((float)(366.1767578125), (float)(97)); - canvas.lineTo((float)(394.7559555656507), (float)(104)); + canvas.moveTo((float)(327.29200744628906), (float)(59)); + canvas.lineTo((float)(327.29200744628906), (float)(54)); + canvas.lineTo((float)(355.9448143122817), (float)(62)); canvas.stroke(); canvas.beginPath(); - canvas.moveTo((float)(407.04394995041633), (float)(107)); - canvas.lineTo((float)(435.623147703567), (float)(115)); - canvas.lineTo((float)(435.623147703567), (float)(120)); + canvas.moveTo((float)(368.65280686599266), (float)(65)); + canvas.lineTo((float)(397.3056137319853), (float)(72)); + canvas.lineTo((float)(397.3056137319853), (float)(77)); canvas.stroke(); - canvas.fillText("3", getTypeface(), getFontSize(), (float)(400.8999527580335), (float)(106), getTextAlign(), getTextBaseline()); + canvas.fillText("3", getTextStyle(), getFontSize(), (float)(362.2988105891372), (float)(63.91999511718751), getTextAlign(), getTextBaseline()); setTextAlign(AlphaSkiaTextAlign.LEFT); setTextBaseline(AlphaSkiaTextBaseline.TOP); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); - canvas.fillRect((float)(472), (float)(130), (float)(206), (float)(1.04)); - canvas.fillRect((float)(472), (float)(139), (float)(206), (float)(1.04)); - canvas.fillRect((float)(472), (float)(148), (float)(206), (float)(1.04)); - canvas.fillRect((float)(472), (float)(157), (float)(206), (float)(1.04)); - canvas.fillRect((float)(472), (float)(166), (float)(206), (float)(1.04)); + canvas.fillRect((float)(433), (float)(87), (float)(192), (float)(1.04)); + canvas.fillRect((float)(433), (float)(96), (float)(192), (float)(1.04)); + canvas.fillRect((float)(433), (float)(105), (float)(192), (float)(1.04)); + canvas.fillRect((float)(433), (float)(114), (float)(192), (float)(1.04)); + canvas.fillRect((float)(433), (float)(123), (float)(192), (float)(1.04)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(200), (byte)(0), (byte)(0), (byte)(255))); - setTypeface(getTypeface("Roboto", false, false)); - setFontSize((float)(11)); - canvas.fillText("3", getTypeface(), getFontSize(), (float)(472), (float)(118.75), getTextAlign(), getTextBaseline()); - canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(496.32666015625), (float)(157), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(496.32666015625), (float)(143.5), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(496.32666015625), (float)(134.5), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.beginRotate((float)(527.8699951171875), (float)(172), (float)(-90)); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(0), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(10.799999999999999), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(21.599999999999998), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(32.4), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(11)); + canvas.fillText("3", getTextStyle(), getFontSize(), (float)(433), (float)(76.5699951171875), getTextAlign(), getTextBaseline()); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(457.510009765625), (float)(114.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(457.510009765625), (float)(101.41999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(457.510009765625), (float)(92.4199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.beginRotate((float)(489.00750732421875), (float)(129.9199951171875), (float)(-90)); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(0), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(10.799999999999999), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(21.599999999999998), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(32.4), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); canvas.endRotate(); canvas.beginPath(); - canvas.moveTo((float)(527.8699951171875), (float)(180)); - canvas.lineTo((float)(531.8699951171875), (float)(172)); - canvas.lineTo((float)(523.8699951171875), (float)(172)); + canvas.moveTo((float)(489.00750732421875), (float)(137.9199951171875)); + canvas.lineTo((float)(493.00750732421875), (float)(129.9199951171875)); + canvas.lineTo((float)(485.00750732421875), (float)(129.9199951171875)); canvas.closePath(); canvas.fill(); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); - canvas.fillRect((float)(533.8699951171875), (float)(175), (float)(15), (float)(1)); - canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(536.8699951171875), (float)(175), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(536.8699951171875), (float)(166), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(536.8699951171875), (float)(157), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(536.8699951171875), (float)(143.5), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(536.8699951171875), (float)(134.5), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); - canvas.fillRect((float)(574.413330078125), (float)(175), (float)(15), (float)(1)); - canvas.fillRect((float)(574.413330078125), (float)(184), (float)(15), (float)(1)); - canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(577.413330078125), (float)(184), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(577.413330078125), (float)(166), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(577.413330078125), (float)(152.5), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.beginRotate((float)(596.9566650390625), (float)(137.5), (float)(90)); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(0), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(10.799999999999999), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(21.599999999999998), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(32.4), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(43.199999999999996), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillRect((float)(495.00750732421875), (float)(132), (float)(15), (float)(1.04)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(498.00750732421875), (float)(132.9199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(498.00750732421875), (float)(123.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(498.00750732421875), (float)(114.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(498.00750732421875), (float)(101.41999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(498.00750732421875), (float)(92.4199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.fillRect((float)(535.5050048828125), (float)(132), (float)(15), (float)(1.04)); + canvas.fillRect((float)(535.5050048828125), (float)(141), (float)(15), (float)(1.04)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(538.5050048828125), (float)(141.9199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(538.5050048828125), (float)(123.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(538.5050048828125), (float)(110.41999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.beginRotate((float)(558.0025024414062), (float)(95.41999511718751), (float)(90)); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(0), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(10.799999999999999), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(21.599999999999998), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(32.4), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(43.199999999999996), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); canvas.endRotate(); canvas.beginPath(); - canvas.moveTo((float)(596.9566650390625), (float)(129.5)); - canvas.lineTo((float)(600.9566650390625), (float)(137.5)); - canvas.lineTo((float)(592.9566650390625), (float)(137.5)); + canvas.moveTo((float)(558.0025024414062), (float)(87.41999511718751)); + canvas.lineTo((float)(562.0025024414062), (float)(95.41999511718751)); + canvas.lineTo((float)(554.0025024414062), (float)(95.41999511718751)); canvas.closePath(); canvas.fill(); - canvas.fillText("\uE262", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(607.9566650390625), (float)(143.5), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); - canvas.fillRect((float)(614.9566650390625), (float)(175), (float)(15), (float)(1)); - canvas.fillRect((float)(614.9566650390625), (float)(184), (float)(15), (float)(1)); - canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(617.9566650390625), (float)(184), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(617.9566650390625), (float)(166), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(617.9566650390625), (float)(152.5), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(617.9566650390625), (float)(143.5), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uE0A4", getMusicTypeface(), (float)(getMusicFontSize() * 1), (float)(617.9566650390625), (float)(134.5), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillRect((float)(670), (float)(130.1), (float)(1), (float)(36)); - canvas.fillRect((float)(674), (float)(130.1), (float)(4), (float)(36)); + canvas.fillText("\uE262", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(569.0025024414062), (float)(101.41999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.fillRect((float)(576.0025024414062), (float)(132), (float)(15), (float)(1.04)); + canvas.fillRect((float)(576.0025024414062), (float)(141), (float)(15), (float)(1.04)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(579.0025024414062), (float)(141.9199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(579.0025024414062), (float)(123.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(579.0025024414062), (float)(110.41999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(579.0025024414062), (float)(101.41999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(579.0025024414062), (float)(92.4199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.fillRect((float)(624), (float)(87.9199951171875), (float)(1), (float)(36.000000000000014)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); canvas.setLineWidth((float)(0.96)); canvas.beginPath(); - canvas.moveTo((float)(496.32666015625), (float)(134.5)); - canvas.lineTo((float)(496.32666015625), (float)(184)); + canvas.moveTo((float)(457.510009765625), (float)(92.4199951171875)); + canvas.lineTo((float)(457.510009765625), (float)(141.9199951171875)); canvas.stroke(); canvas.setLineWidth((float)(1)); canvas.setLineWidth((float)(0.96)); canvas.beginPath(); - canvas.moveTo((float)(545.8699951171875), (float)(107.5)); - canvas.lineTo((float)(545.8699951171875), (float)(175)); + canvas.moveTo((float)(507.00750732421875), (float)(65.4199951171875)); + canvas.lineTo((float)(507.00750732421875), (float)(132.9199951171875)); canvas.stroke(); canvas.setLineWidth((float)(1)); canvas.setLineWidth((float)(0.96)); canvas.beginPath(); - canvas.moveTo((float)(586.413330078125), (float)(125.5)); - canvas.lineTo((float)(586.413330078125), (float)(184)); + canvas.moveTo((float)(547.5050048828125), (float)(83.41999511718751)); + canvas.lineTo((float)(547.5050048828125), (float)(141.9199951171875)); canvas.stroke(); canvas.setLineWidth((float)(1)); canvas.setLineWidth((float)(0.96)); canvas.beginPath(); - canvas.moveTo((float)(626.9566650390625), (float)(107.5)); - canvas.lineTo((float)(626.9566650390625), (float)(184)); + canvas.moveTo((float)(588.0025024414062), (float)(65.4199951171875)); + canvas.lineTo((float)(588.0025024414062), (float)(141.9199951171875)); canvas.stroke(); canvas.setLineWidth((float)(1)); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); - canvas.fillRect((float)(92), (float)(284), (float)(254), (float)(1.04)); - canvas.fillRect((float)(92), (float)(295), (float)(254), (float)(1.04)); - canvas.fillRect((float)(92), (float)(306), (float)(254), (float)(1.04)); - canvas.fillRect((float)(92), (float)(317), (float)(61.02685546875), (float)(1.04)); - canvas.fillRect((float)(161.32666015625), (float)(317), (float)(31.759140014648438), (float)(1.04)); - canvas.fillRect((float)(201.38560485839844), (float)(317), (float)(31.759140014648438), (float)(1.04)); - canvas.fillRect((float)(241.44454956054688), (float)(317), (float)(31.759124755859375), (float)(1.04)); - canvas.fillRect((float)(281.50347900390625), (float)(317), (float)(25.273406982421875), (float)(1.04)); - canvas.fillRect((float)(315.0766906738281), (float)(317), (float)(30.923309326171875), (float)(1.04)); - canvas.fillRect((float)(92), (float)(328), (float)(254), (float)(1.04)); - canvas.fillRect((float)(92), (float)(339), (float)(254), (float)(1.04)); - canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); - canvas.fillText("\uE06D", getMusicTypeface(), (float)(getMusicFontSize() * 0.9230769230769231), (float)(97), (float)(311.8), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillRect((float)(625), (float)(87), (float)(82), (float)(1.04)); + canvas.fillRect((float)(625), (float)(96), (float)(82), (float)(1.04)); + canvas.fillRect((float)(625), (float)(105), (float)(82), (float)(1.04)); + canvas.fillRect((float)(625), (float)(114), (float)(82), (float)(1.04)); + canvas.fillRect((float)(625), (float)(123), (float)(82), (float)(1.04)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(200), (byte)(0), (byte)(0), (byte)(255))); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(11)); + canvas.fillText("4", getTextStyle(), getFontSize(), (float)(625), (float)(76.5699951171875), getTextAlign(), getTextBaseline()); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE4EF\uE4F0\uE4F0\uE4F0\uE4F1", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(636.2920074462891), (float)(105.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uE083", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(666.2920074462891), (float)(74), AlphaSkiaTextAlign.CENTER, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.fillRect((float)(706), (float)(87.9199951171875), (float)(1), (float)(36.000000000000014)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.fillRect((float)(707), (float)(87), (float)(163), (float)(1.04)); + canvas.fillRect((float)(707), (float)(96), (float)(163), (float)(1.04)); + canvas.fillRect((float)(707), (float)(105), (float)(163), (float)(1.04)); + canvas.fillRect((float)(707), (float)(114), (float)(163), (float)(1.04)); + canvas.fillRect((float)(707), (float)(123), (float)(163), (float)(1.04)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(200), (byte)(0), (byte)(0), (byte)(255))); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(11)); + canvas.fillText("7", getTextStyle(), getFontSize(), (float)(707), (float)(76.5699951171875), getTextAlign(), getTextBaseline()); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(718.2920074462891), (float)(96.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(754.8440055847168), (float)(96.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(791.3960037231445), (float)(96.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(827.9480018615723), (float)(96.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.fillRect((float)(869), (float)(87.9199951171875), (float)(1), (float)(36.000000000000014)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setLineWidth((float)(0.96)); + canvas.beginPath(); + canvas.moveTo((float)(718.2920074462891), (float)(96.91999511718751)); + canvas.lineTo((float)(718.2920074462891), (float)(123.91999511718751)); + canvas.stroke(); + canvas.setLineWidth((float)(1)); + canvas.setLineWidth((float)(0.96)); + canvas.beginPath(); + canvas.moveTo((float)(754.8440055847168), (float)(96.91999511718751)); + canvas.lineTo((float)(754.8440055847168), (float)(123.91999511718751)); + canvas.stroke(); + canvas.setLineWidth((float)(1)); + canvas.setLineWidth((float)(0.96)); + canvas.beginPath(); + canvas.moveTo((float)(791.3960037231445), (float)(96.91999511718751)); + canvas.lineTo((float)(791.3960037231445), (float)(123.91999511718751)); + canvas.stroke(); + canvas.setLineWidth((float)(1)); + canvas.setLineWidth((float)(0.96)); + canvas.beginPath(); + canvas.moveTo((float)(827.9480018615723), (float)(96.91999511718751)); + canvas.lineTo((float)(827.9480018615723), (float)(123.91999511718751)); + canvas.stroke(); + canvas.setLineWidth((float)(1)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.fillRect((float)(870), (float)(87), (float)(60), (float)(1.04)); + canvas.fillRect((float)(870), (float)(96), (float)(60), (float)(1.04)); + canvas.fillRect((float)(870), (float)(105), (float)(60), (float)(1.04)); + canvas.fillRect((float)(870), (float)(114), (float)(60), (float)(1.04)); + canvas.fillRect((float)(870), (float)(123), (float)(60), (float)(1.04)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(200), (byte)(0), (byte)(0), (byte)(255))); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(11)); + canvas.fillText("8", getTextStyle(), getFontSize(), (float)(870), (float)(76.5699951171875), getTextAlign(), getTextBaseline()); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE0A4", getMusicTextStyle(), (float)(getMusicFontSize() * 1), (float)(881.2920074462891), (float)(96.91999511718751), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.fillRect((float)(922), (float)(87.9199951171875), (float)(1), (float)(36.000000000000014)); + canvas.fillRect((float)(926), (float)(87.9199951171875), (float)(4), (float)(36.000000000000014)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setLineWidth((float)(0.96)); + canvas.beginPath(); + canvas.moveTo((float)(881.2920074462891), (float)(96.91999511718751)); + canvas.lineTo((float)(881.2920074462891), (float)(123.91999511718751)); + canvas.stroke(); + canvas.setLineWidth((float)(1)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(722.7920074462891), (float)(161.4199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(733.592007446289), (float)(161.4199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(744.3920074462891), (float)(161.4199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(755.192007446289), (float)(161.4199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(765.9920074462891), (float)(161.4199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(776.7920074462891), (float)(161.4199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(787.592007446289), (float)(161.4199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(798.3920074462891), (float)(161.4199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(809.192007446289), (float)(161.4199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(819.9920074462891), (float)(161.4199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.fillRect((float)(48), (float)(216), (float)(259), (float)(1.04)); + canvas.fillRect((float)(48), (float)(227), (float)(259), (float)(1.04)); + canvas.fillRect((float)(48), (float)(238), (float)(259), (float)(1.04)); + canvas.fillRect((float)(48), (float)(249), (float)(66.07400512695312), (float)(1.04)); + canvas.fillRect((float)(122.510009765625), (float)(249), (float)(31.81214141845703), (float)(1.04)); + canvas.fillRect((float)(162.7581558227539), (float)(249), (float)(31.81214141845703), (float)(1.04)); + canvas.fillRect((float)(203.0063018798828), (float)(249), (float)(31.8121337890625), (float)(1.04)); + canvas.fillRect((float)(243.2544403076172), (float)(249), (float)(25.2957763671875), (float)(1.04)); + canvas.fillRect((float)(276.98622131347656), (float)(249), (float)(30.013778686523438), (float)(1.04)); + canvas.fillRect((float)(48), (float)(260), (float)(259), (float)(1.04)); + canvas.fillRect((float)(48), (float)(271), (float)(259), (float)(1.04)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.fillRect((float)(48), (float)(216.3199951171875), (float)(1), (float)(54.99999999999994)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.fillText("\uE06D", getMusicTextStyle(), (float)(getMusicFontSize() * 0.9230769230769231), (float)(54), (float)(243.8199951171875), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(163.32666015625), (float)(317.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(124.510009765625), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("9", getTypeface(), getFontSize(), (float)(153.02685546875), (float)(317.3), getTextAlign(), getTextBaseline()); + canvas.fillText("9", getTextStyle(), getFontSize(), (float)(114.07400512695312), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); setTextBaseline(AlphaSkiaTextBaseline.TOP); canvas.beginPath(); canvas.beginPath(); - canvas.moveTo((float)(188.23569962449085), (float)(274.7)); - canvas.lineTo((float)(185.23569962449085), (float)(280.7)); - canvas.lineTo((float)(191.23569962449085), (float)(280.7)); + canvas.moveTo((float)(150.32215017408072), (float)(206.7199951171875)); + canvas.lineTo((float)(147.32215017408072), (float)(212.7199951171875)); + canvas.lineTo((float)(153.32215017408072), (float)(212.7199951171875)); canvas.closePath(); canvas.fill(); + canvas.beginPath(); + canvas.moveTo((float)(123.510009765625), (float)(249.3199951171875)); + canvas.bezierCurveTo((float)(136.91607996985286), (float)(249.3199951171875), (float)(150.32215017408072), (float)(249.3199951171875), (float)(150.32215017408072), (float)(212.7199951171875)); canvas.stroke(); - canvas.moveTo((float)(162.32666015625), (float)(317.3)); - canvas.bezierCurveTo((float)(175.28117989037042), (float)(317.3), (float)(188.23569962449085), (float)(317.3), (float)(188.23569962449085), (float)(280.7)); - canvas.stroke(); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("\u00BC", getTypeface(), getFontSize(), (float)(183.47495743699085), (float)(260.7), getTextAlign(), getTextBaseline()); + canvas.fillText("\u00BC", getTextStyle(), getFontSize(), (float)(145.47965139478384), (float)(192.7199951171875), getTextAlign(), getTextBaseline()); setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(203.38560196824085), (float)(317.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(164.7581548127526), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("9", getTypeface(), getFontSize(), (float)(193.08579728074085), (float)(317.3), getTextAlign(), getTextBaseline()); + canvas.fillText("9", getTextStyle(), getFontSize(), (float)(154.32215017408072), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); setTextBaseline(AlphaSkiaTextBaseline.TOP); canvas.beginPath(); canvas.beginPath(); - canvas.moveTo((float)(228.29464143648167), (float)(268.7)); - canvas.lineTo((float)(225.29464143648167), (float)(274.7)); - canvas.lineTo((float)(231.29464143648167), (float)(274.7)); + canvas.moveTo((float)(190.5702952212083), (float)(200.7199951171875)); + canvas.lineTo((float)(187.5702952212083), (float)(206.7199951171875)); + canvas.lineTo((float)(193.5702952212083), (float)(206.7199951171875)); canvas.closePath(); canvas.fill(); + canvas.beginPath(); + canvas.moveTo((float)(163.7581548127526), (float)(249.3199951171875)); + canvas.bezierCurveTo((float)(177.16422501698045), (float)(249.3199951171875), (float)(190.5702952212083), (float)(249.3199951171875), (float)(190.5702952212083), (float)(206.7199951171875)); canvas.stroke(); - canvas.moveTo((float)(202.38560196824085), (float)(317.3)); - canvas.bezierCurveTo((float)(215.34012170236127), (float)(317.3), (float)(228.29464143648167), (float)(317.3), (float)(228.29464143648167), (float)(274.7)); - canvas.stroke(); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("\u00BD", getTypeface(), getFontSize(), (float)(223.25142854585667), (float)(254.7), getTextAlign(), getTextBaseline()); + canvas.fillText("\u00BD", getTextStyle(), getFontSize(), (float)(185.55879772364972), (float)(186.7199951171875), getTextAlign(), getTextBaseline()); setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(243.44454378023167), (float)(317.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(205.0062998598802), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("9", getTypeface(), getFontSize(), (float)(233.14473909273167), (float)(317.3), getTextAlign(), getTextBaseline()); + canvas.fillText("9", getTextStyle(), getFontSize(), (float)(194.5702952212083), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); setTextBaseline(AlphaSkiaTextBaseline.TOP); canvas.beginPath(); canvas.beginPath(); - canvas.moveTo((float)(268.3535832484725), (float)(256.7)); - canvas.lineTo((float)(265.3535832484725), (float)(262.7)); - canvas.lineTo((float)(271.3535832484725), (float)(262.7)); + canvas.moveTo((float)(230.81844026833588), (float)(188.7199951171875)); + canvas.lineTo((float)(227.81844026833588), (float)(194.7199951171875)); + canvas.lineTo((float)(233.81844026833588), (float)(194.7199951171875)); canvas.closePath(); canvas.fill(); + canvas.beginPath(); + canvas.moveTo((float)(204.0062998598802), (float)(249.3199951171875)); + canvas.bezierCurveTo((float)(217.41237006410802), (float)(249.3199951171875), (float)(230.81844026833588), (float)(249.3199951171875), (float)(230.81844026833588), (float)(194.7199951171875)); canvas.stroke(); - canvas.moveTo((float)(242.44454378023167), (float)(317.3)); - canvas.bezierCurveTo((float)(255.39906351435206), (float)(317.3), (float)(268.3535832484725), (float)(317.3), (float)(268.3535832484725), (float)(262.7)); - canvas.stroke(); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("full", getTypeface(), getFontSize(), (float)(259.3589543422225), (float)(242.7), getTextAlign(), getTextBaseline()); + canvas.fillText("full", getTextStyle(), getFontSize(), (float)(221.2114380100351), (float)(174.7199951171875), getTextAlign(), getTextBaseline()); setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(283.5034855922225), (float)(317.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(245.25444490700775), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("9", getTypeface(), getFontSize(), (float)(273.2036809047225), (float)(317.3), getTextAlign(), getTextBaseline()); + canvas.fillText("9", getTextStyle(), getFontSize(), (float)(234.81844026833588), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); setTextBaseline(AlphaSkiaTextBaseline.TOP); canvas.beginPath(); canvas.beginPath(); - canvas.moveTo((float)(301.9267916242362), (float)(244.7)); - canvas.lineTo((float)(298.9267916242362), (float)(250.7)); - canvas.lineTo((float)(304.9267916242362), (float)(250.7)); + canvas.moveTo((float)(264.55021897449996), (float)(176.7199951171875)); + canvas.lineTo((float)(261.55021897449996), (float)(182.7199951171875)); + canvas.lineTo((float)(267.55021897449996), (float)(182.7199951171875)); canvas.closePath(); canvas.fill(); + canvas.beginPath(); + canvas.moveTo((float)(244.25444490700775), (float)(249.3199951171875)); + canvas.bezierCurveTo((float)(254.40233194075387), (float)(249.3199951171875), (float)(264.55021897449996), (float)(249.3199951171875), (float)(264.55021897449996), (float)(182.7199951171875)); canvas.stroke(); - canvas.moveTo((float)(282.5034855922225), (float)(317.3)); - canvas.bezierCurveTo((float)(292.2151386082294), (float)(317.3), (float)(301.9267916242362), (float)(317.3), (float)(301.9267916242362), (float)(250.7)); - canvas.stroke(); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("1\u00BD", getTypeface(), getFontSize(), (float)(293.2336763898612), (float)(230.7), getTextAlign(), getTextBaseline()); + canvas.fillText("1\u00BD", getTextStyle(), getFontSize(), (float)(255.82071915760542), (float)(162.7199951171875), getTextAlign(), getTextBaseline()); setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(317.0766939679862), (float)(317.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(278.98622361317183), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("9", getTypeface(), getFontSize(), (float)(306.7768892804862), (float)(317.3), getTextAlign(), getTextBaseline()); + canvas.fillText("9", getTextStyle(), getFontSize(), (float)(268.55021897449996), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); setTextBaseline(AlphaSkiaTextBaseline.TOP); canvas.beginPath(); canvas.beginPath(); - canvas.moveTo((float)(340), (float)(232.7)); - canvas.lineTo((float)(337), (float)(238.7)); - canvas.lineTo((float)(343), (float)(238.7)); + canvas.moveTo((float)(302), (float)(164.7199951171875)); + canvas.lineTo((float)(299), (float)(170.7199951171875)); + canvas.lineTo((float)(305), (float)(170.7199951171875)); canvas.closePath(); canvas.fill(); + canvas.beginPath(); + canvas.moveTo((float)(277.98622361317183), (float)(249.3199951171875)); + canvas.bezierCurveTo((float)(289.99311180658594), (float)(249.3199951171875), (float)(302), (float)(249.3199951171875), (float)(302), (float)(170.7199951171875)); canvas.stroke(); - canvas.moveTo((float)(316.0766939679862), (float)(317.3)); - canvas.bezierCurveTo((float)(328.0383469839931), (float)(317.3), (float)(340), (float)(317.3), (float)(340), (float)(238.7)); - canvas.stroke(); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("2", getTypeface(), getFontSize(), (float)(336.35009765625), (float)(218.7), getTextAlign(), getTextBaseline()); - canvas.fillRect((float)(345), (float)(284.3), (float)(1), (float)(54.99999999999994)); + canvas.fillText("2", getTextStyle(), getFontSize(), (float)(298.28199768066406), (float)(150.7199951171875), getTextAlign(), getTextBaseline()); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.fillRect((float)(306), (float)(216.3199951171875), (float)(1), (float)(54.99999999999994)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); - canvas.fillRect((float)(346), (float)(284), (float)(126), (float)(1.04)); - canvas.fillRect((float)(346), (float)(295), (float)(12.02685546875), (float)(1.04)); - canvas.fillRect((float)(366.32666015625), (float)(295), (float)(12.882984161376953), (float)(1.04)); - canvas.fillRect((float)(387.50944900512695), (float)(295), (float)(84.49055099487305), (float)(1.04)); - canvas.fillRect((float)(346), (float)(306), (float)(126), (float)(1.04)); - canvas.fillRect((float)(346), (float)(317), (float)(54.392433166503906), (float)(1.04)); - canvas.fillRect((float)(408.6922378540039), (float)(317), (float)(18.781005859375), (float)(1.04)); - canvas.fillRect((float)(435.7730484008789), (float)(317), (float)(36.226951599121094), (float)(1.04)); - canvas.fillRect((float)(346), (float)(328), (float)(126), (float)(1.04)); - canvas.fillRect((float)(346), (float)(339), (float)(126), (float)(1.04)); + canvas.fillRect((float)(307), (float)(216), (float)(126), (float)(1.04)); + canvas.fillRect((float)(307), (float)(227), (float)(12.074005126953125), (float)(1.04)); + canvas.fillRect((float)(327.510009765625), (float)(227), (float)(12.9197998046875), (float)(1.04)); + canvas.fillRect((float)(348.8658142089844), (float)(227), (float)(84.13418579101562), (float)(1.04)); + canvas.fillRect((float)(307), (float)(238), (float)(126), (float)(1.04)); + canvas.fillRect((float)(307), (float)(249), (float)(54.785614013671875), (float)(1.04)); + canvas.fillRect((float)(370.22161865234375), (float)(249), (float)(18.865989685058594), (float)(1.04)); + canvas.fillRect((float)(397.5236129760742), (float)(249), (float)(35.47638702392578), (float)(1.04)); + canvas.fillRect((float)(307), (float)(260), (float)(126), (float)(1.04)); + canvas.fillRect((float)(307), (float)(271), (float)(126), (float)(1.04)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(368.32666015625), (float)(295.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(329.510009765625), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("3", getTypeface(), getFontSize(), (float)(358.02685546875), (float)(295.3), getTextAlign(), getTextBaseline()); + canvas.fillText("3", getTextStyle(), getFontSize(), (float)(319.0740051269531), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); setTextBaseline(AlphaSkiaTextBaseline.TOP); setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(389.509449828346), (float)(295.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(350.86581383925926), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("3", getTypeface(), getFontSize(), (float)(379.209645140846), (float)(295.3), getTextAlign(), getTextBaseline()); + canvas.fillText("3", getTextStyle(), getFontSize(), (float)(340.4298092005874), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); setTextBaseline(AlphaSkiaTextBaseline.TOP); setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(410.692239500442), (float)(317.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(372.2216179128936), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("3", getTypeface(), getFontSize(), (float)(400.392434812942), (float)(317.3), getTextAlign(), getTextBaseline()); + canvas.fillText("3", getTextStyle(), getFontSize(), (float)(361.7856132742217), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); setTextBaseline(AlphaSkiaTextBaseline.TOP); setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); - setTypeface(getTypeface("Roboto", false, false)); - setFontSize((float)(13)); - setTypeface(getTypeface("Roboto", false, false)); - setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(437.773050047317), (float)(317.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); - setFontSize((float)(13)); - canvas.fillText("5", getTypeface(), getFontSize(), (float)(427.473245359817), (float)(317.3), getTextAlign(), getTextBaseline()); - setTextBaseline(AlphaSkiaTextBaseline.TOP); - canvas.fillRect((float)(471), (float)(284.3), (float)(1), (float)(54.99999999999994)); - canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); - canvas.fillRect((float)(472), (float)(284), (float)(25.1767578125), (float)(1.04)); - canvas.fillRect((float)(505.4765625), (float)(284), (float)(32.2435302734375), (float)(1.04)); - canvas.fillRect((float)(546.0198974609375), (float)(284), (float)(72.786865234375), (float)(1.04)); - canvas.fillRect((float)(627.1065673828125), (float)(284), (float)(50.8934326171875), (float)(1.04)); - canvas.fillRect((float)(472), (float)(295), (float)(25.1767578125), (float)(1.04)); - canvas.fillRect((float)(505.4765625), (float)(295), (float)(32.2435302734375), (float)(1.04)); - canvas.fillRect((float)(546.0198974609375), (float)(295), (float)(72.786865234375), (float)(1.04)); - canvas.fillRect((float)(627.1065673828125), (float)(295), (float)(50.8934326171875), (float)(1.04)); - canvas.fillRect((float)(472), (float)(306), (float)(25.1767578125), (float)(1.04)); - canvas.fillRect((float)(505.4765625), (float)(306), (float)(32.2435302734375), (float)(1.04)); - canvas.fillRect((float)(546.0198974609375), (float)(306), (float)(32.2435302734375), (float)(1.04)); - canvas.fillRect((float)(586.563232421875), (float)(306), (float)(32.2435302734375), (float)(1.04)); - canvas.fillRect((float)(627.1065673828125), (float)(306), (float)(50.8934326171875), (float)(1.04)); - canvas.fillRect((float)(472), (float)(317), (float)(65.7200927734375), (float)(1.04)); - canvas.fillRect((float)(546.0198974609375), (float)(317), (float)(32.2435302734375), (float)(1.04)); - canvas.fillRect((float)(586.563232421875), (float)(317), (float)(32.2435302734375), (float)(1.04)); - canvas.fillRect((float)(627.1065673828125), (float)(317), (float)(50.8934326171875), (float)(1.04)); - canvas.fillRect((float)(472), (float)(328), (float)(65.7200927734375), (float)(1.04)); - canvas.fillRect((float)(546.0198974609375), (float)(328), (float)(32.2435302734375), (float)(1.04)); - canvas.fillRect((float)(586.563232421875), (float)(328), (float)(32.2435302734375), (float)(1.04)); - canvas.fillRect((float)(627.1065673828125), (float)(328), (float)(50.8934326171875), (float)(1.04)); - canvas.fillRect((float)(472), (float)(339), (float)(206), (float)(1.04)); - canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); - canvas.beginPath(); - canvas.moveTo((float)(488), (float)(275.8)); - canvas.lineTo((float)(488), (float)(312.8)); - canvas.stroke(); - canvas.beginPath(); - canvas.moveTo((float)(488), (float)(275.8)); - canvas.lineTo((float)(492), (float)(283.8)); - canvas.lineTo((float)(484), (float)(283.8)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(13)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(11)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(399.52361605132126), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(13)); + canvas.fillText("5", getTextStyle(), getFontSize(), (float)(389.0876114126494), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.fillRect((float)(432), (float)(216.3199951171875), (float)(1), (float)(54.99999999999994)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.fillRect((float)(433), (float)(216), (float)(25.292007446289062), (float)(1.04)); + canvas.fillRect((float)(466.72801208496094), (float)(216), (float)(32.061492919921875), (float)(1.04)); + canvas.fillRect((float)(507.2255096435547), (float)(216), (float)(72.55899047851562), (float)(1.04)); + canvas.fillRect((float)(588.2205047607422), (float)(216), (float)(36.77949523925781), (float)(1.04)); + canvas.fillRect((float)(433), (float)(227), (float)(25.292007446289062), (float)(1.04)); + canvas.fillRect((float)(466.72801208496094), (float)(227), (float)(32.061492919921875), (float)(1.04)); + canvas.fillRect((float)(507.2255096435547), (float)(227), (float)(72.55899047851562), (float)(1.04)); + canvas.fillRect((float)(588.2205047607422), (float)(227), (float)(36.77949523925781), (float)(1.04)); + canvas.fillRect((float)(433), (float)(238), (float)(25.292007446289062), (float)(1.04)); + canvas.fillRect((float)(466.72801208496094), (float)(238), (float)(32.061492919921875), (float)(1.04)); + canvas.fillRect((float)(507.2255096435547), (float)(238), (float)(32.061492919921875), (float)(1.04)); + canvas.fillRect((float)(547.7230072021484), (float)(238), (float)(32.061492919921875), (float)(1.04)); + canvas.fillRect((float)(588.2205047607422), (float)(238), (float)(36.77949523925781), (float)(1.04)); + canvas.fillRect((float)(433), (float)(249), (float)(65.78950500488281), (float)(1.04)); + canvas.fillRect((float)(507.2255096435547), (float)(249), (float)(32.061492919921875), (float)(1.04)); + canvas.fillRect((float)(547.7230072021484), (float)(249), (float)(32.061492919921875), (float)(1.04)); + canvas.fillRect((float)(588.2205047607422), (float)(249), (float)(36.77949523925781), (float)(1.04)); + canvas.fillRect((float)(433), (float)(260), (float)(65.78950500488281), (float)(1.04)); + canvas.fillRect((float)(507.2255096435547), (float)(260), (float)(32.061492919921875), (float)(1.04)); + canvas.fillRect((float)(547.7230072021484), (float)(260), (float)(32.061492919921875), (float)(1.04)); + canvas.fillRect((float)(588.2205047607422), (float)(260), (float)(36.77949523925781), (float)(1.04)); + canvas.fillRect((float)(433), (float)(271), (float)(192), (float)(1.04)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.beginPath(); + canvas.moveTo((float)(449), (float)(207.8199951171875)); + canvas.lineTo((float)(449), (float)(244.8199951171875)); + canvas.stroke(); + canvas.beginPath(); + canvas.moveTo((float)(449), (float)(207.8199951171875)); + canvas.lineTo((float)(453), (float)(215.8199951171875)); + canvas.lineTo((float)(445), (float)(215.8199951171875)); canvas.closePath(); canvas.fill(); setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(507.4765625), (float)(284.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(468.72801208496094), (float)(216.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("0", getTypeface(), getFontSize(), (float)(497.1767578125), (float)(284.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("0", getTextStyle(), getFontSize(), (float)(458.29200744628906), (float)(216.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(507.4765625), (float)(295.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(468.72801208496094), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("1", getTypeface(), getFontSize(), (float)(497.1767578125), (float)(295.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("1", getTextStyle(), getFontSize(), (float)(458.29200744628906), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(507.4765625), (float)(306.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(468.72801208496094), (float)(238.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("0", getTypeface(), getFontSize(), (float)(497.1767578125), (float)(306.3), getTextAlign(), getTextBaseline()); + canvas.fillText("0", getTextStyle(), getFontSize(), (float)(458.29200744628906), (float)(238.3199951171875), getTextAlign(), getTextBaseline()); setTextBaseline(AlphaSkiaTextBaseline.TOP); - canvas.beginRotate((float)(527.7200927734375), (float)(326.8), (float)(-90)); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(0), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(10.799999999999999), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(21.599999999999998), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(32.4), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(43.199999999999996), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.beginRotate((float)(488.7895050048828), (float)(258.8199951171875), (float)(-90)); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(0), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(10.799999999999999), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(21.599999999999998), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(32.4), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(43.199999999999996), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); canvas.endRotate(); canvas.beginPath(); - canvas.moveTo((float)(528), (float)(334.8)); - canvas.lineTo((float)(532), (float)(326.8)); - canvas.lineTo((float)(524), (float)(326.8)); + canvas.moveTo((float)(489), (float)(266.8199951171875)); + canvas.lineTo((float)(493), (float)(258.8199951171875)); + canvas.lineTo((float)(485), (float)(258.8199951171875)); canvas.closePath(); canvas.fill(); setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(548.0198974609375), (float)(284.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(509.2255096435547), (float)(216.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("0", getTypeface(), getFontSize(), (float)(537.7200927734375), (float)(284.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("0", getTextStyle(), getFontSize(), (float)(498.7895050048828), (float)(216.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(548.0198974609375), (float)(295.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(509.2255096435547), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("1", getTypeface(), getFontSize(), (float)(537.7200927734375), (float)(295.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("1", getTextStyle(), getFontSize(), (float)(498.7895050048828), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(548.0198974609375), (float)(306.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(509.2255096435547), (float)(238.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("0", getTypeface(), getFontSize(), (float)(537.7200927734375), (float)(306.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("0", getTextStyle(), getFontSize(), (float)(498.7895050048828), (float)(238.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(548.0198974609375), (float)(317.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(509.2255096435547), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("2", getTypeface(), getFontSize(), (float)(537.7200927734375), (float)(317.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("2", getTextStyle(), getFontSize(), (float)(498.7895050048828), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(548.0198974609375), (float)(328.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(509.2255096435547), (float)(260.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("3", getTypeface(), getFontSize(), (float)(537.7200927734375), (float)(328.3), getTextAlign(), getTextBaseline()); + canvas.fillText("3", getTextStyle(), getFontSize(), (float)(498.7895050048828), (float)(260.3199951171875), getTextAlign(), getTextBaseline()); setTextBaseline(AlphaSkiaTextBaseline.TOP); canvas.beginPath(); - canvas.moveTo((float)(569), (float)(297.8)); - canvas.lineTo((float)(569), (float)(334.8)); + canvas.moveTo((float)(530), (float)(229.8199951171875)); + canvas.lineTo((float)(530), (float)(266.8199951171875)); canvas.stroke(); canvas.beginPath(); - canvas.moveTo((float)(569), (float)(297.8)); - canvas.lineTo((float)(573), (float)(305.8)); - canvas.lineTo((float)(565), (float)(305.8)); + canvas.moveTo((float)(530), (float)(229.8199951171875)); + canvas.lineTo((float)(534), (float)(237.8199951171875)); + canvas.lineTo((float)(526), (float)(237.8199951171875)); canvas.closePath(); canvas.fill(); setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(588.563232421875), (float)(306.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(549.7230072021484), (float)(238.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("2", getTypeface(), getFontSize(), (float)(578.263427734375), (float)(306.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("2", getTextStyle(), getFontSize(), (float)(539.2870025634766), (float)(238.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(588.563232421875), (float)(317.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(549.7230072021484), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("2", getTypeface(), getFontSize(), (float)(578.263427734375), (float)(317.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("2", getTextStyle(), getFontSize(), (float)(539.2870025634766), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(588.563232421875), (float)(328.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(549.7230072021484), (float)(260.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("0", getTypeface(), getFontSize(), (float)(578.263427734375), (float)(328.3), getTextAlign(), getTextBaseline()); + canvas.fillText("0", getTextStyle(), getFontSize(), (float)(539.2870025634766), (float)(260.3199951171875), getTextAlign(), getTextBaseline()); setTextBaseline(AlphaSkiaTextBaseline.TOP); - canvas.beginRotate((float)(596.8067626953125), (float)(283.8), (float)(90)); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(0), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(10.799999999999999), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(21.599999999999998), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(32.4), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); - canvas.fillText("\uEAA4", getMusicTypeface(), (float)(getMusicFontSize() * 1.2), (float)(43.199999999999996), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.beginRotate((float)(569.7845001220703), (float)(215.8199951171875), (float)(90)); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(0), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(10.799999999999999), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(21.599999999999998), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(32.4), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); + canvas.fillText("\uEAA4", getMusicTextStyle(), (float)(getMusicFontSize() * 1.2), (float)(43.199999999999996), (float)(10.799999999999999), AlphaSkiaTextAlign.LEFT, AlphaSkiaTextBaseline.ALPHABETIC); canvas.endRotate(); canvas.beginPath(); - canvas.moveTo((float)(597), (float)(275.8)); - canvas.lineTo((float)(601), (float)(283.8)); - canvas.lineTo((float)(593), (float)(283.8)); + canvas.moveTo((float)(570), (float)(207.8199951171875)); + canvas.lineTo((float)(574), (float)(215.8199951171875)); + canvas.lineTo((float)(566), (float)(215.8199951171875)); canvas.closePath(); canvas.fill(); setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - setTypeface(getTypeface("Roboto", false, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(629.1065673828125), (float)(284.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(590.2205047607422), (float)(216.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("0", getTypeface(), getFontSize(), (float)(618.8067626953125), (float)(284.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("0", getTextStyle(), getFontSize(), (float)(579.7845001220703), (float)(216.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(629.1065673828125), (float)(295.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(590.2205047607422), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("2", getTypeface(), getFontSize(), (float)(618.8067626953125), (float)(295.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("2", getTextStyle(), getFontSize(), (float)(579.7845001220703), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(629.1065673828125), (float)(306.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(590.2205047607422), (float)(238.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("2", getTypeface(), getFontSize(), (float)(618.8067626953125), (float)(306.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("2", getTextStyle(), getFontSize(), (float)(579.7845001220703), (float)(238.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(629.1065673828125), (float)(317.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(590.2205047607422), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("2", getTypeface(), getFontSize(), (float)(618.8067626953125), (float)(317.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("2", getTextStyle(), getFontSize(), (float)(579.7845001220703), (float)(249.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(11)); - canvas.fillText("", getTypeface(), getFontSize(), (float)(629.1065673828125), (float)(328.3), getTextAlign(), getTextBaseline()); - setTypeface(getTypeface("Roboto", false, false)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(590.2205047607422), (float)(260.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); setFontSize((float)(13)); - canvas.fillText("0", getTypeface(), getFontSize(), (float)(618.8067626953125), (float)(328.3), getTextAlign(), getTextBaseline()); + canvas.fillText("0", getTextStyle(), getFontSize(), (float)(579.7845001220703), (float)(260.3199951171875), getTextAlign(), getTextBaseline()); setTextBaseline(AlphaSkiaTextBaseline.TOP); - canvas.fillRect((float)(670), (float)(284.3), (float)(1), (float)(54.99999999999994)); - canvas.fillRect((float)(674), (float)(284.3), (float)(4), (float)(54.99999999999994)); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); - canvas.beginPath(); - canvas.moveTo((float)(92), (float)(130.1)); - canvas.lineTo((float)(92), (float)(339.3)); - canvas.stroke(); - setTypeface(getTypeface("PT Serif", false, true)); + canvas.fillRect((float)(624), (float)(216.3199951171875), (float)(1), (float)(54.99999999999994)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.fillRect((float)(625), (float)(216), (float)(82), (float)(1.04)); + canvas.fillRect((float)(625), (float)(227), (float)(82), (float)(1.04)); + canvas.fillRect((float)(625), (float)(238), (float)(82), (float)(1.04)); + canvas.fillRect((float)(625), (float)(249), (float)(82), (float)(1.04)); + canvas.fillRect((float)(625), (float)(260), (float)(82), (float)(1.04)); + canvas.fillRect((float)(625), (float)(271), (float)(82), (float)(1.04)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.fillRect((float)(706), (float)(216.3199951171875), (float)(1), (float)(54.99999999999994)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.fillRect((float)(707), (float)(216), (float)(163), (float)(1.04)); + canvas.fillRect((float)(707), (float)(227), (float)(12.074005126953125), (float)(1.04)); + canvas.fillRect((float)(727.510009765625), (float)(227), (float)(28.11599349975586), (float)(1.04)); + canvas.fillRect((float)(764.0620079040527), (float)(227), (float)(28.11599349975586), (float)(1.04)); + canvas.fillRect((float)(800.6140060424805), (float)(227), (float)(28.115989685058594), (float)(1.04)); + canvas.fillRect((float)(837.1660003662109), (float)(227), (float)(32.83399963378906), (float)(1.04)); + canvas.fillRect((float)(707), (float)(238), (float)(163), (float)(1.04)); + canvas.fillRect((float)(707), (float)(249), (float)(163), (float)(1.04)); + canvas.fillRect((float)(707), (float)(260), (float)(163), (float)(1.04)); + canvas.fillRect((float)(707), (float)(271), (float)(163), (float)(1.04)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(13)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(11)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(729.510009765625), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(13)); + canvas.fillText("3", getTextStyle(), getFontSize(), (float)(719.0740051269531), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(13)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(11)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(766.0620079040527), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(13)); + canvas.fillText("3", getTextStyle(), getFontSize(), (float)(755.6260032653809), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(13)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(11)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(802.6140060424805), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(13)); + canvas.fillText("3", getTextStyle(), getFontSize(), (float)(792.1780014038086), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(13)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(11)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(839.1660041809082), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(13)); + canvas.fillText("3", getTextStyle(), getFontSize(), (float)(828.7299995422363), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.fillRect((float)(869), (float)(216.3199951171875), (float)(1), (float)(54.99999999999994)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(165), (byte)(165), (byte)(165), (byte)(255))); + canvas.fillRect((float)(870), (float)(216), (float)(60), (float)(1.04)); + canvas.fillRect((float)(870), (float)(227), (float)(12.074005126953125), (float)(1.04)); + canvas.fillRect((float)(890.510009765625), (float)(227), (float)(39.489990234375), (float)(1.04)); + canvas.fillRect((float)(870), (float)(238), (float)(60), (float)(1.04)); + canvas.fillRect((float)(870), (float)(249), (float)(60), (float)(1.04)); + canvas.fillRect((float)(870), (float)(260), (float)(60), (float)(1.04)); + canvas.fillRect((float)(870), (float)(271), (float)(60), (float)(1.04)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + setTextBaseline(AlphaSkiaTextBaseline.MIDDLE); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(13)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(11)); + canvas.fillText("", getTextStyle(), getFontSize(), (float)(892.510009765625), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false)); + setFontSize((float)(13)); + canvas.fillText("3", getTextStyle(), getFontSize(), (float)(882.0740051269531), (float)(227.3199951171875), getTextAlign(), getTextBaseline()); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + canvas.fillRect((float)(922), (float)(216.3199951171875), (float)(1), (float)(54.99999999999994)); + canvas.fillRect((float)(926), (float)(216.3199951171875), (float)(4), (float)(54.99999999999994)); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(51), (byte)(204), (byte)(100))); + setTextStyle(getTextStyle(new String[]{"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, true)); setFontSize((float)(12)); - canvas.fillText("s.guit.", getTypeface(), getFontSize(), (float)(50), (float)(130.1), getTextAlign(), getTextBaseline()); - canvas.fillRect((float)(86), (float)(118.1), (float)(3), (float)(233.20000000000002)); - canvas.beginPath(); - canvas.moveTo((float)(86), (float)(118.1)); - canvas.bezierCurveTo((float)(86), (float)(118.1), (float)(86), (float)(118.1), (float)(98), (float)(115.1)); - canvas.bezierCurveTo((float)(92), (float)(121.1), (float)(86), (float)(121.1), (float)(86), (float)(121.1)); - canvas.closePath(); - canvas.fill(); - canvas.beginPath(); - canvas.moveTo((float)(86), (float)(351.3)); - canvas.bezierCurveTo((float)(86), (float)(351.3), (float)(92), (float)(351.3), (float)(98), (float)(354.3)); - canvas.bezierCurveTo((float)(92), (float)(348.3), (float)(86), (float)(348.3), (float)(86), (float)(348.3)); - canvas.closePath(); - canvas.fill(); + setTextBaseline(AlphaSkiaTextBaseline.BOTTOM); + setTextAlign(AlphaSkiaTextAlign.CENTER); + canvas.beginRotate((float)(42), (float)(179.6199951171875), (float)(-90.1)); + canvas.fillText("s.guit.", getTextStyle(), getFontSize(), (float)(0), (float)(0), getTextAlign(), getTextBaseline()); + canvas.endRotate(); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextAlign(AlphaSkiaTextAlign.LEFT); + canvas.fillRect((float)(48), (float)(123.91999511718751), (float)(1), (float)(93)); + return canvas.endRender(); + } + private static AlphaSkiaImage drawMusicSheetPart4(AlphaSkiaCanvas canvas) { + canvas.beginRender(709, 14, (float)(getRenderScale())); + canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(153), (byte)(204), (byte)(30), (byte)(255))); + setTextAlign(AlphaSkiaTextAlign.LEFT); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 700, false)); + setFontSize((float)(12)); + setTextAlign(AlphaSkiaTextAlign.CENTER); + canvas.fillText("Copyright", getTextStyle(), getFontSize(), (float)(650), (float)(0), getTextAlign(), getTextBaseline()); + setTextAlign(AlphaSkiaTextAlign.LEFT); + setTextBaseline(AlphaSkiaTextBaseline.TOP); return canvas.endRender(); } private static AlphaSkiaImage drawMusicSheetPart5(AlphaSkiaCanvas canvas) { - canvas.beginRender(116, 24, (float)(getRenderScale())); + canvas.beginRender(779, 12, (float)(getRenderScale())); canvas.setColor(AlphaSkiaCanvas.rgbaToColor((byte)(0), (byte)(0), (byte)(0), (byte)(255))); - setTypeface(getTypeface("Roboto", true, false)); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 700, false)); + setFontSize((float)(12)); + setTextAlign(AlphaSkiaTextAlign.LEFT); + setTextBaseline(AlphaSkiaTextBaseline.TOP); + setTextStyle(getTextStyle(new String[]{"Noto Sans", "Noto Music", "Noto Color Emoji"}, 700, false)); setFontSize((float)(12)); + setTextAlign(AlphaSkiaTextAlign.CENTER); + canvas.fillText("rendered by alphaTab", getTextStyle(), getFontSize(), (float)(650), (float)(0), getTextAlign(), getTextBaseline()); setTextAlign(AlphaSkiaTextAlign.LEFT); - canvas.fillText("rendered by alphaTab", getTypeface(), getFontSize(), (float)(0), (float)(12), getTextAlign(), getTextBaseline()); + setTextBaseline(AlphaSkiaTextBaseline.TOP); return canvas.endRender(); } public static float[][] getPartPositions() { return new float[][] { - {(float)0, (float)0, (float)1300, (float)164}, {(float)0, (float)164, (float)1300, (float)38}, {(float)0, (float)202, (float)1300, (float)6}, {(float)0, (float)208, (float)1300, (float)373}, {(float)591.962890625, (float)581, (float)116.07421875, (float)24} + {(float)0, (float)35, (float)1300, (float)124}, {(float)0, (float)159, (float)1300, (float)12}, {(float)0, (float)171, (float)1300, (float)285}, {(float)0, (float)456, (float)709, (float)14}, {(float)0, (float)470, (float)779.2159881591797, (float)12} }; } public static int getTotalWidth() { return (int)1300; } - public static int getTotalHeight() { return (int)605; } + public static int getTotalHeight() { return (int)482; } public static RenderFunction[] getAllParts() { return new RenderFunction[] diff --git a/test/java/src/main/java/alphaTab/alphaSkia/test/AlphaTabGeneratedRenderTestBase.java b/test/java/src/main/java/alphaTab/alphaSkia/test/AlphaTabGeneratedRenderTestBase.java index 43e2d07..6c78807 100644 --- a/test/java/src/main/java/alphaTab/alphaSkia/test/AlphaTabGeneratedRenderTestBase.java +++ b/test/java/src/main/java/alphaTab/alphaSkia/test/AlphaTabGeneratedRenderTestBase.java @@ -2,6 +2,7 @@ import alphaTab.alphaSkia.AlphaSkiaTextAlign; import alphaTab.alphaSkia.AlphaSkiaTextBaseline; +import alphaTab.alphaSkia.AlphaSkiaTextStyle; import alphaTab.alphaSkia.AlphaSkiaTypeface; import java.io.IOException; @@ -21,14 +22,14 @@ public static void setRenderScale(float renderScale) { AlphaTabGeneratedRenderTestBase.renderScale = renderScale; } - private static AlphaSkiaTypeface musicTypeface; + private static AlphaSkiaTextStyle musicTextStyle; - public static AlphaSkiaTypeface getMusicTypeface() { - return musicTypeface; + public static AlphaSkiaTextStyle getMusicTextStyle() { + return musicTextStyle; } - public static void setMusicTypeface(AlphaSkiaTypeface musicTypeface) { - AlphaTabGeneratedRenderTestBase.musicTypeface = musicTypeface; + public static void setMusicTextStyle(AlphaSkiaTextStyle musicTextStyle) { + AlphaTabGeneratedRenderTestBase.musicTextStyle = musicTextStyle; } public static float getMusicFontSize() { @@ -56,14 +57,14 @@ public static void setTextBaseline(AlphaSkiaTextBaseline textBaseline) { } - private static AlphaSkiaTypeface typeface; + private static AlphaSkiaTextStyle textStyle; - public static AlphaSkiaTypeface getTypeface() { - return typeface; + public static AlphaSkiaTextStyle getTextStyle() { + return textStyle; } - public static void setTypeface(AlphaSkiaTypeface typeface) { - AlphaTabGeneratedRenderTestBase.typeface = typeface; + public static void setTextStyle(AlphaSkiaTextStyle textStyle) { + AlphaTabGeneratedRenderTestBase.textStyle = textStyle; } private static float fontSize = 12; @@ -77,26 +78,26 @@ public static void setFontSize(float fontSize) { } - private static final Map customTypefaces = - new TreeMap(String.CASE_INSENSITIVE_ORDER); + private static final Map customTextStyles = + new TreeMap(String.CASE_INSENSITIVE_ORDER); - private static String customTypefaceKey(String fontFamily, boolean isBold, boolean isItalic) { - return fontFamily.toLowerCase() + "_" + isBold + "_" + isItalic; + private static String customTextStyleKey(String[] fontFamilies, int weight, boolean isItalic) { + return String.join("_", fontFamilies).toLowerCase() + "_" + weight + "_" + isItalic; } - protected static AlphaSkiaTypeface getTypeface(String fontFamily, boolean isBold, boolean isItalic) { - var key = customTypefaceKey(fontFamily, isBold, isItalic); - var typeface = customTypefaces.get(key); - if (typeface == null) { - throw new IllegalStateException("Unknown font requested: " + key); + protected static AlphaSkiaTextStyle getTextStyle(String[] fontFamilies, int weight, boolean isItalic) { + var key = customTextStyleKey(fontFamilies, weight, isItalic); + var textStyle = customTextStyles.get(key); + if (textStyle == null) { + textStyle = new AlphaSkiaTextStyle(fontFamilies, weight, isItalic); + customTextStyles.put(key, textStyle); } - return typeface; + return textStyle; } - public static AlphaSkiaTypeface loadTypeface(String name, boolean isBold, boolean isItalic, Path filePath) throws IOException { - var key = customTypefaceKey(name, isBold, isItalic); - System.out.println("Loading typeface " + key + " from " + filePath); + public static AlphaSkiaTypeface loadTypeface(Path filePath) throws IOException { + System.out.println("Loading typeface from " + filePath); var data = Files.readAllBytes(filePath); System.out.println("Read " + data.length + " bytes from file, decoding typeface"); @@ -105,7 +106,6 @@ public static AlphaSkiaTypeface loadTypeface(String name, boolean isBold, boolea if (typeface == null) { throw new IllegalStateException("Could not create typeface from data"); } - customTypefaces.put(key, typeface); return typeface; } } diff --git a/test/java/src/main/java/alphaTab/alphaSkia/test/Main.java b/test/java/src/main/java/alphaTab/alphaSkia/test/Main.java index 9af9840..4683109 100644 --- a/test/java/src/main/java/alphaTab/alphaSkia/test/Main.java +++ b/test/java/src/main/java/alphaTab/alphaSkia/test/Main.java @@ -7,9 +7,7 @@ import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; -import java.util.stream.*; - +import java.util.*; public class Main { private static Path findRepositoryRoot(Path current) { @@ -62,8 +60,8 @@ public static void main(String[] args) { private static int mainWithExitCode(String[] args) { try { initializeAlphaSkia(); - boolean isFreeType = Arrays.stream(args).anyMatch("--freetype"::equals); - if(isFreeType) { + boolean isFreeType = Arrays.asList(args).contains("--freetype"); + if (isFreeType) { System.out.println("Switching to FreeType Fonts"); AlphaSkiaCanvas.switchToFreeTypeFonts(); } @@ -75,24 +73,18 @@ private static int mainWithExitCode(String[] args) { // Load all fonts for rendering System.out.println("Loading fonts"); var testDataPath = repositoryRoot.resolve("test/test-data"); - AlphaTabGeneratedRenderTest.setMusicTypeface(AlphaTabGeneratedRenderTest.loadTypeface("Bravura", false, false, - testDataPath.resolve("font/bravura/Bravura.ttf"))); - AlphaTabGeneratedRenderTest.loadTypeface("Roboto", false, false, - testDataPath.resolve("font/roboto/Roboto-Regular.ttf")); - AlphaTabGeneratedRenderTest.loadTypeface("Roboto", true, false, - testDataPath.resolve("font/roboto/Roboto-Bold.ttf")); - AlphaTabGeneratedRenderTest.loadTypeface("Roboto", false, true, - testDataPath.resolve("font/roboto/Roboto-Italic.ttf")); - AlphaTabGeneratedRenderTest.loadTypeface("Roboto", true, true, - testDataPath.resolve("font/roboto/Roboto-BoldItalic.ttf")); - AlphaTabGeneratedRenderTest.loadTypeface("PT Serif", false, false, - testDataPath.resolve("font/ptserif/PTSerif-Regular.ttf")); - AlphaTabGeneratedRenderTest.loadTypeface("PT Serif", true, false, - testDataPath.resolve("font/ptserif/PTSerif-Bold.ttf")); - AlphaTabGeneratedRenderTest.loadTypeface("PT Serif", false, true, - testDataPath.resolve("font/ptserif/PTSerif-Italic.ttf")); - AlphaTabGeneratedRenderTest.loadTypeface("PT Serif", true, true, - testDataPath.resolve("font/ptserif/PTSerif-BoldItalic.ttf")); + var musicTypeface = AlphaTabGeneratedRenderTest.loadTypeface(testDataPath.resolve("font/bravura/Bravura.otf")); + AlphaTabGeneratedRenderTest.setMusicTextStyle(new AlphaSkiaTextStyle(new String[]{musicTypeface.getFamilyName()}, musicTypeface.getWeight(), musicTypeface.isItalic())); + AlphaTabGeneratedRenderTest.loadTypeface(testDataPath.resolve("font/noto-sans/NotoSans-Regular.otf")); + AlphaTabGeneratedRenderTest.loadTypeface(testDataPath.resolve("font/noto-sans/NotoSans-Bold.otf")); + AlphaTabGeneratedRenderTest.loadTypeface(testDataPath.resolve("font/noto-sans/NotoSans-Italic.otf")); + AlphaTabGeneratedRenderTest.loadTypeface(testDataPath.resolve("font/noto-sans/NotoSans-BoldItalic.otf")); + AlphaTabGeneratedRenderTest.loadTypeface(testDataPath.resolve("font/noto-serif/NotoSerif-Regular.otf")); + AlphaTabGeneratedRenderTest.loadTypeface(testDataPath.resolve("font/noto-serif/NotoSerif-Bold.otf")); + AlphaTabGeneratedRenderTest.loadTypeface(testDataPath.resolve("font/noto-serif/NotoSerif-Italic.otf")); + AlphaTabGeneratedRenderTest.loadTypeface(testDataPath.resolve("font/noto-serif/NotoSerif-BoldItalic.otf")); + AlphaTabGeneratedRenderTest.loadTypeface(testDataPath.resolve("font/noto-music/NotoMusic-Regular.otf")); + AlphaTabGeneratedRenderTest.loadTypeface(testDataPath.resolve("font/noto-color-emoji/NotoColorEmoji_WindowsCompatible.ttf")); System.out.println("Fonts loaded"); // render full image @@ -139,7 +131,7 @@ private static int mainWithExitCode(String[] args) { var expectedHeight = expectedImage.getHeight(); if (actualWidth != expectedWidth || actualHeight != expectedHeight) { System.err.println( - "Image sizes do not match: Actual[" + actualWidth + "x" + actualHeight + "] Expected[" + expectedWidth + "x" + actualHeight + "]"); + "Image sizes do not match: Actual[" + actualWidth + "x" + actualHeight + "] Expected[" + expectedWidth + "x" + expectedHeight + "]"); return 1; } @@ -185,7 +177,7 @@ private static int mainWithExitCode(String[] args) { } private static void initializeAlphaSkia() throws IOException { - switch(getOperatingSystemRid()) { + switch (getOperatingSystemRid()) { case "macos": AlphaSkiaMacOs.INSTANCE.initialize(); break; diff --git a/test/native/include/AlphaSkiaTestBridge.h b/test/native/include/AlphaSkiaTestBridge.h index d238b67..6a59534 100644 --- a/test/native/include/AlphaSkiaTestBridge.h +++ b/test/native/include/AlphaSkiaTestBridge.h @@ -15,14 +15,14 @@ typedef std::function render_function_t; extern alphaskia_text_align_t text_align; extern alphaskia_text_baseline_t text_baseline; -extern alphaskia_typeface_t typeface; -extern alphaskia_typeface_t music_typeface; +extern alphaskia_textstyle_t text_style; +extern alphaskia_textstyle_t music_text_style; extern float music_font_size; extern float font_size; extern float render_scale; extern int32_t total_width; extern int32_t total_height; -alphaskia_typeface_t alphaskia_get_typeface(const char *name, bool is_bold, bool is_italic); -alphaskia_typeface_t alphaskia_load_typeface(const char *name, bool is_bold, bool is_italic, std::string file_path); +alphaskia_textstyle_t alphaskia_get_text_style(const std::vector& family_names, uint16_t weight, bool is_italic); +alphaskia_typeface_t alphaskia_load_typeface(std::string file_path); void read_file(std::string file_path, std::vector &data); \ No newline at end of file diff --git a/test/native/src/AlphaSkiaTestBridge.cpp b/test/native/src/AlphaSkiaTestBridge.cpp index 388e08b..0d3a6ae 100644 --- a/test/native/src/AlphaSkiaTestBridge.cpp +++ b/test/native/src/AlphaSkiaTestBridge.cpp @@ -4,30 +4,45 @@ #include #include #include +#include alphaskia_text_align_t text_align = alphaskia_text_align_left; alphaskia_text_baseline_t text_baseline = alphaskia_text_baseline_top; -alphaskia_typeface_t typeface = nullptr; -alphaskia_typeface_t music_typeface = nullptr; +alphaskia_textstyle_t text_style = nullptr; +alphaskia_textstyle_t music_text_style = nullptr; float music_font_size = 34; float render_scale = 1; float font_size = 12.0f; -static std::map custom_type_faces; +static std::map custom_text_styles; -std::string custom_typeface_key(const char *name, bool is_bold, bool is_italic) +std::string custom_textstyle_key(const std::vector &family_names, uint16_t weight, bool is_italic) { - return std::string(name) + "_" + (is_bold ? "true" : "false") + "_" + (is_italic ? "true" : "false"); + std::stringstream s; + for (auto &name : family_names) + { + s << name << "_"; + } + s << weight; + s << (is_italic ? "italic" : "upright"); + + return s.str(); } -alphaskia_typeface_t alphaskia_get_typeface(const char *name, bool is_bold, bool is_italic) +alphaskia_textstyle_t alphaskia_get_text_style(const std::vector &family_names, uint16_t weight, bool is_italic) { - auto key = custom_typeface_key(name, is_bold, is_italic); - auto it = custom_type_faces.find(key); - if (it == custom_type_faces.end()) + auto key = custom_textstyle_key(family_names, weight, is_italic); + auto it = custom_text_styles.find(key); + if (it == custom_text_styles.end()) { - std::cerr << "Unknown font requested: " << key << std::endl; - return nullptr; + alphaskia_textstyle_t new_text_style = alphaskia_textstyle_new( + static_cast(family_names.size()), + const_cast(&family_names[0]), + weight, + is_italic); + custom_text_styles[key] = new_text_style; + + return new_text_style; } return it->second; } @@ -47,10 +62,9 @@ void read_file(std::string file_path, std::vector &data) in.read(reinterpret_cast(data.data()), size); } -alphaskia_typeface_t alphaskia_load_typeface(const char *name, bool is_bold, bool is_italic, std::string file_path) +alphaskia_typeface_t alphaskia_load_typeface(std::string file_path) { - auto key = custom_typeface_key(name, is_bold, is_italic); - std::cout << "Loading typeface " << key << " from " << file_path << std::endl; + std::cout << "Loading typeface from " << file_path << std::endl; std::vector data; read_file(file_path, data); @@ -69,7 +83,10 @@ alphaskia_typeface_t alphaskia_load_typeface(const char *name, bool is_bold, boo std::cerr << "Could not create typeface from data " << file_path << std::endl; return nullptr; } - std::cout << "Typeface " << key << " loaded and registered" << std::endl; - custom_type_faces[key] = typeface; + std::cout << "Typeface " + << alphaskia_typeface_get_family_name(typeface) + << "weight: " << alphaskia_typeface_get_weight(typeface) + << " italic: " << (alphaskia_typeface_is_italic(typeface) ? "yes" : "no") + << " loaded" << std::endl; return typeface; } \ No newline at end of file diff --git a/test/native/src/AlphaTabGeneratedTest.cpp b/test/native/src/AlphaTabGeneratedTest.cpp index 3a94dad..2d760d2 100644 --- a/test/native/src/AlphaTabGeneratedTest.cpp +++ b/test/native/src/AlphaTabGeneratedTest.cpp @@ -1,739 +1,1066 @@ #include "../include/AlphaTabGeneratedTest.h" alphaskia_image_t draw_music_sheet_part_1(alphaskia_canvas_t canvas) { - alphaskia_canvas_begin_render(canvas, 1300, 164, static_cast(render_scale)); + alphaskia_canvas_begin_render(canvas, 1300, 124, static_cast(render_scale)); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(204), static_cast(30), static_cast(255))); text_align = alphaskia_text_align_center; - typeface = alphaskia_get_typeface("PT Serif", false, false); + text_style = alphaskia_get_text_style({"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(32); text_align = alphaskia_text_align_center; - alphaskia_canvas_fill_text(canvas, u"Title", 5, typeface, font_size, static_cast(650), static_cast(40), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"Title", 5, text_style, font_size, static_cast(650), static_cast(0), text_align, text_baseline); text_align = alphaskia_text_align_center; - typeface = alphaskia_get_typeface("PT Serif", false, false); + text_baseline = alphaskia_text_baseline_top; + text_style = alphaskia_get_text_style({"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(20); text_align = alphaskia_text_align_center; - alphaskia_canvas_fill_text(canvas, u"Subtitle", 8, typeface, font_size, static_cast(650), static_cast(72), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"Subtitle", 8, text_style, font_size, static_cast(650), static_cast(32), text_align, text_baseline); text_align = alphaskia_text_align_center; - typeface = alphaskia_get_typeface("PT Serif", false, false); + text_baseline = alphaskia_text_baseline_top; + text_style = alphaskia_get_text_style({"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(20); text_align = alphaskia_text_align_center; - alphaskia_canvas_fill_text(canvas, u"Artist", 6, typeface, font_size, static_cast(650), static_cast(92), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"Artist", 6, text_style, font_size, static_cast(650), static_cast(52), text_align, text_baseline); text_align = alphaskia_text_align_center; - typeface = alphaskia_get_typeface("PT Serif", false, false); + text_baseline = alphaskia_text_baseline_top; + text_style = alphaskia_get_text_style({"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(20); text_align = alphaskia_text_align_center; - alphaskia_canvas_fill_text(canvas, u"Album", 5, typeface, font_size, static_cast(650), static_cast(112), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"Album", 5, text_style, font_size, static_cast(650), static_cast(72), text_align, text_baseline); text_align = alphaskia_text_align_center; - typeface = alphaskia_get_typeface("PT Serif", false, false); + text_baseline = alphaskia_text_baseline_top; + text_style = alphaskia_get_text_style({"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(15); - text_align = alphaskia_text_align_right; - alphaskia_canvas_fill_text(canvas, u"Music by Music", 14, typeface, font_size, static_cast(1260), static_cast(132), text_align, text_baseline); + text_align = alphaskia_text_align_left; + alphaskia_canvas_fill_text(canvas, u"Words by Words", 14, text_style, font_size, static_cast(35), static_cast(92), text_align, text_baseline); text_align = alphaskia_text_align_center; - typeface = alphaskia_get_typeface("PT Serif", false, false); + text_baseline = alphaskia_text_baseline_top; + text_style = alphaskia_get_text_style({"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(15); - text_align = alphaskia_text_align_left; - alphaskia_canvas_fill_text(canvas, u"Words by Words", 14, typeface, font_size, static_cast(40), static_cast(132), text_align, text_baseline); + text_align = alphaskia_text_align_right; + alphaskia_canvas_fill_text(canvas, u"Music by Music", 14, text_style, font_size, static_cast(1265), static_cast(92), text_align, text_baseline); text_align = alphaskia_text_align_center; + text_baseline = alphaskia_text_baseline_top; return alphaskia_canvas_end_render(canvas); } alphaskia_image_t draw_music_sheet_part_2(alphaskia_canvas_t canvas) { - alphaskia_canvas_begin_render(canvas, 1300, 38, static_cast(render_scale)); + alphaskia_canvas_begin_render(canvas, 1300, 12, static_cast(render_scale)); text_align = alphaskia_text_align_center; - typeface = alphaskia_get_typeface("PT Serif", false, true); + text_baseline = alphaskia_text_baseline_middle; + text_style = alphaskia_get_text_style({"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, true); font_size = static_cast(12); text_align = alphaskia_text_align_left; - alphaskia_canvas_fill_text(canvas, u"Guitar Standard Tuning", 22, typeface, font_size, static_cast(40), static_cast(3), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"Guitar Standard Tuning", 22, text_style, font_size, static_cast(35), static_cast(4.5659942626953125), text_align, text_baseline); text_align = alphaskia_text_align_center; + text_baseline = alphaskia_text_baseline_middle; return alphaskia_canvas_end_render(canvas); } alphaskia_image_t draw_music_sheet_part_3(alphaskia_canvas_t canvas) { - alphaskia_canvas_begin_render(canvas, 1300, 6, static_cast(render_scale)); - text_align = alphaskia_text_align_center; - return alphaskia_canvas_end_render(canvas); -} -alphaskia_image_t draw_music_sheet_part_4(alphaskia_canvas_t canvas) { - alphaskia_canvas_begin_render(canvas, 1300, 373, static_cast(render_scale)); + alphaskia_canvas_begin_render(canvas, 1300, 285, static_cast(render_scale)); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); text_align = alphaskia_text_align_left; - typeface = alphaskia_get_typeface("PT Serif", true, false); + text_style = alphaskia_get_text_style({"Noto Serif", "Noto Music", "Noto Color Emoji"}, 700, false); font_size = static_cast(14); - alphaskia_canvas_fill_text(canvas, u"\uE1D5", 1, music_typeface, static_cast(music_font_size * 0.75), static_cast(156.6767578125), static_cast(40), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"= 120", 5, typeface, font_size, static_cast(169.1767578125), static_cast(27), text_align, text_baseline); - alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); - alphaskia_canvas_fill_rect(canvas, static_cast(92), static_cast(130), static_cast(254), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(92), static_cast(139), static_cast(254), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(92), static_cast(148), static_cast(254), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(92), static_cast(157), static_cast(254), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(92), static_cast(166), static_cast(254), static_cast(1.04)); - alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); - alphaskia_canvas_fill_text(canvas, u"\uE050", 1, music_typeface, static_cast(music_font_size * 1), static_cast(94), static_cast(157.52), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE084", 1, music_typeface, static_cast(music_font_size * 1), static_cast(127), static_cast(139), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE084", 1, music_typeface, static_cast(music_font_size * 1), static_cast(127), static_cast(157), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + text_baseline = alphaskia_text_baseline_top; + alphaskia_canvas_fill_text(canvas, u"\uE1D5", 1, music_text_style, static_cast(music_font_size * 0.5), static_cast(117.79200744628906), static_cast(25), alphaskia_text_align_center, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"= 120", 5, text_style, font_size, static_cast(125.79200744628906), static_cast(12), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, true); + font_size = static_cast(12); + text_align = alphaskia_text_align_left; + alphaskia_canvas_fill_text(canvas, u"Fallback Font (\U0001D11E \U0001D15F \U0001F3B8 \U0001F918\U0001F3FB)", 29, text_style, font_size, static_cast(885.7920074462891), static_cast(30), text_align, text_baseline); + text_align = alphaskia_text_align_left; + text_baseline = alphaskia_text_baseline_top; + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(722.7920074462891), static_cast(53.5199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(733.592007446289), static_cast(53.5199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(744.3920074462891), static_cast(53.5199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(755.192007446289), static_cast(53.5199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(765.9920074462891), static_cast(53.5199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(776.7920074462891), static_cast(53.5199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(787.592007446289), static_cast(53.5199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(798.3920074462891), static_cast(53.5199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(809.192007446289), static_cast(53.5199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(819.9920074462891), static_cast(53.5199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_fill_rect(canvas, static_cast(48), static_cast(87), static_cast(259), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(48), static_cast(96), static_cast(259), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(48), static_cast(105), static_cast(259), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(48), static_cast(114), static_cast(259), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(48), static_cast(123), static_cast(259), static_cast(1.04)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_fill_rect(canvas, static_cast(48), static_cast(87.9199951171875), static_cast(1), static_cast(36.000000000000014)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE050", 1, music_text_style, static_cast(music_font_size * 1), static_cast(55), static_cast(115.43999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE084", 1, music_text_style, static_cast(music_font_size * 1), static_cast(88), static_cast(96.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE084", 1, music_text_style, static_cast(music_font_size * 1), static_cast(88), static_cast(114.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(200), static_cast(0), static_cast(0), static_cast(255))); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_baseline = alphaskia_text_baseline_top; + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"1", 1, typeface, font_size, static_cast(141), static_cast(118.75), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"1", 1, text_style, font_size, static_cast(102), static_cast(76.5699951171875), text_align, text_baseline); + text_baseline = alphaskia_text_baseline_top; + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(113.29200744628906), static_cast(105.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE272", 1, music_text_style, static_cast(music_font_size * 0.75), static_cast(134.16515249341666), static_cast(105.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(152.1767578125), static_cast(148), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE272", 1, music_typeface, static_cast(music_font_size * 0.75), static_cast(172.86069962449085), static_cast(148), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 0.75), static_cast(180.86069962449085), static_cast(149), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 0.75), static_cast(142.16515249341666), static_cast(106.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(156.6767578125), static_cast(144)); - alphaskia_canvas_line_to(canvas, static_cast(170.855110706305), static_cast(133.50723450810483)); - alphaskia_canvas_line_to(canvas, static_cast(184.23569962449085), static_cast(145)); + alphaskia_canvas_move_to(canvas, static_cast(117.79200744628906), static_cast(101.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(132.06224568469634), static_cast(91.42713139901187)); + alphaskia_canvas_line_to(canvas, static_cast(145.54015249341666), static_cast(102.91999511718751)); alphaskia_canvas_stroke(canvas); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(192.23569962449085), static_cast(148), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 0.75), static_cast(220.91964143648167), static_cast(144.5), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(153.54015249341666), static_cast(105.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 0.75), static_cast(182.41329754054425), static_cast(102.41999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(196.73569962449085), static_cast(144)); - alphaskia_canvas_line_to(canvas, static_cast(209.12929655256082), static_cast(131.33765133817155)); - alphaskia_canvas_line_to(canvas, static_cast(224.29464143648167), static_cast(140.5)); + alphaskia_canvas_move_to(canvas, static_cast(158.04015249341666), static_cast(101.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(170.53765225640643), static_cast(89.25646922337823)); + alphaskia_canvas_line_to(canvas, static_cast(185.78829754054425), static_cast(98.41999511718751)); alphaskia_canvas_stroke(canvas); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(232.29464143648167), static_cast(148), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE262", 1, music_typeface, static_cast(music_font_size * 0.75), static_cast(252.9785832484725), static_cast(143.5), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 0.75), static_cast(260.9785832484725), static_cast(144.5), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(193.78829754054425), static_cast(105.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE262", 1, music_text_style, static_cast(music_font_size * 0.75), static_cast(214.66144258767181), static_cast(101.41999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 0.75), static_cast(222.66144258767181), static_cast(102.41999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(236.79464143648167), static_cast(144)); - alphaskia_canvas_line_to(canvas, static_cast(249.1882383645516), static_cast(131.33765133817155)); - alphaskia_canvas_line_to(canvas, static_cast(264.3535832484725), static_cast(140.5)); + alphaskia_canvas_move_to(canvas, static_cast(198.28829754054425), static_cast(101.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(210.785797303534), static_cast(89.25646922337823)); + alphaskia_canvas_line_to(canvas, static_cast(226.03644258767181), static_cast(98.41999511718751)); alphaskia_canvas_stroke(canvas); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(272.3535832484725), static_cast(148), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 0.75), static_cast(294.5517916242362), static_cast(140), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(234.03644258767181), static_cast(105.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 0.75), static_cast(256.3932212938359), static_cast(97.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(276.8535832484725), static_cast(152)); - alphaskia_canvas_line_to(canvas, static_cast(292.1060513036615), static_cast(156.93783819474976)); - alphaskia_canvas_line_to(canvas, static_cast(297.9267916242362), static_cast(142)); + alphaskia_canvas_move_to(canvas, static_cast(238.53644258767181), static_cast(109.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(253.8393894465572), static_cast(114.87145189181567)); + alphaskia_canvas_line_to(canvas, static_cast(259.7682212938359), static_cast(99.91999511718751)); alphaskia_canvas_stroke(canvas); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(305.9267916242362), static_cast(148), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE262", 1, music_typeface, static_cast(music_font_size * 0.75), static_cast(324.625), static_cast(139), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 0.75), static_cast(332.625), static_cast(140), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(267.7682212938359), static_cast(105.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE262", 1, music_text_style, static_cast(music_font_size * 0.75), static_cast(286.625), static_cast(96.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 0.75), static_cast(294.625), static_cast(97.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(310.4267916242362), static_cast(152)); - alphaskia_canvas_line_to(canvas, static_cast(327.2193887931866), static_cast(157.24460932567123)); - alphaskia_canvas_line_to(canvas, static_cast(336), static_cast(142)); + alphaskia_canvas_move_to(canvas, static_cast(272.2682212938359), static_cast(109.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(289.1186648773111), static_cast(115.17296188710615)); + alphaskia_canvas_line_to(canvas, static_cast(298), static_cast(99.91999511718751)); alphaskia_canvas_stroke(canvas); - alphaskia_canvas_fill_rect(canvas, static_cast(345), static_cast(130.1), static_cast(1), static_cast(36)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_fill_rect(canvas, static_cast(306), static_cast(87.9199951171875), static_cast(1), static_cast(36.000000000000014)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(152.1767578125), static_cast(148)); - alphaskia_canvas_line_to(canvas, static_cast(152.1767578125), static_cast(175)); + alphaskia_canvas_move_to(canvas, static_cast(113.29200744628906), static_cast(105.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(113.29200744628906), static_cast(132.9199951171875)); alphaskia_canvas_stroke(canvas); alphaskia_canvas_set_line_width(canvas, static_cast(1)); alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(192.23569962449085), static_cast(148)); - alphaskia_canvas_line_to(canvas, static_cast(192.23569962449085), static_cast(175)); + alphaskia_canvas_move_to(canvas, static_cast(153.54015249341666), static_cast(105.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(153.54015249341666), static_cast(132.9199951171875)); alphaskia_canvas_stroke(canvas); alphaskia_canvas_set_line_width(canvas, static_cast(1)); alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(232.29464143648167), static_cast(148)); - alphaskia_canvas_line_to(canvas, static_cast(232.29464143648167), static_cast(175)); + alphaskia_canvas_move_to(canvas, static_cast(193.78829754054425), static_cast(105.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(193.78829754054425), static_cast(132.9199951171875)); alphaskia_canvas_stroke(canvas); alphaskia_canvas_set_line_width(canvas, static_cast(1)); alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(281.3535832484725), static_cast(148)); - alphaskia_canvas_line_to(canvas, static_cast(281.3535832484725), static_cast(121)); + alphaskia_canvas_move_to(canvas, static_cast(243.03644258767181), static_cast(105.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(243.03644258767181), static_cast(78.91999511718751)); alphaskia_canvas_stroke(canvas); alphaskia_canvas_set_line_width(canvas, static_cast(1)); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(281.3535832484725), static_cast(121)); - alphaskia_canvas_line_to(canvas, static_cast(314.9267916242362), static_cast(121)); - alphaskia_canvas_line_to(canvas, static_cast(314.9267916242362), static_cast(125)); - alphaskia_canvas_line_to(canvas, static_cast(281.3535832484725), static_cast(125)); + alphaskia_canvas_move_to(canvas, static_cast(243.03644258767181), static_cast(78.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(276.7682212938359), static_cast(78.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(276.7682212938359), static_cast(82.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(243.03644258767181), static_cast(82.91999511718751)); alphaskia_canvas_close_path(canvas); alphaskia_canvas_fill(canvas); alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(314.9267916242362), static_cast(148)); - alphaskia_canvas_line_to(canvas, static_cast(314.9267916242362), static_cast(121)); + alphaskia_canvas_move_to(canvas, static_cast(276.7682212938359), static_cast(105.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(276.7682212938359), static_cast(78.91999511718751)); alphaskia_canvas_stroke(canvas); alphaskia_canvas_set_line_width(canvas, static_cast(1)); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); - alphaskia_canvas_fill_rect(canvas, static_cast(346), static_cast(130), static_cast(126), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(346), static_cast(139), static_cast(126), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(346), static_cast(148), static_cast(126), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(346), static_cast(157), static_cast(126), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(346), static_cast(166), static_cast(126), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(307), static_cast(87), static_cast(126), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(307), static_cast(96), static_cast(126), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(307), static_cast(105), static_cast(126), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(307), static_cast(114), static_cast(126), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(307), static_cast(123), static_cast(126), static_cast(1.04)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(200), static_cast(0), static_cast(0), static_cast(255))); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_baseline = alphaskia_text_baseline_top; + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"2", 1, typeface, font_size, static_cast(346), static_cast(118.75), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"2", 1, text_style, font_size, static_cast(307), static_cast(76.5699951171875), text_align, text_baseline); + text_baseline = alphaskia_text_baseline_top; + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(318.29200744628906), static_cast(96.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(339.6478115199233), static_cast(96.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(361.00361559355764), static_cast(119.41999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A3", 1, music_text_style, static_cast(music_font_size * 1), static_cast(388.3056137319853), static_cast(114.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_fill_rect(canvas, static_cast(432), static_cast(87.9199951171875), static_cast(1), static_cast(36.000000000000014)); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(357.1767578125), static_cast(139), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(378.359547484596), static_cast(139), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(399.542337156692), static_cast(161.5), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A3", 1, music_typeface, static_cast(music_font_size * 1), static_cast(426.623147703567), static_cast(157), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_rect(canvas, static_cast(471), static_cast(130.1), static_cast(1), static_cast(36)); alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(366.1767578125), static_cast(139)); - alphaskia_canvas_line_to(canvas, static_cast(366.1767578125), static_cast(112)); + alphaskia_canvas_move_to(canvas, static_cast(327.29200744628906), static_cast(96.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(327.29200744628906), static_cast(69.91999511718751)); alphaskia_canvas_stroke(canvas); alphaskia_canvas_set_line_width(canvas, static_cast(1)); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(366.1767578125), static_cast(112)); - alphaskia_canvas_line_to(canvas, static_cast(387.359547484596), static_cast(117)); - alphaskia_canvas_line_to(canvas, static_cast(387.359547484596), static_cast(121)); - alphaskia_canvas_line_to(canvas, static_cast(366.1767578125), static_cast(116)); + alphaskia_canvas_move_to(canvas, static_cast(327.29200744628906), static_cast(69.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(348.6478115199233), static_cast(74.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(348.6478115199233), static_cast(78.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(327.29200744628906), static_cast(73.91999511718751)); alphaskia_canvas_close_path(canvas); alphaskia_canvas_fill(canvas); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(366.1767578125), static_cast(118)); - alphaskia_canvas_line_to(canvas, static_cast(387.359547484596), static_cast(123)); - alphaskia_canvas_line_to(canvas, static_cast(387.359547484596), static_cast(127)); - alphaskia_canvas_line_to(canvas, static_cast(366.1767578125), static_cast(122)); + alphaskia_canvas_move_to(canvas, static_cast(327.29200744628906), static_cast(75.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(348.6478115199233), static_cast(80.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(348.6478115199233), static_cast(84.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(327.29200744628906), static_cast(79.91999511718751)); alphaskia_canvas_close_path(canvas); alphaskia_canvas_fill(canvas); alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(387.359547484596), static_cast(139)); - alphaskia_canvas_line_to(canvas, static_cast(387.359547484596), static_cast(117)); + alphaskia_canvas_move_to(canvas, static_cast(348.6478115199233), static_cast(96.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(348.6478115199233), static_cast(74.91999511718751)); alphaskia_canvas_stroke(canvas); alphaskia_canvas_set_line_width(canvas, static_cast(1)); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(387.359547484596), static_cast(117)); - alphaskia_canvas_line_to(canvas, static_cast(408.542337156692), static_cast(122)); - alphaskia_canvas_line_to(canvas, static_cast(408.542337156692), static_cast(126)); - alphaskia_canvas_line_to(canvas, static_cast(387.359547484596), static_cast(121)); + alphaskia_canvas_move_to(canvas, static_cast(348.6478115199233), static_cast(74.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(370.00361559355764), static_cast(79.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(370.00361559355764), static_cast(83.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(348.6478115199233), static_cast(78.91999511718751)); alphaskia_canvas_close_path(canvas); alphaskia_canvas_fill(canvas); alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(408.542337156692), static_cast(161.5)); - alphaskia_canvas_line_to(canvas, static_cast(408.542337156692), static_cast(122)); + alphaskia_canvas_move_to(canvas, static_cast(370.00361559355764), static_cast(119.41999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(370.00361559355764), static_cast(79.91999511718751)); alphaskia_canvas_stroke(canvas); alphaskia_canvas_set_line_width(canvas, static_cast(1)); alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(435.623147703567), static_cast(130)); - alphaskia_canvas_line_to(canvas, static_cast(435.623147703567), static_cast(157)); + alphaskia_canvas_move_to(canvas, static_cast(397.3056137319853), static_cast(87.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(397.3056137319853), static_cast(114.91999511718751)); alphaskia_canvas_stroke(canvas); alphaskia_canvas_set_line_width(canvas, static_cast(1)); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); text_align = alphaskia_text_align_center; text_baseline = alphaskia_text_baseline_middle; - typeface = alphaskia_get_typeface("PT Serif", false, true); + text_style = alphaskia_get_text_style({"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, true); font_size = static_cast(12); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(366.1767578125), static_cast(102)); - alphaskia_canvas_line_to(canvas, static_cast(366.1767578125), static_cast(97)); - alphaskia_canvas_line_to(canvas, static_cast(394.7559555656507), static_cast(104)); + alphaskia_canvas_move_to(canvas, static_cast(327.29200744628906), static_cast(59)); + alphaskia_canvas_line_to(canvas, static_cast(327.29200744628906), static_cast(54)); + alphaskia_canvas_line_to(canvas, static_cast(355.9448143122817), static_cast(62)); alphaskia_canvas_stroke(canvas); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(407.04394995041633), static_cast(107)); - alphaskia_canvas_line_to(canvas, static_cast(435.623147703567), static_cast(115)); - alphaskia_canvas_line_to(canvas, static_cast(435.623147703567), static_cast(120)); + alphaskia_canvas_move_to(canvas, static_cast(368.65280686599266), static_cast(65)); + alphaskia_canvas_line_to(canvas, static_cast(397.3056137319853), static_cast(72)); + alphaskia_canvas_line_to(canvas, static_cast(397.3056137319853), static_cast(77)); alphaskia_canvas_stroke(canvas); - alphaskia_canvas_fill_text(canvas, u"3", 1, typeface, font_size, static_cast(400.8999527580335), static_cast(106), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"3", 1, text_style, font_size, static_cast(362.2988105891372), static_cast(63.91999511718751), text_align, text_baseline); text_align = alphaskia_text_align_left; text_baseline = alphaskia_text_baseline_top; alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); - alphaskia_canvas_fill_rect(canvas, static_cast(472), static_cast(130), static_cast(206), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(472), static_cast(139), static_cast(206), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(472), static_cast(148), static_cast(206), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(472), static_cast(157), static_cast(206), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(472), static_cast(166), static_cast(206), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(433), static_cast(87), static_cast(192), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(433), static_cast(96), static_cast(192), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(433), static_cast(105), static_cast(192), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(433), static_cast(114), static_cast(192), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(433), static_cast(123), static_cast(192), static_cast(1.04)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(200), static_cast(0), static_cast(0), static_cast(255))); - typeface = alphaskia_get_typeface("Roboto", false, false); - font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"3", 1, typeface, font_size, static_cast(472), static_cast(118.75), text_align, text_baseline); - alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(496.32666015625), static_cast(157), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(496.32666015625), static_cast(143.5), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(496.32666015625), static_cast(134.5), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_begin_rotate(canvas, static_cast(527.8699951171875), static_cast(172), static_cast(-90)); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(0), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(10.799999999999999), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(21.599999999999998), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(32.4), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + text_baseline = alphaskia_text_baseline_top; + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(11); + alphaskia_canvas_fill_text(canvas, u"3", 1, text_style, font_size, static_cast(433), static_cast(76.5699951171875), text_align, text_baseline); + text_baseline = alphaskia_text_baseline_top; + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(457.510009765625), static_cast(114.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(457.510009765625), static_cast(101.41999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(457.510009765625), static_cast(92.4199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_begin_rotate(canvas, static_cast(489.00750732421875), static_cast(129.9199951171875), static_cast(-90)); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(0), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(10.799999999999999), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(21.599999999999998), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(32.4), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); alphaskia_canvas_end_rotate(canvas); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(527.8699951171875), static_cast(180)); - alphaskia_canvas_line_to(canvas, static_cast(531.8699951171875), static_cast(172)); - alphaskia_canvas_line_to(canvas, static_cast(523.8699951171875), static_cast(172)); + alphaskia_canvas_move_to(canvas, static_cast(489.00750732421875), static_cast(137.9199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(493.00750732421875), static_cast(129.9199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(485.00750732421875), static_cast(129.9199951171875)); alphaskia_canvas_close_path(canvas); alphaskia_canvas_fill(canvas); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); - alphaskia_canvas_fill_rect(canvas, static_cast(533.8699951171875), static_cast(175), static_cast(15), static_cast(1)); - alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(536.8699951171875), static_cast(175), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(536.8699951171875), static_cast(166), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(536.8699951171875), static_cast(157), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(536.8699951171875), static_cast(143.5), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(536.8699951171875), static_cast(134.5), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); - alphaskia_canvas_fill_rect(canvas, static_cast(574.413330078125), static_cast(175), static_cast(15), static_cast(1)); - alphaskia_canvas_fill_rect(canvas, static_cast(574.413330078125), static_cast(184), static_cast(15), static_cast(1)); - alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(577.413330078125), static_cast(184), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(577.413330078125), static_cast(166), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(577.413330078125), static_cast(152.5), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_begin_rotate(canvas, static_cast(596.9566650390625), static_cast(137.5), static_cast(90)); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(0), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(10.799999999999999), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(21.599999999999998), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(32.4), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(43.199999999999996), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_rect(canvas, static_cast(495.00750732421875), static_cast(132), static_cast(15), static_cast(1.04)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(498.00750732421875), static_cast(132.9199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(498.00750732421875), static_cast(123.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(498.00750732421875), static_cast(114.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(498.00750732421875), static_cast(101.41999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(498.00750732421875), static_cast(92.4199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_fill_rect(canvas, static_cast(535.5050048828125), static_cast(132), static_cast(15), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(535.5050048828125), static_cast(141), static_cast(15), static_cast(1.04)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(538.5050048828125), static_cast(141.9199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(538.5050048828125), static_cast(123.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(538.5050048828125), static_cast(110.41999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_begin_rotate(canvas, static_cast(558.0025024414062), static_cast(95.41999511718751), static_cast(90)); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(0), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(10.799999999999999), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(21.599999999999998), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(32.4), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(43.199999999999996), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); alphaskia_canvas_end_rotate(canvas); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(596.9566650390625), static_cast(129.5)); - alphaskia_canvas_line_to(canvas, static_cast(600.9566650390625), static_cast(137.5)); - alphaskia_canvas_line_to(canvas, static_cast(592.9566650390625), static_cast(137.5)); + alphaskia_canvas_move_to(canvas, static_cast(558.0025024414062), static_cast(87.41999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(562.0025024414062), static_cast(95.41999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(554.0025024414062), static_cast(95.41999511718751)); alphaskia_canvas_close_path(canvas); alphaskia_canvas_fill(canvas); - alphaskia_canvas_fill_text(canvas, u"\uE262", 1, music_typeface, static_cast(music_font_size * 1), static_cast(607.9566650390625), static_cast(143.5), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); - alphaskia_canvas_fill_rect(canvas, static_cast(614.9566650390625), static_cast(175), static_cast(15), static_cast(1)); - alphaskia_canvas_fill_rect(canvas, static_cast(614.9566650390625), static_cast(184), static_cast(15), static_cast(1)); - alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(617.9566650390625), static_cast(184), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(617.9566650390625), static_cast(166), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(617.9566650390625), static_cast(152.5), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(617.9566650390625), static_cast(143.5), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_typeface, static_cast(music_font_size * 1), static_cast(617.9566650390625), static_cast(134.5), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_rect(canvas, static_cast(670), static_cast(130.1), static_cast(1), static_cast(36)); - alphaskia_canvas_fill_rect(canvas, static_cast(674), static_cast(130.1), static_cast(4), static_cast(36)); + alphaskia_canvas_fill_text(canvas, u"\uE262", 1, music_text_style, static_cast(music_font_size * 1), static_cast(569.0025024414062), static_cast(101.41999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_fill_rect(canvas, static_cast(576.0025024414062), static_cast(132), static_cast(15), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(576.0025024414062), static_cast(141), static_cast(15), static_cast(1.04)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(579.0025024414062), static_cast(141.9199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(579.0025024414062), static_cast(123.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(579.0025024414062), static_cast(110.41999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(579.0025024414062), static_cast(101.41999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(579.0025024414062), static_cast(92.4199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_fill_rect(canvas, static_cast(624), static_cast(87.9199951171875), static_cast(1), static_cast(36.000000000000014)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(496.32666015625), static_cast(134.5)); - alphaskia_canvas_line_to(canvas, static_cast(496.32666015625), static_cast(184)); + alphaskia_canvas_move_to(canvas, static_cast(457.510009765625), static_cast(92.4199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(457.510009765625), static_cast(141.9199951171875)); alphaskia_canvas_stroke(canvas); alphaskia_canvas_set_line_width(canvas, static_cast(1)); alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(545.8699951171875), static_cast(107.5)); - alphaskia_canvas_line_to(canvas, static_cast(545.8699951171875), static_cast(175)); + alphaskia_canvas_move_to(canvas, static_cast(507.00750732421875), static_cast(65.4199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(507.00750732421875), static_cast(132.9199951171875)); alphaskia_canvas_stroke(canvas); alphaskia_canvas_set_line_width(canvas, static_cast(1)); alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(586.413330078125), static_cast(125.5)); - alphaskia_canvas_line_to(canvas, static_cast(586.413330078125), static_cast(184)); + alphaskia_canvas_move_to(canvas, static_cast(547.5050048828125), static_cast(83.41999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(547.5050048828125), static_cast(141.9199951171875)); alphaskia_canvas_stroke(canvas); alphaskia_canvas_set_line_width(canvas, static_cast(1)); alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(626.9566650390625), static_cast(107.5)); - alphaskia_canvas_line_to(canvas, static_cast(626.9566650390625), static_cast(184)); + alphaskia_canvas_move_to(canvas, static_cast(588.0025024414062), static_cast(65.4199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(588.0025024414062), static_cast(141.9199951171875)); alphaskia_canvas_stroke(canvas); alphaskia_canvas_set_line_width(canvas, static_cast(1)); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); - alphaskia_canvas_fill_rect(canvas, static_cast(92), static_cast(284), static_cast(254), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(92), static_cast(295), static_cast(254), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(92), static_cast(306), static_cast(254), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(92), static_cast(317), static_cast(61.02685546875), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(161.32666015625), static_cast(317), static_cast(31.759140014648438), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(201.38560485839844), static_cast(317), static_cast(31.759140014648438), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(241.44454956054688), static_cast(317), static_cast(31.759124755859375), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(281.50347900390625), static_cast(317), static_cast(25.273406982421875), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(315.0766906738281), static_cast(317), static_cast(30.923309326171875), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(92), static_cast(328), static_cast(254), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(92), static_cast(339), static_cast(254), static_cast(1.04)); - alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); - alphaskia_canvas_fill_text(canvas, u"\uE06D", 1, music_typeface, static_cast(music_font_size * 0.9230769230769231), static_cast(97), static_cast(311.8), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_rect(canvas, static_cast(625), static_cast(87), static_cast(82), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(625), static_cast(96), static_cast(82), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(625), static_cast(105), static_cast(82), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(625), static_cast(114), static_cast(82), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(625), static_cast(123), static_cast(82), static_cast(1.04)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(200), static_cast(0), static_cast(0), static_cast(255))); + text_baseline = alphaskia_text_baseline_top; + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(11); + alphaskia_canvas_fill_text(canvas, u"4", 1, text_style, font_size, static_cast(625), static_cast(76.5699951171875), text_align, text_baseline); + text_baseline = alphaskia_text_baseline_top; + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE4EF\uE4F0\uE4F0\uE4F0\uE4F1", 5, music_text_style, static_cast(music_font_size * 1), static_cast(636.2920074462891), static_cast(105.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uE083", 1, music_text_style, static_cast(music_font_size * 1), static_cast(666.2920074462891), static_cast(74), alphaskia_text_align_center, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_fill_rect(canvas, static_cast(706), static_cast(87.9199951171875), static_cast(1), static_cast(36.000000000000014)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_fill_rect(canvas, static_cast(707), static_cast(87), static_cast(163), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(707), static_cast(96), static_cast(163), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(707), static_cast(105), static_cast(163), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(707), static_cast(114), static_cast(163), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(707), static_cast(123), static_cast(163), static_cast(1.04)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(200), static_cast(0), static_cast(0), static_cast(255))); + text_baseline = alphaskia_text_baseline_top; + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(11); + alphaskia_canvas_fill_text(canvas, u"7", 1, text_style, font_size, static_cast(707), static_cast(76.5699951171875), text_align, text_baseline); + text_baseline = alphaskia_text_baseline_top; + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(718.2920074462891), static_cast(96.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(754.8440055847168), static_cast(96.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(791.3960037231445), static_cast(96.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(827.9480018615723), static_cast(96.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_fill_rect(canvas, static_cast(869), static_cast(87.9199951171875), static_cast(1), static_cast(36.000000000000014)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); + alphaskia_canvas_begin_path(canvas); + alphaskia_canvas_move_to(canvas, static_cast(718.2920074462891), static_cast(96.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(718.2920074462891), static_cast(123.91999511718751)); + alphaskia_canvas_stroke(canvas); + alphaskia_canvas_set_line_width(canvas, static_cast(1)); + alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); + alphaskia_canvas_begin_path(canvas); + alphaskia_canvas_move_to(canvas, static_cast(754.8440055847168), static_cast(96.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(754.8440055847168), static_cast(123.91999511718751)); + alphaskia_canvas_stroke(canvas); + alphaskia_canvas_set_line_width(canvas, static_cast(1)); + alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); + alphaskia_canvas_begin_path(canvas); + alphaskia_canvas_move_to(canvas, static_cast(791.3960037231445), static_cast(96.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(791.3960037231445), static_cast(123.91999511718751)); + alphaskia_canvas_stroke(canvas); + alphaskia_canvas_set_line_width(canvas, static_cast(1)); + alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); + alphaskia_canvas_begin_path(canvas); + alphaskia_canvas_move_to(canvas, static_cast(827.9480018615723), static_cast(96.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(827.9480018615723), static_cast(123.91999511718751)); + alphaskia_canvas_stroke(canvas); + alphaskia_canvas_set_line_width(canvas, static_cast(1)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_fill_rect(canvas, static_cast(870), static_cast(87), static_cast(60), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(870), static_cast(96), static_cast(60), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(870), static_cast(105), static_cast(60), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(870), static_cast(114), static_cast(60), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(870), static_cast(123), static_cast(60), static_cast(1.04)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(200), static_cast(0), static_cast(0), static_cast(255))); + text_baseline = alphaskia_text_baseline_top; + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(11); + alphaskia_canvas_fill_text(canvas, u"8", 1, text_style, font_size, static_cast(870), static_cast(76.5699951171875), text_align, text_baseline); + text_baseline = alphaskia_text_baseline_top; + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE0A4", 1, music_text_style, static_cast(music_font_size * 1), static_cast(881.2920074462891), static_cast(96.91999511718751), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_fill_rect(canvas, static_cast(922), static_cast(87.9199951171875), static_cast(1), static_cast(36.000000000000014)); + alphaskia_canvas_fill_rect(canvas, static_cast(926), static_cast(87.9199951171875), static_cast(4), static_cast(36.000000000000014)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_line_width(canvas, static_cast(0.96)); + alphaskia_canvas_begin_path(canvas); + alphaskia_canvas_move_to(canvas, static_cast(881.2920074462891), static_cast(96.91999511718751)); + alphaskia_canvas_line_to(canvas, static_cast(881.2920074462891), static_cast(123.91999511718751)); + alphaskia_canvas_stroke(canvas); + alphaskia_canvas_set_line_width(canvas, static_cast(1)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(722.7920074462891), static_cast(161.4199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(733.592007446289), static_cast(161.4199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(744.3920074462891), static_cast(161.4199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(755.192007446289), static_cast(161.4199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(765.9920074462891), static_cast(161.4199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(776.7920074462891), static_cast(161.4199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(787.592007446289), static_cast(161.4199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(798.3920074462891), static_cast(161.4199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(809.192007446289), static_cast(161.4199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(819.9920074462891), static_cast(161.4199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_fill_rect(canvas, static_cast(48), static_cast(216), static_cast(259), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(48), static_cast(227), static_cast(259), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(48), static_cast(238), static_cast(259), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(48), static_cast(249), static_cast(66.07400512695312), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(122.510009765625), static_cast(249), static_cast(31.81214141845703), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(162.7581558227539), static_cast(249), static_cast(31.81214141845703), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(203.0063018798828), static_cast(249), static_cast(31.8121337890625), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(243.2544403076172), static_cast(249), static_cast(25.2957763671875), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(276.98622131347656), static_cast(249), static_cast(30.013778686523438), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(48), static_cast(260), static_cast(259), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(48), static_cast(271), static_cast(259), static_cast(1.04)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_fill_rect(canvas, static_cast(48), static_cast(216.3199951171875), static_cast(1), static_cast(54.99999999999994)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_fill_text(canvas, u"\uE06D", 1, music_text_style, static_cast(music_font_size * 0.9230769230769231), static_cast(54), static_cast(243.8199951171875), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); text_baseline = alphaskia_text_baseline_middle; - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(163.32666015625), static_cast(317.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(124.510009765625), static_cast(249.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"9", 1, typeface, font_size, static_cast(153.02685546875), static_cast(317.3), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"9", 1, text_style, font_size, static_cast(114.07400512695312), static_cast(249.3199951171875), text_align, text_baseline); text_baseline = alphaskia_text_baseline_top; alphaskia_canvas_begin_path(canvas); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(188.23569962449085), static_cast(274.7)); - alphaskia_canvas_line_to(canvas, static_cast(185.23569962449085), static_cast(280.7)); - alphaskia_canvas_line_to(canvas, static_cast(191.23569962449085), static_cast(280.7)); + alphaskia_canvas_move_to(canvas, static_cast(150.32215017408072), static_cast(206.7199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(147.32215017408072), static_cast(212.7199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(153.32215017408072), static_cast(212.7199951171875)); alphaskia_canvas_close_path(canvas); alphaskia_canvas_fill(canvas); + alphaskia_canvas_begin_path(canvas); + alphaskia_canvas_move_to(canvas, static_cast(123.510009765625), static_cast(249.3199951171875)); + alphaskia_canvas_bezier_curve_to(canvas, static_cast(136.91607996985286), static_cast(249.3199951171875), static_cast(150.32215017408072), static_cast(249.3199951171875), static_cast(150.32215017408072), static_cast(212.7199951171875)); alphaskia_canvas_stroke(canvas); - alphaskia_canvas_move_to(canvas, static_cast(162.32666015625), static_cast(317.3)); - alphaskia_canvas_bezier_curve_to(canvas, static_cast(175.28117989037042), static_cast(317.3), static_cast(188.23569962449085), static_cast(317.3), static_cast(188.23569962449085), static_cast(280.7)); - alphaskia_canvas_stroke(canvas); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"\u00BC", 1, typeface, font_size, static_cast(183.47495743699085), static_cast(260.7), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"\u00BC", 1, text_style, font_size, static_cast(145.47965139478384), static_cast(192.7199951171875), text_align, text_baseline); text_baseline = alphaskia_text_baseline_middle; - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(203.38560196824085), static_cast(317.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(164.7581548127526), static_cast(249.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"9", 1, typeface, font_size, static_cast(193.08579728074085), static_cast(317.3), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"9", 1, text_style, font_size, static_cast(154.32215017408072), static_cast(249.3199951171875), text_align, text_baseline); text_baseline = alphaskia_text_baseline_top; alphaskia_canvas_begin_path(canvas); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(228.29464143648167), static_cast(268.7)); - alphaskia_canvas_line_to(canvas, static_cast(225.29464143648167), static_cast(274.7)); - alphaskia_canvas_line_to(canvas, static_cast(231.29464143648167), static_cast(274.7)); + alphaskia_canvas_move_to(canvas, static_cast(190.5702952212083), static_cast(200.7199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(187.5702952212083), static_cast(206.7199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(193.5702952212083), static_cast(206.7199951171875)); alphaskia_canvas_close_path(canvas); alphaskia_canvas_fill(canvas); + alphaskia_canvas_begin_path(canvas); + alphaskia_canvas_move_to(canvas, static_cast(163.7581548127526), static_cast(249.3199951171875)); + alphaskia_canvas_bezier_curve_to(canvas, static_cast(177.16422501698045), static_cast(249.3199951171875), static_cast(190.5702952212083), static_cast(249.3199951171875), static_cast(190.5702952212083), static_cast(206.7199951171875)); alphaskia_canvas_stroke(canvas); - alphaskia_canvas_move_to(canvas, static_cast(202.38560196824085), static_cast(317.3)); - alphaskia_canvas_bezier_curve_to(canvas, static_cast(215.34012170236127), static_cast(317.3), static_cast(228.29464143648167), static_cast(317.3), static_cast(228.29464143648167), static_cast(274.7)); - alphaskia_canvas_stroke(canvas); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"\u00BD", 1, typeface, font_size, static_cast(223.25142854585667), static_cast(254.7), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"\u00BD", 1, text_style, font_size, static_cast(185.55879772364972), static_cast(186.7199951171875), text_align, text_baseline); text_baseline = alphaskia_text_baseline_middle; - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(243.44454378023167), static_cast(317.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(205.0062998598802), static_cast(249.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"9", 1, typeface, font_size, static_cast(233.14473909273167), static_cast(317.3), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"9", 1, text_style, font_size, static_cast(194.5702952212083), static_cast(249.3199951171875), text_align, text_baseline); text_baseline = alphaskia_text_baseline_top; alphaskia_canvas_begin_path(canvas); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(268.3535832484725), static_cast(256.7)); - alphaskia_canvas_line_to(canvas, static_cast(265.3535832484725), static_cast(262.7)); - alphaskia_canvas_line_to(canvas, static_cast(271.3535832484725), static_cast(262.7)); + alphaskia_canvas_move_to(canvas, static_cast(230.81844026833588), static_cast(188.7199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(227.81844026833588), static_cast(194.7199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(233.81844026833588), static_cast(194.7199951171875)); alphaskia_canvas_close_path(canvas); alphaskia_canvas_fill(canvas); + alphaskia_canvas_begin_path(canvas); + alphaskia_canvas_move_to(canvas, static_cast(204.0062998598802), static_cast(249.3199951171875)); + alphaskia_canvas_bezier_curve_to(canvas, static_cast(217.41237006410802), static_cast(249.3199951171875), static_cast(230.81844026833588), static_cast(249.3199951171875), static_cast(230.81844026833588), static_cast(194.7199951171875)); alphaskia_canvas_stroke(canvas); - alphaskia_canvas_move_to(canvas, static_cast(242.44454378023167), static_cast(317.3)); - alphaskia_canvas_bezier_curve_to(canvas, static_cast(255.39906351435206), static_cast(317.3), static_cast(268.3535832484725), static_cast(317.3), static_cast(268.3535832484725), static_cast(262.7)); - alphaskia_canvas_stroke(canvas); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"full", 4, typeface, font_size, static_cast(259.3589543422225), static_cast(242.7), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"full", 4, text_style, font_size, static_cast(221.2114380100351), static_cast(174.7199951171875), text_align, text_baseline); text_baseline = alphaskia_text_baseline_middle; - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(283.5034855922225), static_cast(317.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(245.25444490700775), static_cast(249.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"9", 1, typeface, font_size, static_cast(273.2036809047225), static_cast(317.3), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"9", 1, text_style, font_size, static_cast(234.81844026833588), static_cast(249.3199951171875), text_align, text_baseline); text_baseline = alphaskia_text_baseline_top; alphaskia_canvas_begin_path(canvas); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(301.9267916242362), static_cast(244.7)); - alphaskia_canvas_line_to(canvas, static_cast(298.9267916242362), static_cast(250.7)); - alphaskia_canvas_line_to(canvas, static_cast(304.9267916242362), static_cast(250.7)); + alphaskia_canvas_move_to(canvas, static_cast(264.55021897449996), static_cast(176.7199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(261.55021897449996), static_cast(182.7199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(267.55021897449996), static_cast(182.7199951171875)); alphaskia_canvas_close_path(canvas); alphaskia_canvas_fill(canvas); + alphaskia_canvas_begin_path(canvas); + alphaskia_canvas_move_to(canvas, static_cast(244.25444490700775), static_cast(249.3199951171875)); + alphaskia_canvas_bezier_curve_to(canvas, static_cast(254.40233194075387), static_cast(249.3199951171875), static_cast(264.55021897449996), static_cast(249.3199951171875), static_cast(264.55021897449996), static_cast(182.7199951171875)); alphaskia_canvas_stroke(canvas); - alphaskia_canvas_move_to(canvas, static_cast(282.5034855922225), static_cast(317.3)); - alphaskia_canvas_bezier_curve_to(canvas, static_cast(292.2151386082294), static_cast(317.3), static_cast(301.9267916242362), static_cast(317.3), static_cast(301.9267916242362), static_cast(250.7)); - alphaskia_canvas_stroke(canvas); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"1\u00BD", 2, typeface, font_size, static_cast(293.2336763898612), static_cast(230.7), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"1\u00BD", 2, text_style, font_size, static_cast(255.82071915760542), static_cast(162.7199951171875), text_align, text_baseline); text_baseline = alphaskia_text_baseline_middle; - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(317.0766939679862), static_cast(317.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(278.98622361317183), static_cast(249.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"9", 1, typeface, font_size, static_cast(306.7768892804862), static_cast(317.3), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"9", 1, text_style, font_size, static_cast(268.55021897449996), static_cast(249.3199951171875), text_align, text_baseline); text_baseline = alphaskia_text_baseline_top; alphaskia_canvas_begin_path(canvas); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(340), static_cast(232.7)); - alphaskia_canvas_line_to(canvas, static_cast(337), static_cast(238.7)); - alphaskia_canvas_line_to(canvas, static_cast(343), static_cast(238.7)); + alphaskia_canvas_move_to(canvas, static_cast(302), static_cast(164.7199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(299), static_cast(170.7199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(305), static_cast(170.7199951171875)); alphaskia_canvas_close_path(canvas); alphaskia_canvas_fill(canvas); + alphaskia_canvas_begin_path(canvas); + alphaskia_canvas_move_to(canvas, static_cast(277.98622361317183), static_cast(249.3199951171875)); + alphaskia_canvas_bezier_curve_to(canvas, static_cast(289.99311180658594), static_cast(249.3199951171875), static_cast(302), static_cast(249.3199951171875), static_cast(302), static_cast(170.7199951171875)); alphaskia_canvas_stroke(canvas); - alphaskia_canvas_move_to(canvas, static_cast(316.0766939679862), static_cast(317.3)); - alphaskia_canvas_bezier_curve_to(canvas, static_cast(328.0383469839931), static_cast(317.3), static_cast(340), static_cast(317.3), static_cast(340), static_cast(238.7)); - alphaskia_canvas_stroke(canvas); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"2", 1, typeface, font_size, static_cast(336.35009765625), static_cast(218.7), text_align, text_baseline); - alphaskia_canvas_fill_rect(canvas, static_cast(345), static_cast(284.3), static_cast(1), static_cast(54.99999999999994)); + alphaskia_canvas_fill_text(canvas, u"2", 1, text_style, font_size, static_cast(298.28199768066406), static_cast(150.7199951171875), text_align, text_baseline); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_fill_rect(canvas, static_cast(306), static_cast(216.3199951171875), static_cast(1), static_cast(54.99999999999994)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); - alphaskia_canvas_fill_rect(canvas, static_cast(346), static_cast(284), static_cast(126), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(346), static_cast(295), static_cast(12.02685546875), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(366.32666015625), static_cast(295), static_cast(12.882984161376953), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(387.50944900512695), static_cast(295), static_cast(84.49055099487305), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(346), static_cast(306), static_cast(126), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(346), static_cast(317), static_cast(54.392433166503906), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(408.6922378540039), static_cast(317), static_cast(18.781005859375), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(435.7730484008789), static_cast(317), static_cast(36.226951599121094), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(346), static_cast(328), static_cast(126), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(346), static_cast(339), static_cast(126), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(307), static_cast(216), static_cast(126), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(307), static_cast(227), static_cast(12.074005126953125), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(327.510009765625), static_cast(227), static_cast(12.9197998046875), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(348.8658142089844), static_cast(227), static_cast(84.13418579101562), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(307), static_cast(238), static_cast(126), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(307), static_cast(249), static_cast(54.785614013671875), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(370.22161865234375), static_cast(249), static_cast(18.865989685058594), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(397.5236129760742), static_cast(249), static_cast(35.47638702392578), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(307), static_cast(260), static_cast(126), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(307), static_cast(271), static_cast(126), static_cast(1.04)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); text_baseline = alphaskia_text_baseline_middle; - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(368.32666015625), static_cast(295.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(329.510009765625), static_cast(227.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"3", 1, typeface, font_size, static_cast(358.02685546875), static_cast(295.3), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"3", 1, text_style, font_size, static_cast(319.0740051269531), static_cast(227.3199951171875), text_align, text_baseline); text_baseline = alphaskia_text_baseline_top; text_baseline = alphaskia_text_baseline_middle; - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(389.509449828346), static_cast(295.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(350.86581383925926), static_cast(227.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"3", 1, typeface, font_size, static_cast(379.209645140846), static_cast(295.3), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"3", 1, text_style, font_size, static_cast(340.4298092005874), static_cast(227.3199951171875), text_align, text_baseline); text_baseline = alphaskia_text_baseline_top; text_baseline = alphaskia_text_baseline_middle; - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(410.692239500442), static_cast(317.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(372.2216179128936), static_cast(249.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"3", 1, typeface, font_size, static_cast(400.392434812942), static_cast(317.3), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"3", 1, text_style, font_size, static_cast(361.7856132742217), static_cast(249.3199951171875), text_align, text_baseline); text_baseline = alphaskia_text_baseline_top; text_baseline = alphaskia_text_baseline_middle; - typeface = alphaskia_get_typeface("Roboto", false, false); - font_size = static_cast(13); - typeface = alphaskia_get_typeface("Roboto", false, false); - font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(437.773050047317), static_cast(317.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); - font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"5", 1, typeface, font_size, static_cast(427.473245359817), static_cast(317.3), text_align, text_baseline); - text_baseline = alphaskia_text_baseline_top; - alphaskia_canvas_fill_rect(canvas, static_cast(471), static_cast(284.3), static_cast(1), static_cast(54.99999999999994)); - alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); - alphaskia_canvas_fill_rect(canvas, static_cast(472), static_cast(284), static_cast(25.1767578125), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(505.4765625), static_cast(284), static_cast(32.2435302734375), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(546.0198974609375), static_cast(284), static_cast(72.786865234375), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(627.1065673828125), static_cast(284), static_cast(50.8934326171875), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(472), static_cast(295), static_cast(25.1767578125), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(505.4765625), static_cast(295), static_cast(32.2435302734375), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(546.0198974609375), static_cast(295), static_cast(72.786865234375), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(627.1065673828125), static_cast(295), static_cast(50.8934326171875), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(472), static_cast(306), static_cast(25.1767578125), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(505.4765625), static_cast(306), static_cast(32.2435302734375), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(546.0198974609375), static_cast(306), static_cast(32.2435302734375), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(586.563232421875), static_cast(306), static_cast(32.2435302734375), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(627.1065673828125), static_cast(306), static_cast(50.8934326171875), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(472), static_cast(317), static_cast(65.7200927734375), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(546.0198974609375), static_cast(317), static_cast(32.2435302734375), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(586.563232421875), static_cast(317), static_cast(32.2435302734375), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(627.1065673828125), static_cast(317), static_cast(50.8934326171875), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(472), static_cast(328), static_cast(65.7200927734375), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(546.0198974609375), static_cast(328), static_cast(32.2435302734375), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(586.563232421875), static_cast(328), static_cast(32.2435302734375), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(627.1065673828125), static_cast(328), static_cast(50.8934326171875), static_cast(1.04)); - alphaskia_canvas_fill_rect(canvas, static_cast(472), static_cast(339), static_cast(206), static_cast(1.04)); - alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); - alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(488), static_cast(275.8)); - alphaskia_canvas_line_to(canvas, static_cast(488), static_cast(312.8)); - alphaskia_canvas_stroke(canvas); - alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(488), static_cast(275.8)); - alphaskia_canvas_line_to(canvas, static_cast(492), static_cast(283.8)); - alphaskia_canvas_line_to(canvas, static_cast(484), static_cast(283.8)); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(13); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(11); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(399.52361605132126), static_cast(249.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(13); + alphaskia_canvas_fill_text(canvas, u"5", 1, text_style, font_size, static_cast(389.0876114126494), static_cast(249.3199951171875), text_align, text_baseline); + text_baseline = alphaskia_text_baseline_top; + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_fill_rect(canvas, static_cast(432), static_cast(216.3199951171875), static_cast(1), static_cast(54.99999999999994)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_fill_rect(canvas, static_cast(433), static_cast(216), static_cast(25.292007446289062), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(466.72801208496094), static_cast(216), static_cast(32.061492919921875), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(507.2255096435547), static_cast(216), static_cast(72.55899047851562), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(588.2205047607422), static_cast(216), static_cast(36.77949523925781), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(433), static_cast(227), static_cast(25.292007446289062), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(466.72801208496094), static_cast(227), static_cast(32.061492919921875), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(507.2255096435547), static_cast(227), static_cast(72.55899047851562), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(588.2205047607422), static_cast(227), static_cast(36.77949523925781), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(433), static_cast(238), static_cast(25.292007446289062), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(466.72801208496094), static_cast(238), static_cast(32.061492919921875), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(507.2255096435547), static_cast(238), static_cast(32.061492919921875), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(547.7230072021484), static_cast(238), static_cast(32.061492919921875), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(588.2205047607422), static_cast(238), static_cast(36.77949523925781), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(433), static_cast(249), static_cast(65.78950500488281), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(507.2255096435547), static_cast(249), static_cast(32.061492919921875), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(547.7230072021484), static_cast(249), static_cast(32.061492919921875), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(588.2205047607422), static_cast(249), static_cast(36.77949523925781), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(433), static_cast(260), static_cast(65.78950500488281), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(507.2255096435547), static_cast(260), static_cast(32.061492919921875), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(547.7230072021484), static_cast(260), static_cast(32.061492919921875), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(588.2205047607422), static_cast(260), static_cast(36.77949523925781), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(433), static_cast(271), static_cast(192), static_cast(1.04)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_begin_path(canvas); + alphaskia_canvas_move_to(canvas, static_cast(449), static_cast(207.8199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(449), static_cast(244.8199951171875)); + alphaskia_canvas_stroke(canvas); + alphaskia_canvas_begin_path(canvas); + alphaskia_canvas_move_to(canvas, static_cast(449), static_cast(207.8199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(453), static_cast(215.8199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(445), static_cast(215.8199951171875)); alphaskia_canvas_close_path(canvas); alphaskia_canvas_fill(canvas); text_baseline = alphaskia_text_baseline_middle; - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(507.4765625), static_cast(284.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(468.72801208496094), static_cast(216.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"0", 1, typeface, font_size, static_cast(497.1767578125), static_cast(284.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"0", 1, text_style, font_size, static_cast(458.29200744628906), static_cast(216.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(507.4765625), static_cast(295.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(468.72801208496094), static_cast(227.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"1", 1, typeface, font_size, static_cast(497.1767578125), static_cast(295.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"1", 1, text_style, font_size, static_cast(458.29200744628906), static_cast(227.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(507.4765625), static_cast(306.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(468.72801208496094), static_cast(238.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"0", 1, typeface, font_size, static_cast(497.1767578125), static_cast(306.3), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"0", 1, text_style, font_size, static_cast(458.29200744628906), static_cast(238.3199951171875), text_align, text_baseline); text_baseline = alphaskia_text_baseline_top; - alphaskia_canvas_begin_rotate(canvas, static_cast(527.7200927734375), static_cast(326.8), static_cast(-90)); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(0), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(10.799999999999999), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(21.599999999999998), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(32.4), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(43.199999999999996), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_begin_rotate(canvas, static_cast(488.7895050048828), static_cast(258.8199951171875), static_cast(-90)); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(0), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(10.799999999999999), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(21.599999999999998), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(32.4), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(43.199999999999996), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); alphaskia_canvas_end_rotate(canvas); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(528), static_cast(334.8)); - alphaskia_canvas_line_to(canvas, static_cast(532), static_cast(326.8)); - alphaskia_canvas_line_to(canvas, static_cast(524), static_cast(326.8)); + alphaskia_canvas_move_to(canvas, static_cast(489), static_cast(266.8199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(493), static_cast(258.8199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(485), static_cast(258.8199951171875)); alphaskia_canvas_close_path(canvas); alphaskia_canvas_fill(canvas); text_baseline = alphaskia_text_baseline_middle; - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(548.0198974609375), static_cast(284.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(509.2255096435547), static_cast(216.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"0", 1, typeface, font_size, static_cast(537.7200927734375), static_cast(284.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"0", 1, text_style, font_size, static_cast(498.7895050048828), static_cast(216.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(548.0198974609375), static_cast(295.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(509.2255096435547), static_cast(227.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"1", 1, typeface, font_size, static_cast(537.7200927734375), static_cast(295.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"1", 1, text_style, font_size, static_cast(498.7895050048828), static_cast(227.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(548.0198974609375), static_cast(306.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(509.2255096435547), static_cast(238.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"0", 1, typeface, font_size, static_cast(537.7200927734375), static_cast(306.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"0", 1, text_style, font_size, static_cast(498.7895050048828), static_cast(238.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(548.0198974609375), static_cast(317.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(509.2255096435547), static_cast(249.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"2", 1, typeface, font_size, static_cast(537.7200927734375), static_cast(317.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"2", 1, text_style, font_size, static_cast(498.7895050048828), static_cast(249.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(548.0198974609375), static_cast(328.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(509.2255096435547), static_cast(260.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"3", 1, typeface, font_size, static_cast(537.7200927734375), static_cast(328.3), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"3", 1, text_style, font_size, static_cast(498.7895050048828), static_cast(260.3199951171875), text_align, text_baseline); text_baseline = alphaskia_text_baseline_top; alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(569), static_cast(297.8)); - alphaskia_canvas_line_to(canvas, static_cast(569), static_cast(334.8)); + alphaskia_canvas_move_to(canvas, static_cast(530), static_cast(229.8199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(530), static_cast(266.8199951171875)); alphaskia_canvas_stroke(canvas); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(569), static_cast(297.8)); - alphaskia_canvas_line_to(canvas, static_cast(573), static_cast(305.8)); - alphaskia_canvas_line_to(canvas, static_cast(565), static_cast(305.8)); + alphaskia_canvas_move_to(canvas, static_cast(530), static_cast(229.8199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(534), static_cast(237.8199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(526), static_cast(237.8199951171875)); alphaskia_canvas_close_path(canvas); alphaskia_canvas_fill(canvas); text_baseline = alphaskia_text_baseline_middle; - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(588.563232421875), static_cast(306.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(549.7230072021484), static_cast(238.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"2", 1, typeface, font_size, static_cast(578.263427734375), static_cast(306.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"2", 1, text_style, font_size, static_cast(539.2870025634766), static_cast(238.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(588.563232421875), static_cast(317.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(549.7230072021484), static_cast(249.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"2", 1, typeface, font_size, static_cast(578.263427734375), static_cast(317.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"2", 1, text_style, font_size, static_cast(539.2870025634766), static_cast(249.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(588.563232421875), static_cast(328.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(549.7230072021484), static_cast(260.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"0", 1, typeface, font_size, static_cast(578.263427734375), static_cast(328.3), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"0", 1, text_style, font_size, static_cast(539.2870025634766), static_cast(260.3199951171875), text_align, text_baseline); text_baseline = alphaskia_text_baseline_top; - alphaskia_canvas_begin_rotate(canvas, static_cast(596.8067626953125), static_cast(283.8), static_cast(90)); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(0), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(10.799999999999999), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(21.599999999999998), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(32.4), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); - alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_typeface, static_cast(music_font_size * 1.2), static_cast(43.199999999999996), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_begin_rotate(canvas, static_cast(569.7845001220703), static_cast(215.8199951171875), static_cast(90)); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(0), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(10.799999999999999), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(21.599999999999998), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(32.4), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + alphaskia_canvas_fill_text(canvas, u"\uEAA4", 1, music_text_style, static_cast(music_font_size * 1.2), static_cast(43.199999999999996), static_cast(10.799999999999999), alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); alphaskia_canvas_end_rotate(canvas); alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(597), static_cast(275.8)); - alphaskia_canvas_line_to(canvas, static_cast(601), static_cast(283.8)); - alphaskia_canvas_line_to(canvas, static_cast(593), static_cast(283.8)); + alphaskia_canvas_move_to(canvas, static_cast(570), static_cast(207.8199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(574), static_cast(215.8199951171875)); + alphaskia_canvas_line_to(canvas, static_cast(566), static_cast(215.8199951171875)); alphaskia_canvas_close_path(canvas); alphaskia_canvas_fill(canvas); text_baseline = alphaskia_text_baseline_middle; - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - typeface = alphaskia_get_typeface("Roboto", false, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(629.1065673828125), static_cast(284.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(590.2205047607422), static_cast(216.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"0", 1, typeface, font_size, static_cast(618.8067626953125), static_cast(284.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"0", 1, text_style, font_size, static_cast(579.7845001220703), static_cast(216.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(629.1065673828125), static_cast(295.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(590.2205047607422), static_cast(227.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"2", 1, typeface, font_size, static_cast(618.8067626953125), static_cast(295.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"2", 1, text_style, font_size, static_cast(579.7845001220703), static_cast(227.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(629.1065673828125), static_cast(306.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(590.2205047607422), static_cast(238.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"2", 1, typeface, font_size, static_cast(618.8067626953125), static_cast(306.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"2", 1, text_style, font_size, static_cast(579.7845001220703), static_cast(238.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(629.1065673828125), static_cast(317.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(590.2205047607422), static_cast(249.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"2", 1, typeface, font_size, static_cast(618.8067626953125), static_cast(317.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"2", 1, text_style, font_size, static_cast(579.7845001220703), static_cast(249.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(11); - alphaskia_canvas_fill_text(canvas, u"", 0, typeface, font_size, static_cast(629.1065673828125), static_cast(328.3), text_align, text_baseline); - typeface = alphaskia_get_typeface("Roboto", false, false); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(590.2205047607422), static_cast(260.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); font_size = static_cast(13); - alphaskia_canvas_fill_text(canvas, u"0", 1, typeface, font_size, static_cast(618.8067626953125), static_cast(328.3), text_align, text_baseline); + alphaskia_canvas_fill_text(canvas, u"0", 1, text_style, font_size, static_cast(579.7845001220703), static_cast(260.3199951171875), text_align, text_baseline); text_baseline = alphaskia_text_baseline_top; - alphaskia_canvas_fill_rect(canvas, static_cast(670), static_cast(284.3), static_cast(1), static_cast(54.99999999999994)); - alphaskia_canvas_fill_rect(canvas, static_cast(674), static_cast(284.3), static_cast(4), static_cast(54.99999999999994)); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); - alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(92), static_cast(130.1)); - alphaskia_canvas_line_to(canvas, static_cast(92), static_cast(339.3)); - alphaskia_canvas_stroke(canvas); - typeface = alphaskia_get_typeface("PT Serif", false, true); + alphaskia_canvas_fill_rect(canvas, static_cast(624), static_cast(216.3199951171875), static_cast(1), static_cast(54.99999999999994)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_fill_rect(canvas, static_cast(625), static_cast(216), static_cast(82), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(625), static_cast(227), static_cast(82), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(625), static_cast(238), static_cast(82), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(625), static_cast(249), static_cast(82), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(625), static_cast(260), static_cast(82), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(625), static_cast(271), static_cast(82), static_cast(1.04)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_fill_rect(canvas, static_cast(706), static_cast(216.3199951171875), static_cast(1), static_cast(54.99999999999994)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_fill_rect(canvas, static_cast(707), static_cast(216), static_cast(163), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(707), static_cast(227), static_cast(12.074005126953125), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(727.510009765625), static_cast(227), static_cast(28.11599349975586), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(764.0620079040527), static_cast(227), static_cast(28.11599349975586), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(800.6140060424805), static_cast(227), static_cast(28.115989685058594), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(837.1660003662109), static_cast(227), static_cast(32.83399963378906), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(707), static_cast(238), static_cast(163), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(707), static_cast(249), static_cast(163), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(707), static_cast(260), static_cast(163), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(707), static_cast(271), static_cast(163), static_cast(1.04)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + text_baseline = alphaskia_text_baseline_middle; + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(13); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(11); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(729.510009765625), static_cast(227.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(13); + alphaskia_canvas_fill_text(canvas, u"3", 1, text_style, font_size, static_cast(719.0740051269531), static_cast(227.3199951171875), text_align, text_baseline); + text_baseline = alphaskia_text_baseline_top; + text_baseline = alphaskia_text_baseline_middle; + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(13); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(11); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(766.0620079040527), static_cast(227.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(13); + alphaskia_canvas_fill_text(canvas, u"3", 1, text_style, font_size, static_cast(755.6260032653809), static_cast(227.3199951171875), text_align, text_baseline); + text_baseline = alphaskia_text_baseline_top; + text_baseline = alphaskia_text_baseline_middle; + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(13); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(11); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(802.6140060424805), static_cast(227.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(13); + alphaskia_canvas_fill_text(canvas, u"3", 1, text_style, font_size, static_cast(792.1780014038086), static_cast(227.3199951171875), text_align, text_baseline); + text_baseline = alphaskia_text_baseline_top; + text_baseline = alphaskia_text_baseline_middle; + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(13); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(11); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(839.1660041809082), static_cast(227.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(13); + alphaskia_canvas_fill_text(canvas, u"3", 1, text_style, font_size, static_cast(828.7299995422363), static_cast(227.3199951171875), text_align, text_baseline); + text_baseline = alphaskia_text_baseline_top; + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_fill_rect(canvas, static_cast(869), static_cast(216.3199951171875), static_cast(1), static_cast(54.99999999999994)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(165), static_cast(165), static_cast(165), static_cast(255))); + alphaskia_canvas_fill_rect(canvas, static_cast(870), static_cast(216), static_cast(60), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(870), static_cast(227), static_cast(12.074005126953125), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(890.510009765625), static_cast(227), static_cast(39.489990234375), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(870), static_cast(238), static_cast(60), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(870), static_cast(249), static_cast(60), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(870), static_cast(260), static_cast(60), static_cast(1.04)); + alphaskia_canvas_fill_rect(canvas, static_cast(870), static_cast(271), static_cast(60), static_cast(1.04)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + text_baseline = alphaskia_text_baseline_middle; + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(13); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(11); + alphaskia_canvas_fill_text(canvas, u"", 0, text_style, font_size, static_cast(892.510009765625), static_cast(227.3199951171875), text_align, text_baseline); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 400, false); + font_size = static_cast(13); + alphaskia_canvas_fill_text(canvas, u"3", 1, text_style, font_size, static_cast(882.0740051269531), static_cast(227.3199951171875), text_align, text_baseline); + text_baseline = alphaskia_text_baseline_top; + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + alphaskia_canvas_fill_rect(canvas, static_cast(922), static_cast(216.3199951171875), static_cast(1), static_cast(54.99999999999994)); + alphaskia_canvas_fill_rect(canvas, static_cast(926), static_cast(216.3199951171875), static_cast(4), static_cast(54.99999999999994)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(51), static_cast(204), static_cast(100))); + text_style = alphaskia_get_text_style({"Noto Serif", "Noto Music", "Noto Color Emoji"}, 400, true); font_size = static_cast(12); - alphaskia_canvas_fill_text(canvas, u"s.guit.", 7, typeface, font_size, static_cast(50), static_cast(130.1), text_align, text_baseline); - alphaskia_canvas_fill_rect(canvas, static_cast(86), static_cast(118.1), static_cast(3), static_cast(233.20000000000002)); - alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(86), static_cast(118.1)); - alphaskia_canvas_bezier_curve_to(canvas, static_cast(86), static_cast(118.1), static_cast(86), static_cast(118.1), static_cast(98), static_cast(115.1)); - alphaskia_canvas_bezier_curve_to(canvas, static_cast(92), static_cast(121.1), static_cast(86), static_cast(121.1), static_cast(86), static_cast(121.1)); - alphaskia_canvas_close_path(canvas); - alphaskia_canvas_fill(canvas); - alphaskia_canvas_begin_path(canvas); - alphaskia_canvas_move_to(canvas, static_cast(86), static_cast(351.3)); - alphaskia_canvas_bezier_curve_to(canvas, static_cast(86), static_cast(351.3), static_cast(92), static_cast(351.3), static_cast(98), static_cast(354.3)); - alphaskia_canvas_bezier_curve_to(canvas, static_cast(92), static_cast(348.3), static_cast(86), static_cast(348.3), static_cast(86), static_cast(348.3)); - alphaskia_canvas_close_path(canvas); - alphaskia_canvas_fill(canvas); + text_baseline = alphaskia_text_baseline_bottom; + text_align = alphaskia_text_align_center; + alphaskia_canvas_begin_rotate(canvas, static_cast(42), static_cast(179.6199951171875), static_cast(-90.1)); + alphaskia_canvas_fill_text(canvas, u"s.guit.", 7, text_style, font_size, static_cast(0), static_cast(0), text_align, text_baseline); + alphaskia_canvas_end_rotate(canvas); + text_baseline = alphaskia_text_baseline_top; + text_align = alphaskia_text_align_left; + alphaskia_canvas_fill_rect(canvas, static_cast(48), static_cast(123.91999511718751), static_cast(1), static_cast(93)); + return alphaskia_canvas_end_render(canvas); +} +alphaskia_image_t draw_music_sheet_part_4(alphaskia_canvas_t canvas) { + alphaskia_canvas_begin_render(canvas, 709, 14, static_cast(render_scale)); + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(153), static_cast(204), static_cast(30), static_cast(255))); + text_align = alphaskia_text_align_left; + text_baseline = alphaskia_text_baseline_top; + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 700, false); + font_size = static_cast(12); + text_align = alphaskia_text_align_center; + alphaskia_canvas_fill_text(canvas, u"Copyright", 9, text_style, font_size, static_cast(650), static_cast(0), text_align, text_baseline); + text_align = alphaskia_text_align_left; + text_baseline = alphaskia_text_baseline_top; return alphaskia_canvas_end_render(canvas); } alphaskia_image_t draw_music_sheet_part_5(alphaskia_canvas_t canvas) { - alphaskia_canvas_begin_render(canvas, 116, 24, static_cast(render_scale)); + alphaskia_canvas_begin_render(canvas, 779, 12, static_cast(render_scale)); alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(static_cast(0), static_cast(0), static_cast(0), static_cast(255))); - typeface = alphaskia_get_typeface("Roboto", true, false); + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 700, false); + font_size = static_cast(12); + text_align = alphaskia_text_align_left; + text_baseline = alphaskia_text_baseline_top; + text_style = alphaskia_get_text_style({"Noto Sans", "Noto Music", "Noto Color Emoji"}, 700, false); font_size = static_cast(12); + text_align = alphaskia_text_align_center; + alphaskia_canvas_fill_text(canvas, u"rendered by alphaTab", 20, text_style, font_size, static_cast(650), static_cast(0), text_align, text_baseline); text_align = alphaskia_text_align_left; - alphaskia_canvas_fill_text(canvas, u"rendered by alphaTab", 20, typeface, font_size, static_cast(0), static_cast(12), text_align, text_baseline); + text_baseline = alphaskia_text_baseline_top; return alphaskia_canvas_end_render(canvas); } std::array, 5> part_positions = {{ - {static_cast(0), static_cast(0), static_cast(1300), static_cast(164)}, {static_cast(0), static_cast(164), static_cast(1300), static_cast(38)}, {static_cast(0), static_cast(202), static_cast(1300), static_cast(6)}, {static_cast(0), static_cast(208), static_cast(1300), static_cast(373)}, {static_cast(591.962890625), static_cast(581), static_cast(116.07421875), static_cast(24)} + {static_cast(0), static_cast(35), static_cast(1300), static_cast(124)}, {static_cast(0), static_cast(159), static_cast(1300), static_cast(12)}, {static_cast(0), static_cast(171), static_cast(1300), static_cast(285)}, {static_cast(0), static_cast(456), static_cast(709), static_cast(14)}, {static_cast(0), static_cast(470), static_cast(779.2159881591797), static_cast(12)} }}; int32_t total_width = 1300; -int32_t total_height = 605; +int32_t total_height = 482; std::array all_parts = { &draw_music_sheet_part_1, &draw_music_sheet_part_2, &draw_music_sheet_part_3, &draw_music_sheet_part_4, &draw_music_sheet_part_5 diff --git a/test/native/src/main.cpp b/test/native/src/main.cpp index 2906389..53a8e2d 100644 --- a/test/native/src/main.cpp +++ b/test/native/src/main.cpp @@ -109,15 +109,26 @@ int main(int argc, char **argv) // Load all fonts for rendering std::cout << "Loading fonts" << std::endl; std::filesystem::path test_data_path = repository_root / "test" / "test-data"; - music_typeface = alphaskia_load_typeface("Bravura", false, false, (test_data_path / "font" / "bravura" / "Bravura.ttf").generic_string()); - alphaskia_load_typeface("Roboto", false, false, (test_data_path / "font" / "roboto" / "Roboto-Regular.ttf").generic_string()); - alphaskia_load_typeface("Roboto", true, false, (test_data_path / "font" / "roboto" / "Roboto-Bold.ttf").generic_string()); - alphaskia_load_typeface("Roboto", false, true, (test_data_path / "font" / "roboto" / "Roboto-Italic.ttf").generic_string()); - alphaskia_load_typeface("Roboto", true, true, (test_data_path / "font" / "roboto" / "Roboto-BoldItalic.ttf").generic_string()); - alphaskia_load_typeface("PT Serif", false, false, (test_data_path / "font" / "ptserif" / "PTSerif-Regular.ttf").generic_string()); - alphaskia_load_typeface("PT Serif", true, false, (test_data_path / "font" / "ptserif" / "PTSerif-Bold.ttf").generic_string()); - alphaskia_load_typeface("PT Serif", false, true, (test_data_path / "font" / "ptserif" / "PTSerif-Italic.ttf").generic_string()); - alphaskia_load_typeface("PT Serif", true, true, (test_data_path / "font" / "ptserif" / "PTSerif-BoldItalic.ttf").generic_string()); + auto music_typeface = alphaskia_load_typeface((test_data_path / "font" / "bravura" / "Bravura.otf").generic_string()); + auto music_typeface_name = alphaskia_typeface_get_family_name(music_typeface); + auto music_typeface_weight = alphaskia_typeface_get_weight(music_typeface); + auto music_typeface_italic = alphaskia_typeface_is_italic(music_typeface); + auto music_typeface_name_raw = alphaskia_string_get_utf8(music_typeface_name); + music_text_style = alphaskia_textstyle_new(1, &music_typeface_name_raw, music_typeface_weight, music_typeface_italic); + alphaskia_string_free(music_typeface_name); + + alphaskia_load_typeface((test_data_path / "font" / "noto-sans" / "NotoSans-Regular.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-sans" / "NotoSans-Bold.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-sans" / "NotoSans-Italic.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-sans" / "NotoSans-BoldItalic.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-serif" / "NotoSerif-Regular.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-serif" / "NotoSerif-Bold.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-serif" / "NotoSerif-Italic.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-serif" / "NotoSerif-BoldItalic.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-serif" / "NotoSerif-BoldItalic.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-music" / "NotoMusic-Regular.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-color-emoji" / "NotoColorEmoji_WindowsCompatible.ttf").generic_string()); + std::cout << "Fonts loaded" << std::endl; // render full image diff --git a/test/node/AlphaTabGeneratedRenderTest.ts b/test/node/AlphaTabGeneratedRenderTest.ts index c25f231..2720297 100644 --- a/test/node/AlphaTabGeneratedRenderTest.ts +++ b/test/node/AlphaTabGeneratedRenderTest.ts @@ -1,740 +1,1067 @@ import TestBase from './AlphaTabGeneratedRenderTestBase'; import { AlphaSkiaTextBaseline, AlphaSkiaTextAlign, AlphaSkiaCanvas, AlphaSkiaImage } from '@coderline/alphaskia'; -function drawMusicSheetPart1(canvas: AlphaSkiaCanvas): AlphaSkiaImage { - canvas.beginRender(1300, 164, TestBase.renderScale); +function drawMusicSheetPart1(canvas: AlphaSkiaCanvas): AlphaSkiaImage | undefined { + canvas.beginRender(1300, 124, TestBase.renderScale); canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 204, 30, 255); TestBase.textAlign = AlphaSkiaTextAlign.Center; - TestBase.typeface = TestBase.getTypeface("PT Serif", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Serif", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 32; TestBase.textAlign = AlphaSkiaTextAlign.Center; - canvas.fillText("Title", TestBase.typeface, TestBase.fontSize, 650, 40, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("Title", TestBase.textStyle, TestBase.fontSize, 650, 0, TestBase.textAlign, TestBase.textBaseline); TestBase.textAlign = AlphaSkiaTextAlign.Center; - TestBase.typeface = TestBase.getTypeface("PT Serif", false, false); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textStyle = TestBase.getTextStyle(["Noto Serif", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 20; TestBase.textAlign = AlphaSkiaTextAlign.Center; - canvas.fillText("Subtitle", TestBase.typeface, TestBase.fontSize, 650, 72, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("Subtitle", TestBase.textStyle, TestBase.fontSize, 650, 32, TestBase.textAlign, TestBase.textBaseline); TestBase.textAlign = AlphaSkiaTextAlign.Center; - TestBase.typeface = TestBase.getTypeface("PT Serif", false, false); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textStyle = TestBase.getTextStyle(["Noto Serif", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 20; TestBase.textAlign = AlphaSkiaTextAlign.Center; - canvas.fillText("Artist", TestBase.typeface, TestBase.fontSize, 650, 92, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("Artist", TestBase.textStyle, TestBase.fontSize, 650, 52, TestBase.textAlign, TestBase.textBaseline); TestBase.textAlign = AlphaSkiaTextAlign.Center; - TestBase.typeface = TestBase.getTypeface("PT Serif", false, false); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textStyle = TestBase.getTextStyle(["Noto Serif", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 20; TestBase.textAlign = AlphaSkiaTextAlign.Center; - canvas.fillText("Album", TestBase.typeface, TestBase.fontSize, 650, 112, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("Album", TestBase.textStyle, TestBase.fontSize, 650, 72, TestBase.textAlign, TestBase.textBaseline); TestBase.textAlign = AlphaSkiaTextAlign.Center; - TestBase.typeface = TestBase.getTypeface("PT Serif", false, false); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textStyle = TestBase.getTextStyle(["Noto Serif", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 15; - TestBase.textAlign = AlphaSkiaTextAlign.Right; - canvas.fillText("Music by Music", TestBase.typeface, TestBase.fontSize, 1260, 132, TestBase.textAlign, TestBase.textBaseline); + TestBase.textAlign = AlphaSkiaTextAlign.Left; + canvas.fillText("Words by Words", TestBase.textStyle, TestBase.fontSize, 35, 92, TestBase.textAlign, TestBase.textBaseline); TestBase.textAlign = AlphaSkiaTextAlign.Center; - TestBase.typeface = TestBase.getTypeface("PT Serif", false, false); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textStyle = TestBase.getTextStyle(["Noto Serif", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 15; - TestBase.textAlign = AlphaSkiaTextAlign.Left; - canvas.fillText("Words by Words", TestBase.typeface, TestBase.fontSize, 40, 132, TestBase.textAlign, TestBase.textBaseline); + TestBase.textAlign = AlphaSkiaTextAlign.Right; + canvas.fillText("Music by Music", TestBase.textStyle, TestBase.fontSize, 1265, 92, TestBase.textAlign, TestBase.textBaseline); TestBase.textAlign = AlphaSkiaTextAlign.Center; + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; return canvas.endRender(); } -function drawMusicSheetPart2(canvas: AlphaSkiaCanvas): AlphaSkiaImage { - canvas.beginRender(1300, 38, TestBase.renderScale); +function drawMusicSheetPart2(canvas: AlphaSkiaCanvas): AlphaSkiaImage | undefined { + canvas.beginRender(1300, 12, TestBase.renderScale); TestBase.textAlign = AlphaSkiaTextAlign.Center; - TestBase.typeface = TestBase.getTypeface("PT Serif", false, true); + TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; + TestBase.textStyle = TestBase.getTextStyle(["Noto Serif", "Noto Music", "Noto Color Emoji"], 400, true); TestBase.fontSize = 12; TestBase.textAlign = AlphaSkiaTextAlign.Left; - canvas.fillText("Guitar Standard Tuning", TestBase.typeface, TestBase.fontSize, 40, 3, TestBase.textAlign, TestBase.textBaseline); - TestBase.textAlign = AlphaSkiaTextAlign.Center; - return canvas.endRender(); -} -function drawMusicSheetPart3(canvas: AlphaSkiaCanvas): AlphaSkiaImage { - canvas.beginRender(1300, 6, TestBase.renderScale); + canvas.fillText("Guitar Standard Tuning", TestBase.textStyle, TestBase.fontSize, 35, 4.5659942626953125, TestBase.textAlign, TestBase.textBaseline); TestBase.textAlign = AlphaSkiaTextAlign.Center; + TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; return canvas.endRender(); } -function drawMusicSheetPart4(canvas: AlphaSkiaCanvas): AlphaSkiaImage { - canvas.beginRender(1300, 373, TestBase.renderScale); +function drawMusicSheetPart3(canvas: AlphaSkiaCanvas): AlphaSkiaImage | undefined { + canvas.beginRender(1300, 285, TestBase.renderScale); canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); TestBase.textAlign = AlphaSkiaTextAlign.Left; - TestBase.typeface = TestBase.getTypeface("PT Serif", true, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Serif", "Noto Music", "Noto Color Emoji"], 700, false); TestBase.fontSize = 14; - canvas.fillText("\uE1D5", TestBase.musicTypeface, TestBase.musicFontSize * 0.75, 156.6767578125, 40, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("= 120", TestBase.typeface, TestBase.fontSize, 169.1767578125, 27, TestBase.textAlign, TestBase.textBaseline); - canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); - canvas.fillRect(92, 130, 254, 1.04); - canvas.fillRect(92, 139, 254, 1.04); - canvas.fillRect(92, 148, 254, 1.04); - canvas.fillRect(92, 157, 254, 1.04); - canvas.fillRect(92, 166, 254, 1.04); - canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); - canvas.fillText("\uE050", TestBase.musicTypeface, TestBase.musicFontSize * 1, 94, 157.52, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE084", TestBase.musicTypeface, TestBase.musicFontSize * 1, 127, 139, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE084", TestBase.musicTypeface, TestBase.musicFontSize * 1, 127, 157, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + canvas.fillText("\uE1D5", TestBase.musicTextStyle, TestBase.musicFontSize * 0.5, 117.79200744628906, 25, AlphaSkiaTextAlign.Center, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("= 120", TestBase.textStyle, TestBase.fontSize, 125.79200744628906, 12, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Serif", "Noto Music", "Noto Color Emoji"], 400, true); + TestBase.fontSize = 12; + TestBase.textAlign = AlphaSkiaTextAlign.Left; + canvas.fillText("Fallback Font (\uD834\uDD1E \uD834\uDD5F \uD83C\uDFB8 \uD83E\uDD18\uD83C\uDFFB)", TestBase.textStyle, TestBase.fontSize, 885.7920074462891, 30, TestBase.textAlign, TestBase.textBaseline); + TestBase.textAlign = AlphaSkiaTextAlign.Left; + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 722.7920074462891, 53.5199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 733.592007446289, 53.5199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 744.3920074462891, 53.5199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 755.192007446289, 53.5199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 765.9920074462891, 53.5199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 776.7920074462891, 53.5199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 787.592007446289, 53.5199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 798.3920074462891, 53.5199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 809.192007446289, 53.5199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 819.9920074462891, 53.5199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.fillRect(48, 87, 259, 1.04); + canvas.fillRect(48, 96, 259, 1.04); + canvas.fillRect(48, 105, 259, 1.04); + canvas.fillRect(48, 114, 259, 1.04); + canvas.fillRect(48, 123, 259, 1.04); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.fillRect(48, 87.9199951171875, 1, 36.000000000000014); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE050", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 55, 115.43999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE084", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 88, 96.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE084", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 88, 114.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.color = AlphaSkiaCanvas.rgbaToColor(200, 0, 0, 255); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("1", TestBase.typeface, TestBase.fontSize, 141, 118.75, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("1", TestBase.textStyle, TestBase.fontSize, 102, 76.5699951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 152.1767578125, 148, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE272", TestBase.musicTypeface, TestBase.musicFontSize * 0.75, 172.86069962449085, 148, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 0.75, 180.86069962449085, 149, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 113.29200744628906, 105.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE272", TestBase.musicTextStyle, TestBase.musicFontSize * 0.75, 134.16515249341666, 105.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 0.75, 142.16515249341666, 106.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.beginPath(); - canvas.moveTo(156.6767578125, 144); - canvas.lineTo(170.855110706305, 133.50723450810483); - canvas.lineTo(184.23569962449085, 145); + canvas.moveTo(117.79200744628906, 101.91999511718751); + canvas.lineTo(132.06224568469634, 91.42713139901187); + canvas.lineTo(145.54015249341666, 102.91999511718751); canvas.stroke(); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 192.23569962449085, 148, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 0.75, 220.91964143648167, 144.5, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 153.54015249341666, 105.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 0.75, 182.41329754054425, 102.41999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.beginPath(); - canvas.moveTo(196.73569962449085, 144); - canvas.lineTo(209.12929655256082, 131.33765133817155); - canvas.lineTo(224.29464143648167, 140.5); + canvas.moveTo(158.04015249341666, 101.91999511718751); + canvas.lineTo(170.53765225640643, 89.25646922337823); + canvas.lineTo(185.78829754054425, 98.41999511718751); canvas.stroke(); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 232.29464143648167, 148, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE262", TestBase.musicTypeface, TestBase.musicFontSize * 0.75, 252.9785832484725, 143.5, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 0.75, 260.9785832484725, 144.5, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 193.78829754054425, 105.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE262", TestBase.musicTextStyle, TestBase.musicFontSize * 0.75, 214.66144258767181, 101.41999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 0.75, 222.66144258767181, 102.41999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.beginPath(); - canvas.moveTo(236.79464143648167, 144); - canvas.lineTo(249.1882383645516, 131.33765133817155); - canvas.lineTo(264.3535832484725, 140.5); + canvas.moveTo(198.28829754054425, 101.91999511718751); + canvas.lineTo(210.785797303534, 89.25646922337823); + canvas.lineTo(226.03644258767181, 98.41999511718751); canvas.stroke(); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 272.3535832484725, 148, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 0.75, 294.5517916242362, 140, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 234.03644258767181, 105.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 0.75, 256.3932212938359, 97.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.beginPath(); - canvas.moveTo(276.8535832484725, 152); - canvas.lineTo(292.1060513036615, 156.93783819474976); - canvas.lineTo(297.9267916242362, 142); + canvas.moveTo(238.53644258767181, 109.91999511718751); + canvas.lineTo(253.8393894465572, 114.87145189181567); + canvas.lineTo(259.7682212938359, 99.91999511718751); canvas.stroke(); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 305.9267916242362, 148, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE262", TestBase.musicTypeface, TestBase.musicFontSize * 0.75, 324.625, 139, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 0.75, 332.625, 140, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 267.7682212938359, 105.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE262", TestBase.musicTextStyle, TestBase.musicFontSize * 0.75, 286.625, 96.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 0.75, 294.625, 97.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.beginPath(); - canvas.moveTo(310.4267916242362, 152); - canvas.lineTo(327.2193887931866, 157.24460932567123); - canvas.lineTo(336, 142); + canvas.moveTo(272.2682212938359, 109.91999511718751); + canvas.lineTo(289.1186648773111, 115.17296188710615); + canvas.lineTo(298, 99.91999511718751); canvas.stroke(); - canvas.fillRect(345, 130.1, 1, 36); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.fillRect(306, 87.9199951171875, 1, 36.000000000000014); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); canvas.lineWidth = 0.96; canvas.beginPath(); - canvas.moveTo(152.1767578125, 148); - canvas.lineTo(152.1767578125, 175); + canvas.moveTo(113.29200744628906, 105.91999511718751); + canvas.lineTo(113.29200744628906, 132.9199951171875); canvas.stroke(); canvas.lineWidth = 1; canvas.lineWidth = 0.96; canvas.beginPath(); - canvas.moveTo(192.23569962449085, 148); - canvas.lineTo(192.23569962449085, 175); + canvas.moveTo(153.54015249341666, 105.91999511718751); + canvas.lineTo(153.54015249341666, 132.9199951171875); canvas.stroke(); canvas.lineWidth = 1; canvas.lineWidth = 0.96; canvas.beginPath(); - canvas.moveTo(232.29464143648167, 148); - canvas.lineTo(232.29464143648167, 175); + canvas.moveTo(193.78829754054425, 105.91999511718751); + canvas.lineTo(193.78829754054425, 132.9199951171875); canvas.stroke(); canvas.lineWidth = 1; canvas.lineWidth = 0.96; canvas.beginPath(); - canvas.moveTo(281.3535832484725, 148); - canvas.lineTo(281.3535832484725, 121); + canvas.moveTo(243.03644258767181, 105.91999511718751); + canvas.lineTo(243.03644258767181, 78.91999511718751); canvas.stroke(); canvas.lineWidth = 1; canvas.beginPath(); - canvas.moveTo(281.3535832484725, 121); - canvas.lineTo(314.9267916242362, 121); - canvas.lineTo(314.9267916242362, 125); - canvas.lineTo(281.3535832484725, 125); + canvas.moveTo(243.03644258767181, 78.91999511718751); + canvas.lineTo(276.7682212938359, 78.91999511718751); + canvas.lineTo(276.7682212938359, 82.91999511718751); + canvas.lineTo(243.03644258767181, 82.91999511718751); canvas.closePath(); canvas.fill(); canvas.lineWidth = 0.96; canvas.beginPath(); - canvas.moveTo(314.9267916242362, 148); - canvas.lineTo(314.9267916242362, 121); + canvas.moveTo(276.7682212938359, 105.91999511718751); + canvas.lineTo(276.7682212938359, 78.91999511718751); canvas.stroke(); canvas.lineWidth = 1; canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); - canvas.fillRect(346, 130, 126, 1.04); - canvas.fillRect(346, 139, 126, 1.04); - canvas.fillRect(346, 148, 126, 1.04); - canvas.fillRect(346, 157, 126, 1.04); - canvas.fillRect(346, 166, 126, 1.04); + canvas.fillRect(307, 87, 126, 1.04); + canvas.fillRect(307, 96, 126, 1.04); + canvas.fillRect(307, 105, 126, 1.04); + canvas.fillRect(307, 114, 126, 1.04); + canvas.fillRect(307, 123, 126, 1.04); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); canvas.color = AlphaSkiaCanvas.rgbaToColor(200, 0, 0, 255); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("2", TestBase.typeface, TestBase.fontSize, 346, 118.75, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("2", TestBase.textStyle, TestBase.fontSize, 307, 76.5699951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 318.29200744628906, 96.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 339.6478115199233, 96.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 361.00361559355764, 119.41999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A3", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 388.3056137319853, 114.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.fillRect(432, 87.9199951171875, 1, 36.000000000000014); canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 357.1767578125, 139, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 378.359547484596, 139, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 399.542337156692, 161.5, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A3", TestBase.musicTypeface, TestBase.musicFontSize * 1, 426.623147703567, 157, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillRect(471, 130.1, 1, 36); canvas.lineWidth = 0.96; canvas.beginPath(); - canvas.moveTo(366.1767578125, 139); - canvas.lineTo(366.1767578125, 112); + canvas.moveTo(327.29200744628906, 96.91999511718751); + canvas.lineTo(327.29200744628906, 69.91999511718751); canvas.stroke(); canvas.lineWidth = 1; canvas.beginPath(); - canvas.moveTo(366.1767578125, 112); - canvas.lineTo(387.359547484596, 117); - canvas.lineTo(387.359547484596, 121); - canvas.lineTo(366.1767578125, 116); + canvas.moveTo(327.29200744628906, 69.91999511718751); + canvas.lineTo(348.6478115199233, 74.91999511718751); + canvas.lineTo(348.6478115199233, 78.91999511718751); + canvas.lineTo(327.29200744628906, 73.91999511718751); canvas.closePath(); canvas.fill(); canvas.beginPath(); - canvas.moveTo(366.1767578125, 118); - canvas.lineTo(387.359547484596, 123); - canvas.lineTo(387.359547484596, 127); - canvas.lineTo(366.1767578125, 122); + canvas.moveTo(327.29200744628906, 75.91999511718751); + canvas.lineTo(348.6478115199233, 80.91999511718751); + canvas.lineTo(348.6478115199233, 84.91999511718751); + canvas.lineTo(327.29200744628906, 79.91999511718751); canvas.closePath(); canvas.fill(); canvas.lineWidth = 0.96; canvas.beginPath(); - canvas.moveTo(387.359547484596, 139); - canvas.lineTo(387.359547484596, 117); + canvas.moveTo(348.6478115199233, 96.91999511718751); + canvas.lineTo(348.6478115199233, 74.91999511718751); canvas.stroke(); canvas.lineWidth = 1; canvas.beginPath(); - canvas.moveTo(387.359547484596, 117); - canvas.lineTo(408.542337156692, 122); - canvas.lineTo(408.542337156692, 126); - canvas.lineTo(387.359547484596, 121); + canvas.moveTo(348.6478115199233, 74.91999511718751); + canvas.lineTo(370.00361559355764, 79.91999511718751); + canvas.lineTo(370.00361559355764, 83.91999511718751); + canvas.lineTo(348.6478115199233, 78.91999511718751); canvas.closePath(); canvas.fill(); canvas.lineWidth = 0.96; canvas.beginPath(); - canvas.moveTo(408.542337156692, 161.5); - canvas.lineTo(408.542337156692, 122); + canvas.moveTo(370.00361559355764, 119.41999511718751); + canvas.lineTo(370.00361559355764, 79.91999511718751); canvas.stroke(); canvas.lineWidth = 1; canvas.lineWidth = 0.96; canvas.beginPath(); - canvas.moveTo(435.623147703567, 130); - canvas.lineTo(435.623147703567, 157); + canvas.moveTo(397.3056137319853, 87.91999511718751); + canvas.lineTo(397.3056137319853, 114.91999511718751); canvas.stroke(); canvas.lineWidth = 1; canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); TestBase.textAlign = AlphaSkiaTextAlign.Center; TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; - TestBase.typeface = TestBase.getTypeface("PT Serif", false, true); + TestBase.textStyle = TestBase.getTextStyle(["Noto Serif", "Noto Music", "Noto Color Emoji"], 400, true); TestBase.fontSize = 12; canvas.beginPath(); - canvas.moveTo(366.1767578125, 102); - canvas.lineTo(366.1767578125, 97); - canvas.lineTo(394.7559555656507, 104); + canvas.moveTo(327.29200744628906, 59); + canvas.lineTo(327.29200744628906, 54); + canvas.lineTo(355.9448143122817, 62); canvas.stroke(); canvas.beginPath(); - canvas.moveTo(407.04394995041633, 107); - canvas.lineTo(435.623147703567, 115); - canvas.lineTo(435.623147703567, 120); + canvas.moveTo(368.65280686599266, 65); + canvas.lineTo(397.3056137319853, 72); + canvas.lineTo(397.3056137319853, 77); canvas.stroke(); - canvas.fillText("3", TestBase.typeface, TestBase.fontSize, 400.8999527580335, 106, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("3", TestBase.textStyle, TestBase.fontSize, 362.2988105891372, 63.91999511718751, TestBase.textAlign, TestBase.textBaseline); TestBase.textAlign = AlphaSkiaTextAlign.Left; TestBase.textBaseline = AlphaSkiaTextBaseline.Top; canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); - canvas.fillRect(472, 130, 206, 1.04); - canvas.fillRect(472, 139, 206, 1.04); - canvas.fillRect(472, 148, 206, 1.04); - canvas.fillRect(472, 157, 206, 1.04); - canvas.fillRect(472, 166, 206, 1.04); + canvas.fillRect(433, 87, 192, 1.04); + canvas.fillRect(433, 96, 192, 1.04); + canvas.fillRect(433, 105, 192, 1.04); + canvas.fillRect(433, 114, 192, 1.04); + canvas.fillRect(433, 123, 192, 1.04); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); canvas.color = AlphaSkiaCanvas.rgbaToColor(200, 0, 0, 255); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); - TestBase.fontSize = 11; - canvas.fillText("3", TestBase.typeface, TestBase.fontSize, 472, 118.75, TestBase.textAlign, TestBase.textBaseline); - canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 496.32666015625, 157, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 496.32666015625, 143.5, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 496.32666015625, 134.5, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.beginRotate(527.8699951171875, 172, -90); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 0, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 10.799999999999999, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 21.599999999999998, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 32.4, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 11; + canvas.fillText("3", TestBase.textStyle, TestBase.fontSize, 433, 76.5699951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 457.510009765625, 114.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 457.510009765625, 101.41999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 457.510009765625, 92.4199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.beginRotate(489.00750732421875, 129.9199951171875, -90); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 0, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 10.799999999999999, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 21.599999999999998, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 32.4, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.endRotate(); canvas.beginPath(); - canvas.moveTo(527.8699951171875, 180); - canvas.lineTo(531.8699951171875, 172); - canvas.lineTo(523.8699951171875, 172); + canvas.moveTo(489.00750732421875, 137.9199951171875); + canvas.lineTo(493.00750732421875, 129.9199951171875); + canvas.lineTo(485.00750732421875, 129.9199951171875); canvas.closePath(); canvas.fill(); canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); - canvas.fillRect(533.8699951171875, 175, 15, 1); - canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 536.8699951171875, 175, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 536.8699951171875, 166, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 536.8699951171875, 157, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 536.8699951171875, 143.5, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 536.8699951171875, 134.5, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); - canvas.fillRect(574.413330078125, 175, 15, 1); - canvas.fillRect(574.413330078125, 184, 15, 1); - canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 577.413330078125, 184, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 577.413330078125, 166, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 577.413330078125, 152.5, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.beginRotate(596.9566650390625, 137.5, 90); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 0, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 10.799999999999999, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 21.599999999999998, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 32.4, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 43.199999999999996, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillRect(495.00750732421875, 132, 15, 1.04); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 498.00750732421875, 132.9199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 498.00750732421875, 123.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 498.00750732421875, 114.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 498.00750732421875, 101.41999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 498.00750732421875, 92.4199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.fillRect(535.5050048828125, 132, 15, 1.04); + canvas.fillRect(535.5050048828125, 141, 15, 1.04); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 538.5050048828125, 141.9199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 538.5050048828125, 123.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 538.5050048828125, 110.41999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.beginRotate(558.0025024414062, 95.41999511718751, 90); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 0, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 10.799999999999999, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 21.599999999999998, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 32.4, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 43.199999999999996, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.endRotate(); canvas.beginPath(); - canvas.moveTo(596.9566650390625, 129.5); - canvas.lineTo(600.9566650390625, 137.5); - canvas.lineTo(592.9566650390625, 137.5); + canvas.moveTo(558.0025024414062, 87.41999511718751); + canvas.lineTo(562.0025024414062, 95.41999511718751); + canvas.lineTo(554.0025024414062, 95.41999511718751); canvas.closePath(); canvas.fill(); - canvas.fillText("\uE262", TestBase.musicTypeface, TestBase.musicFontSize * 1, 607.9566650390625, 143.5, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); - canvas.fillRect(614.9566650390625, 175, 15, 1); - canvas.fillRect(614.9566650390625, 184, 15, 1); - canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 617.9566650390625, 184, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 617.9566650390625, 166, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 617.9566650390625, 152.5, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 617.9566650390625, 143.5, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uE0A4", TestBase.musicTypeface, TestBase.musicFontSize * 1, 617.9566650390625, 134.5, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillRect(670, 130.1, 1, 36); - canvas.fillRect(674, 130.1, 4, 36); + canvas.fillText("\uE262", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 569.0025024414062, 101.41999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.fillRect(576.0025024414062, 132, 15, 1.04); + canvas.fillRect(576.0025024414062, 141, 15, 1.04); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 579.0025024414062, 141.9199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 579.0025024414062, 123.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 579.0025024414062, 110.41999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 579.0025024414062, 101.41999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 579.0025024414062, 92.4199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.fillRect(624, 87.9199951171875, 1, 36.000000000000014); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); canvas.lineWidth = 0.96; canvas.beginPath(); - canvas.moveTo(496.32666015625, 134.5); - canvas.lineTo(496.32666015625, 184); + canvas.moveTo(457.510009765625, 92.4199951171875); + canvas.lineTo(457.510009765625, 141.9199951171875); canvas.stroke(); canvas.lineWidth = 1; canvas.lineWidth = 0.96; canvas.beginPath(); - canvas.moveTo(545.8699951171875, 107.5); - canvas.lineTo(545.8699951171875, 175); + canvas.moveTo(507.00750732421875, 65.4199951171875); + canvas.lineTo(507.00750732421875, 132.9199951171875); canvas.stroke(); canvas.lineWidth = 1; canvas.lineWidth = 0.96; canvas.beginPath(); - canvas.moveTo(586.413330078125, 125.5); - canvas.lineTo(586.413330078125, 184); + canvas.moveTo(547.5050048828125, 83.41999511718751); + canvas.lineTo(547.5050048828125, 141.9199951171875); canvas.stroke(); canvas.lineWidth = 1; canvas.lineWidth = 0.96; canvas.beginPath(); - canvas.moveTo(626.9566650390625, 107.5); - canvas.lineTo(626.9566650390625, 184); + canvas.moveTo(588.0025024414062, 65.4199951171875); + canvas.lineTo(588.0025024414062, 141.9199951171875); canvas.stroke(); canvas.lineWidth = 1; canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); - canvas.fillRect(92, 284, 254, 1.04); - canvas.fillRect(92, 295, 254, 1.04); - canvas.fillRect(92, 306, 254, 1.04); - canvas.fillRect(92, 317, 61.02685546875, 1.04); - canvas.fillRect(161.32666015625, 317, 31.759140014648438, 1.04); - canvas.fillRect(201.38560485839844, 317, 31.759140014648438, 1.04); - canvas.fillRect(241.44454956054688, 317, 31.759124755859375, 1.04); - canvas.fillRect(281.50347900390625, 317, 25.273406982421875, 1.04); - canvas.fillRect(315.0766906738281, 317, 30.923309326171875, 1.04); - canvas.fillRect(92, 328, 254, 1.04); - canvas.fillRect(92, 339, 254, 1.04); - canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); - canvas.fillText("\uE06D", TestBase.musicTypeface, TestBase.musicFontSize * 0.9230769230769231, 97, 311.8, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillRect(625, 87, 82, 1.04); + canvas.fillRect(625, 96, 82, 1.04); + canvas.fillRect(625, 105, 82, 1.04); + canvas.fillRect(625, 114, 82, 1.04); + canvas.fillRect(625, 123, 82, 1.04); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(200, 0, 0, 255); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 11; + canvas.fillText("4", TestBase.textStyle, TestBase.fontSize, 625, 76.5699951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE4EF\uE4F0\uE4F0\uE4F0\uE4F1", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 636.2920074462891, 105.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uE083", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 666.2920074462891, 74, AlphaSkiaTextAlign.Center, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.fillRect(706, 87.9199951171875, 1, 36.000000000000014); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.fillRect(707, 87, 163, 1.04); + canvas.fillRect(707, 96, 163, 1.04); + canvas.fillRect(707, 105, 163, 1.04); + canvas.fillRect(707, 114, 163, 1.04); + canvas.fillRect(707, 123, 163, 1.04); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(200, 0, 0, 255); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 11; + canvas.fillText("7", TestBase.textStyle, TestBase.fontSize, 707, 76.5699951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 718.2920074462891, 96.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 754.8440055847168, 96.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 791.3960037231445, 96.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 827.9480018615723, 96.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.fillRect(869, 87.9199951171875, 1, 36.000000000000014); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.lineWidth = 0.96; + canvas.beginPath(); + canvas.moveTo(718.2920074462891, 96.91999511718751); + canvas.lineTo(718.2920074462891, 123.91999511718751); + canvas.stroke(); + canvas.lineWidth = 1; + canvas.lineWidth = 0.96; + canvas.beginPath(); + canvas.moveTo(754.8440055847168, 96.91999511718751); + canvas.lineTo(754.8440055847168, 123.91999511718751); + canvas.stroke(); + canvas.lineWidth = 1; + canvas.lineWidth = 0.96; + canvas.beginPath(); + canvas.moveTo(791.3960037231445, 96.91999511718751); + canvas.lineTo(791.3960037231445, 123.91999511718751); + canvas.stroke(); + canvas.lineWidth = 1; + canvas.lineWidth = 0.96; + canvas.beginPath(); + canvas.moveTo(827.9480018615723, 96.91999511718751); + canvas.lineTo(827.9480018615723, 123.91999511718751); + canvas.stroke(); + canvas.lineWidth = 1; + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.fillRect(870, 87, 60, 1.04); + canvas.fillRect(870, 96, 60, 1.04); + canvas.fillRect(870, 105, 60, 1.04); + canvas.fillRect(870, 114, 60, 1.04); + canvas.fillRect(870, 123, 60, 1.04); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(200, 0, 0, 255); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 11; + canvas.fillText("8", TestBase.textStyle, TestBase.fontSize, 870, 76.5699951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE0A4", TestBase.musicTextStyle, TestBase.musicFontSize * 1, 881.2920074462891, 96.91999511718751, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.fillRect(922, 87.9199951171875, 1, 36.000000000000014); + canvas.fillRect(926, 87.9199951171875, 4, 36.000000000000014); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.lineWidth = 0.96; + canvas.beginPath(); + canvas.moveTo(881.2920074462891, 96.91999511718751); + canvas.lineTo(881.2920074462891, 123.91999511718751); + canvas.stroke(); + canvas.lineWidth = 1; + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 722.7920074462891, 161.4199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 733.592007446289, 161.4199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 744.3920074462891, 161.4199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 755.192007446289, 161.4199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 765.9920074462891, 161.4199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 776.7920074462891, 161.4199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 787.592007446289, 161.4199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 798.3920074462891, 161.4199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 809.192007446289, 161.4199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 819.9920074462891, 161.4199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.fillRect(48, 216, 259, 1.04); + canvas.fillRect(48, 227, 259, 1.04); + canvas.fillRect(48, 238, 259, 1.04); + canvas.fillRect(48, 249, 66.07400512695312, 1.04); + canvas.fillRect(122.510009765625, 249, 31.81214141845703, 1.04); + canvas.fillRect(162.7581558227539, 249, 31.81214141845703, 1.04); + canvas.fillRect(203.0063018798828, 249, 31.8121337890625, 1.04); + canvas.fillRect(243.2544403076172, 249, 25.2957763671875, 1.04); + canvas.fillRect(276.98622131347656, 249, 30.013778686523438, 1.04); + canvas.fillRect(48, 260, 259, 1.04); + canvas.fillRect(48, 271, 259, 1.04); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.fillRect(48, 216.3199951171875, 1, 54.99999999999994); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.fillText("\uE06D", TestBase.musicTextStyle, TestBase.musicFontSize * 0.9230769230769231, 54, 243.8199951171875, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 163.32666015625, 317.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 124.510009765625, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("9", TestBase.typeface, TestBase.fontSize, 153.02685546875, 317.3, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("9", TestBase.textStyle, TestBase.fontSize, 114.07400512695312, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); TestBase.textBaseline = AlphaSkiaTextBaseline.Top; canvas.beginPath(); canvas.beginPath(); - canvas.moveTo(188.23569962449085, 274.7); - canvas.lineTo(185.23569962449085, 280.7); - canvas.lineTo(191.23569962449085, 280.7); + canvas.moveTo(150.32215017408072, 206.7199951171875); + canvas.lineTo(147.32215017408072, 212.7199951171875); + canvas.lineTo(153.32215017408072, 212.7199951171875); canvas.closePath(); canvas.fill(); + canvas.beginPath(); + canvas.moveTo(123.510009765625, 249.3199951171875); + canvas.bezierCurveTo(136.91607996985286, 249.3199951171875, 150.32215017408072, 249.3199951171875, 150.32215017408072, 212.7199951171875); canvas.stroke(); - canvas.moveTo(162.32666015625, 317.3); - canvas.bezierCurveTo(175.28117989037042, 317.3, 188.23569962449085, 317.3, 188.23569962449085, 280.7); - canvas.stroke(); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("\u00BC", TestBase.typeface, TestBase.fontSize, 183.47495743699085, 260.7, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("\u00BC", TestBase.textStyle, TestBase.fontSize, 145.47965139478384, 192.7199951171875, TestBase.textAlign, TestBase.textBaseline); TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 203.38560196824085, 317.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 164.7581548127526, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("9", TestBase.typeface, TestBase.fontSize, 193.08579728074085, 317.3, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("9", TestBase.textStyle, TestBase.fontSize, 154.32215017408072, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); TestBase.textBaseline = AlphaSkiaTextBaseline.Top; canvas.beginPath(); canvas.beginPath(); - canvas.moveTo(228.29464143648167, 268.7); - canvas.lineTo(225.29464143648167, 274.7); - canvas.lineTo(231.29464143648167, 274.7); + canvas.moveTo(190.5702952212083, 200.7199951171875); + canvas.lineTo(187.5702952212083, 206.7199951171875); + canvas.lineTo(193.5702952212083, 206.7199951171875); canvas.closePath(); canvas.fill(); + canvas.beginPath(); + canvas.moveTo(163.7581548127526, 249.3199951171875); + canvas.bezierCurveTo(177.16422501698045, 249.3199951171875, 190.5702952212083, 249.3199951171875, 190.5702952212083, 206.7199951171875); canvas.stroke(); - canvas.moveTo(202.38560196824085, 317.3); - canvas.bezierCurveTo(215.34012170236127, 317.3, 228.29464143648167, 317.3, 228.29464143648167, 274.7); - canvas.stroke(); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("\u00BD", TestBase.typeface, TestBase.fontSize, 223.25142854585667, 254.7, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("\u00BD", TestBase.textStyle, TestBase.fontSize, 185.55879772364972, 186.7199951171875, TestBase.textAlign, TestBase.textBaseline); TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 243.44454378023167, 317.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 205.0062998598802, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("9", TestBase.typeface, TestBase.fontSize, 233.14473909273167, 317.3, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("9", TestBase.textStyle, TestBase.fontSize, 194.5702952212083, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); TestBase.textBaseline = AlphaSkiaTextBaseline.Top; canvas.beginPath(); canvas.beginPath(); - canvas.moveTo(268.3535832484725, 256.7); - canvas.lineTo(265.3535832484725, 262.7); - canvas.lineTo(271.3535832484725, 262.7); + canvas.moveTo(230.81844026833588, 188.7199951171875); + canvas.lineTo(227.81844026833588, 194.7199951171875); + canvas.lineTo(233.81844026833588, 194.7199951171875); canvas.closePath(); canvas.fill(); + canvas.beginPath(); + canvas.moveTo(204.0062998598802, 249.3199951171875); + canvas.bezierCurveTo(217.41237006410802, 249.3199951171875, 230.81844026833588, 249.3199951171875, 230.81844026833588, 194.7199951171875); canvas.stroke(); - canvas.moveTo(242.44454378023167, 317.3); - canvas.bezierCurveTo(255.39906351435206, 317.3, 268.3535832484725, 317.3, 268.3535832484725, 262.7); - canvas.stroke(); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("full", TestBase.typeface, TestBase.fontSize, 259.3589543422225, 242.7, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("full", TestBase.textStyle, TestBase.fontSize, 221.2114380100351, 174.7199951171875, TestBase.textAlign, TestBase.textBaseline); TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 283.5034855922225, 317.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 245.25444490700775, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("9", TestBase.typeface, TestBase.fontSize, 273.2036809047225, 317.3, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("9", TestBase.textStyle, TestBase.fontSize, 234.81844026833588, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); TestBase.textBaseline = AlphaSkiaTextBaseline.Top; canvas.beginPath(); canvas.beginPath(); - canvas.moveTo(301.9267916242362, 244.7); - canvas.lineTo(298.9267916242362, 250.7); - canvas.lineTo(304.9267916242362, 250.7); + canvas.moveTo(264.55021897449996, 176.7199951171875); + canvas.lineTo(261.55021897449996, 182.7199951171875); + canvas.lineTo(267.55021897449996, 182.7199951171875); canvas.closePath(); canvas.fill(); + canvas.beginPath(); + canvas.moveTo(244.25444490700775, 249.3199951171875); + canvas.bezierCurveTo(254.40233194075387, 249.3199951171875, 264.55021897449996, 249.3199951171875, 264.55021897449996, 182.7199951171875); canvas.stroke(); - canvas.moveTo(282.5034855922225, 317.3); - canvas.bezierCurveTo(292.2151386082294, 317.3, 301.9267916242362, 317.3, 301.9267916242362, 250.7); - canvas.stroke(); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("1\u00BD", TestBase.typeface, TestBase.fontSize, 293.2336763898612, 230.7, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("1\u00BD", TestBase.textStyle, TestBase.fontSize, 255.82071915760542, 162.7199951171875, TestBase.textAlign, TestBase.textBaseline); TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 317.0766939679862, 317.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 278.98622361317183, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("9", TestBase.typeface, TestBase.fontSize, 306.7768892804862, 317.3, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("9", TestBase.textStyle, TestBase.fontSize, 268.55021897449996, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); TestBase.textBaseline = AlphaSkiaTextBaseline.Top; canvas.beginPath(); canvas.beginPath(); - canvas.moveTo(340, 232.7); - canvas.lineTo(337, 238.7); - canvas.lineTo(343, 238.7); + canvas.moveTo(302, 164.7199951171875); + canvas.lineTo(299, 170.7199951171875); + canvas.lineTo(305, 170.7199951171875); canvas.closePath(); canvas.fill(); + canvas.beginPath(); + canvas.moveTo(277.98622361317183, 249.3199951171875); + canvas.bezierCurveTo(289.99311180658594, 249.3199951171875, 302, 249.3199951171875, 302, 170.7199951171875); canvas.stroke(); - canvas.moveTo(316.0766939679862, 317.3); - canvas.bezierCurveTo(328.0383469839931, 317.3, 340, 317.3, 340, 238.7); - canvas.stroke(); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("2", TestBase.typeface, TestBase.fontSize, 336.35009765625, 218.7, TestBase.textAlign, TestBase.textBaseline); - canvas.fillRect(345, 284.3, 1, 54.99999999999994); + canvas.fillText("2", TestBase.textStyle, TestBase.fontSize, 298.28199768066406, 150.7199951171875, TestBase.textAlign, TestBase.textBaseline); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.fillRect(306, 216.3199951171875, 1, 54.99999999999994); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); - canvas.fillRect(346, 284, 126, 1.04); - canvas.fillRect(346, 295, 12.02685546875, 1.04); - canvas.fillRect(366.32666015625, 295, 12.882984161376953, 1.04); - canvas.fillRect(387.50944900512695, 295, 84.49055099487305, 1.04); - canvas.fillRect(346, 306, 126, 1.04); - canvas.fillRect(346, 317, 54.392433166503906, 1.04); - canvas.fillRect(408.6922378540039, 317, 18.781005859375, 1.04); - canvas.fillRect(435.7730484008789, 317, 36.226951599121094, 1.04); - canvas.fillRect(346, 328, 126, 1.04); - canvas.fillRect(346, 339, 126, 1.04); + canvas.fillRect(307, 216, 126, 1.04); + canvas.fillRect(307, 227, 12.074005126953125, 1.04); + canvas.fillRect(327.510009765625, 227, 12.9197998046875, 1.04); + canvas.fillRect(348.8658142089844, 227, 84.13418579101562, 1.04); + canvas.fillRect(307, 238, 126, 1.04); + canvas.fillRect(307, 249, 54.785614013671875, 1.04); + canvas.fillRect(370.22161865234375, 249, 18.865989685058594, 1.04); + canvas.fillRect(397.5236129760742, 249, 35.47638702392578, 1.04); + canvas.fillRect(307, 260, 126, 1.04); + canvas.fillRect(307, 271, 126, 1.04); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 368.32666015625, 295.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 329.510009765625, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("3", TestBase.typeface, TestBase.fontSize, 358.02685546875, 295.3, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("3", TestBase.textStyle, TestBase.fontSize, 319.0740051269531, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); TestBase.textBaseline = AlphaSkiaTextBaseline.Top; TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 389.509449828346, 295.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 350.86581383925926, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("3", TestBase.typeface, TestBase.fontSize, 379.209645140846, 295.3, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("3", TestBase.textStyle, TestBase.fontSize, 340.4298092005874, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); TestBase.textBaseline = AlphaSkiaTextBaseline.Top; TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 410.692239500442, 317.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 372.2216179128936, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("3", TestBase.typeface, TestBase.fontSize, 400.392434812942, 317.3, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("3", TestBase.textStyle, TestBase.fontSize, 361.7856132742217, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); TestBase.textBaseline = AlphaSkiaTextBaseline.Top; TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); - TestBase.fontSize = 13; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); - TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 437.773050047317, 317.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); - TestBase.fontSize = 13; - canvas.fillText("5", TestBase.typeface, TestBase.fontSize, 427.473245359817, 317.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.textBaseline = AlphaSkiaTextBaseline.Top; - canvas.fillRect(471, 284.3, 1, 54.99999999999994); - canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); - canvas.fillRect(472, 284, 25.1767578125, 1.04); - canvas.fillRect(505.4765625, 284, 32.2435302734375, 1.04); - canvas.fillRect(546.0198974609375, 284, 72.786865234375, 1.04); - canvas.fillRect(627.1065673828125, 284, 50.8934326171875, 1.04); - canvas.fillRect(472, 295, 25.1767578125, 1.04); - canvas.fillRect(505.4765625, 295, 32.2435302734375, 1.04); - canvas.fillRect(546.0198974609375, 295, 72.786865234375, 1.04); - canvas.fillRect(627.1065673828125, 295, 50.8934326171875, 1.04); - canvas.fillRect(472, 306, 25.1767578125, 1.04); - canvas.fillRect(505.4765625, 306, 32.2435302734375, 1.04); - canvas.fillRect(546.0198974609375, 306, 32.2435302734375, 1.04); - canvas.fillRect(586.563232421875, 306, 32.2435302734375, 1.04); - canvas.fillRect(627.1065673828125, 306, 50.8934326171875, 1.04); - canvas.fillRect(472, 317, 65.7200927734375, 1.04); - canvas.fillRect(546.0198974609375, 317, 32.2435302734375, 1.04); - canvas.fillRect(586.563232421875, 317, 32.2435302734375, 1.04); - canvas.fillRect(627.1065673828125, 317, 50.8934326171875, 1.04); - canvas.fillRect(472, 328, 65.7200927734375, 1.04); - canvas.fillRect(546.0198974609375, 328, 32.2435302734375, 1.04); - canvas.fillRect(586.563232421875, 328, 32.2435302734375, 1.04); - canvas.fillRect(627.1065673828125, 328, 50.8934326171875, 1.04); - canvas.fillRect(472, 339, 206, 1.04); - canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); - canvas.beginPath(); - canvas.moveTo(488, 275.8); - canvas.lineTo(488, 312.8); - canvas.stroke(); - canvas.beginPath(); - canvas.moveTo(488, 275.8); - canvas.lineTo(492, 283.8); - canvas.lineTo(484, 283.8); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 13; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 11; + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 399.52361605132126, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 13; + canvas.fillText("5", TestBase.textStyle, TestBase.fontSize, 389.0876114126494, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.fillRect(432, 216.3199951171875, 1, 54.99999999999994); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.fillRect(433, 216, 25.292007446289062, 1.04); + canvas.fillRect(466.72801208496094, 216, 32.061492919921875, 1.04); + canvas.fillRect(507.2255096435547, 216, 72.55899047851562, 1.04); + canvas.fillRect(588.2205047607422, 216, 36.77949523925781, 1.04); + canvas.fillRect(433, 227, 25.292007446289062, 1.04); + canvas.fillRect(466.72801208496094, 227, 32.061492919921875, 1.04); + canvas.fillRect(507.2255096435547, 227, 72.55899047851562, 1.04); + canvas.fillRect(588.2205047607422, 227, 36.77949523925781, 1.04); + canvas.fillRect(433, 238, 25.292007446289062, 1.04); + canvas.fillRect(466.72801208496094, 238, 32.061492919921875, 1.04); + canvas.fillRect(507.2255096435547, 238, 32.061492919921875, 1.04); + canvas.fillRect(547.7230072021484, 238, 32.061492919921875, 1.04); + canvas.fillRect(588.2205047607422, 238, 36.77949523925781, 1.04); + canvas.fillRect(433, 249, 65.78950500488281, 1.04); + canvas.fillRect(507.2255096435547, 249, 32.061492919921875, 1.04); + canvas.fillRect(547.7230072021484, 249, 32.061492919921875, 1.04); + canvas.fillRect(588.2205047607422, 249, 36.77949523925781, 1.04); + canvas.fillRect(433, 260, 65.78950500488281, 1.04); + canvas.fillRect(507.2255096435547, 260, 32.061492919921875, 1.04); + canvas.fillRect(547.7230072021484, 260, 32.061492919921875, 1.04); + canvas.fillRect(588.2205047607422, 260, 36.77949523925781, 1.04); + canvas.fillRect(433, 271, 192, 1.04); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.beginPath(); + canvas.moveTo(449, 207.8199951171875); + canvas.lineTo(449, 244.8199951171875); + canvas.stroke(); + canvas.beginPath(); + canvas.moveTo(449, 207.8199951171875); + canvas.lineTo(453, 215.8199951171875); + canvas.lineTo(445, 215.8199951171875); canvas.closePath(); canvas.fill(); TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 507.4765625, 284.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 468.72801208496094, 216.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("0", TestBase.typeface, TestBase.fontSize, 497.1767578125, 284.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("0", TestBase.textStyle, TestBase.fontSize, 458.29200744628906, 216.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 507.4765625, 295.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 468.72801208496094, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("1", TestBase.typeface, TestBase.fontSize, 497.1767578125, 295.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("1", TestBase.textStyle, TestBase.fontSize, 458.29200744628906, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 507.4765625, 306.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 468.72801208496094, 238.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("0", TestBase.typeface, TestBase.fontSize, 497.1767578125, 306.3, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("0", TestBase.textStyle, TestBase.fontSize, 458.29200744628906, 238.3199951171875, TestBase.textAlign, TestBase.textBaseline); TestBase.textBaseline = AlphaSkiaTextBaseline.Top; - canvas.beginRotate(527.7200927734375, 326.8, -90); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 0, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 10.799999999999999, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 21.599999999999998, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 32.4, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 43.199999999999996, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.beginRotate(488.7895050048828, 258.8199951171875, -90); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 0, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 10.799999999999999, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 21.599999999999998, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 32.4, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 43.199999999999996, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.endRotate(); canvas.beginPath(); - canvas.moveTo(528, 334.8); - canvas.lineTo(532, 326.8); - canvas.lineTo(524, 326.8); + canvas.moveTo(489, 266.8199951171875); + canvas.lineTo(493, 258.8199951171875); + canvas.lineTo(485, 258.8199951171875); canvas.closePath(); canvas.fill(); TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 548.0198974609375, 284.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 509.2255096435547, 216.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("0", TestBase.typeface, TestBase.fontSize, 537.7200927734375, 284.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("0", TestBase.textStyle, TestBase.fontSize, 498.7895050048828, 216.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 548.0198974609375, 295.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 509.2255096435547, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("1", TestBase.typeface, TestBase.fontSize, 537.7200927734375, 295.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("1", TestBase.textStyle, TestBase.fontSize, 498.7895050048828, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 548.0198974609375, 306.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 509.2255096435547, 238.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("0", TestBase.typeface, TestBase.fontSize, 537.7200927734375, 306.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("0", TestBase.textStyle, TestBase.fontSize, 498.7895050048828, 238.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 548.0198974609375, 317.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 509.2255096435547, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("2", TestBase.typeface, TestBase.fontSize, 537.7200927734375, 317.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("2", TestBase.textStyle, TestBase.fontSize, 498.7895050048828, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 548.0198974609375, 328.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 509.2255096435547, 260.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("3", TestBase.typeface, TestBase.fontSize, 537.7200927734375, 328.3, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("3", TestBase.textStyle, TestBase.fontSize, 498.7895050048828, 260.3199951171875, TestBase.textAlign, TestBase.textBaseline); TestBase.textBaseline = AlphaSkiaTextBaseline.Top; canvas.beginPath(); - canvas.moveTo(569, 297.8); - canvas.lineTo(569, 334.8); + canvas.moveTo(530, 229.8199951171875); + canvas.lineTo(530, 266.8199951171875); canvas.stroke(); canvas.beginPath(); - canvas.moveTo(569, 297.8); - canvas.lineTo(573, 305.8); - canvas.lineTo(565, 305.8); + canvas.moveTo(530, 229.8199951171875); + canvas.lineTo(534, 237.8199951171875); + canvas.lineTo(526, 237.8199951171875); canvas.closePath(); canvas.fill(); TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 588.563232421875, 306.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 549.7230072021484, 238.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("2", TestBase.typeface, TestBase.fontSize, 578.263427734375, 306.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("2", TestBase.textStyle, TestBase.fontSize, 539.2870025634766, 238.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 588.563232421875, 317.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 549.7230072021484, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("2", TestBase.typeface, TestBase.fontSize, 578.263427734375, 317.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("2", TestBase.textStyle, TestBase.fontSize, 539.2870025634766, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 588.563232421875, 328.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 549.7230072021484, 260.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("0", TestBase.typeface, TestBase.fontSize, 578.263427734375, 328.3, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("0", TestBase.textStyle, TestBase.fontSize, 539.2870025634766, 260.3199951171875, TestBase.textAlign, TestBase.textBaseline); TestBase.textBaseline = AlphaSkiaTextBaseline.Top; - canvas.beginRotate(596.8067626953125, 283.8, 90); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 0, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 10.799999999999999, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 21.599999999999998, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 32.4, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); - canvas.fillText("\uEAA4", TestBase.musicTypeface, TestBase.musicFontSize * 1.2, 43.199999999999996, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.beginRotate(569.7845001220703, 215.8199951171875, 90); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 0, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 10.799999999999999, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 21.599999999999998, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 32.4, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); + canvas.fillText("\uEAA4", TestBase.musicTextStyle, TestBase.musicFontSize * 1.2, 43.199999999999996, 10.799999999999999, AlphaSkiaTextAlign.Left, AlphaSkiaTextBaseline.Alphabetic); canvas.endRotate(); canvas.beginPath(); - canvas.moveTo(597, 275.8); - canvas.lineTo(601, 283.8); - canvas.lineTo(593, 283.8); + canvas.moveTo(570, 207.8199951171875); + canvas.lineTo(574, 215.8199951171875); + canvas.lineTo(566, 215.8199951171875); canvas.closePath(); canvas.fill(); TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 629.1065673828125, 284.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 590.2205047607422, 216.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("0", TestBase.typeface, TestBase.fontSize, 618.8067626953125, 284.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("0", TestBase.textStyle, TestBase.fontSize, 579.7845001220703, 216.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 629.1065673828125, 295.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 590.2205047607422, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("2", TestBase.typeface, TestBase.fontSize, 618.8067626953125, 295.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("2", TestBase.textStyle, TestBase.fontSize, 579.7845001220703, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 629.1065673828125, 306.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 590.2205047607422, 238.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("2", TestBase.typeface, TestBase.fontSize, 618.8067626953125, 306.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("2", TestBase.textStyle, TestBase.fontSize, 579.7845001220703, 238.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 629.1065673828125, 317.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 590.2205047607422, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("2", TestBase.typeface, TestBase.fontSize, 618.8067626953125, 317.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("2", TestBase.textStyle, TestBase.fontSize, 579.7845001220703, 249.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 11; - canvas.fillText("", TestBase.typeface, TestBase.fontSize, 629.1065673828125, 328.3, TestBase.textAlign, TestBase.textBaseline); - TestBase.typeface = TestBase.getTypeface("Roboto", false, false); + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 590.2205047607422, 260.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); TestBase.fontSize = 13; - canvas.fillText("0", TestBase.typeface, TestBase.fontSize, 618.8067626953125, 328.3, TestBase.textAlign, TestBase.textBaseline); + canvas.fillText("0", TestBase.textStyle, TestBase.fontSize, 579.7845001220703, 260.3199951171875, TestBase.textAlign, TestBase.textBaseline); TestBase.textBaseline = AlphaSkiaTextBaseline.Top; - canvas.fillRect(670, 284.3, 1, 54.99999999999994); - canvas.fillRect(674, 284.3, 4, 54.99999999999994); canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); - canvas.beginPath(); - canvas.moveTo(92, 130.1); - canvas.lineTo(92, 339.3); - canvas.stroke(); - TestBase.typeface = TestBase.getTypeface("PT Serif", false, true); + canvas.fillRect(624, 216.3199951171875, 1, 54.99999999999994); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.fillRect(625, 216, 82, 1.04); + canvas.fillRect(625, 227, 82, 1.04); + canvas.fillRect(625, 238, 82, 1.04); + canvas.fillRect(625, 249, 82, 1.04); + canvas.fillRect(625, 260, 82, 1.04); + canvas.fillRect(625, 271, 82, 1.04); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.fillRect(706, 216.3199951171875, 1, 54.99999999999994); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.fillRect(707, 216, 163, 1.04); + canvas.fillRect(707, 227, 12.074005126953125, 1.04); + canvas.fillRect(727.510009765625, 227, 28.11599349975586, 1.04); + canvas.fillRect(764.0620079040527, 227, 28.11599349975586, 1.04); + canvas.fillRect(800.6140060424805, 227, 28.115989685058594, 1.04); + canvas.fillRect(837.1660003662109, 227, 32.83399963378906, 1.04); + canvas.fillRect(707, 238, 163, 1.04); + canvas.fillRect(707, 249, 163, 1.04); + canvas.fillRect(707, 260, 163, 1.04); + canvas.fillRect(707, 271, 163, 1.04); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 13; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 11; + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 729.510009765625, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 13; + canvas.fillText("3", TestBase.textStyle, TestBase.fontSize, 719.0740051269531, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 13; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 11; + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 766.0620079040527, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 13; + canvas.fillText("3", TestBase.textStyle, TestBase.fontSize, 755.6260032653809, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 13; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 11; + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 802.6140060424805, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 13; + canvas.fillText("3", TestBase.textStyle, TestBase.fontSize, 792.1780014038086, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 13; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 11; + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 839.1660041809082, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 13; + canvas.fillText("3", TestBase.textStyle, TestBase.fontSize, 828.7299995422363, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.fillRect(869, 216.3199951171875, 1, 54.99999999999994); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(165, 165, 165, 255); + canvas.fillRect(870, 216, 60, 1.04); + canvas.fillRect(870, 227, 12.074005126953125, 1.04); + canvas.fillRect(890.510009765625, 227, 39.489990234375, 1.04); + canvas.fillRect(870, 238, 60, 1.04); + canvas.fillRect(870, 249, 60, 1.04); + canvas.fillRect(870, 260, 60, 1.04); + canvas.fillRect(870, 271, 60, 1.04); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + TestBase.textBaseline = AlphaSkiaTextBaseline.Middle; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 13; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 11; + canvas.fillText("", TestBase.textStyle, TestBase.fontSize, 892.510009765625, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 400, false); + TestBase.fontSize = 13; + canvas.fillText("3", TestBase.textStyle, TestBase.fontSize, 882.0740051269531, 227.3199951171875, TestBase.textAlign, TestBase.textBaseline); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + canvas.fillRect(922, 216.3199951171875, 1, 54.99999999999994); + canvas.fillRect(926, 216.3199951171875, 4, 54.99999999999994); + canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 51, 204, 100); + TestBase.textStyle = TestBase.getTextStyle(["Noto Serif", "Noto Music", "Noto Color Emoji"], 400, true); TestBase.fontSize = 12; - canvas.fillText("s.guit.", TestBase.typeface, TestBase.fontSize, 50, 130.1, TestBase.textAlign, TestBase.textBaseline); - canvas.fillRect(86, 118.1, 3, 233.20000000000002); - canvas.beginPath(); - canvas.moveTo(86, 118.1); - canvas.bezierCurveTo(86, 118.1, 86, 118.1, 98, 115.1); - canvas.bezierCurveTo(92, 121.1, 86, 121.1, 86, 121.1); - canvas.closePath(); - canvas.fill(); - canvas.beginPath(); - canvas.moveTo(86, 351.3); - canvas.bezierCurveTo(86, 351.3, 92, 351.3, 98, 354.3); - canvas.bezierCurveTo(92, 348.3, 86, 348.3, 86, 348.3); - canvas.closePath(); - canvas.fill(); + TestBase.textBaseline = AlphaSkiaTextBaseline.Bottom; + TestBase.textAlign = AlphaSkiaTextAlign.Center; + canvas.beginRotate(42, 179.6199951171875, -90.1); + canvas.fillText("s.guit.", TestBase.textStyle, TestBase.fontSize, 0, 0, TestBase.textAlign, TestBase.textBaseline); + canvas.endRotate(); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textAlign = AlphaSkiaTextAlign.Left; + canvas.fillRect(48, 123.91999511718751, 1, 93); + return canvas.endRender(); +} +function drawMusicSheetPart4(canvas: AlphaSkiaCanvas): AlphaSkiaImage | undefined { + canvas.beginRender(709, 14, TestBase.renderScale); + canvas.color = AlphaSkiaCanvas.rgbaToColor(153, 204, 30, 255); + TestBase.textAlign = AlphaSkiaTextAlign.Left; + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 700, false); + TestBase.fontSize = 12; + TestBase.textAlign = AlphaSkiaTextAlign.Center; + canvas.fillText("Copyright", TestBase.textStyle, TestBase.fontSize, 650, 0, TestBase.textAlign, TestBase.textBaseline); + TestBase.textAlign = AlphaSkiaTextAlign.Left; + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; return canvas.endRender(); } -function drawMusicSheetPart5(canvas: AlphaSkiaCanvas): AlphaSkiaImage { - canvas.beginRender(116, 24, TestBase.renderScale); +function drawMusicSheetPart5(canvas: AlphaSkiaCanvas): AlphaSkiaImage | undefined { + canvas.beginRender(779, 12, TestBase.renderScale); canvas.color = AlphaSkiaCanvas.rgbaToColor(0, 0, 0, 255); - TestBase.typeface = TestBase.getTypeface("Roboto", true, false); + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 700, false); + TestBase.fontSize = 12; + TestBase.textAlign = AlphaSkiaTextAlign.Left; + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; + TestBase.textStyle = TestBase.getTextStyle(["Noto Sans", "Noto Music", "Noto Color Emoji"], 700, false); TestBase.fontSize = 12; + TestBase.textAlign = AlphaSkiaTextAlign.Center; + canvas.fillText("rendered by alphaTab", TestBase.textStyle, TestBase.fontSize, 650, 0, TestBase.textAlign, TestBase.textBaseline); TestBase.textAlign = AlphaSkiaTextAlign.Left; - canvas.fillText("rendered by alphaTab", TestBase.typeface, TestBase.fontSize, 0, 12, TestBase.textAlign, TestBase.textBaseline); + TestBase.textBaseline = AlphaSkiaTextBaseline.Top; return canvas.endRender(); } export default { partPositions: [ - [0, 0, 1300, 164], [0, 164, 1300, 38], [0, 202, 1300, 6], [0, 208, 1300, 373], [591.962890625, 581, 116.07421875, 24] + [0, 35, 1300, 124], [0, 159, 1300, 12], [0, 171, 1300, 285], [0, 456, 709, 14], [0, 470, 779.2159881591797, 12] ], totalWidth: 1300, - totalHeight: 605, + totalHeight: 482, allParts: [ drawMusicSheetPart1, drawMusicSheetPart2, drawMusicSheetPart3, drawMusicSheetPart4, drawMusicSheetPart5 ] diff --git a/test/node/AlphaTabGeneratedRenderTestBase.ts b/test/node/AlphaTabGeneratedRenderTestBase.ts index e02cf81..5b0f85b 100644 --- a/test/node/AlphaTabGeneratedRenderTestBase.ts +++ b/test/node/AlphaTabGeneratedRenderTestBase.ts @@ -1,23 +1,23 @@ -import { AlphaSkiaTextAlign, AlphaSkiaTextBaseline, AlphaSkiaTypeface } from "@coderline/alphaskia"; +import { AlphaSkiaTextAlign, AlphaSkiaTextBaseline, AlphaSkiaTypeface, AlphaSkiaTextStyle } from "@coderline/alphaskia"; import * as fs from 'fs'; -const customTypefaces = new Map(); -function customTypefaceKey(fontFamily: string, isBold: boolean, isItalic: boolean) { - return `${fontFamily.toLocaleLowerCase()}_${isBold}_${isItalic}`; +const customTextStyles = new Map(); +function customTextStyleKey(fontFamilies: string[], weight: number, isItalic: boolean) { + return `${fontFamilies.join('_').toLowerCase()}_${weight}_${isItalic}`; } -function getTypeface(fontFamily: string, isBold: boolean, isItalic: boolean): AlphaSkiaTypeface { - const key = customTypefaceKey(fontFamily, isBold, isItalic); - const typeface = customTypefaces.get(key); - if (!typeface) { - throw new Error(`Unknown font requested: ${key}`); +function getTextStyle(fontFamilies: string[], weight: number, isItalic: boolean): AlphaSkiaTextStyle { + const key = customTextStyleKey(fontFamilies, weight, isItalic); + let textStyle = customTextStyles.get(key); + if (!textStyle) { + textStyle = new AlphaSkiaTextStyle(fontFamilies, weight, isItalic); + customTextStyles.set(key, textStyle); } - return typeface; + return textStyle; } -function loadTypeface(fontFamily: string, isBold: boolean, isItalic: boolean, filePath: string): AlphaSkiaTypeface { - const key = customTypefaceKey(fontFamily, isBold, isItalic); - console.log(`Loading typeface ${key} from ${filePath}`); +function loadTypeface(filePath: string): AlphaSkiaTypeface { + console.log(`Loading typefac from ${filePath}`); const data = fs.readFileSync(filePath); console.log(`Read ${data.length} bytes from file, decoding typeface`); @@ -27,18 +27,17 @@ function loadTypeface(fontFamily: string, isBold: boolean, isItalic: boolean, fi throw new Error("Could not create typeface from data") } - customTypefaces.set(key, typeface); return typeface; } export default { renderScale: 1, - musicTypeface: null! as AlphaSkiaTypeface, + musicTextStyle: null! as AlphaSkiaTextStyle, musicFontSize: 34, textAlign: AlphaSkiaTextAlign.Left, textBaseline: AlphaSkiaTextBaseline.Top, - typeface: null! as AlphaSkiaTypeface, + textStyle: null! as AlphaSkiaTextStyle, fontSize: 12, - getTypeface, + getTextStyle, loadTypeface }; \ No newline at end of file diff --git a/test/node/index.ts b/test/node/index.ts index 43a1a8e..1dd635b 100644 --- a/test/node/index.ts +++ b/test/node/index.ts @@ -2,7 +2,7 @@ import * as fs from 'fs'; import * as path from 'path'; import * as os from 'os'; -import { AlphaSkiaCanvas, AlphaSkiaImage } from '@coderline/alphaskia'; +import { AlphaSkiaCanvas, AlphaSkiaImage, AlphaSkiaTextStyle } from '@coderline/alphaskia'; import TestBase from './AlphaTabGeneratedRenderTestBase' import Test from './AlphaTabGeneratedRenderTest' @@ -30,7 +30,7 @@ function renderFullImage(): AlphaSkiaImage { using partialCanvas = new AlphaSkiaCanvas(); for (let i = 0; i < Test.allParts.length; i++) { console.log(`Render part ${i}`); - using part = Test.allParts[i](partialCanvas); + using part = Test.allParts[i](partialCanvas)!; const x = Test.partPositions[i][0]; const y = Test.partPositions[i][1]; @@ -67,7 +67,7 @@ function main(): number { try { const repositoryRoot = findRepositoryRoot(path.resolve('.')); const isFreeType = process.argv.includes("--freetype"); - if(isFreeType) { + if (isFreeType) { console.log("Switching to FreeType Fonts"); AlphaSkiaCanvas.switchToFreeTypeFonts(); } @@ -75,24 +75,23 @@ function main(): number { // Load all fonts for rendering console.log("Loading fonts"); let testDataPath = path.join(repositoryRoot, "test", "test-data"); - TestBase.musicTypeface = TestBase.loadTypeface("Bravura", false, false, - path.join(testDataPath, "font", "bravura", "Bravura.ttf")); - TestBase.loadTypeface("Roboto", false, false, - path.join(testDataPath, "font", "roboto", "Roboto-Regular.ttf")); - TestBase.loadTypeface("Roboto", true, false, - path.join(testDataPath, "font", "roboto", "Roboto-Bold.ttf")); - TestBase.loadTypeface("Roboto", false, true, - path.join(testDataPath, "font", "roboto", "Roboto-Italic.ttf")); - TestBase.loadTypeface("Roboto", true, true, - path.join(testDataPath, "font", "roboto", "Roboto-BoldItalic.ttf")); - TestBase.loadTypeface("PT Serif", false, false, - path.join(testDataPath, "font", "ptserif", "PTSerif-Regular.ttf")); - TestBase.loadTypeface("PT Serif", true, false, - path.join(testDataPath, "font", "ptserif", "PTSerif-Bold.ttf")); - TestBase.loadTypeface("PT Serif", false, true, - path.join(testDataPath, "font", "ptserif", "PTSerif-Italic.ttf")); - TestBase.loadTypeface("PT Serif", true, true, - path.join(testDataPath, "font", "ptserif", "PTSerif-BoldItalic.ttf")); + const musicTypeface = TestBase.loadTypeface(path.join(testDataPath, "font", "bravura", "Bravura.otf")); + TestBase.musicTextStyle = new AlphaSkiaTextStyle( + [musicTypeface.familyName], + musicTypeface.weight, + musicTypeface.isItalic + ); + + TestBase.loadTypeface(path.join(testDataPath, "font", "noto-sans", "NotoSans-Regular.otf")); + TestBase.loadTypeface(path.join(testDataPath, "font", "noto-sans", "NotoSans-Bold.otf")); + TestBase.loadTypeface(path.join(testDataPath, "font", "noto-sans", "NotoSans-Italic.otf")); + TestBase.loadTypeface(path.join(testDataPath, "font", "noto-sans", "NotoSans-BoldItalic.otf")); + TestBase.loadTypeface(path.join(testDataPath, "font", "noto-serif", "NotoSerif-Regular.otf")); + TestBase.loadTypeface(path.join(testDataPath, "font", "noto-serif", "NotoSerif-Bold.otf")); + TestBase.loadTypeface(path.join(testDataPath, "font", "noto-serif", "NotoSerif-Italic.otf")); + TestBase.loadTypeface(path.join(testDataPath, "font", "noto-serif", "NotoSerif-BoldItalic.otf")); + TestBase.loadTypeface(path.join(testDataPath, "font", "noto-music", "NotoMusic-Regular.otf")); + TestBase.loadTypeface(path.join(testDataPath, "font", "noto-color-emoji", "NotoColorEmoji_WindowsCompatible.ttf")); console.log("Fonts loaded"); // render full image @@ -167,7 +166,7 @@ function main(): number { let diffImagePngData = diffImage.toPng()!; let diffOutputPath = path.join(testOutputPath, testOutputFileBase + ".diff.png"); - fs.writeFileSync(diffOutputPath, diffImagePngData); + fs.writeFileSync(diffOutputPath, new Uint8Array(diffImagePngData)); console.log(`Error diff image saved to ${diffOutputPath}`); return 1; } diff --git a/test/node/package.json b/test/node/package.json index cc4f2cf..e71552c 100644 --- a/test/node/package.json +++ b/test/node/package.json @@ -10,6 +10,7 @@ "@coderline/alphaskia-linux": "file:../../dist/nodetars/coderline-alphaskia-linux.tgz", "@coderline/alphaskia-macos": "file:../../dist/nodetars/coderline-alphaskia-macos.tgz", "@coderline/alphaskia-windows": "file:../../dist/nodetars/coderline-alphaskia-windows.tgz", + "@types/node": "^22.14.1", "tsx": "^3.13.0" } } diff --git a/test/test-data/font/noto-color-emoji/NotoColorEmoji-Regular.ttf b/test/test-data/font/noto-color-emoji/NotoColorEmoji-Regular.ttf new file mode 100644 index 0000000..9851173 Binary files /dev/null and b/test/test-data/font/noto-color-emoji/NotoColorEmoji-Regular.ttf differ diff --git a/test/test-data/font/noto-color-emoji/NotoColorEmoji_WindowsCompatible.ttf b/test/test-data/font/noto-color-emoji/NotoColorEmoji_WindowsCompatible.ttf new file mode 100644 index 0000000..b2346a4 Binary files /dev/null and b/test/test-data/font/noto-color-emoji/NotoColorEmoji_WindowsCompatible.ttf differ diff --git a/test/test-data/font/ptserif/PTSerif-OFL.txt b/test/test-data/font/noto-color-emoji/OFL.txt similarity index 96% rename from test/test-data/font/ptserif/PTSerif-OFL.txt rename to test/test-data/font/noto-color-emoji/OFL.txt index 3f70bfe..04e112f 100644 --- a/test/test-data/font/ptserif/PTSerif-OFL.txt +++ b/test/test-data/font/noto-color-emoji/OFL.txt @@ -1,9 +1,8 @@ -Copyright (c) 2010, ParaType Ltd. (http://www.paratype.com/public), -with Reserved Font Names "PT Sans", "PT Serif" and "ParaType". +Copyright 2021 Google Inc. All Rights Reserved. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL +https://openfontlicense.org ----------------------------------------------------------- diff --git a/test/test-data/font/noto-music/NotoMusic-Regular.otf b/test/test-data/font/noto-music/NotoMusic-Regular.otf new file mode 100644 index 0000000..fb87aa7 Binary files /dev/null and b/test/test-data/font/noto-music/NotoMusic-Regular.otf differ diff --git a/test/test-data/font/noto-music/OFL.txt b/test/test-data/font/noto-music/OFL.txt new file mode 100644 index 0000000..0373e14 --- /dev/null +++ b/test/test-data/font/noto-music/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2022 The Noto Project Authors (https://github.com/notofonts/latin-greek-cyrillic) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/test/test-data/font/noto-sans/NotoSans-Bold.otf b/test/test-data/font/noto-sans/NotoSans-Bold.otf new file mode 100644 index 0000000..7325f69 Binary files /dev/null and b/test/test-data/font/noto-sans/NotoSans-Bold.otf differ diff --git a/test/test-data/font/noto-sans/NotoSans-BoldItalic.otf b/test/test-data/font/noto-sans/NotoSans-BoldItalic.otf new file mode 100644 index 0000000..123f51f Binary files /dev/null and b/test/test-data/font/noto-sans/NotoSans-BoldItalic.otf differ diff --git a/test/test-data/font/noto-sans/NotoSans-Italic.otf b/test/test-data/font/noto-sans/NotoSans-Italic.otf new file mode 100644 index 0000000..202f454 Binary files /dev/null and b/test/test-data/font/noto-sans/NotoSans-Italic.otf differ diff --git a/test/test-data/font/noto-sans/NotoSans-Regular.otf b/test/test-data/font/noto-sans/NotoSans-Regular.otf new file mode 100644 index 0000000..b8f04a5 Binary files /dev/null and b/test/test-data/font/noto-sans/NotoSans-Regular.otf differ diff --git a/test/test-data/font/noto-sans/OFL.txt b/test/test-data/font/noto-sans/OFL.txt new file mode 100644 index 0000000..0373e14 --- /dev/null +++ b/test/test-data/font/noto-sans/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2022 The Noto Project Authors (https://github.com/notofonts/latin-greek-cyrillic) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/test/test-data/font/noto-sans/README.txt b/test/test-data/font/noto-sans/README.txt new file mode 100644 index 0000000..aeb63ed --- /dev/null +++ b/test/test-data/font/noto-sans/README.txt @@ -0,0 +1,136 @@ +Noto Sans Variable Font +======================= + +This download contains Noto Sans as both variable fonts and static fonts. + +Noto Sans is a variable font with these axes: + wdth + wght + +This means all the styles are contained in these files: + Noto_Sans/NotoSans-VariableFont_wdth,wght.ttf + Noto_Sans/NotoSans-Italic-VariableFont_wdth,wght.ttf + +If your app fully supports variable fonts, you can now pick intermediate styles +that aren’t available as static fonts. Not all apps support variable fonts, and +in those cases you can use the static font files for Noto Sans: + Noto_Sans/static/NotoSans_ExtraCondensed-Thin.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-ExtraLight.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-Light.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-Regular.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-Medium.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-SemiBold.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-Bold.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-ExtraBold.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-Black.ttf + Noto_Sans/static/NotoSans_Condensed-Thin.ttf + Noto_Sans/static/NotoSans_Condensed-ExtraLight.ttf + Noto_Sans/static/NotoSans_Condensed-Light.ttf + Noto_Sans/static/NotoSans_Condensed-Regular.ttf + Noto_Sans/static/NotoSans_Condensed-Medium.ttf + Noto_Sans/static/NotoSans_Condensed-SemiBold.ttf + Noto_Sans/static/NotoSans_Condensed-Bold.ttf + Noto_Sans/static/NotoSans_Condensed-ExtraBold.ttf + Noto_Sans/static/NotoSans_Condensed-Black.ttf + Noto_Sans/static/NotoSans_SemiCondensed-Thin.ttf + Noto_Sans/static/NotoSans_SemiCondensed-ExtraLight.ttf + Noto_Sans/static/NotoSans_SemiCondensed-Light.ttf + Noto_Sans/static/NotoSans_SemiCondensed-Regular.ttf + Noto_Sans/static/NotoSans_SemiCondensed-Medium.ttf + Noto_Sans/static/NotoSans_SemiCondensed-SemiBold.ttf + Noto_Sans/static/NotoSans_SemiCondensed-Bold.ttf + Noto_Sans/static/NotoSans_SemiCondensed-ExtraBold.ttf + Noto_Sans/static/NotoSans_SemiCondensed-Black.ttf + Noto_Sans/static/NotoSans-Thin.ttf + Noto_Sans/static/NotoSans-ExtraLight.ttf + Noto_Sans/static/NotoSans-Light.ttf + Noto_Sans/static/NotoSans-Regular.ttf + Noto_Sans/static/NotoSans-Medium.ttf + Noto_Sans/static/NotoSans-SemiBold.ttf + Noto_Sans/static/NotoSans-Bold.ttf + Noto_Sans/static/NotoSans-ExtraBold.ttf + Noto_Sans/static/NotoSans-Black.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-ThinItalic.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-ExtraLightItalic.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-LightItalic.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-Italic.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-MediumItalic.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-SemiBoldItalic.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-BoldItalic.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-ExtraBoldItalic.ttf + Noto_Sans/static/NotoSans_ExtraCondensed-BlackItalic.ttf + Noto_Sans/static/NotoSans_Condensed-ThinItalic.ttf + Noto_Sans/static/NotoSans_Condensed-ExtraLightItalic.ttf + Noto_Sans/static/NotoSans_Condensed-LightItalic.ttf + Noto_Sans/static/NotoSans_Condensed-Italic.ttf + Noto_Sans/static/NotoSans_Condensed-MediumItalic.ttf + Noto_Sans/static/NotoSans_Condensed-SemiBoldItalic.ttf + Noto_Sans/static/NotoSans_Condensed-BoldItalic.ttf + Noto_Sans/static/NotoSans_Condensed-ExtraBoldItalic.ttf + Noto_Sans/static/NotoSans_Condensed-BlackItalic.ttf + Noto_Sans/static/NotoSans_SemiCondensed-ThinItalic.ttf + Noto_Sans/static/NotoSans_SemiCondensed-ExtraLightItalic.ttf + Noto_Sans/static/NotoSans_SemiCondensed-LightItalic.ttf + Noto_Sans/static/NotoSans_SemiCondensed-Italic.ttf + Noto_Sans/static/NotoSans_SemiCondensed-MediumItalic.ttf + Noto_Sans/static/NotoSans_SemiCondensed-SemiBoldItalic.ttf + Noto_Sans/static/NotoSans_SemiCondensed-BoldItalic.ttf + Noto_Sans/static/NotoSans_SemiCondensed-ExtraBoldItalic.ttf + Noto_Sans/static/NotoSans_SemiCondensed-BlackItalic.ttf + Noto_Sans/static/NotoSans-ThinItalic.ttf + Noto_Sans/static/NotoSans-ExtraLightItalic.ttf + Noto_Sans/static/NotoSans-LightItalic.ttf + Noto_Sans/static/NotoSans-Italic.ttf + Noto_Sans/static/NotoSans-MediumItalic.ttf + Noto_Sans/static/NotoSans-SemiBoldItalic.ttf + Noto_Sans/static/NotoSans-BoldItalic.ttf + Noto_Sans/static/NotoSans-ExtraBoldItalic.ttf + Noto_Sans/static/NotoSans-BlackItalic.ttf + +Get started +----------- + +1. Install the font files you want to use + +2. Use your app's font picker to view the font family and all the +available styles + +Learn more about variable fonts +------------------------------- + + https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts + https://variablefonts.typenetwork.com + https://medium.com/variable-fonts + +In desktop apps + + https://theblog.adobe.com/can-variable-fonts-illustrator-cc + https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts + +Online + + https://developers.google.com/fonts/docs/getting_started + https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide + https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts + +Installing fonts + + MacOS: https://support.apple.com/en-us/HT201749 + Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux + Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows + +Android Apps + + https://developers.google.com/fonts/docs/android + https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts + +License +------- +Please read the full license text (OFL.txt) to understand the permissions, +restrictions and requirements for usage, redistribution, and modification. + +You can use them in your products & projects – print or digital, +commercial or otherwise. + +This isn't legal advice, please consider consulting a lawyer and see the full +license for all details. diff --git a/test/test-data/font/noto-serif/NotoSerif-Bold.otf b/test/test-data/font/noto-serif/NotoSerif-Bold.otf new file mode 100644 index 0000000..fef5808 Binary files /dev/null and b/test/test-data/font/noto-serif/NotoSerif-Bold.otf differ diff --git a/test/test-data/font/noto-serif/NotoSerif-BoldItalic.otf b/test/test-data/font/noto-serif/NotoSerif-BoldItalic.otf new file mode 100644 index 0000000..154beba Binary files /dev/null and b/test/test-data/font/noto-serif/NotoSerif-BoldItalic.otf differ diff --git a/test/test-data/font/noto-serif/NotoSerif-Italic.otf b/test/test-data/font/noto-serif/NotoSerif-Italic.otf new file mode 100644 index 0000000..21ea4c9 Binary files /dev/null and b/test/test-data/font/noto-serif/NotoSerif-Italic.otf differ diff --git a/test/test-data/font/noto-serif/NotoSerif-Regular.otf b/test/test-data/font/noto-serif/NotoSerif-Regular.otf new file mode 100644 index 0000000..0efd27d Binary files /dev/null and b/test/test-data/font/noto-serif/NotoSerif-Regular.otf differ diff --git a/test/test-data/font/noto-serif/OFL.txt b/test/test-data/font/noto-serif/OFL.txt new file mode 100644 index 0000000..0373e14 --- /dev/null +++ b/test/test-data/font/noto-serif/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2022 The Noto Project Authors (https://github.com/notofonts/latin-greek-cyrillic) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/test/test-data/font/noto-serif/README.txt b/test/test-data/font/noto-serif/README.txt new file mode 100644 index 0000000..3bb5cc0 --- /dev/null +++ b/test/test-data/font/noto-serif/README.txt @@ -0,0 +1,136 @@ +Noto Serif Variable Font +======================== + +This download contains Noto Serif as both variable fonts and static fonts. + +Noto Serif is a variable font with these axes: + wdth + wght + +This means all the styles are contained in these files: + Noto_Serif/NotoSerif-VariableFont_wdth,wght.ttf + Noto_Serif/NotoSerif-Italic-VariableFont_wdth,wght.ttf + +If your app fully supports variable fonts, you can now pick intermediate styles +that aren’t available as static fonts. Not all apps support variable fonts, and +in those cases you can use the static font files for Noto Serif: + Noto_Serif/static/NotoSerif_ExtraCondensed-Thin.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-ExtraLight.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-Light.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-Regular.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-Medium.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-SemiBold.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-Bold.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-ExtraBold.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-Black.ttf + Noto_Serif/static/NotoSerif_Condensed-Thin.ttf + Noto_Serif/static/NotoSerif_Condensed-ExtraLight.ttf + Noto_Serif/static/NotoSerif_Condensed-Light.ttf + Noto_Serif/static/NotoSerif_Condensed-Regular.ttf + Noto_Serif/static/NotoSerif_Condensed-Medium.ttf + Noto_Serif/static/NotoSerif_Condensed-SemiBold.ttf + Noto_Serif/static/NotoSerif_Condensed-Bold.ttf + Noto_Serif/static/NotoSerif_Condensed-ExtraBold.ttf + Noto_Serif/static/NotoSerif_Condensed-Black.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-Thin.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-ExtraLight.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-Light.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-Regular.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-Medium.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-SemiBold.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-Bold.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-ExtraBold.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-Black.ttf + Noto_Serif/static/NotoSerif-Thin.ttf + Noto_Serif/static/NotoSerif-ExtraLight.ttf + Noto_Serif/static/NotoSerif-Light.ttf + Noto_Serif/static/NotoSerif-Regular.ttf + Noto_Serif/static/NotoSerif-Medium.ttf + Noto_Serif/static/NotoSerif-SemiBold.ttf + Noto_Serif/static/NotoSerif-Bold.ttf + Noto_Serif/static/NotoSerif-ExtraBold.ttf + Noto_Serif/static/NotoSerif-Black.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-ThinItalic.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-ExtraLightItalic.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-LightItalic.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-Italic.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-MediumItalic.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-SemiBoldItalic.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-BoldItalic.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-ExtraBoldItalic.ttf + Noto_Serif/static/NotoSerif_ExtraCondensed-BlackItalic.ttf + Noto_Serif/static/NotoSerif_Condensed-ThinItalic.ttf + Noto_Serif/static/NotoSerif_Condensed-ExtraLightItalic.ttf + Noto_Serif/static/NotoSerif_Condensed-LightItalic.ttf + Noto_Serif/static/NotoSerif_Condensed-Italic.ttf + Noto_Serif/static/NotoSerif_Condensed-MediumItalic.ttf + Noto_Serif/static/NotoSerif_Condensed-SemiBoldItalic.ttf + Noto_Serif/static/NotoSerif_Condensed-BoldItalic.ttf + Noto_Serif/static/NotoSerif_Condensed-ExtraBoldItalic.ttf + Noto_Serif/static/NotoSerif_Condensed-BlackItalic.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-ThinItalic.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-ExtraLightItalic.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-LightItalic.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-Italic.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-MediumItalic.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-SemiBoldItalic.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-BoldItalic.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-ExtraBoldItalic.ttf + Noto_Serif/static/NotoSerif_SemiCondensed-BlackItalic.ttf + Noto_Serif/static/NotoSerif-ThinItalic.ttf + Noto_Serif/static/NotoSerif-ExtraLightItalic.ttf + Noto_Serif/static/NotoSerif-LightItalic.ttf + Noto_Serif/static/NotoSerif-Italic.ttf + Noto_Serif/static/NotoSerif-MediumItalic.ttf + Noto_Serif/static/NotoSerif-SemiBoldItalic.ttf + Noto_Serif/static/NotoSerif-BoldItalic.ttf + Noto_Serif/static/NotoSerif-ExtraBoldItalic.ttf + Noto_Serif/static/NotoSerif-BlackItalic.ttf + +Get started +----------- + +1. Install the font files you want to use + +2. Use your app's font picker to view the font family and all the +available styles + +Learn more about variable fonts +------------------------------- + + https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts + https://variablefonts.typenetwork.com + https://medium.com/variable-fonts + +In desktop apps + + https://theblog.adobe.com/can-variable-fonts-illustrator-cc + https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts + +Online + + https://developers.google.com/fonts/docs/getting_started + https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide + https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts + +Installing fonts + + MacOS: https://support.apple.com/en-us/HT201749 + Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux + Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows + +Android Apps + + https://developers.google.com/fonts/docs/android + https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts + +License +------- +Please read the full license text (OFL.txt) to understand the permissions, +restrictions and requirements for usage, redistribution, and modification. + +You can use them in your products & projects – print or digital, +commercial or otherwise. + +This isn't legal advice, please consider consulting a lawyer and see the full +license for all details. diff --git a/test/test-data/font/ptserif/PTSerif-Bold.ttf b/test/test-data/font/ptserif/PTSerif-Bold.ttf deleted file mode 100644 index b955732..0000000 Binary files a/test/test-data/font/ptserif/PTSerif-Bold.ttf and /dev/null differ diff --git a/test/test-data/font/ptserif/PTSerif-BoldItalic.ttf b/test/test-data/font/ptserif/PTSerif-BoldItalic.ttf deleted file mode 100644 index e933f84..0000000 Binary files a/test/test-data/font/ptserif/PTSerif-BoldItalic.ttf and /dev/null differ diff --git a/test/test-data/font/ptserif/PTSerif-Italic.ttf b/test/test-data/font/ptserif/PTSerif-Italic.ttf deleted file mode 100644 index e53ac86..0000000 Binary files a/test/test-data/font/ptserif/PTSerif-Italic.ttf and /dev/null differ diff --git a/test/test-data/font/ptserif/PTSerif-Regular.ttf b/test/test-data/font/ptserif/PTSerif-Regular.ttf deleted file mode 100644 index 24af478..0000000 Binary files a/test/test-data/font/ptserif/PTSerif-Regular.ttf and /dev/null differ diff --git a/test/test-data/font/roboto/LICENSE.txt b/test/test-data/font/roboto/LICENSE.txt deleted file mode 100644 index d645695..0000000 --- a/test/test-data/font/roboto/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/test/test-data/font/roboto/Roboto-Bold.ttf b/test/test-data/font/roboto/Roboto-Bold.ttf deleted file mode 100644 index d998cf5..0000000 Binary files a/test/test-data/font/roboto/Roboto-Bold.ttf and /dev/null differ diff --git a/test/test-data/font/roboto/Roboto-BoldItalic.ttf b/test/test-data/font/roboto/Roboto-BoldItalic.ttf deleted file mode 100644 index b4e2210..0000000 Binary files a/test/test-data/font/roboto/Roboto-BoldItalic.ttf and /dev/null differ diff --git a/test/test-data/font/roboto/Roboto-Italic.ttf b/test/test-data/font/roboto/Roboto-Italic.ttf deleted file mode 100644 index 5b390ff..0000000 Binary files a/test/test-data/font/roboto/Roboto-Italic.ttf and /dev/null differ diff --git a/test/test-data/font/roboto/Roboto-Regular.ttf b/test/test-data/font/roboto/Roboto-Regular.ttf deleted file mode 100644 index 2b6392f..0000000 Binary files a/test/test-data/font/roboto/Roboto-Regular.ttf and /dev/null differ diff --git a/test/test-data/reference/freetype.png b/test/test-data/reference/freetype.png index 7105391..a3c9851 100644 Binary files a/test/test-data/reference/freetype.png and b/test/test-data/reference/freetype.png differ diff --git a/test/test-data/reference/linux.png b/test/test-data/reference/linux.png index 85454e5..a3c9851 100644 Binary files a/test/test-data/reference/linux.png and b/test/test-data/reference/linux.png differ diff --git a/test/test-data/reference/macos.png b/test/test-data/reference/macos.png index 12f3f11..44623b8 100644 Binary files a/test/test-data/reference/macos.png and b/test/test-data/reference/macos.png differ diff --git a/test/test-data/reference/old-win-x64.png b/test/test-data/reference/old-win-x64.png deleted file mode 100644 index 7eab43b..0000000 Binary files a/test/test-data/reference/old-win-x64.png and /dev/null differ diff --git a/test/test-data/reference/win.png b/test/test-data/reference/win.png index 81479f1..7e250dd 100644 Binary files a/test/test-data/reference/win.png and b/test/test-data/reference/win.png differ diff --git a/test/test-generator/AlphaSkiaTestCanvas.cs b/test/test-generator/AlphaSkiaTestCanvas.cs index c1374ac..ec9a9b5 100644 --- a/test/test-generator/AlphaSkiaTestCanvas.cs +++ b/test/test-generator/AlphaSkiaTestCanvas.cs @@ -58,8 +58,9 @@ public Font Font get => _font; set { - _testSource.WriteSetTestProperty("Typeface", _testSource.MakeCallTestMethod("GetTypeface", - $"\"{value.Families[0]}\", {(value.IsBold ? "true" : "false")}, {(value.IsItalic ? "true" : "false")}", + var familyArgs = _testSource.MakeStringArray(value.Families); + _testSource.WriteSetTestProperty("TextStyle", _testSource.MakeCallTestMethod("GetTextStyle", + $"{familyArgs}, {(value.IsBold ? "700" : "400")}, {(value.IsItalic ? "true" : "false")}", false )); _testSource.WriteSetTestProperty("FontSize", $"{_testSource.MakeCastToFloat(value.Size)}"); @@ -119,16 +120,16 @@ public void FillText(string text, double x, double y) { var textPart = WithTextLength ? $"{_testSource.EncodeString(text)}, {text.Length}" : $"{_testSource.EncodeString(text)}"; _testSource.WriteCallCanvasMethod("FillText", - $"{textPart}, {_testSource.MakeTestGetProperty("Typeface")}, {_testSource.MakeTestGetProperty("FontSize")}, {_testSource.MakeCastToFloat(x)}, {_testSource.MakeCastToFloat(y)}, {_testSource.MakeTestGetProperty("TextAlign")}, {_testSource.MakeTestGetProperty("TextBaseline")}"); + $"{textPart}, {_testSource.MakeTestGetProperty("TextStyle")}, {_testSource.MakeTestGetProperty("FontSize")}, {_testSource.MakeCastToFloat(x)}, {_testSource.MakeCastToFloat(y)}, {_testSource.MakeTestGetProperty("TextAlign")}, {_testSource.MakeTestGetProperty("TextBaseline")}"); } - public double MeasureText(string text) + public MeasuredText MeasureText(string text) { return SkiaSharpTextMeasurer.MeasureText(_font, text); } public void FillMusicFontSymbol(double x, double y, double scale, MusicFontSymbol symbol, - bool centerAtPosition = false) + bool? centerAtPosition = null) { FillMusicFontSymbols(x, y, scale, new List { @@ -137,19 +138,19 @@ public void FillMusicFontSymbol(double x, double y, double scale, MusicFontSymbo } public void FillMusicFontSymbols(double x, double y, double scale, IList symbols, - bool centerAtPosition = false) + bool? centerAtPosition = null) { var text = _testSource.EncodeString( new string(symbols.Select(s => (char)((int)s)).ToArray())); - var textAlign = centerAtPosition + var textAlign = centerAtPosition.GetValueOrDefault() ? _testSource.MakeEnumAccess("AlphaSkiaTextAlign", "Center") : _testSource.MakeEnumAccess("AlphaSkiaTextAlign", "Left"); var textPart = WithTextLength ? $"{text}, {symbols.Count}" : $"{text}"; _testSource.WriteCallCanvasMethod("FillText", - $"{textPart}, {_testSource.MakeTestGetProperty("MusicTypeface")}, {MakeGetMusicFontSize(scale)}, {_testSource.MakeCastToFloat(x)}, {_testSource.MakeCastToFloat(y)}, {textAlign}, {_testSource.MakeEnumAccess("AlphaSkiaTextBaseline", "Alphabetic")}"); + $"{textPart}, {_testSource.MakeTestGetProperty("MusicTextStyle")}, {MakeGetMusicFontSize(scale)}, {_testSource.MakeCastToFloat(x)}, {_testSource.MakeCastToFloat(y)}, {textAlign}, {_testSource.MakeEnumAccess("AlphaSkiaTextBaseline", "Alphabetic")}"); } private string MakeGetMusicFontSize(double? scale = null) @@ -235,4 +236,8 @@ public void QuadraticCurveTo(double cpx, double cpy, double x, double y) { _testSource.WriteCallCanvasMethod("QuadraticCurveTo", $"{_testSource.MakeCastToFloat(cpx)}, {_testSource.MakeCastToFloat(cpy)}, {_testSource.MakeCastToFloat(x)}, {_testSource.MakeCastToFloat(y)}"); } + + public void Destroy() + { + } } \ No newline at end of file diff --git a/test/test-generator/AlphaSkiaUnitTestGenerator.cs b/test/test-generator/AlphaSkiaUnitTestGenerator.cs index 2af2132..6ee4921 100644 --- a/test/test-generator/AlphaSkiaUnitTestGenerator.cs +++ b/test/test-generator/AlphaSkiaUnitTestGenerator.cs @@ -1,4 +1,6 @@ -using AlphaTab; +using System.Text; +using System.Text.Unicode; +using AlphaTab; using AlphaTab.Importer; using AlphaTab.Model; using AlphaTab.Rendering; @@ -14,17 +16,18 @@ private static (List partialPositions, double totalWidth, double total settings.Core.EnableLazyLoading = false; // custom fonts - settings.Display.Resources.CopyrightFont.Families = new[] { "Roboto" }; - settings.Display.Resources.TitleFont.Families = new[] { "PT Serif" }; - settings.Display.Resources.SubTitleFont.Families = new[] { "PT Serif" }; - settings.Display.Resources.WordsFont.Families = new[] { "PT Serif" }; - settings.Display.Resources.EffectFont.Families = new[] { "PT Serif" }; - settings.Display.Resources.FretboardNumberFont.Families = new[] { "Roboto" }; - settings.Display.Resources.TablatureFont.Families = new[] { "Roboto" }; - settings.Display.Resources.GraceFont.Families = new[] { "Roboto" }; - settings.Display.Resources.BarNumberFont.Families = new[] { "Roboto" }; - settings.Display.Resources.FingeringFont.Families = new[] { "PT Serif" }; - settings.Display.Resources.MarkerFont.Families = new[] { "PT Serif" }; + settings.Display.Resources.CopyrightFont.Families = new[] { "Noto Sans", "Noto Music", "Noto Color Emoji" }; + settings.Display.Resources.TitleFont.Families = new[] { "Noto Serif", "Noto Music", "Noto Color Emoji" }; + settings.Display.Resources.SubTitleFont.Families = new[] { "Noto Serif", "Noto Music", "Noto Color Emoji" }; + settings.Display.Resources.WordsFont.Families = new[] { "Noto Serif", "Noto Music", "Noto Color Emoji" }; + settings.Display.Resources.EffectFont.Families = new[] { "Noto Serif", "Noto Music", "Noto Color Emoji" }; + settings.Display.Resources.FretboardNumberFont.Families = + new[] { "Noto Sans", "Noto Music", "Noto Color Emoji" }; + settings.Display.Resources.TablatureFont.Families = new[] { "Noto Sans", "Noto Music", "Noto Color Emoji" }; + settings.Display.Resources.GraceFont.Families = new[] { "Noto Sans", "Noto Music", "Noto Color Emoji" }; + settings.Display.Resources.BarNumberFont.Families = new[] { "Noto Sans", "Noto Music", "Noto Color Emoji" }; + settings.Display.Resources.FingeringFont.Families = new[] { "Noto Serif", "Noto Music", "Noto Color Emoji" }; + settings.Display.Resources.MarkerFont.Families = new[] { "Noto Serif", "Noto Music", "Noto Color Emoji" }; // add some colors to ensure we test this as well settings.Display.Resources.ScoreInfoColor = new Color(153, 204, 30); @@ -42,6 +45,16 @@ private static (List partialPositions, double totalWidth, double total var score = ScoreLoader.LoadScoreFromBytes(buffer, settings); + // inject some unicode characters for fallback font + score.Tracks[0].Staves[0].Bars[7].Voices[0].Beats[0].Text = + score.Tracks[0].Staves[0].Bars[7].Voices[0].Beats[0].Text!.Replace("%UNICODE%", + // From Musical Symbols unicode block + // 𝄞 𝅘𝅥 + // And some emojis + // 🎸 🤘🏻 + "\U0001D11E \U0001D15F \U0001F3B8 \U0001F918\U0001F3FB" + ); + List partialPositions = new List(); var totalWidth = 0.0; @@ -60,7 +73,17 @@ void HandleResult(RenderFinishedEventArgs e) scoreRenderer.RenderFinished.On(HandleResult); scoreRenderer.PartialRenderFinished.On(HandleResult); + Exception? renderError = null; + scoreRenderer.Error.On(error => + { + renderError = error; + }); + scoreRenderer.RenderScore(score, new double[] { 0 }); + if (renderError != null) + { + throw renderError; + } return ( partialPositions, @@ -166,7 +189,8 @@ public static string GenerateJava() sourceCode.WriteLine("return new RenderFunction[]"); sourceCode.BeginBlock(); { - var parts = result.partialPositions.Select((_, i) => $"AlphaTabGeneratedRenderTest::drawMusicSheetPart{i + 1}"); + var parts = result.partialPositions.Select((_, i) => + $"AlphaTabGeneratedRenderTest::drawMusicSheetPart{i + 1}"); sourceCode.WriteLine(string.Join(", ", parts)); } sourceCode.EndBlock(true); @@ -197,9 +221,10 @@ public static string GenerateTypeScript() sourceCode.Resume(); sourceCode.WriteLine("import TestBase from './AlphaTabGeneratedRenderTestBase'; "); - sourceCode.WriteLine("import { AlphaSkiaTextBaseline, AlphaSkiaTextAlign, AlphaSkiaCanvas, AlphaSkiaImage } from '@coderline/alphaskia'; "); + sourceCode.WriteLine( + "import { AlphaSkiaTextBaseline, AlphaSkiaTextAlign, AlphaSkiaCanvas, AlphaSkiaImage } from '@coderline/alphaskia'; "); sourceCode.WriteLine(); - + sourceCode.Suspend(); var result = GenerateTestCode(settings); @@ -220,7 +245,7 @@ public static string GenerateTypeScript() sourceCode.WriteLine("]"); sourceCode.EndBlock(true); - + sourceCode.Suspend(); return sourceCode.ToString(); diff --git a/test/test-generator/CSharpTestSourceBuilder.cs b/test/test-generator/CSharpTestSourceBuilder.cs index a01045f..63b6dc9 100644 --- a/test/test-generator/CSharpTestSourceBuilder.cs +++ b/test/test-generator/CSharpTestSourceBuilder.cs @@ -1,4 +1,6 @@ -namespace TestGenerator; +using System.Text.Json; + +namespace TestGenerator; class CSharpTestSourceBuilder : TestSourceBuilder { @@ -52,9 +54,17 @@ public override string MakeEnumAccess(string type, string field) { return $"{type}.{ToPascalCase(field)}"; } + + protected override bool SupportsUtf32EscapeSequence => true; public override void WriteSetCanvasProperty(string property, string value) { WriteLine($"canvas.{ToPascalCase(property)} = {value};"); } + + public override string MakeStringArray(IList values) + { + var items = string.Join(", ", values.Select(v => JsonSerializer.Serialize(v))); + return "new []{" + items + "}"; + } } \ No newline at end of file diff --git a/test/test-generator/CppTestSourceBuilder.cs b/test/test-generator/CppTestSourceBuilder.cs index ba4c61c..5986fca 100644 --- a/test/test-generator/CppTestSourceBuilder.cs +++ b/test/test-generator/CppTestSourceBuilder.cs @@ -1,4 +1,9 @@ -namespace TestGenerator; +using System.Text; +using System.Text.Encodings.Web; +using System.Text.Json; +using System.Text.Unicode; + +namespace TestGenerator; class CppTestSourceBuilder : TestSourceBuilder { @@ -60,6 +65,13 @@ public override void WriteSetCanvasProperty(string property, string value) public override string EncodeString(string text) { - return "u" + base.EncodeString(text); + return $"u{base.EncodeString(text)}"; + } + protected override bool SupportsUtf32EscapeSequence => true; + + public override string MakeStringArray(IList values) + { + var items = string.Join(", ", values.Select(v => base.EncodeString(v))); + return "{" + items + "}"; } } \ No newline at end of file diff --git a/test/test-generator/JavaTestSourceBuilder.cs b/test/test-generator/JavaTestSourceBuilder.cs index 443b285..0c5bead 100644 --- a/test/test-generator/JavaTestSourceBuilder.cs +++ b/test/test-generator/JavaTestSourceBuilder.cs @@ -1,4 +1,6 @@ -namespace TestGenerator; +using System.Text.Json; + +namespace TestGenerator; class JavaTestSourceBuilder : TestSourceBuilder { @@ -56,4 +58,12 @@ public override void WriteSetCanvasProperty(string property, string value) { WriteLine($"canvas.set{ToPascalCase(property)}({value});"); } + + protected override bool SupportsUtf32EscapeSequence => false; + + public override string MakeStringArray(IList values) + { + var items = string.Join(", ", values.Select(v => JsonSerializer.Serialize(v))); + return "new String[]{" + items + "}"; + } } \ No newline at end of file diff --git a/test/test-generator/Program.cs b/test/test-generator/Program.cs index 93f2b56..7636393 100644 --- a/test/test-generator/Program.cs +++ b/test/test-generator/Program.cs @@ -1,4 +1,5 @@ using System.Globalization; +using System.Reflection; using TestGenerator; CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; @@ -6,6 +7,9 @@ CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture; +// TODO: make public again +// typeof(AlphaTab.Environment).GetProperty("HighDpiFactor", BindingFlags.Static | BindingFlags.NonPublic)!.SetValue(null, 1.5); + var rootDir = PathUtils.RepositoryRoot; var nativeTestFileCpp = Path.Combine(rootDir, "test", "native", "src", "AlphaTabGeneratedTest.cpp"); diff --git a/test/test-generator/SkiaSharpTextMeasurer.cs b/test/test-generator/SkiaSharpTextMeasurer.cs index 11c643a..fe0d26e 100644 --- a/test/test-generator/SkiaSharpTextMeasurer.cs +++ b/test/test-generator/SkiaSharpTextMeasurer.cs @@ -1,4 +1,5 @@ using System.Runtime.InteropServices; +using AlphaTab.Platform; using HarfBuzzSharp; using SkiaSharp; using Font = AlphaTab.Model.Font; @@ -40,27 +41,29 @@ private static string CustomTypeFaceKey(string fontFamily, bool isBold, bool isI static SkiaSharpTextMeasurer() { var repositoryRoot = PathUtils.RepositoryRoot; - RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "bravura", "Bravura.ttf")); - - RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "roboto", "Roboto-Regular.ttf")); - RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "roboto", "Roboto-Bold.ttf")); - RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "roboto", "Roboto-Italic.ttf")); - RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "roboto", - "Roboto-BoldItalic.ttf")); - - RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "ptserif", "PTSerif-Regular.ttf")); - RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "ptserif", "PTSerif-Bold.ttf")); - RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "ptserif", "PTSerif-Italic.ttf")); - RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "ptserif", - "PTSerif-BoldItalic.ttf")); + RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "bravura", "Bravura.otf")); + + RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "noto-sans", "NotoSans-Regular.otf")); + RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "noto-sans", "NotoSans-Bold.otf")); + RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "noto-sans", "NotoSans-Italic.otf")); + RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "noto-sans", "NotoSans-BoldItalic.otf")); + + RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "noto-serif", "NotoSerif-Regular.otf")); + RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "noto-serif", "NotoSerif-Bold.otf")); + RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "noto-serif", "NotoSerif-Italic.otf")); + RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "noto-serif", "NotoSerif-BoldItalic.otf")); + + RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "noto-music", "NotoMusic-Regular.otf")); + RegisterCustomFont(Path.Combine(repositoryRoot, "test", "test-data", "font", "noto-color-emoji", "NotoColorEmoji_WindowsCompatible.ttf")); } - - public static double MeasureText(Font font, string text) + public static MeasuredText MeasureText(Font font, string text) { + // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc;l=1288;bpv=0;bpt=1 + if (string.IsNullOrEmpty(text)) { - return 0; + return new MeasuredText(0, 0); } var typeFace = GetTypeFace(font); @@ -75,18 +78,61 @@ public static double MeasureText(Font font, string text) var infos = buffer.GlyphInfos; var positions = buffer.GlyphPositions; - var width = 0.0f; + + // https://source.chromium.org/chromium/chromium/src/+/refs/tags/120.0.6099.81:third_party/blink/renderer/platform/fonts/font.cc;l=387;bpv=0;bpt=0 + + var glyphBoundsY = 0.0f; + var glyphBoundsBottom = 0.0f; + + using var fontData = new SKFont(typeFace, (float)font.Size); + fontData.GetFontMetrics(out var fontMetrics); + + var x = 0; + var width = 0; + var y = 0; + for (var i = 0; i < infos.Length; i++) { - width += HarfBuzzToSkiaFontSize * positions[i].XAdvance; + var yOffset = y - positions[i].YOffset; + + var glyphBottom = yOffset; + if (harfBuzzFont.TryGetGlyphExtents(infos[i].Codepoint, out var glyphExtents)) + { + yOffset += glyphExtents.YBearing; + glyphBottom += glyphExtents.YBearing + glyphExtents.Height; + } + + if (glyphBoundsY < yOffset) + { + glyphBoundsY = yOffset; + } + + if (glyphBottom > glyphBoundsBottom) + { + glyphBoundsBottom = glyphBottom; + } + + x += positions[i].XAdvance; + if (x > width) + { + width = x; + } + y += positions[i].YAdvance; } - return width; - } + // default text-baseline in canvas is alphabetic. there baseline is 0 + // https://github.com/chromium/chromium/blob/99314be8152e688bafbbf9a615536bdbb289ea87/third_party/blink/renderer/core/html/canvas/text_metrics.cc#L34 + var baselineY = 0; + + var actualBoundingBoxAscent = -glyphBoundsY - baselineY; + var actualBoundingBoxDescent = glyphBoundsBottom + baselineY; + var height = actualBoundingBoxDescent - actualBoundingBoxAscent; + + return new MeasuredText((double)width / SkiaToHarfBuzzFontSize, height / SkiaToHarfBuzzFontSize); + } private const int SkiaToHarfBuzzFontSize = 1 << 16; - private const float HarfBuzzToSkiaFontSize = 1f / SkiaToHarfBuzzFontSize; private static HarfBuzzSharp.Font MakeHarfBuzzFont(SKTypeface typeface, int size) { diff --git a/test/test-generator/TestFile.gp b/test/test-generator/TestFile.gp index 7fda8fe..230c338 100644 Binary files a/test/test-generator/TestFile.gp and b/test/test-generator/TestFile.gp differ diff --git a/test/test-generator/TestGenerator.csproj b/test/test-generator/TestGenerator.csproj index b31e373..df6e442 100644 --- a/test/test-generator/TestGenerator.csproj +++ b/test/test-generator/TestGenerator.csproj @@ -5,13 +5,14 @@ net9.0 enable enable + true - - - - + + + + diff --git a/test/test-generator/TestSourceBuilder.cs b/test/test-generator/TestSourceBuilder.cs index 37c0554..d79bdb3 100644 --- a/test/test-generator/TestSourceBuilder.cs +++ b/test/test-generator/TestSourceBuilder.cs @@ -1,5 +1,9 @@ -using System.Text; +using System.Runtime.CompilerServices; +using System.Text; +using System.Text.Encodings.Web; +using System.Text.Json; using System.Text.RegularExpressions; +using System.Text.Unicode; namespace TestGenerator; @@ -120,9 +124,238 @@ protected static string ToSnakeCase(string s) public virtual string EncodeString(string text) { - return System.Text.Json.JsonSerializer.Serialize(text); + return JsonSerializer.Serialize(text, + SupportsUtf32EscapeSequence ? Utf32EscapeSequenceOptions : Utf16EscapeSequenceOptions); } + protected abstract bool SupportsUtf32EscapeSequence { get; } + + private static readonly JsonSerializerOptions Utf32EscapeSequenceOptions = new() + { + Encoder = new Utf32EscapeSequenceEncoder() + }; + + // mostly borrowed from DefaultJavaScriptEncoder and OptimizedInboxTextEncoder + private class Utf32EscapeSequenceEncoder : JavaScriptEncoder + { + private readonly HashSet _allowedBmpCodePoints = []; + + public Utf32EscapeSequenceEncoder() + { + var range = UnicodeRanges.BasicLatin; + var firstCodePoint = range.FirstCodePoint; + var rangeSize = range.Length; + for (var i = 0; i < rangeSize; i++) + { + var codePoint = firstCodePoint + i; + _allowedBmpCodePoints.Add((uint)codePoint); + } + } + + public override unsafe int FindFirstCharacterToEncode(char* text, int textLength) + { + var data = new ReadOnlySpan(text, textLength); + fixed (char* pData = data) + { + nuint lengthInChars = (uint)data.Length; + + nuint idx = 0; + + // If there's any leftover data, try consuming it now. + + if (idx < lengthInChars) + { + // unroll the loop 8x + nint loopIter; + for (; lengthInChars - idx >= 8; idx += 8) + { + loopIter = -1; + if (!_allowedBmpCodePoints.Contains(pData[idx + (nuint)(++loopIter)])) + { + goto BrokeInUnrolledLoop; + } + + if (!_allowedBmpCodePoints.Contains(pData[idx + (nuint)(++loopIter)])) + { + goto BrokeInUnrolledLoop; + } + + if (!_allowedBmpCodePoints.Contains(pData[idx + (nuint)(++loopIter)])) + { + goto BrokeInUnrolledLoop; + } + + if (!_allowedBmpCodePoints.Contains(pData[idx + (nuint)(++loopIter)])) + { + goto BrokeInUnrolledLoop; + } + + if (!_allowedBmpCodePoints.Contains(pData[idx + (nuint)(++loopIter)])) + { + goto BrokeInUnrolledLoop; + } + + if (!_allowedBmpCodePoints.Contains(pData[idx + (nuint)(++loopIter)])) + { + goto BrokeInUnrolledLoop; + } + + if (!_allowedBmpCodePoints.Contains(pData[idx + (nuint)(++loopIter)])) + { + goto BrokeInUnrolledLoop; + } + + if (!_allowedBmpCodePoints.Contains(pData[idx + (nuint)(++loopIter)])) + { + goto BrokeInUnrolledLoop; + } + } + + for (; idx < lengthInChars; idx++) + { + if (!_allowedBmpCodePoints.Contains(pData[idx])) + { + break; + } + } + + goto Return; + + BrokeInUnrolledLoop: + idx += (nuint)loopIter; + } + + Return: + + var idx32 = (int)idx; + if (idx32 == (int)lengthInChars) + { + idx32 = -1; + } + + return idx32; + } + } + + public override unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, + out int numberOfCharactersWritten) + { + var destination = new Span(buffer, bufferLength); + + if (_allowedBmpCodePoints.Contains((uint)unicodeScalar)) + { + // The bitmap should only allow BMP non-surrogate code points. + if (!destination.IsEmpty) + { + destination[0] = (char)unicodeScalar; // reflect as-is + numberOfCharactersWritten = 1; + return true; + } + } + else + { + var innerCharsWritten = EncodeUtf16(new Rune(unicodeScalar), destination); + if (innerCharsWritten >= 0) + { + numberOfCharactersWritten = innerCharsWritten; + return true; + } + } + + // If we reached this point, we ran out of space in the destination. + numberOfCharactersWritten = 0; + return false; + } + + private int EncodeUtf16(Rune value, Span destination) + { + if (value.IsBmp) + { + // Write 6 chars: "\uXXXX" + if (!IsValidIndex(destination, 5)) + { + return -1; + } + + destination[0] = '\\'; + destination[1] = 'u'; + destination[2] = '0'; + destination[3] = '0'; + destination[4] = '0'; + destination[5] = '0'; + + var u16 = (ushort)value.Value; + unsafe + { + var ptr = Unsafe.AsPointer(ref u16); + var raw = new Span(ptr, 2); + raw.Reverse(); + Convert.TryToHexString(raw, destination[2..], out var charsWritten); + + // pad + if (charsWritten < 4) + { + for (var i = 0; i < charsWritten; i++) + { + var src = 2 + i; + var dst = 5 - i; + destination[dst] = destination[src]; + } + } + } + + return 6; + } + + // "\UXXXXXXXX" + destination[0] = '\\'; + destination[1] = 'U'; + destination[2] = '0'; + destination[3] = '0'; + destination[4] = '0'; + destination[5] = '0'; + destination[6] = '0'; + destination[7] = '0'; + destination[8] = '0'; + destination[9] = '0'; + var u32 = (uint)value.Value; + + unsafe + { + var ptr = Unsafe.AsPointer(ref u32); + var raw = new Span(ptr, 4); + raw.Reverse(); + Convert.TryToHexString(raw, destination[2..], out var charsWritten); + + if (charsWritten < 8) + { + for (int i = 0; i < charsWritten; i++) + { + var src = 2 + i; + var dst = 9 - i; + destination[dst] = destination[src]; + } + } + } + return 10; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static bool IsValidIndex(Span span, int index) + { + return (uint)index < (uint)span.Length; + } + + public override bool WillEncode(int unicodeScalar) + { + return !_allowedBmpCodePoints.Contains((uint)unicodeScalar); + } + + public override int MaxOutputCharactersPerInputCharacter => 10; // \UXXXXXXXX + } + + private static readonly JsonSerializerOptions Utf16EscapeSequenceOptions = new(); + public void Resume() { _suspended = false; @@ -132,4 +365,6 @@ public void Suspend() { _suspended = true; } + + public abstract string MakeStringArray(IList values); } \ No newline at end of file diff --git a/test/test-generator/TypeScriptTestSourceBuilder.cs b/test/test-generator/TypeScriptTestSourceBuilder.cs index 465db7c..ee2f67c 100644 --- a/test/test-generator/TypeScriptTestSourceBuilder.cs +++ b/test/test-generator/TypeScriptTestSourceBuilder.cs @@ -1,10 +1,12 @@ -namespace TestGenerator; +using System.Text.Json; + +namespace TestGenerator; class TypeScriptTestSourceBuilder : TestSourceBuilder { public override void WritePartialRenderMethod(string methodName) { - Write($"function {ToCamelCase(methodName)}(canvas: AlphaSkiaCanvas): AlphaSkiaImage "); + Write($"function {ToCamelCase(methodName)}(canvas: AlphaSkiaCanvas): AlphaSkiaImage | undefined "); } public override string MakeCallTestMethod(string methodName, string args, bool statement) @@ -27,6 +29,8 @@ public override string MakeCastToFloat(string value) return value; } + protected override bool SupportsUtf32EscapeSequence => false; + public override string MakeCastToByte(double value) { return ((int)value).ToString(); @@ -58,4 +62,10 @@ public override void WriteSetCanvasProperty(string property, string value) { WriteLine($"canvas.{ToCamelCase(property)} = {value};"); } + + public override string MakeStringArray(IList values) + { + var items = string.Join(", ", values.Select(v => JsonSerializer.Serialize(v))); + return "[" + items + "]"; + } } \ No newline at end of file diff --git a/wrapper/include/AlphaSkiaCanvas.h b/wrapper/include/AlphaSkiaCanvas.h index 0f3b2cd..f5c6486 100644 --- a/wrapper/include/AlphaSkiaCanvas.h +++ b/wrapper/include/AlphaSkiaCanvas.h @@ -7,6 +7,42 @@ #include "../../externals/skia/include/core/SkSurface.h" #include "../../externals/skia/include/core/SkFont.h" #include "../../externals/skia/include/core/SkTypeface.h" +#include "../../externals/skia/modules/skparagraph/include/FontCollection.h" +#include "../../externals/skia/modules/skparagraph/include/Paragraph.h" + +#include + +class AlphaSkiaTextStyle +{ +public: + AlphaSkiaTextStyle( + int32_t weight, + SkFontStyle::Slant slant, + uint8_t family_name_count) + : font_style_(weight, SkFontStyle::Width::kNormal_Width, slant) + { + family_names_.reserve(family_name_count); + } + + const SkFontStyle &get_font_style() const + { + return font_style_; + } + + std::vector &get_family_names() + { + return family_names_; + } + + const std::vector &get_family_names() const + { + return family_names_; + } + +private: + SkFontStyle font_style_; + std::vector family_names_; +}; class AlphaSkiaCanvas { @@ -35,32 +71,21 @@ class AlphaSkiaCanvas void fill(); void stroke(); void draw_image(sk_sp image, float x, float y, float w, float h); - - void fill_text(const char16_t *text, int text_length, sk_sp typeface, float font_size, float x, float y, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline); - float measure_text(const char16_t *text, int text_length, sk_sp typeface, float font_size); + + void fill_text(const char16_t *text, int text_length, const AlphaSkiaTextStyle &textstyle, float font_size, float x, float y, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline); + float measure_text(const char16_t *text, int text_length, const AlphaSkiaTextStyle &textstyle, float font_size); void begin_rotate(float center_x, float center_y, float angle); void end_rotate(); private: SkPaint create_paint(); + std::unique_ptr build_paragraph(const char16_t *text, int text_length, const AlphaSkiaTextStyle &textstyle, float font_size, alphaskia_text_align_t text_align); + static float get_font_baseline(const SkFont &font, alphaskia_text_baseline_t baseline); SkColor color_; float line_width_; sk_sp surface_; SkPath path_; - // Chromium adopted text shaping and blob creation - static const uint32_t layoutUnitFractionalBits_; - static const int32_t fixedPointDenominator_; - void text_run(const char16_t* text, - int text_length, - SkFont &font, - sk_sp &realBlob, - float &width); - - static int float_to_layout_unit(float value); - static float layout_unit_to_float(int value); - static bool try_set_normalized_typo_ascent_and_descent(float em_height, float typo_ascent, float typo_descent, int &ascent, int &descent); - static void normalized_typo_ascent_and_descent(const SkFont &font, int &ascent, int &descent); - static float get_font_baseline(const SkFont &font, alphaskia_text_baseline_t baseline); + sk_sp font_collection_; }; \ No newline at end of file diff --git a/wrapper/include/SkFontMgr_alphaskia.h b/wrapper/include/SkFontMgr_alphaskia.h index b1eeccf..c790bbb 100644 --- a/wrapper/include/SkFontMgr_alphaskia.h +++ b/wrapper/include/SkFontMgr_alphaskia.h @@ -1,6 +1,12 @@ #pragma once #include "../../externals/skia/include/core/SkFontMgr.h" +#include "../../externals/skia/src/core/SkTHash.h" + +#include +#include + +class SkFontStyleSet_Custom; class SK_API SkFontMgr_AlphaSkia : public SkFontMgr { @@ -30,7 +36,14 @@ class SK_API SkFontMgr_AlphaSkia : public SkFontMgr private: + void registerTypeface(const sk_sp &typeface) const; + sk_sp currentFontMgr_; + skia_private::THashMap> *currentFontMgrFontStyleSets_; + sk_sp freeTypeFontMgr_; + skia_private::THashMap> freeTypeFontStyleSets_; + sk_sp operatingSystemTypeFontMgr_; + skia_private::THashMap> operatingSystemFontStyleSets_; }; diff --git a/wrapper/include/alphaskia.h b/wrapper/include/alphaskia.h index 2958f02..a7d3e87 100644 --- a/wrapper/include/alphaskia.h +++ b/wrapper/include/alphaskia.h @@ -38,11 +38,19 @@ extern "C" typedef AS_API void *alphaskia_typeface_t; AS_API alphaskia_typeface_t alphaskia_typeface_register(alphaskia_data_t data); AS_API void alphaskia_typeface_free(alphaskia_typeface_t typeface); - AS_API alphaskia_typeface_t alphaskia_typeface_make_from_name(const char *family_name, uint8_t bold, uint8_t italic); + AS_API alphaskia_typeface_t alphaskia_typeface_make_from_name(const char *family_name, uint16_t weight, uint8_t italic); AS_API alphaskia_string_t alphaskia_typeface_get_family_name(alphaskia_typeface_t typeface); - AS_API uint8_t alphaskia_typeface_is_bold(alphaskia_typeface_t typeface); + AS_API uint16_t alphaskia_typeface_get_weight(alphaskia_typeface_t typeface); AS_API uint8_t alphaskia_typeface_is_italic(alphaskia_typeface_t typeface); + typedef AS_API void *alphaskia_textstyle_t; + AS_API alphaskia_textstyle_t alphaskia_textstyle_new(uint8_t family_name_count, const char** family_names, uint16_t weight, uint8_t italic); + AS_API uint8_t alphaskia_textstyle_get_family_name_count(alphaskia_textstyle_t textstyle); + AS_API alphaskia_string_t alphaskia_textstyle_get_family_name(alphaskia_textstyle_t textstyle, uint8_t index); + AS_API uint16_t alphaskia_textstyle_get_weight(alphaskia_textstyle_t textstyle); + AS_API uint8_t alphaskia_textstyle_is_italic(alphaskia_textstyle_t textstyle); + AS_API void alphaskia_textstyle_free(alphaskia_textstyle_t textstyle); + typedef AS_API void *alphaskia_image_t; AS_API int32_t alphaskia_image_get_width(alphaskia_image_t image); AS_API int32_t alphaskia_image_get_height(alphaskia_image_t image); @@ -92,9 +100,9 @@ extern "C" alphaskia_text_baseline_middle = 2, alphaskia_text_baseline_bottom = 3 } alphaskia_text_baseline_t; - AS_API void alphaskia_canvas_fill_text(alphaskia_canvas_t canvas, const char16_t *text, int text_length, alphaskia_typeface_t typeface, float font_size, float x, float y, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline); + AS_API void alphaskia_canvas_fill_text(alphaskia_canvas_t canvas, const char16_t *text, int text_length, alphaskia_textstyle_t textstyle, float font_size, float x, float y, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline); - AS_API float alphaskia_canvas_measure_text(alphaskia_canvas_t canvas, const char16_t *text, int text_length, alphaskia_typeface_t typeface, float font_size); + AS_API float alphaskia_canvas_measure_text(alphaskia_canvas_t canvas, const char16_t *text, int text_length, alphaskia_textstyle_t textstyle, float font_size); AS_API void alphaskia_canvas_begin_rotate(alphaskia_canvas_t canvas, float center_x, float center_y, float angle); AS_API void alphaskia_canvas_end_rotate(alphaskia_canvas_t canvas); } \ No newline at end of file diff --git a/wrapper/src/AlphaSkiaCanvas.cpp b/wrapper/src/AlphaSkiaCanvas.cpp index bcfcca4..3b274a8 100644 --- a/wrapper/src/AlphaSkiaCanvas.cpp +++ b/wrapper/src/AlphaSkiaCanvas.cpp @@ -1,4 +1,5 @@ #include "../include/AlphaSkiaCanvas.h" +#include "../include/SkFontMgr_alphaskia.h" #include "../../externals/skia/include/core/SkData.h" #include "../../externals/skia/include/core/SkPaint.h" @@ -10,9 +11,8 @@ #include "../../externals/skia/include/core/SkFontMetrics.h" #include "../../externals/skia/include/core/SkTextBlob.h" #include "../../externals/skia/include/core/SkRefCnt.h" - -#include "../../externals/skia/third_party/externals/harfbuzz/src/hb.h" -#include "../../externals/skia/third_party/externals/harfbuzz/src/hb-ot.h" +#include "../../externals/skia/modules/skparagraph/include/FontCollection.h" +#include "../../externals/skia/modules/skparagraph/include/ParagraphBuilder.h" #include #include @@ -22,6 +22,8 @@ AlphaSkiaCanvas::AlphaSkiaCanvas() : color_(SK_ColorWHITE), line_width_(1.0f) { + font_collection_ = sk_make_sp(); + font_collection_->setDefaultFontManager(SkFontMgr_AlphaSkia::instance()); } SkPaint AlphaSkiaCanvas::create_paint() @@ -53,11 +55,14 @@ void AlphaSkiaCanvas::set_line_width(float line_width) void AlphaSkiaCanvas::begin_render(int32_t width, int32_t height, float render_scale) { + SkSurfaceProps props(0, kRGB_H_SkPixelGeometry); + surface_ = SkSurfaces::Raster(SkImageInfo::Make( - width * render_scale, - height * render_scale, - kN32_SkColorType, - kPremul_SkAlphaType)); + width * render_scale, + height * render_scale, + kN32_SkColorType, + kPremul_SkAlphaType), + &props); surface_->getCanvas()->scale(render_scale, render_scale); path_.transform(SkMatrix::Scale(1 / render_scale, 1 / render_scale)); @@ -149,45 +154,76 @@ void AlphaSkiaCanvas::stroke() path_.reset(); } -void AlphaSkiaCanvas::fill_text(const char16_t *text, int text_length, sk_sp type_face, float font_size, float x, float y, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline) +std::unique_ptr AlphaSkiaCanvas::build_paragraph(const char16_t *text, int text_length, const AlphaSkiaTextStyle &textstyle, float font_size, alphaskia_text_align_t text_align) { - sk_sp realBlob; - SkFont font(type_face, font_size); + skia::textlayout::TextStyle style; + + SkPaint foregroundColor; + foregroundColor.setColor(color_); + style.setForegroundColor(foregroundColor); - float width(0); - text_run(text, text_length, font, realBlob, width); + style.setFontFamilies(std::vector(textstyle.get_family_names())); + style.setFontStyle(textstyle.get_font_style()); + style.setFontSize(font_size); + + skia::textlayout::ParagraphStyle paraStyle; + paraStyle.setTextHeightBehavior(skia::textlayout::TextHeightBehavior::kDisableAll); + paraStyle.setTextStyle(style); switch (text_align) { case alphaskia_text_align_left: + paraStyle.setTextAlign(skia::textlayout::TextAlign::kLeft); break; case alphaskia_text_align_center: - x -= width / 2; + paraStyle.setTextAlign(skia::textlayout::TextAlign::kCenter); break; case alphaskia_text_align_right: - x -= width; + paraStyle.setTextAlign(skia::textlayout::TextAlign::kRight); break; } - y += get_font_baseline(font, baseline); + auto builder = skia::textlayout::ParagraphBuilder::make(paraStyle, font_collection_); + builder->addText(text); + + return builder->Build(); +} + +void AlphaSkiaCanvas::fill_text(const char16_t *text, int text_length, const AlphaSkiaTextStyle &textstyle, float font_size, float x, float y, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline) +{ + auto paragraph(build_paragraph(text, text_length, textstyle, font_size, text_align)); + + // layout with enough space for our text to definitely fit + const float layoutWidth = surface_->width() * 2; + paragraph->layout(surface_->width() * 2); - if (realBlob) + // NOTE: SkParagraph has no support for font/line specific baselines, first font is better than nothing + y += get_font_baseline(paragraph->getFontAt(0), baseline); + + switch (text_align) { - SkPaint paint(create_paint()); - paint.setStyle(SkPaint::kFill_Style); - surface_->getCanvas()->drawTextBlob(realBlob, x, - y, - paint); + case alphaskia_text_align_left: + // doesn't matter + break; + case alphaskia_text_align_center: + x -= layoutWidth / 2; + break; + case alphaskia_text_align_right: + // text is aligned at layoutWidth, shift it left + x -= layoutWidth; + break; } + + paragraph->paint(surface_->getCanvas(), x, y); } -float AlphaSkiaCanvas::measure_text(const char16_t *text, int text_length, sk_sp type_face, float font_size) +float AlphaSkiaCanvas::measure_text(const char16_t *text, int text_length, const AlphaSkiaTextStyle &textstyle, float font_size) { - sk_sp realBlob; - SkFont font(type_face, font_size); - float width(0); - text_run(text, text_length, font, realBlob, width); - return width; + auto paragraph(build_paragraph(text, text_length, textstyle, font_size, alphaskia_text_align_t::alphaskia_text_align_left)); + + paragraph->layout(10000); + + return static_cast(paragraph->getMaxIntrinsicWidth()); } void AlphaSkiaCanvas::begin_rotate(float center_x, float center_y, float angle) @@ -202,144 +238,10 @@ void AlphaSkiaCanvas::end_rotate() surface_->getCanvas()->restore(); } -using HBBlob = std::unique_ptr>; -using HBFace = std::unique_ptr>; -using HBFont = std::unique_ptr>; -using HBBuffer = std::unique_ptr>; - -const int SkiaToHarfBuzzFontSize = 1 << 16; -const float HarfBuzzToSkiaFontSize = 1.0f / SkiaToHarfBuzzFontSize; - -hb_blob_t* skhb_get_table(hb_face_t* face, hb_tag_t tag, void* user_data) -{ - SkTypeface& typeface = *reinterpret_cast(user_data); - - auto data = typeface.copyTableData(tag); - if (!data) - { - return nullptr; - } - SkData* rawData = data.release(); - return hb_blob_create(reinterpret_cast(rawData->writable_data()), rawData->size(), - HB_MEMORY_MODE_READONLY, rawData, [](void* ctx) { - SkSafeUnref(((SkData*)ctx)); - }); -} - - -HBFont make_harfbuzz_font(const SkFont &font) -{ - int index = 0; - std::unique_ptr typefaceAsset = font.getTypeface()->openExistingStream(&index); - - HBFace hbFace; - - if (typefaceAsset) - { - size_t size = typefaceAsset->getLength(); - - HBBlob blob; - if (const void *base = typefaceAsset->getMemoryBase()) - { - blob.reset(hb_blob_create((char *)base, SkToUInt(size), - HB_MEMORY_MODE_READONLY, typefaceAsset.release(), - [](void *p) - { delete (SkStreamAsset *)p; })); - } - else - { - void *ptr = size ? sk_malloc_throw(size) : nullptr; - typefaceAsset->read(ptr, size); - blob.reset(hb_blob_create((char *)ptr, SkToUInt(size), - HB_MEMORY_MODE_READONLY, ptr, sk_free)); - } - hb_blob_make_immutable(blob.get()); - - hbFace.reset(hb_face_create(blob.get(), index)); - hb_face_set_index(hbFace.get(), index); - hb_face_set_upem(hbFace.get(), font.getTypeface()->getUnitsPerEm()); - } - - - if(!hbFace) - { - hbFace.reset(hb_face_create_for_tables( - skhb_get_table, - const_cast(SkRef(font.getTypeface())), - [](void* user_data){ SkSafeUnref(reinterpret_cast(user_data)); })); - - if(hbFace) - { - hb_face_set_index(hbFace.get(), (unsigned)index); - hb_face_set_upem(hbFace.get(), font.getTypeface()->getUnitsPerEm()); - } - } - - if(!hbFace) - { - return HBFont(); - } - - HBFont hbFont(hb_font_create(hbFace.get())); - float scale = font.getSize() * SkiaToHarfBuzzFontSize; - hb_font_set_scale(hbFont.get(), scale, scale); - hb_ot_font_set_funcs(hbFont.get()); - return hbFont; -} - -void AlphaSkiaCanvas::text_run(const char16_t *text, - int text_length, - SkFont &font, - sk_sp &realBlob, - float &width) +void AlphaSkiaCanvas::draw_image(sk_sp image, float x, float y, float w, float h) { - font.setEdging(SkFont::Edging::kAntiAlias); - font.setSubpixel(true); - font.setHinting(SkFontHinting::kNormal); - - HBFont harfBuzzFont(make_harfbuzz_font(font)); - - SkTextBlobBuilder builder; - if(!harfBuzzFont) - { - auto runBuffer = builder.allocRunPos(font, 0); - realBlob = builder.make(); - width = 0.0f; - return; - } - - HBBuffer buffer(hb_buffer_create()); - hb_buffer_set_direction(buffer.get(), HB_DIRECTION_LTR); - hb_buffer_set_language(buffer.get(), hb_language_get_default()); - hb_buffer_add_utf16(buffer.get(), reinterpret_cast(text), text_length, 0, -1); - - hb_shape(harfBuzzFont.get(), buffer.get(), nullptr, 0); - - uint32_t infosLength(0); - hb_glyph_info_t *infos = hb_buffer_get_glyph_infos(buffer.get(), - &infosLength); - uint32_t positionsLength(0); - hb_glyph_position_t *positions = hb_buffer_get_glyph_positions(buffer.get(), - &positionsLength); - - auto runBuffer = builder.allocRunPos(font, infosLength); - - auto glyphSpan = runBuffer.glyphs; - auto positionSpan = runBuffer.points(); - - width = 0.0f; - for (uint32_t i = 0; i < infosLength; i++) - { - glyphSpan[i] = (SkGlyphID)infos[i].codepoint; - - auto xOffset = width + HarfBuzzToSkiaFontSize * positions[i].x_offset; - auto yOffset = HarfBuzzToSkiaFontSize * -positions[i].y_offset; - positionSpan[i] = {xOffset, yOffset}; - - width += HarfBuzzToSkiaFontSize * positions[i].x_advance; - } - - realBlob = builder.make(); + SkSamplingOptions sampling; + surface_->getCanvas()->drawImageRect(image, SkRect::MakeXYWH(x, y, w, h), sampling); } float float_ascent(const SkFontMetrics &metrics) @@ -372,22 +274,22 @@ std::pair typo_ascender_and_descender(SkTypeface *typeface) return std::make_pair(0, 0); } -const uint32_t AlphaSkiaCanvas::layoutUnitFractionalBits_ = 6; -const int AlphaSkiaCanvas::fixedPointDenominator_ = 1 << layoutUnitFractionalBits_; +const uint32_t layoutUnitFractionalBits_ = 6; +const int fixedPointDenominator_ = 1 << layoutUnitFractionalBits_; -int AlphaSkiaCanvas::float_to_layout_unit(float value) +int float_to_layout_unit(float value) { // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/geometry/layout_unit.h;l=147;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1?q=FromFloatRound&ss=chromium%2Fchromium%2Fsrc return static_cast(roundf(value * fixedPointDenominator_)); } -float AlphaSkiaCanvas::layout_unit_to_float(int value) +float layout_unit_to_float(int value) { // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/geometry/layout_unit.h;l=147;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1?q=FromFloatRound&sq=&ss=chromium%2Fchromium%2Fsrc return static_cast(roundf(value * kFixedPointDenominator)) return static_cast(value) / fixedPointDenominator_; } -bool AlphaSkiaCanvas::try_set_normalized_typo_ascent_and_descent(float em_height, float typo_ascent, float typo_descent, int &ascent, int &descent) +bool try_set_normalized_typo_ascent_and_descent(float em_height, float typo_ascent, float typo_descent, int &ascent, int &descent) { // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/simple_font_data.cc;l=422;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1?q=NormalizedTypoAscentAndDescent&ss=chromium%2Fchromium%2Fsrc const float height = typo_ascent + typo_descent; @@ -401,7 +303,7 @@ bool AlphaSkiaCanvas::try_set_normalized_typo_ascent_and_descent(float em_height return true; } -void AlphaSkiaCanvas::normalized_typo_ascent_and_descent(const SkFont &font, int &ascent, int &descent) +void normalized_typo_ascent_and_descent(const SkFont &font, int &ascent, int &descent) { // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/simple_font_data.cc;l=366;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1?q=NormalizedTypoAscentAndDescent&ss=chromium%2Fchromium%2Fsrc SkTypeface *typeface = font.getTypeface(); @@ -428,34 +330,37 @@ float AlphaSkiaCanvas::get_font_baseline(const SkFont &font, alphaskia_text_base SkFontMetrics metrics; font.getMetrics(&metrics); + float baselineOffset = 0; int ascent(0); int descent(0); switch (baseline) { case alphaskia_text_baseline_alphabetic: // kAlphabeticTextBaseline - return 0; + baselineOffset = 0; + break; case alphaskia_text_baseline_top: // kHangingTextBaseline #define kHangingAsPercentOfAscent 80 - return float_ascent(metrics) * kHangingAsPercentOfAscent / 100.0f; + baselineOffset = float_ascent(metrics) * kHangingAsPercentOfAscent / 100.0f; break; case alphaskia_text_baseline_middle: // kMiddleTextBaseline { normalized_typo_ascent_and_descent(font, ascent, descent); auto middle = (layout_unit_to_float(ascent) - layout_unit_to_float(descent)) / 2.0f; - return middle; + baselineOffset = middle; + break; } case alphaskia_text_baseline_bottom: // kBottomTextBaseline normalized_typo_ascent_and_descent(font, ascent, descent); - return -layout_unit_to_float(descent); + baselineOffset = -layout_unit_to_float(descent); break; } - return 0; -} + // SkParagraph defines its baseline() as (fLeading / 2 - fAscent) + // see: Run.h -> InternalLineMetrics::baseline() + // we reset this here + const float skParagraphBaseline = metrics.fLeading / 2 + float_ascent(metrics); + baselineOffset -= skParagraphBaseline; -void AlphaSkiaCanvas::draw_image(sk_sp image, float x, float y, float w, float h) -{ - SkSamplingOptions sampling; - surface_->getCanvas()->drawImageRect(image, SkRect::MakeXYWH(x, y, w, h), sampling); + return baselineOffset; } \ No newline at end of file diff --git a/wrapper/src/SkFontMgr_alphaskia.cpp b/wrapper/src/SkFontMgr_alphaskia.cpp index adb989a..76a1a98 100644 --- a/wrapper/src/SkFontMgr_alphaskia.cpp +++ b/wrapper/src/SkFontMgr_alphaskia.cpp @@ -5,6 +5,7 @@ #include "../../externals/skia/include/core/SkTypeface.h" #include "../../externals/skia/include/core/SkStream.h" #include "../../externals/skia/include/ports/SkFontMgr_data.h" +#include "../../externals/skia/src/ports/SkFontMgr_custom.h" #if defined(ALPHASKIA_FONTMGR_WINDOWS) #include "../../externals/skia/include/ports/SkTypeface_win.h" @@ -39,11 +40,13 @@ SkFontMgr_AlphaSkia::SkFontMgr_AlphaSkia() { operatingSystemTypeFontMgr_ = CREATE_OPERATING_SYSTEM_FONTMGR; currentFontMgr_ = operatingSystemTypeFontMgr_; + currentFontMgrFontStyleSets_ = &operatingSystemFontStyleSets_; } void SkFontMgr_AlphaSkia::switch_to_operating_system_fonts() { currentFontMgr_ = operatingSystemTypeFontMgr_; + currentFontMgrFontStyleSets_ = &operatingSystemFontStyleSets_; } void SkFontMgr_AlphaSkia::switch_to_freetype_fonts() @@ -53,6 +56,7 @@ void SkFontMgr_AlphaSkia::switch_to_freetype_fonts() freeTypeFontMgr_ = SkFontMgr_New_Custom_Data(SkSpan>(nullptr, 0)); } currentFontMgr_ = freeTypeFontMgr_; + currentFontMgrFontStyleSets_ = &freeTypeFontStyleSets_; } int SkFontMgr_AlphaSkia::onCountFamilies() const @@ -64,6 +68,7 @@ void SkFontMgr_AlphaSkia::onGetFamilyName(int index, SkString *familyName) const { currentFontMgr_->getFamilyName(index, familyName); } + sk_sp SkFontMgr_AlphaSkia::onCreateStyleSet(int index) const { return currentFontMgr_->createStyleSet(index); @@ -71,25 +76,60 @@ sk_sp SkFontMgr_AlphaSkia::onCreateStyleSet(int index) const sk_sp SkFontMgr_AlphaSkia::onMatchFamily(const char familyName[]) const { - return currentFontMgr_->matchFamily(familyName); + // custom matching with loaded fonts (underlying manager sometimes doesn't lookup newly loaded fonts, skia isn't that dynamic) + auto it = currentFontMgrFontStyleSets_->find(SkString(familyName)); + if (it) + { + return *it; + } + + auto styleSet = currentFontMgr_->matchFamily(familyName); + if (styleSet) + { + return styleSet; + } + + return nullptr; } sk_sp SkFontMgr_AlphaSkia::onMatchFamilyStyle(const char familyName[], const SkFontStyle &fontStyle) const { - return currentFontMgr_->matchFamilyStyle(familyName, fontStyle); + // custom matching with loaded fonts (underlying manager sometimes doesn't lookup newly loaded fonts, skia isn't that dynamic) + auto it = currentFontMgrFontStyleSets_->find(SkString(familyName)); + if (it) + { + return (*it)->matchStyle(fontStyle); + } + + auto typeface = currentFontMgr_->matchFamilyStyle(familyName, fontStyle); + if (typeface) + { + return typeface; + } + + return nullptr; } sk_sp SkFontMgr_AlphaSkia::onMatchFamilyStyleCharacter(const char familyName[], const SkFontStyle &style, const char *bcp47[], int bcp47Count, SkUnichar character) const { - return currentFontMgr_->matchFamilyStyleCharacter(familyName, style, bcp47, bcp47Count, character); + auto typeface = currentFontMgr_->matchFamilyStyleCharacter(familyName, style, bcp47, bcp47Count, character); + if (typeface) + { + return typeface; + } + + // better than nothing? lets match by style and hope for the best + return onMatchFamilyStyle(familyName, style); } sk_sp SkFontMgr_AlphaSkia::onMakeFromData(sk_sp data, int ttcIndex) const { - return currentFontMgr_->makeFromData(data, ttcIndex); + auto typeface = currentFontMgr_->makeFromData(data, ttcIndex); + registerTypeface(typeface); + return typeface; } sk_sp SkFontMgr_AlphaSkia::onMakeFromStreamIndex(std::unique_ptr stream, int ttcIndex) const @@ -98,7 +138,9 @@ sk_sp SkFontMgr_AlphaSkia::onMakeFromStreamIndex(std::unique_ptrmakeFromStream(std::move(stream), ttcIndex); + auto typeface = currentFontMgr_->makeFromStream(std::move(stream), ttcIndex); + registerTypeface(typeface); + return typeface; } sk_sp SkFontMgr_AlphaSkia::onMakeFromStreamArgs(std::unique_ptr stream, const SkFontArguments &args) const @@ -107,15 +149,39 @@ sk_sp SkFontMgr_AlphaSkia::onMakeFromStreamArgs(std::unique_ptrmakeFromStream(std::move(stream), args); + auto typeface = currentFontMgr_->makeFromStream(std::move(stream), args); + registerTypeface(typeface); + return typeface; } sk_sp SkFontMgr_AlphaSkia::onMakeFromFile(const char path[], int ttcIndex) const { - return currentFontMgr_->makeFromFile(path, ttcIndex); + auto typeface = currentFontMgr_->makeFromFile(path, ttcIndex); + registerTypeface(typeface); + return typeface; } sk_sp SkFontMgr_AlphaSkia::onLegacyMakeTypeface(const char familyName[], SkFontStyle style) const { - return currentFontMgr_->legacyMakeTypeface(familyName, style); + auto typeface = currentFontMgr_->legacyMakeTypeface(familyName, style); + registerTypeface(typeface); + return typeface; +} + +void SkFontMgr_AlphaSkia::registerTypeface(const sk_sp &typeface) const +{ + SkString familyName; + typeface->getFamilyName(&familyName); + + auto it = currentFontMgrFontStyleSets_->find(familyName); + if (it) + { + (*it)->appendTypeface(typeface); + } + else + { + auto newFamily = sk_sp(new SkFontStyleSet_Custom(familyName)); + newFamily->appendTypeface(typeface); + currentFontMgrFontStyleSets_->set(familyName, newFamily); + } } \ No newline at end of file diff --git a/wrapper/src/alphaskia_canvas.cpp b/wrapper/src/alphaskia_canvas.cpp index 85d90b6..cbb0df3 100644 --- a/wrapper/src/alphaskia_canvas.cpp +++ b/wrapper/src/alphaskia_canvas.cpp @@ -130,16 +130,16 @@ extern "C" reinterpret_cast(canvas)->stroke(); } - AS_API void alphaskia_canvas_fill_text(alphaskia_canvas_t canvas, const char16_t *text, int text_length, alphaskia_typeface_t typeface, float font_size, float x, float y, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline) + AS_API void alphaskia_canvas_fill_text(alphaskia_canvas_t canvas, const char16_t *text, int text_length, alphaskia_textstyle_t textstyle, float font_size, float x, float y, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline) { - sk_sp *skTypeface = reinterpret_cast *>(typeface); - reinterpret_cast(canvas)->fill_text(text, text_length, *skTypeface, font_size, x, y, text_align, baseline); + AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(textstyle); + reinterpret_cast(canvas)->fill_text(text, text_length, *skTextstyle, font_size, x, y, text_align, baseline); } - AS_API float alphaskia_canvas_measure_text(alphaskia_canvas_t canvas, const char16_t *text, int text_length, alphaskia_typeface_t typeface, float font_size) + AS_API float alphaskia_canvas_measure_text(alphaskia_canvas_t canvas, const char16_t *text, int text_length, alphaskia_textstyle_t textstyle, float font_size) { - sk_sp *skTypeface = reinterpret_cast *>(typeface); - return reinterpret_cast(canvas)->measure_text(text, text_length, *skTypeface, font_size); + AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(textstyle); + return reinterpret_cast(canvas)->measure_text(text, text_length, *skTextstyle, font_size); } AS_API void alphaskia_canvas_begin_rotate(alphaskia_canvas_t canvas, float center_x, float center_y, float angle) diff --git a/wrapper/src/alphaskia_textstyle.cpp b/wrapper/src/alphaskia_textstyle.cpp new file mode 100644 index 0000000..487face --- /dev/null +++ b/wrapper/src/alphaskia_textstyle.cpp @@ -0,0 +1,83 @@ +#include "../include/alphaskia.h" +#include "../include/AlphaSkiaCanvas.h" + +extern "C" +{ + AS_API alphaskia_textstyle_t alphaskia_textstyle_new(uint8_t family_name_count, const char **family_names, uint16_t weight, uint8_t italic) + { + SkFontStyle::Weight skWeight; + switch (weight) + { + case SkFontStyle::Weight::kInvisible_Weight: + case SkFontStyle::Weight::kThin_Weight: + case SkFontStyle::Weight::kExtraLight_Weight: + case SkFontStyle::Weight::kLight_Weight: + case SkFontStyle::Weight::kNormal_Weight: + case SkFontStyle::Weight::kMedium_Weight: + case SkFontStyle::Weight::kSemiBold_Weight: + case SkFontStyle::Weight::kBold_Weight: + case SkFontStyle::Weight::kExtraBold_Weight: + case SkFontStyle::Weight::kBlack_Weight: + case SkFontStyle::Weight::kExtraBlack_Weight: + skWeight = static_cast(weight); + break; + default: + skWeight = SkFontStyle::Weight::kNormal_Weight; + break; + } + + AlphaSkiaTextStyle *skTextStyle(new AlphaSkiaTextStyle( + skWeight, + italic ? SkFontStyle::Slant::kItalic_Slant : SkFontStyle::Slant::kUpright_Slant, + family_name_count)); + + for (int i = 0; i < family_name_count; i++) + { + skTextStyle->get_family_names().emplace_back(SkString(family_names[i])); + } + + return reinterpret_cast(skTextStyle); + } + + AS_API uint8_t alphaskia_textstyle_get_family_name_count(alphaskia_textstyle_t textstyle) + { + AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(textstyle); + return static_cast(skTextstyle->get_family_names().size()); + } + + AS_API alphaskia_string_t alphaskia_textstyle_get_family_name(alphaskia_textstyle_t textstyle, uint8_t index) + { + AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(textstyle); + + if (index >= skTextstyle->get_family_names().size()) + { + return nullptr; + } + + SkString *skFamilyName = new SkString(skTextstyle->get_family_names()[index]); + return reinterpret_cast(skFamilyName); + } + + AS_API uint16_t alphaskia_textstyle_get_weight(alphaskia_textstyle_t textstyle) + { + AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(textstyle); + return static_cast(skTextstyle->get_font_style().weight()); + } + + AS_API uint8_t alphaskia_textstyle_is_italic(alphaskia_textstyle_t textstyle) + { + AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(textstyle); + return skTextstyle->get_font_style().slant() == SkFontStyle::Slant::kItalic_Slant ? 1 : 0; + } + + AS_API void alphaskia_textstyle_free(alphaskia_textstyle_t textstyle) + { + if (!textstyle) + { + return; + } + + AlphaSkiaTextStyle *skTextStyle = reinterpret_cast(textstyle); + delete skTextStyle; + } +} \ No newline at end of file diff --git a/wrapper/src/alphaskia_typeface.cpp b/wrapper/src/alphaskia_typeface.cpp index d40c7a5..a8d2245 100644 --- a/wrapper/src/alphaskia_typeface.cpp +++ b/wrapper/src/alphaskia_typeface.cpp @@ -2,6 +2,7 @@ #include "../include/SkFontMgr_alphaskia.h" #include "../../externals/skia/include/core/SkTypeface.h" #include "../../externals/skia/include/core/SkData.h" +#include "../../externals/skia/include/core/SkFontMgr.h" extern "C" { @@ -14,7 +15,6 @@ extern "C" { return nullptr; } - return reinterpret_cast(new sk_sp(skTypeface)); } @@ -29,11 +29,11 @@ extern "C" delete skTypeface; } - AS_API alphaskia_typeface_t alphaskia_typeface_make_from_name(const char *family_name, uint8_t bold, uint8_t italic) + AS_API alphaskia_typeface_t alphaskia_typeface_make_from_name(const char *family_name, uint16_t weight, uint8_t italic) { auto fontMgr = SkFontMgr_AlphaSkia::instance(); - SkFontStyle style(bold ? SkFontStyle::kBold_Weight : SkFontStyle::kNormal_Weight, + SkFontStyle style(weight, SkFontStyle::kNormal_Width, italic ? SkFontStyle::kItalic_Slant : SkFontStyle::kUpright_Slant); sk_sp skTypeface = fontMgr->legacyMakeTypeface(family_name, style); @@ -56,10 +56,10 @@ extern "C" return reinterpret_cast(skFamilyName); } - AS_API uint8_t alphaskia_typeface_is_bold(alphaskia_typeface_t typeface) + AS_API uint16_t alphaskia_typeface_get_weight(alphaskia_typeface_t typeface) { sk_sp *skTypeface = reinterpret_cast *>(typeface); - return (*skTypeface)->isBold() ? 1 : 0; + return static_cast((*skTypeface)->fontStyle().weight()); } AS_API uint8_t alphaskia_typeface_is_italic(alphaskia_typeface_t typeface)