Method: Origami::Filter::LZW#encode

Defined in:
lib/origami/filters/lzw.rb

#encode(string) ⇒ Object

Encodes given data using LZW compression method.

stream

The data to encode.



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/origami/filters/lzw.rb', line 67

def encode(string)
  if @params.Predictor.is_a?(Integer)
    colors  = @params.Colors.is_a?(Integer) ?  @params.Colors.to_i : 1
    bpc     = @params.BitsPerComponent.is_a?(Integer) ? @params.BitsPerComponent.to_i : 8
    columns = @params.Columns.is_a?(Integer) ? @params.Columns.to_i : 1

    string = Predictor.do_pre_prediction(string, @params.Predictor.to_i, colors, bpc, columns)
  end       
  
  codesize = 9
  result = Utils::BitWriter.new
  result.write(CLEARTABLE, codesize)
  table = clear({})
  
  s = ''        
  string.each_byte do |byte|
    char = byte.chr
    
    case table.size
      when 512 then codesize = 10
      when 1024 then codesize = 11
      when 2048 then codesize = 12
      when 4096
        result.write(CLEARTABLE, codesize)
        codesize = 9
        clear table
        redo
    end
   
    it = s + char
    if table.has_key?(it)
      s = it
    else
      result.write(table[s], codesize)
      table[it] = table.size
      s = char
    end
  end
   
  result.write(table[s], codesize)
  result.write(EOD, codesize)
  
  result.final.to_s
end