Class: Aspera::Preview::Backend::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/aspera/preview/terminal.rb

Overview

Base decoder that rescales image data to the current terminal geometry.

Direct Known Subclasses

ChunkyPNG, RMagick

Instance Method Summary collapse

Constructor Details

#initialize(reserve:, double:, font_ratio:) ⇒ Base

Returns a new instance of Base.

Parameters:

  • reserve (Integer)

    number of terminal rows reserved for non-image output

  • double (Boolean)

    when ‘true`, render two image rows in one terminal row

  • font_ratio (Float)

    terminal font aspect ratio: height divided by width



19
20
21
22
23
# File 'lib/aspera/preview/terminal.rb', line 19

def initialize(reserve:, double:, font_ratio:)
  @reserve = reserve
  @height_ratio = double ? 2.0 : 1.0
  @font_ratio = font_ratio
end

Instance Method Details

#terminal_scaling(rows, columns) ⇒ Array<Integer>

Compute output dimensions that fit inside the terminal while preserving aspect ratio.

Parameters:

  • rows (Integer)

    source image height in pixels

  • columns (Integer)

    source image width in pixels

Returns:

  • (Array<Integer>)

    scaled width and height for terminal rendering



30
31
32
33
34
35
# File 'lib/aspera/preview/terminal.rb', line 30

def terminal_scaling(rows, columns)
  (term_rows, term_columns) = IO.console.winsize || [24, 80]
  term_rows = [term_rows - @reserve, 2].max
  fit_term_ratio = [term_rows.to_f * @font_ratio / rows.to_f, term_columns.to_f / columns.to_f].min
  [(columns * fit_term_ratio).to_i, (rows * fit_term_ratio * @height_ratio / @font_ratio).to_i]
end