diff --git a/assets/branding/lasalle-mascot-provider.png b/assets/branding/lasalle-mascot-provider.png new file mode 100644 index 0000000..5a9c26c Binary files /dev/null and b/assets/branding/lasalle-mascot-provider.png differ diff --git a/src/SGU.CredentialProvider/ProviderTileIcon.cs b/src/SGU.CredentialProvider/ProviderTileIcon.cs index bb58066..5153571 100644 --- a/src/SGU.CredentialProvider/ProviderTileIcon.cs +++ b/src/SGU.CredentialProvider/ProviderTileIcon.cs @@ -1,35 +1,30 @@ using System.Drawing; -using System.Drawing.Drawing2D; using System.Drawing.Imaging; +using System.Drawing.Drawing2D; namespace SGU.CredentialProvider; internal static class ProviderTileIcon { public const int Size = 72; + private const string MascotResourceName = "SGU.CredentialProvider.Branding.LaSalleMascot.png"; public static Bitmap Create() { Bitmap bitmap = new(Size, Size, PixelFormat.Format32bppArgb); using Graphics graphics = Graphics.FromImage(bitmap); - graphics.SmoothingMode = SmoothingMode.AntiAlias; + graphics.CompositingQuality = CompositingQuality.HighQuality; + graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; graphics.Clear(Color.Transparent); - using SolidBrush background = new(Color.FromArgb(0, 83, 155)); - graphics.FillEllipse(background, 1, 1, Size - 2, Size - 2); - - using Pen key = new(Color.White, 5.5f) - { - StartCap = LineCap.Round, - EndCap = LineCap.Round, - LineJoin = LineJoin.Round - }; - - graphics.DrawEllipse(key, 14, 14, 25, 25); - graphics.DrawLine(key, 35, 35, 57, 57); - graphics.DrawLine(key, 47, 47, 55, 39); - graphics.DrawLine(key, 53, 53, 61, 45); + using Stream sourceStream = typeof(ProviderTileIcon).Assembly.GetManifestResourceStream(MascotResourceName) + ?? throw new InvalidOperationException($"The branded Credential Provider logo '{MascotResourceName}' is unavailable."); + using Bitmap mascot = new(sourceStream); + using GraphicsPath circularMask = new(); + circularMask.AddEllipse(0, 0, Size, Size); + graphics.SetClip(circularMask); + graphics.DrawImage(mascot, new Rectangle(0, 0, Size, Size)); return bitmap; } diff --git a/src/SGU.CredentialProvider/SGU.CredentialProvider.csproj b/src/SGU.CredentialProvider/SGU.CredentialProvider.csproj index 29bc647..4da34d1 100644 --- a/src/SGU.CredentialProvider/SGU.CredentialProvider.csproj +++ b/src/SGU.CredentialProvider/SGU.CredentialProvider.csproj @@ -23,6 +23,11 @@ + + + + <_Parameter1>SGU.CredentialProvider.Tests diff --git a/tests/SGU.CredentialProvider.Tests/ProviderTileIconTests.cs b/tests/SGU.CredentialProvider.Tests/ProviderTileIconTests.cs index aad5126..7810e6a 100644 --- a/tests/SGU.CredentialProvider.Tests/ProviderTileIconTests.cs +++ b/tests/SGU.CredentialProvider.Tests/ProviderTileIconTests.cs @@ -20,22 +20,27 @@ public sealed class ProviderTileIconTests Assert.Equal(0, logo.Bitmap.GetPixel(ProviderTileIcon.Size - 1, 0).A); Assert.Equal(0, logo.Bitmap.GetPixel(0, ProviderTileIcon.Size - 1).A); Assert.Equal(0, logo.Bitmap.GetPixel(ProviderTileIcon.Size - 1, ProviderTileIcon.Size - 1).A); - Assert.Equal( - Color.FromArgb(0, 83, 155).ToArgb(), - logo.Bitmap.GetPixel(6, ProviderTileIcon.Size / 2).ToArgb()); - int lightPixels = 0; + int redPixels = 0; + int navyPixels = 0; for (int x = 0; x < logo.Bitmap.Width; x++) { for (int y = 0; y < logo.Bitmap.Height; y++) { - if (logo.Bitmap.GetPixel(x, y).GetBrightness() > 0.7f) + Color pixel = logo.Bitmap.GetPixel(x, y); + if (pixel.R > 160 && pixel.G < 100 && pixel.B < 100) { - lightPixels++; + redPixels++; + } + + if (pixel.B > pixel.R && pixel.B > pixel.G && pixel.R < 70) + { + navyPixels++; } } } - Assert.InRange(lightPixels, 200, 2_000); + Assert.InRange(redPixels, 100, 2_000); + Assert.InRange(navyPixels, 100, 4_000); } [Fact]