[retro-gtk/wip/aplazas/lcd: 1/2] lcd grid test
- From: Adrien Plazas <aplazas src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [retro-gtk/wip/aplazas/lcd: 1/2] lcd grid test
- Date: Mon, 5 Nov 2018 19:43:14 +0000 (UTC)
commit 0c7e8ccd200345513154cdc2136a6100a22291be
Author: Adrien Plazas <kekun plazas laposte net>
Date: Mon Nov 5 20:31:24 2018 +0100
lcd grid test
demos/retro-demo.c | 1 +
retro-gtk/glsl-filters/lcd-grid.filter | 7 +++
retro-gtk/glsl-filters/lcd-grid.fs | 88 ++++++++++++++++++++++++++++++++++
retro-gtk/retro-gl-display.c | 1 +
retro-gtk/retro-gtk.gresource.xml | 2 +
retro-gtk/retro-video-filter.c | 1 +
retro-gtk/retro-video-filter.h | 2 +
7 files changed, 102 insertions(+)
---
diff --git a/demos/retro-demo.c b/demos/retro-demo.c
index bdeed27..b210bc5 100644
--- a/demos/retro-demo.c
+++ b/demos/retro-demo.c
@@ -101,6 +101,7 @@ retro_demo_activate (GApplication *application)
view = retro_core_view_new ();
retro_core_view_set_core (view, self->core);
retro_core_view_set_as_default_controller (view, self->core);
+ retro_core_view_set_filter (view, RETRO_VIDEO_FILTER_LCD);
retro_core_set_keyboard (self->core, GTK_WIDGET (view));
diff --git a/retro-gtk/glsl-filters/lcd-grid.filter b/retro-gtk/glsl-filters/lcd-grid.filter
new file mode 100644
index 0000000..4886167
--- /dev/null
+++ b/retro-gtk/glsl-filters/lcd-grid.filter
@@ -0,0 +1,7 @@
+[GLSL Filter]
+Filter=Linear
+Wrap=Border
+Fragment=lcd-grid.fs
+Authors=hunterk;
+License=GPL-2.0+;
+URL=https://github.com/hizzlekizzle/quark-shaders/blob/master/LCD-cgwg.shader
diff --git a/retro-gtk/glsl-filters/lcd-grid.fs b/retro-gtk/glsl-filters/lcd-grid.fs
new file mode 100644
index 0000000..dd2b3fb
--- /dev/null
+++ b/retro-gtk/glsl-filters/lcd-grid.fs
@@ -0,0 +1,88 @@
+#version 150
+
+#define red vec3(1,0,0)
+#define green vec3(0,1,0)
+#define blue vec3(0,0,1)
+#define gain 1.0
+#define gamma 3.0
+#define blacklevel 0.05
+#define ambient 0.0
+#define BGR
+
+#define outgamma 2.2
+
+uniform sampler2D source[];
+uniform vec4 sourceSize[];
+uniform vec4 targetSize;
+
+in Vertex {
+ vec2 texCoord;
+};
+
+out vec4 fragColor;
+
+#define fetch_offset(coord,offset) (pow(vec3(gain) * texelFetchOffset(source[0], (coord), 0, (offset)).rgb +
vec3(blacklevel), vec3(gamma)) + vec3(ambient))
+
+// integral of (1 - x^2 - x^4 + x^6)^2
+const float coeffs_x[] = float[](1.0, -2.0/3.0, -1.0/5.0, 4.0/7.0, -1.0/9.0, -2.0/11.0, 1.0/13.0);
+// integral of (1 - 2x^4 + x^6)^2
+const float coeffs_y[] = float[](1.0, 0.0, -4.0/5.0, 2.0/7.0, 4.0/9.0, -4.0/11.0, 1.0/13.0);
+float intsmear_func(float z, float coeffs[7])
+{
+ float z2 = z*z;
+ float zn = z;
+ float ret = 0.0;
+ for (int i = 0; i < 7; i++) {
+ ret += zn*coeffs[i];
+ zn *= z2;
+ }
+ return ret;
+}
+float intsmear(float x, float dx, float d, float coeffs[7])
+{
+ float zl = clamp((x-dx*0.5)/d,-1.0,1.0);
+ float zh = clamp((x+dx*0.5)/d,-1.0,1.0);
+ return d * ( intsmear_func(zh,coeffs) - intsmear_func(zl,coeffs) )/dx;
+}
+
+void main()
+{
+ vec2 texelSize = 1.0 / sourceSize[0].xy;
+ vec2 range = sourceSize[0].xy / (targetSize.xy * sourceSize[0].xy);
+
+ vec3 cred = pow(red, vec3(outgamma));
+ vec3 cgreen = pow(green, vec3(outgamma));
+ vec3 cblue = pow(blue, vec3(outgamma));
+
+ ivec2 tli = ivec2(floor(texCoord/texelSize-vec2(0.4999)));
+
+ vec3 lcol, rcol;
+ float subpix = (texCoord.x/texelSize.x - 0.4999 - float(tli.x))*3.0;
+ float rsubpix = range.x/texelSize.x * 3.0;
+ lcol = vec3(intsmear(subpix+1.0,rsubpix, 1.5, coeffs_x),
+ intsmear(subpix ,rsubpix, 1.5, coeffs_x),
+ intsmear(subpix-1.0,rsubpix, 1.5, coeffs_x));
+ rcol = vec3(intsmear(subpix-2.0,rsubpix, 1.5, coeffs_x),
+ intsmear(subpix-3.0,rsubpix, 1.5, coeffs_x),
+ intsmear(subpix-4.0,rsubpix, 1.5, coeffs_x));
+#ifdef BGR
+ lcol.rgb = lcol.bgr;
+ rcol.rgb = rcol.bgr;
+#endif
+ float tcol, bcol;
+ subpix = texCoord.y/texelSize.y - 0.4999 - float(tli.y);
+ rsubpix = range.y/texelSize.y;
+ tcol = intsmear(subpix ,rsubpix, 0.63, coeffs_y);
+ bcol = intsmear(subpix-1.0,rsubpix, 0.63, coeffs_y);
+
+ vec3 topLeftColor = fetch_offset(tli, ivec2(0,0)) * lcol * vec3(tcol);
+ vec3 bottomRightColor = fetch_offset(tli, ivec2(1,1)) * rcol * vec3(bcol);
+ vec3 bottomLeftColor = fetch_offset(tli, ivec2(0,1)) * lcol * vec3(bcol);
+ vec3 topRightColor = fetch_offset(tli, ivec2(1,0)) * rcol * vec3(tcol);
+
+ vec3 averageColor = topLeftColor + bottomRightColor + bottomLeftColor + topRightColor;
+
+ averageColor = mat3x3(cred, cgreen, cblue) * averageColor;
+
+ fragColor = vec4(pow(averageColor,vec3(1.0/outgamma)),0.0);
+}
diff --git a/retro-gtk/retro-gl-display.c b/retro-gtk/retro-gl-display.c
index ff1fc8c..4378aa1 100644
--- a/retro-gtk/retro-gl-display.c
+++ b/retro-gtk/retro-gl-display.c
@@ -48,6 +48,7 @@ static const gchar *filter_uris[] = {
NULL,
NULL,
"resource:///org/gnome/Retro/glsl-filters/crt-simple.filter",
+ "resource:///org/gnome/Retro/glsl-filters/lcd-grid.filter",
};
/* Private */
diff --git a/retro-gtk/retro-gtk.gresource.xml b/retro-gtk/retro-gtk.gresource.xml
index f88aa9a..0e7e885 100644
--- a/retro-gtk/retro-gtk.gresource.xml
+++ b/retro-gtk/retro-gtk.gresource.xml
@@ -4,5 +4,7 @@
<file>glsl-filters/crt-simple.filter</file>
<file>glsl-filters/crt-simple.fs</file>
<file>glsl-filters/crt-simple.vs</file>
+ <file>glsl-filters/lcd-grid.filter</file>
+ <file>glsl-filters/lcd-grid.fs</file>
</gresource>
</gresources>
diff --git a/retro-gtk/retro-video-filter.c b/retro-gtk/retro-video-filter.c
index dc86d7f..72c4356 100644
--- a/retro-gtk/retro-video-filter.c
+++ b/retro-gtk/retro-video-filter.c
@@ -42,6 +42,7 @@ retro_video_filter_get_type (void)
{ RETRO_VIDEO_FILTER_SMOOTH, "RETRO_VIDEO_FILTER_SMOOTH", "smooth" },
{ RETRO_VIDEO_FILTER_SHARP, "RETRO_VIDEO_FILTER_SHARP", "sharp" },
{ RETRO_VIDEO_FILTER_CRT, "RETRO_VIDEO_FILTER_CRT", "crt" },
+ { RETRO_VIDEO_FILTER_LCD, "RETRO_VIDEO_FILTER_LCD", "lcd" },
{ RETRO_VIDEO_FILTER_COUNT, "RETRO_VIDEO_FILTER_COUNT", "count" },
{ 0, NULL, NULL },
};
diff --git a/retro-gtk/retro-video-filter.h b/retro-gtk/retro-video-filter.h
index 9cdb647..ad41f4e 100644
--- a/retro-gtk/retro-video-filter.h
+++ b/retro-gtk/retro-video-filter.h
@@ -20,6 +20,7 @@ GType retro_video_filter_get_type (void) G_GNUC_CONST;
* @RETRO_VIDEO_FILTER_SMOOTH: a smooth but blurry video filer
* @RETRO_VIDEO_FILTER_SHARP: a sharp video filter showing every pixel
* @RETRO_VIDEO_FILTER_CRT: a video filter mimicking CRT screens
+ * @RETRO_VIDEO_FILTER_LCD: a video filter mimicking LCD screens
* @RETRO_VIDEO_FILTER_COUNT: the number of video filters
*
* Represents the filters that can be applied to the video output.
@@ -29,6 +30,7 @@ typedef enum
RETRO_VIDEO_FILTER_SMOOTH,
RETRO_VIDEO_FILTER_SHARP,
RETRO_VIDEO_FILTER_CRT,
+ RETRO_VIDEO_FILTER_LCD,
RETRO_VIDEO_FILTER_COUNT,
} RetroVideoFilter;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]