diff --git a/qrcode/main.py b/qrcode/main.py index 46116b5c..a1beac6d 100644 --- a/qrcode/main.py +++ b/qrcode/main.py @@ -158,11 +158,11 @@ def make(self, fit=True): if fit or (self.version is None): self.best_fit(start=self.version) if self.mask_pattern is None: - self.makeImpl(False, self.best_mask_pattern()) + self.makeImpl(self.best_mask_pattern()) else: - self.makeImpl(False, self.mask_pattern) + self.makeImpl(self.mask_pattern) - def makeImpl(self, test, mask_pattern): + def makeImpl(self, mask_pattern): self.modules_count = self.version * 4 + 17 if self.version in precomputed_qr_blanks: @@ -179,10 +179,10 @@ def makeImpl(self, test, mask_pattern): precomputed_qr_blanks[self.version] = copy_2d_array(self.modules) - self.setup_type_info(test, mask_pattern) + self.setup_type_info(mask_pattern) if self.version >= 7: - self.setup_type_number(test) + self.setup_type_number() if self.data_cache is None: self.data_cache = util.create_data( @@ -246,7 +246,7 @@ def best_mask_pattern(self): pattern = 0 for i in range(8): - self.makeImpl(True, i) + self.makeImpl(i) lost_point = util.lost_point(self.modules) @@ -430,24 +430,24 @@ def setup_position_adjust_pattern(self): else: self.modules[row + r][col + c] = False - def setup_type_number(self, test): + def setup_type_number(self): bits = util.BCH_type_number(self.version) for i in range(18): - mod = not test and ((bits >> i) & 1) == 1 + mod = ((bits >> i) & 1) == 1 self.modules[i // 3][i % 3 + self.modules_count - 8 - 3] = mod for i in range(18): - mod = not test and ((bits >> i) & 1) == 1 + mod = ((bits >> i) & 1) == 1 self.modules[i % 3 + self.modules_count - 8 - 3][i // 3] = mod - def setup_type_info(self, test, mask_pattern): + def setup_type_info(self, mask_pattern): data = (self.error_correction << 3) | mask_pattern bits = util.BCH_type_info(data) # vertical for i in range(15): - mod = not test and ((bits >> i) & 1) == 1 + mod = ((bits >> i) & 1) == 1 if i < 6: self.modules[i][8] = mod @@ -458,7 +458,7 @@ def setup_type_info(self, test, mask_pattern): # horizontal for i in range(15): - mod = not test and ((bits >> i) & 1) == 1 + mod = ((bits >> i) & 1) == 1 if i < 8: self.modules[8][self.modules_count - i - 1] = mod @@ -468,7 +468,7 @@ def setup_type_info(self, test, mask_pattern): self.modules[8][15 - i - 1] = mod # fixed module - self.modules[self.modules_count - 8][8] = not test + self.modules[self.modules_count - 8][8] = True def map_data(self, data, mask_pattern): inc = -1 diff --git a/qrcode/tests/test_qrcode.py b/qrcode/tests/test_qrcode.py index 65242848..a0ccfce4 100644 --- a/qrcode/tests/test_qrcode.py +++ b/qrcode/tests/test_qrcode.py @@ -106,6 +106,20 @@ def test_make_image_with_wrong_pattern(): qrcode.QRCode(mask_pattern=42) +def test_best_mask_pattern_includes_format_info(): + """Mask evaluation should use the complete symbol per ISO 18004 ยง7.8.3.1.""" + qr = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_H) + qr.add_data("hello") + qr.best_fit() + qr.data_cache = qrcode.util.create_data( + qr.version, qr.error_correction, qr.data_list + ) + # The old code zeroed out format info, version info, and the dark module + # during mask evaluation, which violated the spec and selected mask 5 for + # this input. With the complete symbol evaluated, the correct mask is 6. + assert qr.best_mask_pattern() == 6 + + def test_mask_pattern_setter(): qr = qrcode.QRCode()