Skip to content

Commit 419d5da

Browse files
committed
Refactor BlockedModules
1 parent a95e5fa commit 419d5da

File tree

8 files changed

+148
-96
lines changed

8 files changed

+148
-96
lines changed

QRCoder/QRCodeData.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,16 @@ public QRCodeData(int version)
1717
{
1818
this.Version = version;
1919
var size = ModulesPerSideFromVersion(version);
20-
this.ModuleMatrix = new List<BitArray>();
20+
this.ModuleMatrix = new List<BitArray>(size);
21+
for (var i = 0; i < size; i++)
22+
this.ModuleMatrix.Add(new BitArray(size));
23+
}
24+
25+
public QRCodeData(int version, bool addPadding)
26+
{
27+
this.Version = version;
28+
var size = ModulesPerSideFromVersion(version) + (addPadding ? 8 : 0);
29+
this.ModuleMatrix = new List<BitArray>(size);
2130
for (var i = 0; i < size; i++)
2231
this.ModuleMatrix.Add(new BitArray(size));
2332
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
using System.Collections.Generic;
2+
3+
namespace QRCoder
4+
{
5+
public partial class QRCodeGenerator
6+
{
7+
private static partial class ModulePlacer
8+
{
9+
/// <summary>
10+
/// Struct that represents blocked modules using rectangles.
11+
/// </summary>
12+
public struct BlockedModules
13+
{
14+
private readonly List<Rectangle> _blockedModules;
15+
16+
/// <summary>
17+
/// Initializes a new instance of the <see cref="BlockedModules"/> struct with a specified capacity.
18+
/// </summary>
19+
/// <param name="capacity">The initial capacity of the blocked modules list.</param>
20+
public BlockedModules(int capacity)
21+
{
22+
_blockedModules = new List<Rectangle>(capacity);
23+
}
24+
25+
/// <summary>
26+
/// Adds a blocked module at the specified coordinates.
27+
/// </summary>
28+
/// <param name="x">The x-coordinate of the module.</param>
29+
/// <param name="y">The y-coordinate of the module.</param>
30+
public void Add(int x, int y)
31+
{
32+
_blockedModules.Add(new Rectangle(x, y, 1, 1));
33+
}
34+
35+
/// <summary>
36+
/// Adds a blocked module defined by the specified rectangle.
37+
/// </summary>
38+
/// <param name="rect">The rectangle that defines the blocked module.</param>
39+
public void Add(Rectangle rect)
40+
{
41+
_blockedModules.Add(rect);
42+
}
43+
44+
/// <summary>
45+
/// Checks if the specified coordinates are blocked.
46+
/// </summary>
47+
/// <param name="x">The x-coordinate to check.</param>
48+
/// <param name="y">The y-coordinate to check.</param>
49+
/// <returns><c>true</c> if the coordinates are blocked; otherwise, <c>false</c>.</returns>
50+
public bool IsBlocked(int x, int y)
51+
{
52+
return IsBlocked(new Rectangle(x, y, 1, 1));
53+
}
54+
55+
/// <summary>
56+
/// Checks if the specified rectangle is blocked.
57+
/// </summary>
58+
/// <param name="r1">The rectangle to check.</param>
59+
/// <returns><c>true</c> if the rectangle is blocked; otherwise, <c>false</c>.</returns>
60+
public bool IsBlocked(Rectangle r1)
61+
{
62+
// Iterate through the list of blocked modules to check for any intersection.
63+
foreach (var r2 in _blockedModules)
64+
{
65+
// Check if any part of the rectangles overlap.
66+
if (r2.X < r1.X + r1.Width && r1.X < r2.X + r2.Width && r2.Y < r1.Y + r1.Height && r1.Y < r2.Y + r2.Height)
67+
return true;
68+
}
69+
return false;
70+
}
71+
}
72+
}
73+
}
74+
}

QRCoder/QRCodeGenerator.ModulePlacer.cs

Lines changed: 53 additions & 87 deletions
Large diffs are not rendered by default.

QRCoder/QRCodeGenerator.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -319,27 +319,26 @@ BitArray InterleaveData()
319319
// Place the modules on the QR code matrix
320320
QRCodeData PlaceModules()
321321
{
322-
var qr = new QRCodeData(version);
323-
var blockedModules = new List<Rectangle>(17);
322+
var qr = new QRCodeData(version, true);
323+
var size = qr.ModuleMatrix.Count - 8;
324+
var blockedModules = new ModulePlacer.BlockedModules(17);
324325
ModulePlacer.PlaceFinderPatterns(qr, blockedModules);
325-
ModulePlacer.ReserveSeperatorAreas(qr.ModuleMatrix.Count, blockedModules);
326+
ModulePlacer.ReserveSeperatorAreas(size, blockedModules);
326327
ModulePlacer.PlaceAlignmentPatterns(qr, alignmentPatternTable[version].PatternPositions, blockedModules);
327328
ModulePlacer.PlaceTimingPatterns(qr, blockedModules);
328329
ModulePlacer.PlaceDarkModule(qr, version, blockedModules);
329-
ModulePlacer.ReserveVersionAreas(qr.ModuleMatrix.Count, version, blockedModules);
330+
ModulePlacer.ReserveVersionAreas(size, version, blockedModules);
330331
ModulePlacer.PlaceDataWords(qr, interleavedData, blockedModules);
331332
var maskVersion = ModulePlacer.MaskCode(qr, version, blockedModules, eccLevel);
332333
var formatStr = GetFormatString(eccLevel, maskVersion);
333334

334-
ModulePlacer.PlaceFormat(qr, formatStr);
335+
ModulePlacer.PlaceFormat(qr, formatStr, true);
335336
if (version >= 7)
336337
{
337338
var versionString = GetVersionString(version);
338-
ModulePlacer.PlaceVersion(qr, versionString);
339+
ModulePlacer.PlaceVersion(qr, versionString, true);
339340
}
340341

341-
ModulePlacer.AddQuietZone(qr);
342-
343342
return qr;
344343
}
345344
}

QRCoderApiTests/net35+net40+net50+net50-windows+netstandard20/QRCoder.approved.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,7 @@ namespace QRCoder
868868
{
869869
public QRCodeData(int version) { }
870870
public QRCodeData(byte[] rawData, QRCoder.QRCodeData.Compression compressMode) { }
871+
public QRCodeData(int version, bool addPadding) { }
871872
public QRCodeData(string pathToRawData, QRCoder.QRCodeData.Compression compressMode) { }
872873
public System.Collections.Generic.List<System.Collections.BitArray> ModuleMatrix { get; set; }
873874
public int Version { get; }

QRCoderApiTests/net60-windows/QRCoder.approved.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -876,6 +876,7 @@ namespace QRCoder
876876
{
877877
public QRCodeData(int version) { }
878878
public QRCodeData(byte[] rawData, QRCoder.QRCodeData.Compression compressMode) { }
879+
public QRCodeData(int version, bool addPadding) { }
879880
public QRCodeData(string pathToRawData, QRCoder.QRCodeData.Compression compressMode) { }
880881
public System.Collections.Generic.List<System.Collections.BitArray> ModuleMatrix { get; set; }
881882
public int Version { get; }

QRCoderApiTests/net60/QRCoder.approved.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,7 @@ namespace QRCoder
810810
{
811811
public QRCodeData(int version) { }
812812
public QRCodeData(byte[] rawData, QRCoder.QRCodeData.Compression compressMode) { }
813+
public QRCodeData(int version, bool addPadding) { }
813814
public QRCodeData(string pathToRawData, QRCoder.QRCodeData.Compression compressMode) { }
814815
public System.Collections.Generic.List<System.Collections.BitArray> ModuleMatrix { get; set; }
815816
public int Version { get; }

QRCoderApiTests/netstandard13/QRCoder.approved.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,7 @@ namespace QRCoder
775775
{
776776
public QRCodeData(int version) { }
777777
public QRCodeData(byte[] rawData, QRCoder.QRCodeData.Compression compressMode) { }
778+
public QRCodeData(int version, bool addPadding) { }
778779
public QRCodeData(string pathToRawData, QRCoder.QRCodeData.Compression compressMode) { }
779780
public System.Collections.Generic.List<System.Collections.BitArray> ModuleMatrix { get; set; }
780781
public int Version { get; }

0 commit comments

Comments
 (0)