Class: Dimensions::Scanner

Inherits:
Object
  • Object
show all
Defined in:
lib/dimensions/scanner.rb

Direct Known Subclasses

ExifScanner, JpegScanner, TiffScanner

Defined Under Namespace

Classes: ScanError

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data) ⇒ Scanner

Returns a new instance of Scanner.



7
8
9
10
11
12
13
# File 'lib/dimensions/scanner.rb', line 7

def initialize(data)
  @data = data.dup
  @data.force_encoding("BINARY") if @data.respond_to?(:force_encoding)
  @size = @data.length
  @pos  = 0
  big!  # endianness
end

Instance Attribute Details

#posObject (readonly)

Returns the value of attribute pos.



5
6
7
# File 'lib/dimensions/scanner.rb', line 5

def pos
  @pos
end

Instance Method Details

#advance(length) ⇒ Object



38
39
40
41
# File 'lib/dimensions/scanner.rb', line 38

def advance(length)
  @pos += length
  raise_scan_error if @pos > @size
end

#big!Object



48
49
50
# File 'lib/dimensions/scanner.rb', line 48

def big!
  @big = true
end

#little!Object



52
53
54
# File 'lib/dimensions/scanner.rb', line 52

def little!
  @big = false
end

#raise_scan_errorObject

Raises:



56
57
58
# File 'lib/dimensions/scanner.rb', line 56

def raise_scan_error
  raise ScanError
end

#read(size, format) ⇒ Object



27
28
29
30
# File 'lib/dimensions/scanner.rb', line 27

def read(size, format)
  data = read_data(size)
  data.unpack(format)[0]
end

#read_charObject



15
16
17
# File 'lib/dimensions/scanner.rb', line 15

def read_char
  read(1, "C")
end

#read_data(size) ⇒ Object



32
33
34
35
36
# File 'lib/dimensions/scanner.rb', line 32

def read_data(size)
  data = @data[@pos, size]
  advance(size)
  data
end

#read_longObject



23
24
25
# File 'lib/dimensions/scanner.rb', line 23

def read_long
  read(4, @big ? "N" : "V")
end

#read_shortObject



19
20
21
# File 'lib/dimensions/scanner.rb', line 19

def read_short
  read(2, @big ? "n" : "v")
end

#skip_to(pos) ⇒ Object



43
44
45
46
# File 'lib/dimensions/scanner.rb', line 43

def skip_to(pos)
  @pos = pos
  raise_scan_error if @pos > @size
end