Module: JXL::Color::Transfer

Defined in:
lib/jxl/color/transfer.rb

Class Method Summary collapse

Class Method Details

.decode(value, function, gamma: nil, intensity_target: 255.0) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/jxl/color/transfer.rb', line 36

def decode(value, function, gamma: nil, intensity_target: 255.0)
  return value if function == 8
  return signed_power(value, 10_000_000.0 / gamma) if function.nil? && gamma
  return signed_power(value, 2.6) if function == 17
  return value < 0.081 ? value / 4.5 : ((value + 0.099) / 1.099)**(1.0 / 0.45) if function == 1
  return inverse_pq(value, intensity_target) if function == 16
  return inverse_hlg(value) if function == 18
  raise UnsupportedFeatureError, "transfer function #{function}" unless function == 13

  sign = value.negative? ? -1.0 : 1.0
  magnitude = value.abs
  sign * (magnitude <= 0.04045 ? magnitude / 12.92 : ((magnitude + 0.055) / 1.055)**2.4)
end

.encode(value, function, gamma: nil, intensity_target: 255.0) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/jxl/color/transfer.rb', line 15

def encode(value, function, gamma: nil, intensity_target: 255.0)
  return value if function == 8
  return value.positive? ? value**(gamma / 10_000_000.0) : 0.0 if function.nil? && gamma
  return value.positive? ? value**(1.0 / 2.6) : 0.0 if function == 17
  return bt709(value) if function == 1
  return pq(value, intensity_target) if function == 16
  return hlg(value) if function == 18
  raise UnsupportedFeatureError, "transfer function #{function}" unless function == 13

  sign = value.negative? ? -1.0 : 1.0
  magnitude = value.abs
  sign * (magnitude <= 0.0031308 ? 12.92 * magnitude : (1.055 * (magnitude**(1.0 / 2.4))) - 0.055)
end

.from_linear!(channels, function, gamma: nil, intensity_target: 255.0) ⇒ Object



8
9
10
11
12
13
# File 'lib/jxl/color/transfer.rb', line 8

def from_linear!(channels, function, gamma: nil, intensity_target: 255.0)
  channels.first(3).each do |plane|
    plane.data.map! { encode(_1, function, gamma:, intensity_target:) }
  end
  channels
end

.to_linear!(channels, function, gamma: nil, intensity_target: 255.0) ⇒ Object



29
30
31
32
33
34
# File 'lib/jxl/color/transfer.rb', line 29

def to_linear!(channels, function, gamma: nil, intensity_target: 255.0)
  channels.first(3).each do |plane|
    plane.data.map! { decode(_1, function, gamma:, intensity_target:) }
  end
  channels
end