Class: RQRCodeCore::QRBitBuffer

Inherits:
Object
  • Object
show all
Defined in:
lib/rqrcode_core/qrcode/qr_bit_buffer.rb

Constant Summary collapse

PAD0 =
0xEC
PAD1 =
0x11

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(version) ⇒ QRBitBuffer

Returns a new instance of QRBitBuffer.



10
11
12
13
14
# File 'lib/rqrcode_core/qrcode/qr_bit_buffer.rb', line 10

def initialize(version)
  @version = version
  @buffer = []
  @length = 0
end

Instance Attribute Details

#bufferObject (readonly)

Returns the value of attribute buffer.



5
6
7
# File 'lib/rqrcode_core/qrcode/qr_bit_buffer.rb', line 5

def buffer
  @buffer
end

Instance Method Details

#alphanumeric_encoding_start(length) ⇒ Object



49
50
51
52
# File 'lib/rqrcode_core/qrcode/qr_bit_buffer.rb', line 49

def alphanumeric_encoding_start(length)
  put(QRMODE[:mode_alpha_numk], 4)
  put(length, QRUtil.get_length_in_bits(QRMODE[:mode_alpha_numk], @version))
end

#byte_encoding_start(length) ⇒ Object



44
45
46
47
# File 'lib/rqrcode_core/qrcode/qr_bit_buffer.rb', line 44

def byte_encoding_start(length)
  put(QRMODE[:mode_8bit_byte], 4)
  put(length, QRUtil.get_length_in_bits(QRMODE[:mode_8bit_byte], @version))
end

#end_of_message(max_data_bits) ⇒ Object



72
73
74
# File 'lib/rqrcode_core/qrcode/qr_bit_buffer.rb', line 72

def end_of_message(max_data_bits)
  put(0, 4) unless get_length_in_bits + 4 > max_data_bits
end

#get(index) ⇒ Object



16
17
18
19
# File 'lib/rqrcode_core/qrcode/qr_bit_buffer.rb', line 16

def get(index)
  buf_index = (index / 8).floor
  (QRUtil.rszf(@buffer[buf_index], 7 - index % 8) & 1) == 1
end

#get_length_in_bitsObject



27
28
29
# File 'lib/rqrcode_core/qrcode/qr_bit_buffer.rb', line 27

def get_length_in_bits
  @length
end

#numeric_encoding_start(length) ⇒ Object



54
55
56
57
# File 'lib/rqrcode_core/qrcode/qr_bit_buffer.rb', line 54

def numeric_encoding_start(length)
  put(QRMODE[:mode_number], 4)
  put(length, QRUtil.get_length_in_bits(QRMODE[:mode_number], @version))
end

#pad_until(prefered_size) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/rqrcode_core/qrcode/qr_bit_buffer.rb', line 59

def pad_until(prefered_size)
  # Align on byte
  while get_length_in_bits % 8 != 0
    put_bit(false)
  end

  # Pad with padding code words
  while get_length_in_bits < prefered_size
    put(PAD0, 8)
    put(PAD1, 8) if get_length_in_bits < prefered_size
  end
end

#put(num, length) ⇒ Object



21
22
23
24
25
# File 'lib/rqrcode_core/qrcode/qr_bit_buffer.rb', line 21

def put(num, length)
  (0...length).each do |i|
    put_bit((QRUtil.rszf(num, length - i - 1) & 1) == 1)
  end
end

#put_bit(bit) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/rqrcode_core/qrcode/qr_bit_buffer.rb', line 31

def put_bit(bit)
  buf_index = (@length / 8).floor
  if @buffer.size <= buf_index
    @buffer << 0
  end

  if bit
    @buffer[buf_index] |= QRUtil.rszf(0x80, @length % 8)
  end

  @length += 1
end