Class: FileData::OrdinalIfd

Inherits:
Object
  • Object
show all
Includes:
TagEnumerator
Defined in:
lib/file_data/formats/exif/ordinal_ifd.rb

Overview

Represents either the zeroth or first ifd

Constant Summary

Constants included from TagEnumerator

TagEnumerator::TAG_RECORD_SIZE

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from TagEnumerator

#read_num_tags, #tags_enum, #tags_size

Constructor Details

#initialize(exif_stream, index) ⇒ OrdinalIfd

Returns a new instance of OrdinalIfd.



11
12
13
14
# File 'lib/file_data/formats/exif/ordinal_ifd.rb', line 11

def initialize(exif_stream, index)
  @stream = exif_stream
  @index = index
end

Instance Attribute Details

#indexObject (readonly)

Returns the value of attribute index.



7
8
9
# File 'lib/file_data/formats/exif/ordinal_ifd.rb', line 7

def index
  @index
end

#streamObject (readonly)

Returns the value of attribute stream.



7
8
9
# File 'lib/file_data/formats/exif/ordinal_ifd.rb', line 7

def stream
  @stream
end

Instance Method Details

#pointer_tag?(tag_id) ⇒ Boolean

Returns:

  • (Boolean)


30
31
32
# File 'lib/file_data/formats/exif/ordinal_ifd.rb', line 30

def pointer_tag?(tag_id)
  ExifTags.tag_groups.key?(tag_id)
end

#process_extra_ifd(enumerator, tag_id) ⇒ Object



34
35
36
37
# File 'lib/file_data/formats/exif/ordinal_ifd.rb', line 34

def process_extra_ifd(enumerator, tag_id)
  seek_ifd(stream.read_tag_value)
  tags_enum.each { |t| yield_tag(enumerator, tag_id, t) }
end

#process_tag(enumerator, tag_id) ⇒ Object



22
23
24
25
26
27
28
# File 'lib/file_data/formats/exif/ordinal_ifd.rb', line 22

def process_tag(enumerator, tag_id)
  if pointer_tag?(tag_id)
    process_extra_ifd(enumerator, tag_id)
  else
    yield_tag(enumerator, :Tiff, tag_id)
  end
end

#seek_ifd(pointer_value) ⇒ Object



43
44
45
# File 'lib/file_data/formats/exif/ordinal_ifd.rb', line 43

def seek_ifd(pointer_value)
  stream.seek_exif(pointer_value)
end

#skipObject



47
48
49
# File 'lib/file_data/formats/exif/ordinal_ifd.rb', line 47

def skip
  stream.seek(tags_size(read_num_tags), IO::SEEK_CUR)
end

#tagsObject



16
17
18
19
20
# File 'lib/file_data/formats/exif/ordinal_ifd.rb', line 16

def tags
  Enumerator.new do |e|
    tags_enum.each { |tag_id| process_tag(e, tag_id) }
  end
end

#yield_tag(enumerator, ifd_id, tag_id) ⇒ Object



39
40
41
# File 'lib/file_data/formats/exif/ordinal_ifd.rb', line 39

def yield_tag(enumerator, ifd_id, tag_id)
  enumerator.yield [index, ifd_id, tag_id]
end