@@ -46,7 +46,6 @@ public string GetGraphic(int repeatPerModule, string darkColorString = "██",
4646 /// <returns></returns>
4747 public string [ ] GetLineByLineGraphic ( int repeatPerModule , string darkColorString = "██" , string whiteSpaceString = " " , bool drawQuietZones = true )
4848 {
49- var qrCode = new List < string > ( ) ;
5049 //We need to adjust the repeatPerModule based on number of characters in darkColorString
5150 //(we assume whiteSpaceString has the same number of characters)
5251 //to keep the QR code as square as possible.
@@ -55,9 +54,34 @@ public string[] GetLineByLineGraphic(int repeatPerModule, string darkColorString
5554 var adjustmentValueForNumberOfCharacters = darkColorString . Length / 2 != 1 ? darkColorString . Length / 2 : 0 ;
5655 var verticalNumberOfRepeats = repeatPerModule + adjustmentValueForNumberOfCharacters ;
5756 var sideLength = ( QrCodeData . ModuleMatrix . Count - quietZonesModifier ) * verticalNumberOfRepeats ;
57+ var qrCode = new string [ sideLength ] ;
58+ var lineCapacity = ( QrCodeData . ModuleMatrix . Count - quietZonesModifier ) * repeatPerModule * darkColorString . Length ;
59+ #if HAS_SPAN
60+ if ( darkColorString . Length == whiteSpaceString . Length && lineCapacity < 510 )
61+ {
62+ Span < char > row = stackalloc char [ lineCapacity ] ;
63+ for ( var y = 0 ; y < sideLength ; y ++ )
64+ {
65+ var offset = 0 ;
66+ for ( var x = 0 ; x < QrCodeData . ModuleMatrix . Count - quietZonesModifier ; x ++ )
67+ {
68+ var module = QrCodeData . ModuleMatrix [ ( ( y + verticalNumberOfRepeats ) / verticalNumberOfRepeats - 1 ) + quietZonesOffset ] [ x + quietZonesOffset ] ;
69+ for ( var i = 0 ; i < repeatPerModule ; i ++ )
70+ {
71+ var sourceSpan = module ? darkColorString . AsSpan ( ) : whiteSpaceString . AsSpan ( ) ;
72+ var targetSpan = row . Slice ( offset , darkColorString . Length ) ;
73+ sourceSpan . CopyTo ( targetSpan ) ;
74+ offset += darkColorString . Length ;
75+ }
76+ }
77+ qrCode [ y ] = row . ToString ( ) ;
78+ }
79+ return qrCode ;
80+ }
81+ #endif
82+ var lineBuilder = new StringBuilder ( lineCapacity ) ;
5883 for ( var y = 0 ; y < sideLength ; y ++ )
5984 {
60- var lineBuilder = new StringBuilder ( ) ;
6185 for ( var x = 0 ; x < QrCodeData . ModuleMatrix . Count - quietZonesModifier ; x ++ )
6286 {
6387 var module = QrCodeData . ModuleMatrix [ ( ( y + verticalNumberOfRepeats ) / verticalNumberOfRepeats - 1 ) + quietZonesOffset ] [ x + quietZonesOffset ] ;
@@ -66,9 +90,10 @@ public string[] GetLineByLineGraphic(int repeatPerModule, string darkColorString
6690 lineBuilder . Append ( module ? darkColorString : whiteSpaceString ) ;
6791 }
6892 }
69- qrCode . Add ( lineBuilder . ToString ( ) ) ;
93+ qrCode [ y ] = lineBuilder . ToString ( ) ;
94+ lineBuilder . Length = 0 ;
7095 }
71- return qrCode . ToArray ( ) ;
96+ return qrCode ;
7297 }
7398
7499 /// <summary>
0 commit comments