Class: Quadtone::QuadFile

Inherits:
Object
  • Object
show all
Defined in:
lib/quadtone/quad_file.rb

Constant Summary collapse

ChannelAliases =
{
  'C' => 'c',
  'M' => 'm',
  'Y' => 'y',
  'K' => 'k',
  'c' => 'lc',
  'm' => 'lm',
  'k' => 'lk',
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(profile) ⇒ QuadFile

Returns a new instance of QuadFile.



17
18
19
20
21
# File 'lib/quadtone/quad_file.rb', line 17

def initialize(profile)
  @profile = profile
  @curve_set = CurveSet.new(channels: [], profile: @profile, type: :separation)
  load(@profile.quad_file_path)
end

Instance Attribute Details

#curve_setObject

Returns the value of attribute curve_set.



5
6
7
# File 'lib/quadtone/quad_file.rb', line 5

def curve_set
  @curve_set
end

Instance Method Details

#load(quad_file) ⇒ Object

Read QTR quad (curve) file



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/quadtone/quad_file.rb', line 25

def load(quad_file)
  ;;warn "reading #{quad_file}"
  lines = Path.new(quad_file).open.readlines.map { |line| line.chomp.force_encoding('ISO-8859-1') }
  # process header
  channels = parse_channel_list(lines.shift)
  channels.each do |channel|
    samples = (0..255).to_a.map do |input|
      lines.shift while lines.first =~ /^#/
      line = lines.shift
      line =~ /^(\d+)$/ or raise "Unexpected value: #{line.inspect}"
      output = $1.to_i
      Sample.new(input: Color::Gray.new(k: 100 * (input / 255.0)), output: Color::Gray.new(k: 100 * (output / 65535.0)))
    end
    if @profile.inks.include?(channel)
      @curve_set.curves << Curve.new(channel: channel, samples: samples)
    end
  end
end

#parse_channel_list(line) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/quadtone/quad_file.rb', line 44

def parse_channel_list(line)
  # "## QuadToneRIP K,C,M,Y,LC,LM"
  # "## QuadToneRIP KCMY"
  line =~ /^##\s+QuadToneRIP\s+(.*)$/ or raise "Unexpected header line: #{line.inspect}"
  channel_list = $1
  case channel_list
  when /,/
    channel_list.split(',')
  else
    channel_list.chars.map { |c| ChannelAliases[c] }
  end.map { |c| c.downcase.to_sym }
end