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