[gtk/ngl-vertex-attributes] ngl: Make the coloring shader more versatile
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/ngl-vertex-attributes] ngl: Make the coloring shader more versatile
- Date: Fri, 12 Mar 2021 06:45:52 +0000 (UTC)
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]