Class: QRCode::Encoder::BitBuffer

Inherits:
Object
  • Object
show all
Defined in:
lib/qrcode/encoder/bit_buffer.rb

Constant Summary collapse

PAD0 =
0xEC
PAD1 =
0x11

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(version) ⇒ BitBuffer

Returns a new instance of BitBuffer.



23
24
25
26
27
# File 'lib/qrcode/encoder/bit_buffer.rb', line 23

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

Instance Attribute Details

#bufferObject (readonly)

Returns the value of attribute buffer.



18
19
20
# File 'lib/qrcode/encoder/bit_buffer.rb', line 18

def buffer
  @buffer
end

Instance Method Details

#alphanumeric_encoding_start(length) ⇒ Object



62
63
64
65
# File 'lib/qrcode/encoder/bit_buffer.rb', line 62

def alphanumeric_encoding_start(length)
	put(MODE[:mode_alpha_numk], 4)
	put(length, Encoder::Util.get_length_in_bits(MODE[:mode_alpha_numk], @version))
end

#byte_encoding_start(length) ⇒ Object



57
58
59
60
# File 'lib/qrcode/encoder/bit_buffer.rb', line 57

def byte_encoding_start(length)
	put(MODE[:mode_8bit_byte], 4)
	put(length, Encoder::Util.get_length_in_bits(MODE[:mode_8bit_byte], @version))
end

#end_of_message(max_data_bits) ⇒ Object



85
86
87
# File 'lib/qrcode/encoder/bit_buffer.rb', line 85

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

#get(index) ⇒ Object



29
30
31
32
# File 'lib/qrcode/encoder/bit_buffer.rb', line 29

def get(index)
	byte_index = (index / 8).floor
	(Encoder::Util.rszf(@buffer[byte_index], 7 - index % 8) & 1) == 1
end

#get_length_in_bitsObject



40
41
42
# File 'lib/qrcode/encoder/bit_buffer.rb', line 40

def get_length_in_bits
	@length
end

#numeric_encoding_start(length) ⇒ Object



67
68
69
70
# File 'lib/qrcode/encoder/bit_buffer.rb', line 67

def numeric_encoding_start(length)
	put(MODE[:mode_number], 4)
	put(length, Encoder::Util.get_length_in_bits(MODE[:mode_number], @version))
end

#pad_until(prefered_size) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/qrcode/encoder/bit_buffer.rb', line 72

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



34
35
36
37
38
# File 'lib/qrcode/encoder/bit_buffer.rb', line 34

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

#put_bit(bit) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/qrcode/encoder/bit_buffer.rb', line 44

def put_bit(bit)
	byte_index = (@length / 8).floor
	if @buffer.size <= byte_index
		@buffer << 0
	end
	
	if bit
		@buffer[byte_index] |= Encoder::Util.rszf(0x80, @length % 8)
	end
	
	@length += 1
end