Module: JXL::Color::Transfer
- Defined in:
- lib/jxl/color/transfer.rb
Class Method Summary collapse
- .decode(value, function, gamma: nil, intensity_target: 255.0) ⇒ Object
- .encode(value, function, gamma: nil, intensity_target: 255.0) ⇒ Object
- .from_linear!(channels, function, gamma: nil, intensity_target: 255.0) ⇒ Object
- .to_linear!(channels, function, gamma: nil, intensity_target: 255.0) ⇒ Object
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 |