class PDF::Reader::Filter::RunLength

implementation of the run length stream filter

Public Class Methods

new(options = {}) click to toggle source
# File lib/pdf/reader/filter/run_length.rb, line 11
def initialize(options = {})
  @options = options
end

Public Instance Methods

filter(data) click to toggle source

Decode the specified data with the RunLengthDecode compression algorithm

# File lib/pdf/reader/filter/run_length.rb, line 17
def filter(data)
  pos = 0
  out = "".dup

  while pos < data.length
    length = data.getbyte(pos)
    pos += 1

    unless length.nil?
      case
        # nothing
      when length == 128
        break
      when length < 128
        # When the length is < 128, we copy the following length+1 bytes
        # literally.
        out << data[pos, length + 1]
        pos += length
      else
        # When the length is > 128, we copy the next byte (257 - length)
        # times; i.e., "\xFA\x00" ([250, 0]) will expand to
        # "\x00\x00\x00\x00\x00\x00\x00".
        previous_byte = data[pos, 1] || ""
        out << previous_byte * (257 - length)
      end
    end

    pos += 1
  end

  Depredict.new(@options).filter(out)
end