Skip to content

Commit e3664d1

Browse files
authored
Merge pull request #531 from Shane32/maskpattern_list
Change MaskPattern.Patterns to a list
2 parents 8259416 + 5c652f3 commit e3664d1

File tree

2 files changed

+20
-17
lines changed

2 files changed

+20
-17
lines changed

QRCoder/QRCodeGenerator.ModulePlacer.MaskPattern.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ private static class MaskPattern
1717
/// <summary>
1818
/// A dictionary mapping each mask pattern index to its corresponding function that calculates whether a given pixel should be masked.
1919
/// </summary>
20-
public static readonly Dictionary<int, Func<int, int, bool>> Patterns =
21-
new Dictionary<int, Func<int, int, bool>>(8) {
22-
{ 1, MaskPattern.Pattern1 }, {2, MaskPattern.Pattern2 }, {3, MaskPattern.Pattern3 }, {4, MaskPattern.Pattern4 },
23-
{ 5, MaskPattern.Pattern5 }, {6, MaskPattern.Pattern6 }, {7, MaskPattern.Pattern7 }, {8, MaskPattern.Pattern8 }
20+
public static readonly List<Func<int, int, bool>> Patterns =
21+
new List<Func<int, int, bool>>(8) {
22+
MaskPattern.Pattern1, MaskPattern.Pattern2, MaskPattern.Pattern3, MaskPattern.Pattern4,
23+
MaskPattern.Pattern5, MaskPattern.Pattern6, MaskPattern.Pattern7, MaskPattern.Pattern8
2424
};
2525

2626
/// <summary>

QRCoder/QRCodeGenerator.ModulePlacer.cs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ public static void PlaceFormat(QRCodeData qrCode, BitArray formatStr, bool offse
107107
/// <returns>The index of the selected mask pattern.</returns>
108108
public static int MaskCode(QRCodeData qrCode, int version, BlockedModules blockedModules, ECCLevel eccLevel)
109109
{
110-
int? selectedPattern = null;
111-
var patternScore = 0;
110+
int selectedPattern = -1; // no pattern selected yet
111+
var patternScore = int.MaxValue; // lower score is better
112112

113113
var size = qrCode.ModuleMatrix.Count - 8;
114114

@@ -121,8 +121,10 @@ public static int MaskCode(QRCodeData qrCode, int version, BlockedModules blocke
121121
GetVersionString(versionString, version);
122122
}
123123
var formatStr = new BitArray(15);
124-
foreach (var pattern in MaskPattern.Patterns)
124+
for (var maskPattern = 0; maskPattern < 8; maskPattern++)
125125
{
126+
var patternFunc = MaskPattern.Patterns[maskPattern];
127+
126128
// Reset the temporary QR code to the current state of the actual QR code.
127129
for (var y = 0; y < size; y++)
128130
{
@@ -133,7 +135,7 @@ public static int MaskCode(QRCodeData qrCode, int version, BlockedModules blocke
133135
}
134136

135137
// Place format information using the current mask pattern.
136-
GetFormatString(formatStr, eccLevel, pattern.Key - 1);
138+
GetFormatString(formatStr, eccLevel, maskPattern);
137139
ModulePlacer.PlaceFormat(qrTemp, formatStr, false);
138140

139141
// Place version information if applicable.
@@ -149,46 +151,47 @@ public static int MaskCode(QRCodeData qrCode, int version, BlockedModules blocke
149151
{
150152
if (!blockedModules.IsBlocked(x, y))
151153
{
152-
qrTemp.ModuleMatrix[y][x] ^= pattern.Value(x, y);
153-
qrTemp.ModuleMatrix[x][y] ^= pattern.Value(y, x);
154+
qrTemp.ModuleMatrix[y][x] ^= patternFunc(x, y);
155+
qrTemp.ModuleMatrix[x][y] ^= patternFunc(y, x);
154156
}
155157
}
156158

157159
if (!blockedModules.IsBlocked(x, x))
158160
{
159-
qrTemp.ModuleMatrix[x][x] ^= pattern.Value(x, x);
161+
qrTemp.ModuleMatrix[x][x] ^= patternFunc(x, x);
160162
}
161163
}
162164

163165
var score = MaskPattern.Score(qrTemp);
164166

165167
// Select the pattern with the lowest score, indicating better QR code readability.
166-
if (!selectedPattern.HasValue || patternScore > score)
168+
if (patternScore > score)
167169
{
168-
selectedPattern = pattern.Key;
170+
selectedPattern = maskPattern;
169171
patternScore = score;
170172
}
171173
}
172174

173175
// Apply the best mask pattern to the actual QR code.
176+
var selectedPatternFunc = MaskPattern.Patterns[selectedPattern];
174177
for (var x = 0; x < size; x++)
175178
{
176179
for (var y = 0; y < x; y++)
177180
{
178181
if (!blockedModules.IsBlocked(x, y))
179182
{
180-
qrCode.ModuleMatrix[y + 4][x + 4] ^= MaskPattern.Patterns[selectedPattern.Value](x, y);
181-
qrCode.ModuleMatrix[x + 4][y + 4] ^= MaskPattern.Patterns[selectedPattern.Value](y, x);
183+
qrCode.ModuleMatrix[y + 4][x + 4] ^= selectedPatternFunc(x, y);
184+
qrCode.ModuleMatrix[x + 4][y + 4] ^= selectedPatternFunc(y, x);
182185
}
183186
}
184187

185188
if (!blockedModules.IsBlocked(x, x))
186189
{
187-
qrCode.ModuleMatrix[x + 4][x + 4] ^= MaskPattern.Patterns[selectedPattern.Value](x, x);
190+
qrCode.ModuleMatrix[x + 4][x + 4] ^= selectedPatternFunc(x, x);
188191
}
189192
}
190193

191-
return selectedPattern.Value - 1;
194+
return selectedPattern;
192195
}
193196

194197
/// <summary>

0 commit comments

Comments
 (0)