From 6d5bce02113d8e7d3cb578522c8c302e5e9bbbc1 Mon Sep 17 00:00:00 2001 From: Shane32 Date: Thu, 25 Apr 2024 02:47:14 -0400 Subject: [PATCH 1/5] Clean up ifdefs --- QRCoder.Xaml/XamlQRCode.cs | 5 +- QRCoder/ArtQRCode.cs | 6 +-- QRCoder/Base64QRCode.cs | 6 +-- QRCoder/PayloadGenerator.cs | 10 ++-- QRCoder/PdfByteQRCode.cs | 6 +-- QRCoder/QRCode.cs | 6 +-- QRCoder/QRCodeData.cs | 8 ++-- QRCoder/QRCodeGenerator.cs | 4 -- QRCoder/QRCoder.csproj | 8 ++-- QRCoder/SvgQRCode.cs | 6 +-- QRCoderTests/ArtQRCodeRendererTests.cs | 12 ++--- QRCoderTests/Base64QRCodeRendererTests.cs | 2 +- QRCoderTests/Helpers/CategoryDiscoverer.cs | 4 +- QRCoderTests/Helpers/HelperFunctions.cs | 54 +++++++++++++++------- QRCoderTests/PngByteQRCodeRendererTests.cs | 12 ++--- QRCoderTests/QRCodeRendererTests.cs | 20 ++++---- QRCoderTests/QRCoderTests.csproj | 2 + QRCoderTests/QRGeneratorTests.cs | 7 +-- QRCoderTests/SvgQRCodeRendererTests.cs | 11 ++++- QRCoderTests/XamlQRCodeRendererTests.cs | 4 +- 20 files changed, 105 insertions(+), 88 deletions(-) diff --git a/QRCoder.Xaml/XamlQRCode.cs b/QRCoder.Xaml/XamlQRCode.cs index a049f8bb..832beada 100644 --- a/QRCoder.Xaml/XamlQRCode.cs +++ b/QRCoder.Xaml/XamlQRCode.cs @@ -1,5 +1,4 @@ -#if NETFRAMEWORK || NET5_0_WINDOWS || NET6_0_WINDOWS -using System; +using System; using System.Windows; using System.Windows.Media; using static QRCoder.QRCodeGenerator; @@ -93,5 +92,3 @@ public static DrawingImage GetQRCode(string plainText, int pixelsPerModule, stri } } } - -#endif \ No newline at end of file diff --git a/QRCoder/ArtQRCode.cs b/QRCoder/ArtQRCode.cs index dcdf40d0..af56e658 100644 --- a/QRCoder/ArtQRCode.cs +++ b/QRCoder/ArtQRCode.cs @@ -1,4 +1,4 @@ -#if NETFRAMEWORK || NETSTANDARD2_0 || NET5_0 || NET6_0_WINDOWS +#if SYSTEM_DRAWING using System; using System.Drawing; @@ -9,7 +9,7 @@ // pull request raised to extend library used. namespace QRCoder { -#if NET6_0_WINDOWS +#if NET6_0_OR_GREATER [System.Runtime.Versioning.SupportedOSPlatform("windows")] #endif public class ArtQRCode : AbstractQRCode, IDisposable @@ -258,7 +258,7 @@ public enum BackgroundImageStyle } } -#if NET6_0_WINDOWS +#if NET6_0_OR_GREATER [System.Runtime.Versioning.SupportedOSPlatform("windows")] #endif public static class ArtQRCodeHelper diff --git a/QRCoder/Base64QRCode.cs b/QRCoder/Base64QRCode.cs index 0c9d119d..bba6e9bc 100644 --- a/QRCoder/Base64QRCode.cs +++ b/QRCoder/Base64QRCode.cs @@ -62,7 +62,7 @@ public string GetGraphic(int pixelsPerModule, Color darkColor, Color lightColor, return Convert.ToBase64String(pngData, Base64FormattingOptions.None); } -#if NETFRAMEWORK || NETSTANDARD2_0 || NET5_0 || NET6_0_WINDOWS +#if SYSTEM_DRAWING #pragma warning disable CA1416 // Validate platform compatibility var qr = new QRCode(QrCodeData); var base64 = string.Empty; @@ -77,7 +77,7 @@ public string GetGraphic(int pixelsPerModule, Color darkColor, Color lightColor, #endif } -#if NETFRAMEWORK || NETSTANDARD2_0 || NET5_0 || NET6_0_WINDOWS +#if SYSTEM_DRAWING #if NET6_0_OR_GREATER [System.Runtime.Versioning.SupportedOSPlatform("windows")] #endif @@ -93,7 +93,7 @@ public string GetGraphic(int pixelsPerModule, Color darkColor, Color lightColor, } #endif -#if NETFRAMEWORK || NETSTANDARD2_0 || NET5_0 || NET6_0_WINDOWS +#if SYSTEM_DRAWING #if NET6_0_OR_GREATER [System.Runtime.Versioning.SupportedOSPlatform("windows")] #endif diff --git a/QRCoder/PayloadGenerator.cs b/QRCoder/PayloadGenerator.cs index f0e75378..c8483694 100644 --- a/QRCoder/PayloadGenerator.cs +++ b/QRCoder/PayloadGenerator.cs @@ -2516,14 +2516,10 @@ public override string ToString() var cp = characterSet.ToString().Replace("_", "-"); var bytes = ToBytes(); -#if !NET35_OR_GREATER && !NETSTANDARD1_3_OR_GREATER +#if NETCOREAPP System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); #endif -#if NETSTANDARD1_3 - return Encoding.GetEncoding(cp).GetString(bytes,0,bytes.Length); -#else - return Encoding.GetEncoding(cp).GetString(bytes); -#endif + return Encoding.GetEncoding(cp).GetString(bytes, 0, bytes.Length); } /// @@ -2536,7 +2532,7 @@ public byte[] ToBytes() { //Setup byte encoder //Encode return string as byte[] with correct CharacterSet -#if !NET35_OR_GREATER +#if !NETFRAMEWORK // -- why different ifdef than line 2519? -- Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); #endif var cp = this.characterSet.ToString().Replace("_", "-"); diff --git a/QRCoder/PdfByteQRCode.cs b/QRCoder/PdfByteQRCode.cs index 22549797..68269eed 100644 --- a/QRCoder/PdfByteQRCode.cs +++ b/QRCoder/PdfByteQRCode.cs @@ -1,4 +1,4 @@ -#if NETFRAMEWORK || NETSTANDARD2_0 || NET5_0 || NET6_0_WINDOWS +#if SYSTEM_DRAWING using System; using System.Collections.Generic; using System.Drawing.Imaging; @@ -11,7 +11,7 @@ namespace QRCoder { -#if NET6_0_WINDOWS +#if NET6_0_OR_GREATER [System.Runtime.Versioning.SupportedOSPlatform("windows")] #endif // ReSharper disable once InconsistentNaming @@ -213,7 +213,7 @@ public byte[] GetGraphic(int pixelsPerModule, string darkColorHtmlHex, string li } } -#if NET6_0_WINDOWS +#if NET6_0_OR_GREATER [System.Runtime.Versioning.SupportedOSPlatform("windows")] #endif public static class PdfByteQRCodeHelper diff --git a/QRCoder/QRCode.cs b/QRCoder/QRCode.cs index 3fac751e..6ba4b629 100644 --- a/QRCoder/QRCode.cs +++ b/QRCoder/QRCode.cs @@ -1,4 +1,4 @@ -#if NETFRAMEWORK || NETSTANDARD2_0 || NET5_0 || NET6_0_WINDOWS +#if SYSTEM_DRAWING using System; using System.Drawing; using System.Drawing.Drawing2D; @@ -6,7 +6,7 @@ namespace QRCoder { -#if NET6_0_WINDOWS +#if NET6_0_OR_GREATER [System.Runtime.Versioning.SupportedOSPlatform("windows")] #endif public class QRCode : AbstractQRCode, IDisposable @@ -128,7 +128,7 @@ internal GraphicsPath CreateRoundedRectanglePath(RectangleF rect, int cornerRadi } } -#if NET6_0_WINDOWS +#if NET6_0_OR_GREATER [System.Runtime.Versioning.SupportedOSPlatform("windows")] #endif public static class QRCodeHelper diff --git a/QRCoder/QRCodeData.cs b/QRCoder/QRCodeData.cs index 8a19b5af..195b7fdd 100644 --- a/QRCoder/QRCodeData.cs +++ b/QRCoder/QRCodeData.cs @@ -21,11 +21,12 @@ public QRCodeData(int version) for (var i = 0; i < size; i++) this.ModuleMatrix.Add(new BitArray(size)); } -#if NETFRAMEWORK || NETSTANDARD2_0 || NET5_0 + + [Obsolete("This constructor will be removed in version 2.0.0.")] public QRCodeData(string pathToRawData, Compression compressMode) : this(File.ReadAllBytes(pathToRawData), compressMode) { } -#endif + public QRCodeData(byte[] rawData, Compression compressMode) { var bytes = new List(rawData); @@ -154,12 +155,11 @@ public byte[] GetRawData(Compression compressMode) return rawData; } -#if NETFRAMEWORK || NETSTANDARD2_0 || NET5_0 + [Obsolete("This constructor will be removed in version 2.0.0.")] public void SaveRawData(string filePath, Compression compressMode) { File.WriteAllBytes(filePath, GetRawData(compressMode)); } -#endif public int Version { get; private set; } diff --git a/QRCoder/QRCodeGenerator.cs b/QRCoder/QRCodeGenerator.cs index 7c70d137..bfff8c0c 100644 --- a/QRCoder/QRCodeGenerator.cs +++ b/QRCoder/QRCodeGenerator.cs @@ -1107,11 +1107,7 @@ private static string ConvertToIso8859(string value, string Iso = "ISO-8859-2") Encoding utf8 = Encoding.UTF8; byte[] utfBytes = utf8.GetBytes(value); byte[] isoBytes = Encoding.Convert(utf8, iso, utfBytes); -#if NETFRAMEWORK || NETSTANDARD2_0 || NET5_0 return iso.GetString(isoBytes); -#else - return iso.GetString(isoBytes, 0, isoBytes.Length); -#endif } private static string PlainTextToBinaryByte(string plainText, EciMode eciMode, bool utf8BOM, bool forceUtf8) diff --git a/QRCoder/QRCoder.csproj b/QRCoder/QRCoder.csproj index 9b37e4c6..419db4d9 100644 --- a/QRCoder/QRCoder.csproj +++ b/QRCoder/QRCoder.csproj @@ -3,6 +3,7 @@ net35;net40;netstandard1.3;netstandard2.0;net5.0;net5.0-windows;net6.0;net6.0-windows false + $(DefineConstants);SYSTEM_DRAWING $(DefineConstants);NET5_0_WINDOWS $(DefineConstants);NET6_0_WINDOWS false @@ -48,9 +49,10 @@ - - - + + + + $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client diff --git a/QRCoder/SvgQRCode.cs b/QRCoder/SvgQRCode.cs index 89599680..642b8289 100644 --- a/QRCoder/SvgQRCode.cs +++ b/QRCoder/SvgQRCode.cs @@ -1,4 +1,4 @@ -#if NETFRAMEWORK || NETSTANDARD2_0 || NET5_0_OR_GREATER +#if !NETSTANDARD1_3 using QRCoder.Extensions; using System; using System.Collections; @@ -267,14 +267,14 @@ public class SvgLogo private object _logoRaw; private bool _isEmbedded; -#if NETFRAMEWORK || NETSTANDARD2_0 || NET5_0 || NET6_0_WINDOWS +#if SYSTEM_DRAWING /// /// Create a logo object to be used in SvgQRCode renderer /// /// Logo to be rendered as Bitmap/rasterized graphic /// Degree of percentage coverage of the QR code by the logo /// If true, the background behind the logo will be cleaned -#if NET6_0_WINDOWS +#if NET6_0_OR_GREATER [System.Runtime.Versioning.SupportedOSPlatform("windows")] #endif public SvgLogo(Bitmap iconRasterized, int iconSizePercent = 15, bool fillLogoBackground = true) diff --git a/QRCoderTests/ArtQRCodeRendererTests.cs b/QRCoderTests/ArtQRCodeRendererTests.cs index 1fadd3b1..111d6979 100644 --- a/QRCoderTests/ArtQRCodeRendererTests.cs +++ b/QRCoderTests/ArtQRCodeRendererTests.cs @@ -1,4 +1,4 @@ -#if !NETCOREAPP1_1 && !NET6_0 +#if SYSTEM_DRAWING using Xunit; using QRCoder; @@ -23,7 +23,7 @@ public void can_create_standard_qrcode_graphic() var bmp = new ArtQRCode(data).GetGraphic(10); var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("cb38c3156eaf13cdfba699bdafc3a84c"); + result.ShouldBe("df510ce9feddc0dd8c23c54e700abbf0"); } [Fact] @@ -40,7 +40,7 @@ public void can_create_standard_qrcode_graphic_with_custom_finder() var bmp = new ArtQRCode(data).GetGraphic(10, Color.Black, Color.White, Color.Transparent, finderPatternImage: finder); var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("5df3f2892eeb01e9c282ad10f642dec2"); + result.ShouldBe("e28a3779b9b975b85984e36f596c9a35"); } [Fact] @@ -52,7 +52,7 @@ public void can_create_standard_qrcode_graphic_without_quietzone() var bmp = new ArtQRCode(data).GetGraphic(10, Color.Black, Color.White, Color.Transparent, drawQuietZones: false); var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("632315c8695416fc82fe06a202688433"); + result.ShouldBe("54408da26852d6c67ab7cad2656da7fa"); } [Fact] @@ -66,7 +66,7 @@ public void can_create_standard_qrcode_graphic_with_background() var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("bbea08507282773175cfe7b52f0ddae4"); + result.ShouldBe("7f039ccde219ae78e4f768466376a17f"); } [Fact] @@ -99,7 +99,7 @@ public void can_render_artqrcode_from_helper() //Create QR code var bmp = ArtQRCodeHelper.GetQRCode("A", 10, Color.Black, Color.White, Color.Transparent, QRCodeGenerator.ECCLevel.L); var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("57ecaa9bdeadcdcbeac8a19d734907ff"); + result.ShouldBe("a1975852df9b537344468bd44d54abe0"); } } } diff --git a/QRCoderTests/Base64QRCodeRendererTests.cs b/QRCoderTests/Base64QRCodeRendererTests.cs index 58011fba..bee20b36 100644 --- a/QRCoderTests/Base64QRCodeRendererTests.cs +++ b/QRCoderTests/Base64QRCodeRendererTests.cs @@ -55,7 +55,7 @@ public void can_render_base64_qrcode_transparent() base64QRCode.ShouldBe(Convert.ToBase64String(pngCodeGfx)); } -#if NETFRAMEWORK || NETCOREAPP2_0 || NET5_0 || NET6_0_WINDOWS +#if SYSTEM_DRAWING [Fact] [Category("QRRenderer/Base64QRCode")] public void can_render_base64_qrcode_jpeg() diff --git a/QRCoderTests/Helpers/CategoryDiscoverer.cs b/QRCoderTests/Helpers/CategoryDiscoverer.cs index 0593cb1a..758617c9 100644 --- a/QRCoderTests/Helpers/CategoryDiscoverer.cs +++ b/QRCoderTests/Helpers/CategoryDiscoverer.cs @@ -1,14 +1,14 @@ using System; using System.Collections.Generic; using System.Linq; -#if !NET35 && !NET452 +#if !NETFRAMEWORK using Xunit.Abstractions; #endif using Xunit.Sdk; namespace QRCoderTests.Helpers.XUnitExtenstions { -#if NET35 || NET452 +#if NETFRAMEWORK [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] public class CategoryAttribute : Attribute { diff --git a/QRCoderTests/Helpers/HelperFunctions.cs b/QRCoderTests/Helpers/HelperFunctions.cs index 1f337865..c6bf59ec 100644 --- a/QRCoderTests/Helpers/HelperFunctions.cs +++ b/QRCoderTests/Helpers/HelperFunctions.cs @@ -2,10 +2,11 @@ using System.Text; using System.IO; using System.Security.Cryptography; +using System.Reflection; #if !NETCOREAPP1_1 using System.Drawing; #endif -#if NETFRAMEWORK || NET5_0_WINDOWS || NET6_0_WINDOWS +#if TEST_XAML using SW = System.Windows; using System.Windows.Media; using System.Windows.Media.Imaging; @@ -17,7 +18,7 @@ namespace QRCoderTests.Helpers public static class HelperFunctions { -#if NETFRAMEWORK || NET5_0_WINDOWS || NET6_0_WINDOWS +#if TEST_XAML public static BitmapSource ToBitmapSource(DrawingImage source) { DrawingVisual drawingVisual = new DrawingVisual(); @@ -44,34 +45,53 @@ public static Bitmap BitmapSourceToBitmap(DrawingImage xamlImg) } } } -#endif +#endif -#if !NETCOREAPP1_1 public static string GetAssemblyPath() { return -#if NET5_0 || NET6_0 - AppDomain.CurrentDomain.BaseDirectory; -#elif NET35 || NET452 - Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).Replace("file:\\", ""); +#if NET5_0_OR_GREATER + AppDomain.CurrentDomain.BaseDirectory; +#elif NETFRAMEWORK + Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).Replace("file:\\", ""); +#elif NETCOREAPP1_1 + Path.GetDirectoryName(typeof(HelperFunctions).GetTypeInfo().Assembly.Location).Replace("file:\\", ""); #else - Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location).Replace("file:\\", ""); + Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location).Replace("file:\\", ""); #endif } -#endif #if !NETCOREAPP1_1 - public static string BitmapToHash(Bitmap bmp) + /// + /// Converts a bitmap to a hash string based on the pixel data + /// using a deterministic algorithm that ignores compression algorithm + /// differences across platforms. + /// + public static string BitmapToHash(Bitmap bitmap) { - byte[] imgBytes = null; - using (var ms = new MemoryStream()) + // Lock the bitmap's bits. + var rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height); + var bitmapData = bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + + byte[] rgbValues; + try { - bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png); - imgBytes = ms.ToArray(); - ms.Dispose(); + // Create an array to hold the bytes of the bitmap. + int bytes = Math.Abs(bitmapData.Stride) * bitmap.Height; + rgbValues = new byte[bytes]; + + // Copy the RGB values into the array. + System.Runtime.InteropServices.Marshal.Copy(bitmapData.Scan0, rgbValues, 0, bytes); + } + finally + { + // Unlock the bits. + bitmap.UnlockBits(bitmapData); } - return ByteArrayToHash(imgBytes); + + // Hash the resulting byte array + return ByteArrayToHash(rgbValues); } #endif diff --git a/QRCoderTests/PngByteQRCodeRendererTests.cs b/QRCoderTests/PngByteQRCodeRendererTests.cs index 0bba6e82..7fc1a7ce 100644 --- a/QRCoderTests/PngByteQRCodeRendererTests.cs +++ b/QRCoderTests/PngByteQRCodeRendererTests.cs @@ -38,7 +38,7 @@ public void can_render_pngbyte_qrcode_blackwhite() { var bmp = (Bitmap)Image.FromStream(mStream); var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("18b19e6037cff06ae995d8d487b0e46e"); + result.ShouldBe("0cfc8a8d552ade875190d8e9f5c1e1bf"); } #endif } @@ -60,7 +60,7 @@ public void can_render_pngbyte_qrcode_color() { var bmp = (Bitmap)Image.FromStream(mStream); var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("37ae73e90b66beac317b790be3db24cc"); + result.ShouldBe("88d394b2405499869feb69b81593e703"); } #endif } @@ -83,7 +83,7 @@ public void can_render_pngbyte_qrcode_color_with_alpha() { var bmp = (Bitmap)Image.FromStream(mStream); var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("c56c2a9535fd8e9a92a6ac9709d21e67"); + result.ShouldBe("1d81b3d52fc64543186558eee7d9494b"); } #endif } @@ -107,7 +107,7 @@ public void can_render_pngbyte_qrcode_color_without_quietzones() var bmp = (Bitmap)Image.FromStream(mStream); bmp.MakeTransparent(Color.Transparent); var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("fbbc8255ebf3e4f4a1d21f0dd15f76f8"); + result.ShouldBe("825a6469f89bf9e3d7318a5390d5ba7f"); } #endif } @@ -136,7 +136,7 @@ public void can_render_pngbyte_qrcode_from_helper() { var bmp = (Bitmap)Image.FromStream(mStream); var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("1978fb11ce26acf9b6cb7490b4c44ef2"); + result.ShouldBe("a2ea116068eb516a7c210b2541e99348"); } #endif } @@ -156,7 +156,7 @@ public void can_render_pngbyte_qrcode_from_helper_2() { var bmp = (Bitmap)Image.FromStream(mStream); var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("c56c2a9535fd8e9a92a6ac9709d21e67"); + result.ShouldBe("1d81b3d52fc64543186558eee7d9494b"); } #endif } diff --git a/QRCoderTests/QRCodeRendererTests.cs b/QRCoderTests/QRCodeRendererTests.cs index ed77ec5f..d01eaf7a 100644 --- a/QRCoderTests/QRCodeRendererTests.cs +++ b/QRCoderTests/QRCodeRendererTests.cs @@ -1,4 +1,4 @@ -#if !NETCOREAPP1_1 && !NET6_0 +#if SYSTEM_DRAWING using Xunit; using QRCoder; using Shouldly; @@ -21,7 +21,7 @@ public void can_create_qrcode_standard_graphic() var bmp = new QRCode(data).GetGraphic(10); var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("e8c61b8f0455924fe08ba68686d0d296"); + result.ShouldBe("f2ed5073bd42dc012e442c0f750e9dae"); } [Fact] @@ -33,7 +33,7 @@ public void can_create_qrcode_standard_graphic_hex() var bmp = new QRCode(data).GetGraphic(10, "#000000", "#ffffff"); var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("e8c61b8f0455924fe08ba68686d0d296"); + result.ShouldBe("f2ed5073bd42dc012e442c0f750e9dae"); } @@ -46,7 +46,7 @@ public void can_create_qrcode_standard_graphic_without_quietzones() var bmp = new QRCode(data).GetGraphic(5, Color.Black, Color.White, false); var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("d703e54a0ba541c6ea69e3d316e394e7"); + result.ShouldBe("c401d45c01e636af3eb4b8ca6cd17d14"); } @@ -61,7 +61,7 @@ public void can_create_qrcode_with_transparent_logo_graphic() var bmp = new QRCode(data).GetGraphic(10, Color.Black, Color.Transparent, icon: (Bitmap)Image.FromFile(HelperFunctions.GetAssemblyPath() + "\\assets\\noun_software engineer_2909346.png")); //Used logo is licensed under public domain. Ref.: https://thenounproject.com/Iconathon1/collection/redefining-women/?i=2909346 var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("150f8fc7dae4487ba2887d2b2bea1c25"); + result.ShouldBe("c99a82b43ce48ddae18a75862c476a9e"); } [Fact] @@ -75,7 +75,7 @@ public void can_create_qrcode_with_non_transparent_logo_graphic() //Used logo is licensed under public domain. Ref.: https://thenounproject.com/Iconathon1/collection/redefining-women/?i=2909346 var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("c46a7ec51bf978d7a882059c322ca69d"); + result.ShouldBe("74808e52270bba92e7b821dbd067dfd2"); } [Fact] @@ -90,7 +90,7 @@ public void can_create_qrcode_with_logo_and_with_transparent_border() var bmp = new QRCode(data).GetGraphic(10, Color.Black, Color.Transparent, icon: logo, iconBorderWidth: 6); //Used logo is licensed under public domain. Ref.: https://thenounproject.com/Iconathon1/collection/redefining-women/?i=2909346 var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("150f8fc7dae4487ba2887d2b2bea1c25"); + result.ShouldBe("c99a82b43ce48ddae18a75862c476a9e"); } [Fact] @@ -105,7 +105,7 @@ public void can_create_qrcode_with_logo_and_with_standard_border() var bmp = new QRCode(data).GetGraphic(10, Color.Black, Color.White, icon: logo, iconBorderWidth: 6); //Used logo is licensed under public domain. Ref.: https://thenounproject.com/Iconathon1/collection/redefining-women/?i=2909346 var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("1c926ea1d48f42fdf8e6f1438b774cdd"); + result.ShouldBe("943ecd2a847a4d9509ca0266dbbadd7b"); } [Fact] @@ -120,7 +120,7 @@ public void can_create_qrcode_with_logo_and_with_custom_border() var bmp = new QRCode(data).GetGraphic(10, Color.Black, Color.Transparent, icon: logo, iconBorderWidth: 6, iconBackgroundColor: Color.DarkGreen); //Used logo is licensed under public domain. Ref.: https://thenounproject.com/Iconathon1/collection/redefining-women/?i=2909346 var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("9a06bfbb72df999b6290b5af5c4037cb"); + result.ShouldBe("e60bdaafe807889ca322d47146fe8300"); } @@ -141,7 +141,7 @@ public void can_render_qrcode_from_helper() var bmp = QRCodeHelper.GetQRCode("This is a quick test! 123#?", 10, Color.Black, Color.White, QRCodeGenerator.ECCLevel.H); var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("e8c61b8f0455924fe08ba68686d0d296"); + result.ShouldBe("f2ed5073bd42dc012e442c0f750e9dae"); } } diff --git a/QRCoderTests/QRCoderTests.csproj b/QRCoderTests/QRCoderTests.csproj index e5c01ba9..c9f71186 100644 --- a/QRCoderTests/QRCoderTests.csproj +++ b/QRCoderTests/QRCoderTests.csproj @@ -3,6 +3,8 @@ net35;net452;netcoreapp1.1;netcoreapp2.0;net5.0;net5.0-windows;net6.0;net6.0-windows true true + $(DefineConstants);SYSTEM_DRAWING + $(DefineConstants);TEST_XAML $(DefineConstants);NET5_0_WINDOWS $(DefineConstants);NET6_0_WINDOWS false diff --git a/QRCoderTests/QRGeneratorTests.cs b/QRCoderTests/QRGeneratorTests.cs index bbeeb91d..1a81e0ed 100644 --- a/QRCoderTests/QRGeneratorTests.cs +++ b/QRCoderTests/QRGeneratorTests.cs @@ -140,12 +140,7 @@ public static class ExtensionMethods public static string ToBitString(this BitArray bits) { var sb = new StringBuilder(); - int bitLength = 0; -#if !NETCOREAPP1_1 - bitLength = bits.Count; -#else - bitLength = bits.Length; -#endif + int bitLength = bits.Length; for (int i = 0; i < bitLength; i++) { char c = bits[i] ? '1' : '0'; diff --git a/QRCoderTests/SvgQRCodeRendererTests.cs b/QRCoderTests/SvgQRCodeRendererTests.cs index 158d9bc9..beed32ec 100644 --- a/QRCoderTests/SvgQRCodeRendererTests.cs +++ b/QRCoderTests/SvgQRCodeRendererTests.cs @@ -14,6 +14,15 @@ namespace QRCoderTests public class SvgQRCodeRendererTests { + private string GetAssemblyPath() + { + return +#if NET5_0 + AppDomain.CurrentDomain.BaseDirectory; +#else + Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).Replace("file:\\", ""); +#endif + } [Fact] [Category("QRRenderer/SvgQRCode")] @@ -93,7 +102,7 @@ public void can_render_svg_qrcode_without_quietzones_hex() result.ShouldBe("4ab0417cc6127e347ca1b2322c49ed7d"); } -#if NETFRAMEWORK || NETSTANDARD2_0 || NET5_0 || NET6_0_WINDOWS +#if SYSTEM_DRAWING && !NET5_0_OR_GREATER // .NET 5+ does not encode PNG images in a deterministic way, so the hash may be different across different runs [Fact] [Category("QRRenderer/SvgQRCode")] public void can_render_svg_qrcode_with_png_logo_bitmap() diff --git a/QRCoderTests/XamlQRCodeRendererTests.cs b/QRCoderTests/XamlQRCodeRendererTests.cs index 884138c3..1e5d27f4 100644 --- a/QRCoderTests/XamlQRCodeRendererTests.cs +++ b/QRCoderTests/XamlQRCodeRendererTests.cs @@ -1,4 +1,4 @@ -#if NETFRAMEWORK || NET5_0_WINDOWS || NET6_0_WINDOWS +#if TEST_XAML using Xunit; using QRCoder; using QRCoder.Xaml; @@ -22,7 +22,7 @@ public void can_create_xaml_qrcode_standard_graphic() var bmp = HelperFunctions.BitmapSourceToBitmap(xCode); var result = HelperFunctions.BitmapToHash(bmp); - result.ShouldBe("e8c61b8f0455924fe08ba68686d0d296"); + result.ShouldBe("f2ed5073bd42dc012e442c0f750e9dae"); } From 069e4a14e48a94f0d46a8449e31dcac5205665dc Mon Sep 17 00:00:00 2001 From: Shane32 Date: Thu, 25 Apr 2024 03:03:24 -0400 Subject: [PATCH 2/5] Cleanup SvgQRCodeRendererTests --- QRCoderTests/SvgQRCodeRendererTests.cs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/QRCoderTests/SvgQRCodeRendererTests.cs b/QRCoderTests/SvgQRCodeRendererTests.cs index beed32ec..9b296272 100644 --- a/QRCoderTests/SvgQRCodeRendererTests.cs +++ b/QRCoderTests/SvgQRCodeRendererTests.cs @@ -14,16 +14,6 @@ namespace QRCoderTests public class SvgQRCodeRendererTests { - private string GetAssemblyPath() - { - return -#if NET5_0 - AppDomain.CurrentDomain.BaseDirectory; -#else - Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).Replace("file:\\", ""); -#endif - } - [Fact] [Category("QRRenderer/SvgQRCode")] public void can_render_svg_qrcode_simple() From 97d1ce5a5857aa4384efa3b9738c2685bc22a6d9 Mon Sep 17 00:00:00 2001 From: Shane32 Date: Fri, 26 Apr 2024 00:47:15 -0400 Subject: [PATCH 3/5] Updates based on code review --- QRCoder/PayloadGenerator.cs | 8 ++++---- QRCoder/QRCodeGenerator.cs | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/QRCoder/PayloadGenerator.cs b/QRCoder/PayloadGenerator.cs index c8483694..39bae5f0 100644 --- a/QRCoder/PayloadGenerator.cs +++ b/QRCoder/PayloadGenerator.cs @@ -2516,8 +2516,8 @@ public override string ToString() var cp = characterSet.ToString().Replace("_", "-"); var bytes = ToBytes(); -#if NETCOREAPP - System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); +#if !NETFRAMEWORK + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); #endif return Encoding.GetEncoding(cp).GetString(bytes, 0, bytes.Length); } @@ -2532,7 +2532,7 @@ public byte[] ToBytes() { //Setup byte encoder //Encode return string as byte[] with correct CharacterSet -#if !NETFRAMEWORK // -- why different ifdef than line 2519? -- +#if !NETFRAMEWORK Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); #endif var cp = this.characterSet.ToString().Replace("_", "-"); @@ -3111,7 +3111,7 @@ private static string ConvertStringToEncoding(string message, string encoding) Encoding utf8 = Encoding.UTF8; byte[] utfBytes = utf8.GetBytes(message); byte[] isoBytes = Encoding.Convert(utf8, iso, utfBytes); - return iso.GetString(isoBytes, 0, isoBytes.Length); + return iso.GetString(isoBytes); } private static string EscapeInput(string inp, bool simple = false) diff --git a/QRCoder/QRCodeGenerator.cs b/QRCoder/QRCodeGenerator.cs index bfff8c0c..85c24b17 100644 --- a/QRCoder/QRCodeGenerator.cs +++ b/QRCoder/QRCodeGenerator.cs @@ -1026,8 +1026,7 @@ private static bool IsUtf8(EncodingMode encoding, string plainText, bool forceUt private static bool IsValidISO(string input) { var bytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(input); - //var result = Encoding.GetEncoding("ISO-8859-1").GetString(bytes); - var result = Encoding.GetEncoding("ISO-8859-1").GetString(bytes,0,bytes.Length); + var result = Encoding.GetEncoding("ISO-8859-1").GetString(bytes); return String.Equals(input, result); } From eaf046afb3d2cf0f0937b17c16e8573eb9f36fcb Mon Sep 17 00:00:00 2001 From: Shane Krueger Date: Fri, 26 Apr 2024 09:29:08 -0400 Subject: [PATCH 4/5] Update QRCoder/QRCodeData.cs --- QRCoder/QRCodeData.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/QRCoder/QRCodeData.cs b/QRCoder/QRCodeData.cs index 195b7fdd..40285d0a 100644 --- a/QRCoder/QRCodeData.cs +++ b/QRCoder/QRCodeData.cs @@ -22,7 +22,6 @@ public QRCodeData(int version) this.ModuleMatrix.Add(new BitArray(size)); } - [Obsolete("This constructor will be removed in version 2.0.0.")] public QRCodeData(string pathToRawData, Compression compressMode) : this(File.ReadAllBytes(pathToRawData), compressMode) { } From 6550b8d4ebd04bed63db856ce2198472fbab1fab Mon Sep 17 00:00:00 2001 From: Shane Krueger Date: Fri, 26 Apr 2024 09:29:25 -0400 Subject: [PATCH 5/5] Update QRCoder/QRCodeData.cs --- QRCoder/QRCodeData.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/QRCoder/QRCodeData.cs b/QRCoder/QRCodeData.cs index 40285d0a..b7f5df29 100644 --- a/QRCoder/QRCodeData.cs +++ b/QRCoder/QRCodeData.cs @@ -154,7 +154,6 @@ public byte[] GetRawData(Compression compressMode) return rawData; } - [Obsolete("This constructor will be removed in version 2.0.0.")] public void SaveRawData(string filePath, Compression compressMode) { File.WriteAllBytes(filePath, GetRawData(compressMode));