diff --git a/OverLua/docs/rgb2hsl.lua b/OverLua/docs/rgb2hsl.lua new file mode 100644 index 000000000..dbe8b301f --- /dev/null +++ b/OverLua/docs/rgb2hsl.lua @@ -0,0 +1,55 @@ +--- 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