module ChunkyPNG::Chunk

def self.read(io)

Returns:
  • (ChunkyPNG::Chung::Base) - The loaded chunk instance.

Parameters:
  • io (IO, #read) -- The IO stream to read from.
def self.read(io)
  length, type = read_bytes(io, 8).unpack("Na4")
  content = read_bytes(io, length)
  crc     = read_bytes(io, 4).unpack("N").first
  verify_crc!(type, content, crc)
  CHUNK_TYPES.fetch(type, Generic).read(type, content)
end

def self.read_bytes(io, length)

Raises:
  • (ChunkyPNG::ExpectationFailed) - If not exactly length

Returns:
  • (String) - A binary string of exactly length bytes.

Parameters:
  • length (Integer) -- The IO exact number of bytes to read.
  • io (IO, #read) -- The IO stream to read from.
def self.read_bytes(io, length)
  data = io.read(length)
  raise ExpectationFailed, "Couldn't read #{length} bytes from IO stream." if data.nil? || data.bytesize != length
  data
end

def self.verify_crc!(type, content, found_crc)

Raises:
  • (ChunkyPNG::CRCMismatch) - An exception is raised if

Parameters:
  • found_crc (Integer) -- The chunk's found CRC value.
  • content (String) -- The chunk's content.
  • type (String) -- The chunk's type.
def self.verify_crc!(type, content, found_crc)
  expected_crc = Zlib.crc32(content, Zlib.crc32(type))
  raise ChunkyPNG::CRCMismatch, "Chuck CRC mismatch!" if found_crc != expected_crc
end