From 2a9aca302485bc08f5b2dd2a54987de6f80fc338 Mon Sep 17 00:00:00 2001 From: Ariel Costas Guerrero Date: Fri, 19 Dec 2025 13:06:27 +0100 Subject: Implement loading stops as tiles from OTP --- .../Helpers/ContrastHelper.cs | 48 ++++++++++++++++++++++ .../Helpers/SortingHelper.cs | 35 ++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 src/Costasdev.Busurbano.Backend/Helpers/ContrastHelper.cs create mode 100644 src/Costasdev.Busurbano.Backend/Helpers/SortingHelper.cs (limited to 'src/Costasdev.Busurbano.Backend/Helpers') diff --git a/src/Costasdev.Busurbano.Backend/Helpers/ContrastHelper.cs b/src/Costasdev.Busurbano.Backend/Helpers/ContrastHelper.cs new file mode 100644 index 0000000..e48660b --- /dev/null +++ b/src/Costasdev.Busurbano.Backend/Helpers/ContrastHelper.cs @@ -0,0 +1,48 @@ +namespace Costasdev.Busurbano.Backend.Helpers; + +using System; +using System.Globalization; + +public static class ContrastHelper +{ + public static string GetBestTextColour(string backgroundHex) + { + // Strip # + backgroundHex = backgroundHex.TrimStart('#'); + + if (backgroundHex.Length != 6) + throw new ArgumentException("Hex colour must be 6 characters (RRGGBB)"); + + // Parse RGB + int r = int.Parse(backgroundHex.Substring(0, 2), NumberStyles.HexNumber); + int g = int.Parse(backgroundHex.Substring(2, 2), NumberStyles.HexNumber); + int b = int.Parse(backgroundHex.Substring(4, 2), NumberStyles.HexNumber); + + // Convert to relative luminance + double luminance = GetRelativeLuminance(r, g, b); + + // Contrast ratios + double contrastWithWhite = (1.0 + 0.05) / (luminance + 0.05); + double contrastWithBlack = (luminance + 0.05) / 0.05; + + if (contrastWithWhite > 3) + { + return "#FFFFFF"; + } + + return "#000000"; + } + + private static double GetRelativeLuminance(int r, int g, int b) + { + double rs = r / 255.0; + double gs = g / 255.0; + double bs = b / 255.0; + + rs = rs <= 0.03928 ? rs / 12.92 : Math.Pow((rs + 0.055) / 1.055, 2.4); + gs = gs <= 0.03928 ? gs / 12.92 : Math.Pow((gs + 0.055) / 1.055, 2.4); + bs = bs <= 0.03928 ? bs / 12.92 : Math.Pow((bs + 0.055) / 1.055, 2.4); + + return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs; + } +} diff --git a/src/Costasdev.Busurbano.Backend/Helpers/SortingHelper.cs b/src/Costasdev.Busurbano.Backend/Helpers/SortingHelper.cs new file mode 100644 index 0000000..472a56f --- /dev/null +++ b/src/Costasdev.Busurbano.Backend/Helpers/SortingHelper.cs @@ -0,0 +1,35 @@ +namespace Costasdev.Busurbano.Backend.Helpers; + +public class SortingHelper +{ + public static int SortRouteShortNames(string? a, string? b) + { + if (a == null && b == null) return 0; + if (a == null) return 1; + if (b == null) return -1; + + var aDigits = new string(a.Where(char.IsDigit).ToArray()); + var bDigits = new string(b.Where(char.IsDigit).ToArray()); + + bool aHasDigits = int.TryParse(aDigits, out int aNumber); + bool bHasDigits = int.TryParse(bDigits, out int bNumber); + + if (aHasDigits != bHasDigits) + { + // Non-numeric routes (like "A" or "-") go to the beginning + return aHasDigits ? 1 : -1; + } + + if (aHasDigits && bHasDigits) + { + if (aNumber != bNumber) + { + return aNumber.CompareTo(bNumber); + } + } + + // If both are non-numeric, or numeric parts are equal, use alphabetical + return string.Compare(a, b, StringComparison.OrdinalIgnoreCase); + } + +} -- cgit v1.3