Sha256: a85c3da45d30097df931e7f0d2192e0b15f76f0275604ae4a96fecf9800e88d1

Contents?: true

Size: 1.47 KB

Versions: 16

Compression:

Stored size: 1.47 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 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

16 entries across 16 versions & 1 rubygems

Version Path
format_parser-0.15.1 lib/parsers/dpx_parser.rb
format_parser-0.15.0 lib/parsers/dpx_parser.rb
format_parser-0.14.1 lib/parsers/dpx_parser.rb
format_parser-0.14.0 lib/parsers/dpx_parser.rb
format_parser-0.13.6 lib/parsers/dpx_parser.rb
format_parser-0.13.5 lib/parsers/dpx_parser.rb
format_parser-0.13.4 lib/parsers/dpx_parser.rb
format_parser-0.13.3 lib/parsers/dpx_parser.rb
format_parser-0.13.2 lib/parsers/dpx_parser.rb
format_parser-0.13.1 lib/parsers/dpx_parser.rb
format_parser-0.13.0 lib/parsers/dpx_parser.rb
format_parser-0.12.4 lib/parsers/dpx_parser.rb
format_parser-0.12.2 lib/parsers/dpx_parser.rb
format_parser-0.12.1 lib/parsers/dpx_parser.rb
format_parser-0.12.0 lib/parsers/dpx_parser.rb
format_parser-0.11.0 lib/parsers/dpx_parser.rb