diff --git a/src/Captcha.Core/Constants.cs b/src/Captcha.Core/Constants.cs index 50382fe..019d738 100644 --- a/src/Captcha.Core/Constants.cs +++ b/src/Captcha.Core/Constants.cs @@ -10,11 +10,17 @@ public static class Constants public const int DefaultCaptchaHeight = 100; public const float DefaultFrequency = 100F; public const int FrequencyScalingFactor = 40000; // on a 400 x 100 image - public const string DefaultCaptchaFontName = "Captcha.Core.Resources.Fonts.Caveat-SemiBold.ttf"; - public const string DefaultCaptchaFallbackFontName = "Captcha.Core.Resources.Fonts.Unifont.ttf"; public static readonly SKColor DefaultPrimaryColor = SKColor.Parse("FFD3D3D3"); public static readonly SKColor DefaultSecondaryColor = SKColor.Parse("FFFFFFFF"); public const string CaptchaContentType = "image/jpeg"; public const float WarpCaptchaTextFrequency = 4F; public const int CaptchaNoise = 50; + + // According to https://learn.microsoft.com/en-us/dotnet/api/skiasharp.sktypeface, this should be thread-safe + public static SKTypeface MainFontTypeface { get; } = + SKTypeface.FromStream(typeof(Constants).Assembly.GetManifestResourceStream("Captcha.Core.Resources.Fonts.Caveat-SemiBold.ttf")); + + // According to https://learn.microsoft.com/en-us/dotnet/api/skiasharp.sktypeface, this should be thread-safe + public static SKTypeface FallbackFontTypeface { get; } = + SKTypeface.FromStream(typeof(Constants).Assembly.GetManifestResourceStream("Captcha.Core.Resources.Fonts.Unifont.ttf")); } diff --git a/src/Captcha.Core/Services/CaptchaImageService.cs b/src/Captcha.Core/Services/CaptchaImageService.cs index 3d12044..9c19e79 100644 --- a/src/Captcha.Core/Services/CaptchaImageService.cs +++ b/src/Captcha.Core/Services/CaptchaImageService.cs @@ -6,22 +6,6 @@ namespace Captcha.Core.Services; public class CaptchaImageService : ICaptchaImageService { - private readonly SKTypeface _mainFontTypeface; - private readonly SKTypeface _fallbackFontTypeface; - - public CaptchaImageService() - { - var assembly = typeof(CaptchaImageService).Assembly; - - _mainFontTypeface = SKTypeface.FromStream( - assembly.GetManifestResourceStream(Constants.DefaultCaptchaFontName) - ); - - _fallbackFontTypeface = SKTypeface.FromStream( - assembly.GetManifestResourceStream(Constants.DefaultCaptchaFallbackFontName) - ); - } - public SKBitmap CreateCaptchaImage(CaptchaConfigurationData config) { var bitmap = new SKBitmap(new SKImageInfo(config.Width, config.Height)); @@ -89,7 +73,7 @@ private static void DrawWarpedText(CaptchaConfigurationData config, SKFont font, graphics.DrawPath(path, fillPaint); } - private SKFont GetFontThatFitsRectangle(CaptchaConfigurationData config, SKRect rectangle) + private static SKFont GetFontThatFitsRectangle(CaptchaConfigurationData config, SKRect rectangle) { var typeface = GetTypefaceThatCanRenderText(config.Text); @@ -123,16 +107,16 @@ private static void FillInTheBackground(CaptchaConfigurationData config, SKRect graphics.DrawRect(rectangle, paint); } - private SKTypeface GetTypefaceThatCanRenderText(string text) + private static SKTypeface GetTypefaceThatCanRenderText(string text) { - using var mainFont = new SKFont(_mainFontTypeface); + using var mainFont = new SKFont(Constants.MainFontTypeface); if (mainFont.ContainsGlyphs(text)) { - return _mainFontTypeface; + return Constants.MainFontTypeface; } - return _fallbackFontTypeface; + return Constants.FallbackFontTypeface; } /// diff --git a/tests/Captcha.UnitTests/ConstantsTests.cs b/tests/Captcha.UnitTests/ConstantsTests.cs index 7ceb07a..3091888 100644 --- a/tests/Captcha.UnitTests/ConstantsTests.cs +++ b/tests/Captcha.UnitTests/ConstantsTests.cs @@ -22,12 +22,6 @@ public class ConstantsTests [Test] public void DefaultFrequencyShouldBe100() => Assert.That(Constants.DefaultFrequency, Is.EqualTo(100F)); - [Test] - public void DefaultCaptchaFontNameShouldBeCaveat() => Assert.That(Constants.DefaultCaptchaFontName, Is.EqualTo("Captcha.Core.Resources.Fonts.Caveat-SemiBold.ttf")); - - [Test] - public void FallbackCaptchaFontNameShouldBeUnifont() => Assert.That(Constants.DefaultCaptchaFallbackFontName, Is.EqualTo("Captcha.Core.Resources.Fonts.Unifont.ttf")); - [Test] public void DefaultPrimaryColorShouldBeDarkGray() => Assert.That(Constants.DefaultPrimaryColor, Is.EqualTo(SKColor.Parse("FFD3D3D3")));