Skip to content

Commit 9590d2e

Browse files
committed
Add ASCII renderer optimizations
1 parent 317c587 commit 9590d2e

File tree

1 file changed

+29
-4
lines changed

1 file changed

+29
-4
lines changed

QRCoder/ASCIIQRCode.cs

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)