[retro-gtk/wip/aplazas/lcd: 1/2] lcd grid test



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]