class RQRCodeCore::QRUtil
Constants
- BITS_FOR_MODE
- DEMERIT_POINTS_1
- DEMERIT_POINTS_2
- DEMERIT_POINTS_3
- DEMERIT_POINTS_4
- G15
- G15_MASK
- G18
- PATTERN_POSITION_TABLE
Public Class Methods
demerit_points_1_same_color(modules)
click to toggle source
# File lib/rqrcode_core/qrcode/qr_util.rb, line 156 def self.demerit_points_1_same_color(modules) demerit_points = 0 module_count = modules.size # level1 (0...module_count).each do |row| (0...module_count).each do |col| same_count = 0 dark = modules[row][col] (-1..1).each do |r| next if row + r < 0 || module_count <= row + r (-1..1).each do |c| next if col + c < 0 || module_count <= col + c next if r == 0 && c == 0 if dark == modules[row + r][col + c] same_count += 1 end end end if same_count > 5 demerit_points += (DEMERIT_POINTS_1 + same_count - 5) end end end demerit_points end
demerit_points_2_full_blocks(modules)
click to toggle source
# File lib/rqrcode_core/qrcode/qr_util.rb, line 187 def self.demerit_points_2_full_blocks(modules) demerit_points = 0 module_count = modules.size # level 2 (0...(module_count - 1)).each do |row| (0...(module_count - 1)).each do |col| count = 0 count += 1 if modules[row][col] count += 1 if modules[row + 1][col] count += 1 if modules[row][col + 1] count += 1 if modules[row + 1][col + 1] if count == 0 || count == 4 demerit_points += DEMERIT_POINTS_2 end end end demerit_points end
demerit_points_3_dangerous_patterns(modules)
click to toggle source
# File lib/rqrcode_core/qrcode/qr_util.rb, line 208 def self.demerit_points_3_dangerous_patterns(modules) demerit_points = 0 module_count = modules.size # level 3 modules.each do |row| (module_count - 6).times do |col_idx| if row[col_idx] && !row[col_idx + 1] && row[col_idx + 2] && row[col_idx + 3] && row[col_idx + 4] && !row[col_idx + 5] && row[col_idx + 6] demerit_points += DEMERIT_POINTS_3 end end end (0...module_count).each do |col| (0...(module_count - 6)).each do |row| if modules[row][col] && !modules[row + 1][col] && modules[row + 2][col] && modules[row + 3][col] && modules[row + 4][col] && !modules[row + 5][col] && modules[row + 6][col] demerit_points += DEMERIT_POINTS_3 end end end demerit_points end
demerit_points_4_dark_ratio(modules)
click to toggle source
# File lib/rqrcode_core/qrcode/qr_util.rb, line 244 def self.demerit_points_4_dark_ratio(modules) # level 4 dark_count = modules.reduce(0) do |sum, col| sum + col.count(true) end ratio = dark_count / (modules.size * modules.size) ratio_delta = (100 * ratio - 50).abs / 5 ratio_delta * DEMERIT_POINTS_4 end
get_bch_digit(data)
click to toggle source
# File lib/rqrcode_core/qrcode/qr_util.rb, line 89 def self.get_bch_digit(data) digit = 0 while data != 0 digit += 1 data = QRUtil.rszf(data, 1) end digit end
get_bch_format_info(data)
click to toggle source
# File lib/rqrcode_core/qrcode/qr_util.rb, line 68 def self.get_bch_format_info(data) d = data << 10 while QRUtil.get_bch_digit(d) - QRUtil.get_bch_digit(G15) >= 0 d ^= (G15 << (QRUtil.get_bch_digit(d) - QRUtil.get_bch_digit(G15))) end ((data << 10) | d) ^ G15_MASK end
get_bch_version(data)
click to toggle source
# File lib/rqrcode_core/qrcode/qr_util.rb, line 81 def self.get_bch_version(data) d = data << 12 while QRUtil.get_bch_digit(d) - QRUtil.get_bch_digit(G18) >= 0 d ^= (G18 << (QRUtil.get_bch_digit(d) - QRUtil.get_bch_digit(G18))) end (data << 12) | d end
get_error_correct_polynomial(error_correct_length)
click to toggle source
# File lib/rqrcode_core/qrcode/qr_util.rb, line 112 def self.get_error_correct_polynomial(error_correct_length) a = QRPolynomial.new([1], 0) (0...error_correct_length).each do |i| a = a.multiply(QRPolynomial.new([1, QRMath.gexp(i)], 0)) end a end
get_length_in_bits(mode, version)
click to toggle source
# File lib/rqrcode_core/qrcode/qr_util.rb, line 122 def self.get_length_in_bits(mode, version) if !QRMODE.value?(mode) raise QRCodeRunTimeError, "Unknown mode: #{mode}" end if version > 40 raise QRCodeRunTimeError, "Unknown version: #{version}" end if version.between?(1, 9) # 1 - 9 macro_version = 0 elsif version <= 26 # 10 - 26 macro_version = 1 elsif version <= 40 # 27 - 40 macro_version = 2 end BITS_FOR_MODE[mode][macro_version] end
get_lost_points(modules)
click to toggle source
# File lib/rqrcode_core/qrcode/qr_util.rb, line 145 def self.get_lost_points(modules) demerit_points = 0 demerit_points += QRUtil.demerit_points_1_same_color(modules) demerit_points += QRUtil.demerit_points_2_full_blocks(modules) demerit_points += QRUtil.demerit_points_3_dangerous_patterns(modules) demerit_points += QRUtil.demerit_points_4_dark_ratio(modules) demerit_points end
get_mask(mask_pattern, i, j)
click to toggle source
# File lib/rqrcode_core/qrcode/qr_util.rb, line 104 def self.get_mask(mask_pattern, i, j) if mask_pattern > QRMASKCOMPUTATIONS.size raise QRCodeRunTimeError, "bad mask_pattern: #{mask_pattern}" end QRMASKCOMPUTATIONS[mask_pattern].call(i, j) end
get_pattern_positions(version)
click to toggle source
# File lib/rqrcode_core/qrcode/qr_util.rb, line 100 def self.get_pattern_positions(version) PATTERN_POSITION_TABLE[version - 1] end
max_size()
click to toggle source
# File lib/rqrcode_core/qrcode/qr_util.rb, line 64 def self.max_size PATTERN_POSITION_TABLE.count end
rszf(num, count)
click to toggle source
# File lib/rqrcode_core/qrcode/qr_util.rb, line 76 def self.rszf(num, count) # zero fill right shift (num >> count) & ((2**((num.size * 8) - count)) - 1) end