26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
# File 'lib/parsers/dpx_parser.rb', line 26
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
|