defmodule Fledex.Color.Conversion.Raw do
use Fledex.Color.Types
@hsv_section_3 0x40
@spec hsv2rgb(hsv, any) :: rgb
def hsv2rgb({h,s,v}, _extra_color_correction) do
invsat = 255 - s
brightness_floor = trunc((v*invsat) / 256)
color_amplitude = v - brightness_floor
section = trunc(h / @hsv_section_3)
offset = rem(h, @hsv_section_3)
rampup = offset
rampdown = (@hsv_section_3 - 1) - offset
rampup_amp_adj = trunc((rampup * color_amplitude) / (256/4))
rampdown_amp_adj = trunc((rampdown * color_amplitude) / (256/4))
rampup_adj_with_floor = rampup_amp_adj + brightness_floor
rampdown_adj_with_floor = rampdown_amp_adj + brightness_floor
set_colors(section, brightness_floor, rampup_adj_with_floor, rampdown_adj_with_floor)
end
@spec set_colors(byte, byte, byte, byte) :: rgb
def set_colors(section, brightness_floor, rampup_adj_with_floor, rampdown_adj_with_floor)
def set_colors(0, brightness_floor, rampup_adj_with_floor, rampdown_adj_with_floor) do
{rampdown_adj_with_floor, rampup_adj_with_floor, brightness_floor}
end
def set_colors(1, brightness_floor, rampup_adj_with_floor, rampdown_adj_with_floor) do
{brightness_floor, rampdown_adj_with_floor, rampup_adj_with_floor}
end
def set_colors(_, brightness_floor, rampup_adj_with_floor, rampdown_adj_with_floor) do
{rampup_adj_with_floor, brightness_floor, rampdown_adj_with_floor}
end
end