[gtk/ngl-vertex-attributes] ngl: Make the coloring shader more versatile



commit 0e638775fbe39284ee2dde0df3622a5dc5fbafbb
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Mar 12 01:27:19 2021 -0500

    ngl: Make the coloring shader more versatile
    
    When the color passed is transparent black, use
    the color from the texture as source, instead of
    as mask. This lets use use the coloring program
    both for regular and color glyphs, avoiding
    program changes in text with Emoji.

 gsk/ngl/gsknglrenderjob.c       | 55 ++++++++++++++++++++++-------------------
 gsk/ngl/resources/coloring.glsl |  8 +++++-
 2 files changed, 36 insertions(+), 27 deletions(-)
---
diff --git a/gsk/ngl/gsknglrenderjob.c b/gsk/ngl/gsknglrenderjob.c
index 14e3b3e42b..eff963fa64 100644
--- a/gsk/ngl/gsknglrenderjob.c
+++ b/gsk/ngl/gsknglrenderjob.c
@@ -2703,15 +2703,18 @@ gsk_ngl_render_job_visit_text_node (GskNglRenderJob     *job,
   guint last_texture = 0;
   GskNglDrawVertex *vertices;
   guint used = 0;
+  GdkRGBA c;
 
   if (num_glyphs == 0)
     return;
 
+  program = CHOOSE_PROGRAM (job, coloring);
+
   /* If the font has color glyphs, we don't need to recolor anything */
   if (!force_color && gsk_text_node_has_color_glyphs (node))
-    program = CHOOSE_PROGRAM (job, blit);
+    c = (GdkRGBA) { 0.f, 0.f, 0.f, 0.f };
   else
-    program = CHOOSE_PROGRAM (job, coloring);
+    c = *color;
 
   lookup.font = (PangoFont *)font;
   lookup.scale = (guint) (text_scale * 1024);
@@ -2786,55 +2789,55 @@ gsk_ngl_render_job_visit_text_node (GskNglRenderJob     *job,
       vertices[base+0].position[1] = glyph_y;
       vertices[base+0].uv[0] = tx;
       vertices[base+0].uv[1] = ty;
-      vertices[base+0].color[0] = color->red;
-      vertices[base+0].color[1] = color->green;
-      vertices[base+0].color[2] = color->blue;
-      vertices[base+0].color[3] = color->alpha;
+      vertices[base+0].color[0] = c.red;
+      vertices[base+0].color[1] = c.green;
+      vertices[base+0].color[2] = c.blue;
+      vertices[base+0].color[3] = c.alpha;
 
       vertices[base+1].position[0] = glyph_x;
       vertices[base+1].position[1] = glyph_y2;
       vertices[base+1].uv[0] = tx;
       vertices[base+1].uv[1] = ty2;
-      vertices[base+1].color[0] = color->red;
-      vertices[base+1].color[1] = color->green;
-      vertices[base+1].color[2] = color->blue;
-      vertices[base+1].color[3] = color->alpha;
+      vertices[base+1].color[0] = c.red;
+      vertices[base+1].color[1] = c.green;
+      vertices[base+1].color[2] = c.blue;
+      vertices[base+1].color[3] = c.alpha;
 
       vertices[base+2].position[0] = glyph_x2;
       vertices[base+2].position[1] = glyph_y;
       vertices[base+2].uv[0] = tx2;
       vertices[base+2].uv[1] = ty;
-      vertices[base+2].color[0] = color->red;
-      vertices[base+2].color[1] = color->green;
-      vertices[base+2].color[2] = color->blue;
-      vertices[base+2].color[3] = color->alpha;
+      vertices[base+2].color[0] = c.red;
+      vertices[base+2].color[1] = c.green;
+      vertices[base+2].color[2] = c.blue;
+      vertices[base+2].color[3] = c.alpha;
 
       vertices[base+3].position[0] = glyph_x2;
       vertices[base+3].position[1] = glyph_y2;
       vertices[base+3].uv[0] = tx2;
       vertices[base+3].uv[1] = ty2;
-      vertices[base+3].color[0] = color->red;
-      vertices[base+3].color[1] = color->green;
-      vertices[base+3].color[2] = color->blue;
-      vertices[base+3].color[3] = color->alpha;
+      vertices[base+3].color[0] = c.red;
+      vertices[base+3].color[1] = c.green;
+      vertices[base+3].color[2] = c.blue;
+      vertices[base+3].color[3] = c.alpha;
 
       vertices[base+4].position[0] = glyph_x;
       vertices[base+4].position[1] = glyph_y2;
       vertices[base+4].uv[0] = tx;
       vertices[base+4].uv[1] = ty2;
-      vertices[base+4].color[0] = color->red;
-      vertices[base+4].color[1] = color->green;
-      vertices[base+4].color[2] = color->blue;
-      vertices[base+4].color[3] = color->alpha;
+      vertices[base+4].color[0] = c.red;
+      vertices[base+4].color[1] = c.green;
+      vertices[base+4].color[2] = c.blue;
+      vertices[base+4].color[3] = c.alpha;
 
       vertices[base+5].position[0] = glyph_x2;
       vertices[base+5].position[1] = glyph_y;
       vertices[base+5].uv[0] = tx2;
       vertices[base+5].uv[1] = ty;
-      vertices[base+5].color[0] = color->red;
-      vertices[base+5].color[1] = color->green;
-      vertices[base+5].color[2] = color->blue;
-      vertices[base+5].color[3] = color->alpha;
+      vertices[base+5].color[0] = c.red;
+      vertices[base+5].color[1] = c.green;
+      vertices[base+5].color[2] = c.blue;
+      vertices[base+5].color[3] = c.alpha;
 
       batch->draw.vbo_count += GSK_NGL_N_VERTICES;
       used++;
diff --git a/gsk/ngl/resources/coloring.glsl b/gsk/ngl/resources/coloring.glsl
index b6af0c1766..31156f6705 100644
--- a/gsk/ngl/resources/coloring.glsl
+++ b/gsk/ngl/resources/coloring.glsl
@@ -1,20 +1,26 @@
 // VERTEX_SHADER:
 _OUT_ vec4 final_color;
+_OUT_ vec4 color;
 
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
   vUv = vec2(aUv.x, aUv.y);
 
+  color = aColor;
   final_color = gsk_premultiply(aColor) * u_alpha;
 }
 
 // FRAGMENT_SHADER:
 
 _IN_ vec4 final_color;
+_IN_ vec4 color;
 
 void main() {
   vec4 diffuse = GskTexture(u_source, vUv);
 
-  gskSetOutputColor(final_color * diffuse.a);
+  if (color != vec4(0.0))
+    gskSetOutputColor(final_color * diffuse.a);
+  else
+    gskSetOutputColor(diffuse * u_alpha);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]