Skip to content

Commit ff0fd9c

Browse files
committed
Extract MaskPattern to another file
1 parent 77623dd commit ff0fd9c

File tree

2 files changed

+188
-178
lines changed

2 files changed

+188
-178
lines changed
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace QRCoder
5+
{
6+
public partial class QRCodeGenerator
7+
{
8+
private static partial class ModulePlacer
9+
{
10+
private static class MaskPattern
11+
{
12+
public static readonly Dictionary<int, Func<int, int, bool>> Patterns =
13+
new Dictionary<int, Func<int, int, bool>>(8) {
14+
{ 1, MaskPattern.Pattern1 }, {2, MaskPattern.Pattern2 }, {3, MaskPattern.Pattern3 }, {4, MaskPattern.Pattern4 },
15+
{ 5, MaskPattern.Pattern5 }, {6, MaskPattern.Pattern6 }, {7, MaskPattern.Pattern7 }, {8, MaskPattern.Pattern8 }
16+
};
17+
18+
public static bool Pattern1(int x, int y)
19+
{
20+
return (x + y) % 2 == 0;
21+
}
22+
23+
public static bool Pattern2(int x, int y)
24+
{
25+
return y % 2 == 0;
26+
}
27+
28+
public static bool Pattern3(int x, int y)
29+
{
30+
return x % 3 == 0;
31+
}
32+
33+
public static bool Pattern4(int x, int y)
34+
{
35+
return (x + y) % 3 == 0;
36+
}
37+
38+
public static bool Pattern5(int x, int y)
39+
{
40+
return ((int)(Math.Floor(y / 2d) + Math.Floor(x / 3d)) % 2) == 0;
41+
}
42+
43+
public static bool Pattern6(int x, int y)
44+
{
45+
return ((x * y) % 2) + ((x * y) % 3) == 0;
46+
}
47+
48+
public static bool Pattern7(int x, int y)
49+
{
50+
return (((x * y) % 2) + ((x * y) % 3)) % 2 == 0;
51+
}
52+
53+
public static bool Pattern8(int x, int y)
54+
{
55+
return (((x + y) % 2) + ((x * y) % 3)) % 2 == 0;
56+
}
57+
58+
public static int Score(QRCodeData qrCode)
59+
{
60+
int score1 = 0,
61+
score2 = 0,
62+
score3 = 0,
63+
score4 = 0;
64+
var size = qrCode.ModuleMatrix.Count;
65+
66+
//Penalty 1
67+
for (var y = 0; y < size; y++)
68+
{
69+
var modInRow = 0;
70+
var modInColumn = 0;
71+
var lastValRow = qrCode.ModuleMatrix[y][0];
72+
var lastValColumn = qrCode.ModuleMatrix[0][y];
73+
for (var x = 0; x < size; x++)
74+
{
75+
if (qrCode.ModuleMatrix[y][x] == lastValRow)
76+
modInRow++;
77+
else
78+
modInRow = 1;
79+
if (modInRow == 5)
80+
score1 += 3;
81+
else if (modInRow > 5)
82+
score1++;
83+
lastValRow = qrCode.ModuleMatrix[y][x];
84+
85+
86+
if (qrCode.ModuleMatrix[x][y] == lastValColumn)
87+
modInColumn++;
88+
else
89+
modInColumn = 1;
90+
if (modInColumn == 5)
91+
score1 += 3;
92+
else if (modInColumn > 5)
93+
score1++;
94+
lastValColumn = qrCode.ModuleMatrix[x][y];
95+
}
96+
}
97+
98+
99+
//Penalty 2
100+
for (var y = 0; y < size - 1; y++)
101+
{
102+
for (var x = 0; x < size - 1; x++)
103+
{
104+
if (qrCode.ModuleMatrix[y][x] == qrCode.ModuleMatrix[y][x + 1] &&
105+
qrCode.ModuleMatrix[y][x] == qrCode.ModuleMatrix[y + 1][x] &&
106+
qrCode.ModuleMatrix[y][x] == qrCode.ModuleMatrix[y + 1][x + 1])
107+
score2 += 3;
108+
}
109+
}
110+
111+
//Penalty 3
112+
for (var y = 0; y < size; y++)
113+
{
114+
for (var x = 0; x < size - 10; x++)
115+
{
116+
if ((qrCode.ModuleMatrix[y][x] &&
117+
!qrCode.ModuleMatrix[y][x + 1] &&
118+
qrCode.ModuleMatrix[y][x + 2] &&
119+
qrCode.ModuleMatrix[y][x + 3] &&
120+
qrCode.ModuleMatrix[y][x + 4] &&
121+
!qrCode.ModuleMatrix[y][x + 5] &&
122+
qrCode.ModuleMatrix[y][x + 6] &&
123+
!qrCode.ModuleMatrix[y][x + 7] &&
124+
!qrCode.ModuleMatrix[y][x + 8] &&
125+
!qrCode.ModuleMatrix[y][x + 9] &&
126+
!qrCode.ModuleMatrix[y][x + 10]) ||
127+
(!qrCode.ModuleMatrix[y][x] &&
128+
!qrCode.ModuleMatrix[y][x + 1] &&
129+
!qrCode.ModuleMatrix[y][x + 2] &&
130+
!qrCode.ModuleMatrix[y][x + 3] &&
131+
qrCode.ModuleMatrix[y][x + 4] &&
132+
!qrCode.ModuleMatrix[y][x + 5] &&
133+
qrCode.ModuleMatrix[y][x + 6] &&
134+
qrCode.ModuleMatrix[y][x + 7] &&
135+
qrCode.ModuleMatrix[y][x + 8] &&
136+
!qrCode.ModuleMatrix[y][x + 9] &&
137+
qrCode.ModuleMatrix[y][x + 10]))
138+
{
139+
score3 += 40;
140+
}
141+
142+
if ((qrCode.ModuleMatrix[x][y] &&
143+
!qrCode.ModuleMatrix[x + 1][y] &&
144+
qrCode.ModuleMatrix[x + 2][y] &&
145+
qrCode.ModuleMatrix[x + 3][y] &&
146+
qrCode.ModuleMatrix[x + 4][y] &&
147+
!qrCode.ModuleMatrix[x + 5][y] &&
148+
qrCode.ModuleMatrix[x + 6][y] &&
149+
!qrCode.ModuleMatrix[x + 7][y] &&
150+
!qrCode.ModuleMatrix[x + 8][y] &&
151+
!qrCode.ModuleMatrix[x + 9][y] &&
152+
!qrCode.ModuleMatrix[x + 10][y]) ||
153+
(!qrCode.ModuleMatrix[x][y] &&
154+
!qrCode.ModuleMatrix[x + 1][y] &&
155+
!qrCode.ModuleMatrix[x + 2][y] &&
156+
!qrCode.ModuleMatrix[x + 3][y] &&
157+
qrCode.ModuleMatrix[x + 4][y] &&
158+
!qrCode.ModuleMatrix[x + 5][y] &&
159+
qrCode.ModuleMatrix[x + 6][y] &&
160+
qrCode.ModuleMatrix[x + 7][y] &&
161+
qrCode.ModuleMatrix[x + 8][y] &&
162+
!qrCode.ModuleMatrix[x + 9][y] &&
163+
qrCode.ModuleMatrix[x + 10][y]))
164+
{
165+
score3 += 40;
166+
}
167+
}
168+
}
169+
170+
//Penalty 4
171+
int blackModules = 0;
172+
foreach (var bitArray in qrCode.ModuleMatrix)
173+
for (var x = 0; x < size; x++)
174+
if (bitArray[x])
175+
blackModules++;
176+
177+
var percentDiv5 = blackModules * 20 / (qrCode.ModuleMatrix.Count * qrCode.ModuleMatrix.Count);
178+
var prevMultipleOf5 = Math.Abs(percentDiv5 - 10);
179+
var nextMultipleOf5 = Math.Abs(percentDiv5 - 9);
180+
score4 = Math.Min(prevMultipleOf5, nextMultipleOf5) * 10;
181+
182+
return (score1 + score2) + (score3 + score4);
183+
}
184+
}
185+
}
186+
}
187+
}

QRCoder/QRCodeGenerator.ModulePlacer.cs

Lines changed: 1 addition & 178 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace QRCoder
66
{
77
public partial class QRCodeGenerator
88
{
9-
private static class ModulePlacer
9+
private static partial class ModulePlacer
1010
{
1111
public static void AddQuietZone(QRCodeData qrCode)
1212
{
@@ -293,183 +293,6 @@ private static bool IsBlocked(Rectangle r1, List<Rectangle> blockedModules)
293293
}
294294
return false;
295295
}
296-
297-
private static class MaskPattern
298-
{
299-
public static readonly Dictionary<int, Func<int, int, bool>> Patterns =
300-
new Dictionary<int, Func<int, int, bool>>(8) {
301-
{ 1, MaskPattern.Pattern1 }, {2, MaskPattern.Pattern2 }, {3, MaskPattern.Pattern3 }, {4, MaskPattern.Pattern4 },
302-
{ 5, MaskPattern.Pattern5 }, {6, MaskPattern.Pattern6 }, {7, MaskPattern.Pattern7 }, {8, MaskPattern.Pattern8 }
303-
};
304-
305-
public static bool Pattern1(int x, int y)
306-
{
307-
return (x + y) % 2 == 0;
308-
}
309-
310-
public static bool Pattern2(int x, int y)
311-
{
312-
return y % 2 == 0;
313-
}
314-
315-
public static bool Pattern3(int x, int y)
316-
{
317-
return x % 3 == 0;
318-
}
319-
320-
public static bool Pattern4(int x, int y)
321-
{
322-
return (x + y) % 3 == 0;
323-
}
324-
325-
public static bool Pattern5(int x, int y)
326-
{
327-
return ((int)(Math.Floor(y / 2d) + Math.Floor(x / 3d)) % 2) == 0;
328-
}
329-
330-
public static bool Pattern6(int x, int y)
331-
{
332-
return ((x * y) % 2) + ((x * y) % 3) == 0;
333-
}
334-
335-
public static bool Pattern7(int x, int y)
336-
{
337-
return (((x * y) % 2) + ((x * y) % 3)) % 2 == 0;
338-
}
339-
340-
public static bool Pattern8(int x, int y)
341-
{
342-
return (((x + y) % 2) + ((x * y) % 3)) % 2 == 0;
343-
}
344-
345-
public static int Score(QRCodeData qrCode)
346-
{
347-
int score1 = 0,
348-
score2 = 0,
349-
score3 = 0,
350-
score4 = 0;
351-
var size = qrCode.ModuleMatrix.Count;
352-
353-
//Penalty 1
354-
for (var y = 0; y < size; y++)
355-
{
356-
var modInRow = 0;
357-
var modInColumn = 0;
358-
var lastValRow = qrCode.ModuleMatrix[y][0];
359-
var lastValColumn = qrCode.ModuleMatrix[0][y];
360-
for (var x = 0; x < size; x++)
361-
{
362-
if (qrCode.ModuleMatrix[y][x] == lastValRow)
363-
modInRow++;
364-
else
365-
modInRow = 1;
366-
if (modInRow == 5)
367-
score1 += 3;
368-
else if (modInRow > 5)
369-
score1++;
370-
lastValRow = qrCode.ModuleMatrix[y][x];
371-
372-
373-
if (qrCode.ModuleMatrix[x][y] == lastValColumn)
374-
modInColumn++;
375-
else
376-
modInColumn = 1;
377-
if (modInColumn == 5)
378-
score1 += 3;
379-
else if (modInColumn > 5)
380-
score1++;
381-
lastValColumn = qrCode.ModuleMatrix[x][y];
382-
}
383-
}
384-
385-
386-
//Penalty 2
387-
for (var y = 0; y < size - 1; y++)
388-
{
389-
for (var x = 0; x < size - 1; x++)
390-
{
391-
if (qrCode.ModuleMatrix[y][x] == qrCode.ModuleMatrix[y][x + 1] &&
392-
qrCode.ModuleMatrix[y][x] == qrCode.ModuleMatrix[y + 1][x] &&
393-
qrCode.ModuleMatrix[y][x] == qrCode.ModuleMatrix[y + 1][x + 1])
394-
score2 += 3;
395-
}
396-
}
397-
398-
//Penalty 3
399-
for (var y = 0; y < size; y++)
400-
{
401-
for (var x = 0; x < size - 10; x++)
402-
{
403-
if ((qrCode.ModuleMatrix[y][x] &&
404-
!qrCode.ModuleMatrix[y][x + 1] &&
405-
qrCode.ModuleMatrix[y][x + 2] &&
406-
qrCode.ModuleMatrix[y][x + 3] &&
407-
qrCode.ModuleMatrix[y][x + 4] &&
408-
!qrCode.ModuleMatrix[y][x + 5] &&
409-
qrCode.ModuleMatrix[y][x + 6] &&
410-
!qrCode.ModuleMatrix[y][x + 7] &&
411-
!qrCode.ModuleMatrix[y][x + 8] &&
412-
!qrCode.ModuleMatrix[y][x + 9] &&
413-
!qrCode.ModuleMatrix[y][x + 10]) ||
414-
(!qrCode.ModuleMatrix[y][x] &&
415-
!qrCode.ModuleMatrix[y][x + 1] &&
416-
!qrCode.ModuleMatrix[y][x + 2] &&
417-
!qrCode.ModuleMatrix[y][x + 3] &&
418-
qrCode.ModuleMatrix[y][x + 4] &&
419-
!qrCode.ModuleMatrix[y][x + 5] &&
420-
qrCode.ModuleMatrix[y][x + 6] &&
421-
qrCode.ModuleMatrix[y][x + 7] &&
422-
qrCode.ModuleMatrix[y][x + 8] &&
423-
!qrCode.ModuleMatrix[y][x + 9] &&
424-
qrCode.ModuleMatrix[y][x + 10]))
425-
{
426-
score3 += 40;
427-
}
428-
429-
if ((qrCode.ModuleMatrix[x][y] &&
430-
!qrCode.ModuleMatrix[x + 1][y] &&
431-
qrCode.ModuleMatrix[x + 2][y] &&
432-
qrCode.ModuleMatrix[x + 3][y] &&
433-
qrCode.ModuleMatrix[x + 4][y] &&
434-
!qrCode.ModuleMatrix[x + 5][y] &&
435-
qrCode.ModuleMatrix[x + 6][y] &&
436-
!qrCode.ModuleMatrix[x + 7][y] &&
437-
!qrCode.ModuleMatrix[x + 8][y] &&
438-
!qrCode.ModuleMatrix[x + 9][y] &&
439-
!qrCode.ModuleMatrix[x + 10][y]) ||
440-
(!qrCode.ModuleMatrix[x][y] &&
441-
!qrCode.ModuleMatrix[x + 1][y] &&
442-
!qrCode.ModuleMatrix[x + 2][y] &&
443-
!qrCode.ModuleMatrix[x + 3][y] &&
444-
qrCode.ModuleMatrix[x + 4][y] &&
445-
!qrCode.ModuleMatrix[x + 5][y] &&
446-
qrCode.ModuleMatrix[x + 6][y] &&
447-
qrCode.ModuleMatrix[x + 7][y] &&
448-
qrCode.ModuleMatrix[x + 8][y] &&
449-
!qrCode.ModuleMatrix[x + 9][y] &&
450-
qrCode.ModuleMatrix[x + 10][y]))
451-
{
452-
score3 += 40;
453-
}
454-
}
455-
}
456-
457-
//Penalty 4
458-
int blackModules = 0;
459-
foreach (var bitArray in qrCode.ModuleMatrix)
460-
for (var x = 0; x < size; x++)
461-
if (bitArray[x])
462-
blackModules++;
463-
464-
var percentDiv5 = blackModules * 20 / (qrCode.ModuleMatrix.Count * qrCode.ModuleMatrix.Count);
465-
var prevMultipleOf5 = Math.Abs(percentDiv5 - 10);
466-
var nextMultipleOf5 = Math.Abs(percentDiv5 - 9);
467-
score4 = Math.Min(prevMultipleOf5, nextMultipleOf5) * 10;
468-
469-
return (score1 + score2) + (score3 + score4);
470-
}
471-
}
472-
473296
}
474297
}
475298
}

0 commit comments

Comments
 (0)