|
CLAW Library (a C++ Library Absolutely Wonderful) 1.5.5
|
The buffer passed to the LZW decoder to decode the input. More...
Public Member Functions | |
| input_buffer (std::istream &is, u_int_8 code_size) | |
| Constructor. | |
| bool | end_of_data () const |
| Tell if we reached the end of the data and we must restart the decompression procedure. | |
| bool | end_of_information () const |
| Tell if we reached the end of the compressed stream. | |
| unsigned int | symbols_count () const |
| Get The count of symbols in the alphabet. | |
| unsigned int | get_next () |
| Get the next code in the input. | |
| void | reset () |
| Reset the code size and the code limit. | |
| void | new_code (unsigned int code) |
| Inform the input buffer that a new code has been added in the dictionary. | |
Private Member Functions | |
| void | fill_buffer () |
| Fill the input buffer. | |
Private Attributes | |
| unsigned int | m_val |
| The last value read from the input. | |
| std::istream & | m_input |
| The input data. | |
| char | m_buffer [257] |
| Encoded data read from the stream. | |
| std::size_t | m_pending |
| The position of the next byte to read in m_buffer. | |
| unsigned char | m_pending_bits |
| The number of available bits in m_buffer[m_pending]. | |
| std::size_t | m_pending_end |
| The end of the data in m_buffer;. | |
| u_int_8 | m_next_data_length |
| The length of the next data block. | |
| const unsigned int | m_initial_code_size |
| The initial size of the codes. | |
| unsigned int | m_code_size |
| The current size of the codes. | |
| unsigned int | m_code_limit |
| The maximum code allowed with the current code size. | |
| claw::graphic::gif::reader::input_buffer::input_buffer | ( | std::istream & | is, |
| u_int_8 | code_size | ||
| ) |
Constructor.
| is | The stream from which we read the data. |
| code_size | The initial size of the codes. |
Definition at line 46 of file gif_reader.cpp.
: m_val(0), m_input(is), m_pending(0), m_pending_bits(0), m_pending_end(0), m_initial_code_size(code_size), m_code_size(m_initial_code_size+1), m_code_limit(1 << m_code_size) { m_input.read ( reinterpret_cast<char*>(&m_next_data_length), sizeof(m_next_data_length) ); } // gif::reader::input_buffer::input_buffer()
| bool claw::graphic::gif::reader::input_buffer::end_of_data | ( | ) | const |
Tell if we reached the end of the data and we must restart the decompression procedure.
Definition at line 61 of file gif_reader.cpp.
References end_of_information(), m_initial_code_size, and m_val.
{
return (m_val == (unsigned int)(1 << m_initial_code_size))
|| end_of_information();
} // gif::reader::input_buffer::end_of_data()
| bool claw::graphic::gif::reader::input_buffer::end_of_information | ( | ) | const |
Tell if we reached the end of the compressed stream.
Definition at line 71 of file gif_reader.cpp.
Referenced by claw::graphic::gif::reader::decode_data(), and end_of_data().
{
return !m_input || (m_val == (unsigned int)(1 << m_initial_code_size)+1)
|| ( (m_next_data_length == 0) // no more data in the stream
&& (m_pending == m_pending_end) // no more data in the buffer
&& (m_pending_bits < m_code_size) );
} // gif::reader::input_buffer::end_of_information()
| void claw::graphic::gif::reader::input_buffer::fill_buffer | ( | ) | [private] |
Fill the input buffer.
Definition at line 177 of file gif_reader.cpp.
{
// move available data at the begining of the buffer
std::copy( m_buffer + m_pending, m_buffer + m_pending_end, m_buffer );
m_pending_end = m_pending_end - m_pending;
m_pending = 0;
if (m_next_data_length != 0)
{
assert( m_pending_end + m_next_data_length <= sizeof(m_buffer) );
m_input.read( m_buffer + m_pending_end, m_next_data_length );
m_pending_end += m_next_data_length;
if ( (m_pending_bits == 0) && (m_pending != m_pending_end) )
m_pending_bits = CHAR_BIT;
m_input.read
( reinterpret_cast<char*>(&m_next_data_length),
sizeof(m_next_data_length) );
}
} // gif::reader::input_buffer::fill_buffer()
| unsigned int claw::graphic::gif::reader::input_buffer::get_next | ( | ) |
Get the next code in the input.
Definition at line 92 of file gif_reader.cpp.
{
if ( m_pending == m_pending_end )
fill_buffer();
else if ( m_pending_bits + (m_pending_end - m_pending - 1) * CHAR_BIT
< m_code_size )
fill_buffer();
m_val = 0;
std::size_t n(m_code_size);
unsigned int cur_size = 0;
char* buf = reinterpret_cast<char*>(&m_val);
while ( (n != 0) && m_input )
{
while( (m_pending_bits != 0) && (n!=0) && m_input )
{
unsigned int bits = std::min((std::size_t)m_pending_bits, n);
if ( CHAR_BIT - cur_size < bits )
bits = CHAR_BIT - cur_size;
unsigned int mask = (1 << bits) - 1;
*buf |= (m_buffer[m_pending] & mask) << cur_size;
cur_size += bits;
m_pending_bits -= bits;
m_buffer[m_pending] >>= bits;
n -= bits;
if ( cur_size == CHAR_BIT )
{
++buf;
cur_size = 0;
}
}
if ( m_pending_bits == 0 )
{
++m_pending;
if ( (m_pending == m_pending_end) && (n!=0) )
fill_buffer();
if ( m_pending == m_pending_end )
n = 0;
else
m_pending_bits = CHAR_BIT;
}
}
return m_val;
} // gif::reader::input_buffer::get_next()
| void claw::graphic::gif::reader::input_buffer::new_code | ( | unsigned int | code | ) |
Inform the input buffer that a new code has been added in the dictionary.
| code | The new code. |
Definition at line 164 of file gif_reader.cpp.
{
if ( (code == m_code_limit) && (m_code_size != 12) )
{
++m_code_size;
m_code_limit = 1 << m_code_size;
}
} // gif::reader::input_buffer::new_code()
| void claw::graphic::gif::reader::input_buffer::reset | ( | ) |
Reset the code size and the code limit.
Definition at line 151 of file gif_reader.cpp.
Referenced by claw::graphic::gif::reader::decode_data().
{
m_val = 0;
m_code_size = m_initial_code_size+1;
m_code_limit = 1 << m_code_size;
} // gif::reader::input_buffer::reset()
| unsigned int claw::graphic::gif::reader::input_buffer::symbols_count | ( | ) | const |
Get The count of symbols in the alphabet.
Definition at line 83 of file gif_reader.cpp.
{
return (1 << m_initial_code_size) + 2;
} // gif::reader::input_buffer::symbols_count()
char claw::graphic::gif::reader::input_buffer::m_buffer[257] [private] |
unsigned int claw::graphic::gif::reader::input_buffer::m_code_limit [private] |
unsigned int claw::graphic::gif::reader::input_buffer::m_code_size [private] |
const unsigned int claw::graphic::gif::reader::input_buffer::m_initial_code_size [private] |
std::istream& claw::graphic::gif::reader::input_buffer::m_input [private] |
std::size_t claw::graphic::gif::reader::input_buffer::m_pending [private] |
unsigned char claw::graphic::gif::reader::input_buffer::m_pending_bits [private] |
std::size_t claw::graphic::gif::reader::input_buffer::m_pending_end [private] |
unsigned int claw::graphic::gif::reader::input_buffer::m_val [private] |
The last value read from the input.
Definition at line 322 of file gif.hpp.
Referenced by end_of_data().
1.7.3