--- Convert RGB colour to HSL (hue/saturation/luminance)
-- The output image will have H instead of R,
-- S instead of G and L instead of B.

function render_frame(f, t)
	local w, h = f.width, f.height
	for y = 0, h-1 do
		for x = 0, w-1 do
			local r, g, b = f(x, y)
			local h, s, l = RGB2HSL(r, g, b)
			f[y*w+x] = {h, s, l}
		end
	end
end

function clip_colorval(v)
	if v < 0 then
		return 0
	elseif v > 255 then
		return 255
	else
		return math.floor(v)
	end
end

function RGB2HSL(R, G, B)
	local r, g, b = R/255, G/255, B/255
	local h, s, l
	
	local minrgb, maxrgb = math.min(r, math.min(g, b)), math.max(r, math.max(g, b))
	
	l = (minrgb + maxrgb) / 2
	
	if minrgb == maxrgb then
		h, s = 0, 0
	else
		if l < 0.5 then
			s = (maxrgb - minrgb) / (maxrgb + minrgb)
		else
			s = (maxrgb - minrgb) / (2 - maxrgb - minrgb)
		end
		if r == maxrgb then
			h = (g - b) / (maxrgb - minrgb) + 0
		elseif g == maxrgb then
			h = (b - r) / (maxrgb - minrgb) + 2
		else
			h = (r - g) / (maxrgb - minrgb) + 4
		end
	end
	
	if h < 0 then h = h + 6 end
	if h >= 6 then h = h - 6 end
	
	return clip_colorval(h*255/6), clip_colorval(s*255), clip_colorval(l*255)
end