Sha256: e4f4671d01bcccc8ed857d15440b4cc8b3140d287db9e573435e5e61a5e0832d

Contents?: true

Size: 1.54 KB

Versions: 2

Compression:

Stored size: 1.54 KB

Contents

require 'delegate'

class FormatParser::DPXParser
  include FormatParser::IOUtils
  require_relative 'dpx_parser/dpx_structs'
  BE_MAGIC = 'SDPX'
  LE_MAGIC = BE_MAGIC.reverse

  class ByteOrderHintIO < SimpleDelegator
    def initialize(io, is_little_endian)
      super(io)
      @little_endian = is_little_endian
    end

    def le?
      @little_endian
    end
  end

  private_constant :ByteOrderHintIO

  def self.likely_match?(filename)
    filename =~ /\.dpx$/i
  end

  def call(io)
    io = FormatParser::IOConstraint.new(io)
    magic = safe_read(io, 4)
    return unless [BE_MAGIC, LE_MAGIC].include?(magic)

    io.seek(0)

    dpx_structure = DPX.read_and_unpack(ByteOrderHintIO.new(io, magic == LE_MAGIC))

    w = dpx_structure.fetch(:image).fetch(:pixels_per_line)
    h = dpx_structure.fetch(:image).fetch(:lines_per_element)

    pixel_aspect_w = dpx_structure.fetch(:orientation).fetch(:horizontal_pixel_aspect)
    pixel_aspect_h = dpx_structure.fetch(:orientation).fetch(:vertical_pixel_aspect)
    pixel_aspect = pixel_aspect_w / pixel_aspect_h.to_f

    image_aspect = w / h.to_f * pixel_aspect

    display_w = w
    display_h = h
    if image_aspect > 1
      display_h = (display_w / image_aspect).round
    else
      display_w = (display_h * image_aspect).round
    end

    FormatParser::Image.new(
      format: :dpx,
      width_px: w,
      height_px: h,
      display_width_px: display_w,
      display_height_px: display_h,
      intrinsics: dpx_structure,
    )
  end

  FormatParser.register_parser self, natures: :image, formats: :dpx
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
format_parser-0.16.1 lib/parsers/dpx_parser.rb
format_parser-0.16.0 lib/parsers/dpx_parser.rb