From 38690397c28004f83c4a5acdaf8d3cd53f600daa Mon Sep 17 00:00:00 2001 From: JetSetIlly Date: Sat, 27 Apr 2024 06:50:31 +0100 Subject: [PATCH] added TV saturation control --- gui/fonts/fonts.go | 1 + gui/sdlimgui/gl32_shaders.go | 3 +++ gui/sdlimgui/shaders/tv_color.frag | 7 +++++++ gui/sdlimgui/win_prefs_tv.go | 16 ++++++++++++++++ 4 files changed, 27 insertions(+) diff --git a/gui/fonts/fonts.go b/gui/fonts/fonts.go index 2b7f956c..586b90be 100644 --- a/gui/fonts/fonts.go +++ b/gui/fonts/fonts.go @@ -95,6 +95,7 @@ const ( Directory = '\uf07c' TVBrightness = '\uf185' TVContrast = '\uf042' + TVSaturation = '\uf0e9' TVHue = '\uf043' ) diff --git a/gui/sdlimgui/gl32_shaders.go b/gui/sdlimgui/gl32_shaders.go index 60740fae..c0e7ff93 100644 --- a/gui/sdlimgui/gl32_shaders.go +++ b/gui/sdlimgui/gl32_shaders.go @@ -196,6 +196,7 @@ type tvColorShader struct { shader brightness int32 contrast int32 + saturation int32 hue int32 } @@ -204,6 +205,7 @@ func newTVColorShader() shaderProgram { sh.createProgram(string(shaders.YFlipVertexShader), string(shaders.TVColorShader)) sh.brightness = gl.GetUniformLocation(sh.handle, gl.Str("Brightness"+"\x00")) sh.contrast = gl.GetUniformLocation(sh.handle, gl.Str("Contrast"+"\x00")) + sh.saturation = gl.GetUniformLocation(sh.handle, gl.Str("Saturation"+"\x00")) sh.hue = gl.GetUniformLocation(sh.handle, gl.Str("Hue"+"\x00")) return sh } @@ -212,6 +214,7 @@ func (sh *tvColorShader) setAttributesArgs(env shaderEnvironment, prefs crtSeqPr sh.shader.setAttributes(env) gl.Uniform1f(sh.contrast, float32(prefs.Contrast)) gl.Uniform1f(sh.brightness, float32(prefs.Brightness)) + gl.Uniform1f(sh.saturation, float32(prefs.Saturation)) gl.Uniform1f(sh.hue, float32(prefs.Hue)) } diff --git a/gui/sdlimgui/shaders/tv_color.frag b/gui/sdlimgui/shaders/tv_color.frag index d03b30bd..ffdb4391 100644 --- a/gui/sdlimgui/shaders/tv_color.frag +++ b/gui/sdlimgui/shaders/tv_color.frag @@ -39,6 +39,13 @@ void main() } adjust *= contrast; + // saturation + adjust *= mat3( + vec3(1, 0, 0), + vec3(0, Saturation, 0), + vec3(0, 0, Saturation) + ); + // hue float hue = 2 * PI * Hue; adjust *= mat3( diff --git a/gui/sdlimgui/win_prefs_tv.go b/gui/sdlimgui/win_prefs_tv.go index 1fc3d65e..cae1b568 100644 --- a/gui/sdlimgui/win_prefs_tv.go +++ b/gui/sdlimgui/win_prefs_tv.go @@ -29,6 +29,8 @@ func (win *winPrefs) drawTV() { imgui.Spacing() win.drawContrast() imgui.Spacing() + win.drawSaturation() + imgui.Spacing() win.drawHue() } @@ -60,6 +62,20 @@ func (win *winPrefs) drawContrast() { } } +func (win *winPrefs) drawSaturation() { + imgui.Text(fmt.Sprintf("%c Saturation", fonts.TVSaturation)) + + f := float32(win.img.crtPrefs.Saturation.Get().(float64)) + + minv := float32(0.1) + maxv := float32(1.90) + label := fmt.Sprintf("%.0f", 100*(f-minv)/(maxv-minv)) + + if imgui.SliderFloatV("##saturation", &f, minv, maxv, label, imgui.SliderFlagsNone) { + win.img.crtPrefs.Saturation.Set(f) + } +} + func (win *winPrefs) drawHue() { imgui.Text(fmt.Sprintf("%c Hue", fonts.TVHue))