| Class | Origami::Filter::RunLength |
| In: |
sources/parser/filters.rb
|
| Parent: | Object |
Decodes data using RLE decompression method.
| stream: | The data to decode. |
# File sources/parser/filters.rb, line 726
726: def decode(stream)
727:
728: i = 0
729: result = ""
730:
731: if not stream.include?(EOD) then raise InvalidRunLengthData, "No end marker" end
732:
733: until stream[i] == EOD do
734:
735: length = stream[i]
736: if length < EOD
737: result << stream[i + 1, length + 1]
738: i = i + length + 2
739: else
740: result << stream[i + 1,1] * (257 - length)
741: i = i + 2
742: end
743:
744: end
745:
746: result
747: end
Encodes data using RLE compression method.
| stream: | The data to encode. |
# File sources/parser/filters.rb, line 678
678: def encode(stream)
679:
680: result = ""
681: i = 0
682:
683: while i < stream.size
684:
685: #
686: # How many identical bytes coming?
687: #
688: length = 1
689: while i+1 < stream.size and length < EOD and stream[i] == stream[i+1]
690: length = length + 1
691: i = i + 1
692: end
693:
694: #
695: # If more than 1, then compress them.
696: #
697: if length > 1
698: result << (257 - length).chr << stream[i,1]
699:
700: #
701: # Otherwise how many different bytes to copy ?
702: #
703: else
704: j = i
705: while j+1 < stream.size and (j - i + 1) < EOD and stream[j] != stream[j+1]
706: j = j + 1
707: end
708:
709: length = j - i
710: result << length.chr << stream[i, length+1]
711:
712: i = j
713: end
714:
715: i = i + 1
716: end
717:
718: result << EOD
719: end