class RQRCode::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/qrcode/qr_util.rb, line 165
def QRUtil.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

  return demerit_points
end
demerit_points_2_full_blocks(modules) click to toggle source
# File lib/rqrcode/qrcode/qr_util.rb, line 196
def QRUtil.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

  return demerit_points
end
demerit_points_3_dangerous_patterns(modules) click to toggle source
# File lib/rqrcode/qrcode/qr_util.rb, line 217
def QRUtil.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

  return demerit_points
end
demerit_points_4_dark_ratio(modules) click to toggle source
# File lib/rqrcode/qrcode/qr_util.rb, line 253
def QRUtil.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

  demerit_points = ratio_delta * DEMERIT_POINTS_4
  return demerit_points
end
get_bch_digit( data ) click to toggle source
# File lib/rqrcode/qrcode/qr_util.rb, line 94
def QRUtil.get_bch_digit( data )
  digit = 0

  while data != 0
    digit = digit + 1
    data = (data).rszf(1)
  end

  digit
end
get_bch_format_info( data ) click to toggle source
# File lib/rqrcode/qrcode/qr_util.rb, line 76
def QRUtil.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/qrcode/qr_util.rb, line 85
def QRUtil.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/qrcode/qr_util.rb, line 120
def QRUtil.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/qrcode/qr_util.rb, line 131
def QRUtil.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

  return BITS_FOR_MODE[mode][macro_version]
end
get_lost_points(modules) click to toggle source
# File lib/rqrcode/qrcode/qr_util.rb, line 154
def QRUtil.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)

  return demerit_points
end
get_mask( mask_pattern, i, j ) click to toggle source
# File lib/rqrcode/qrcode/qr_util.rb, line 111
def QRUtil.get_mask( mask_pattern, i, j )
  if mask_pattern > QRMASKCOMPUTATIONS.size
    raise QRCodeRunTimeError, "bad mask_pattern: #{mask_pattern}"  
  end

  return QRMASKCOMPUTATIONS[mask_pattern].call(i, j)
end
get_pattern_positions(version) click to toggle source
# File lib/rqrcode/qrcode/qr_util.rb, line 106
def QRUtil.get_pattern_positions(version)
  PATTERN_POSITION_TABLE[version - 1]
end