[gtk+/wip/matthiasc/gskpango: 12/15] Use GL to render underlines



commit 0c2158d6baffe1db844ef4fe53e92b1353e218a0
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Aug 30 15:06:13 2017 -0400

    Use GL to render underlines
    
    Translate draw_rectangle calls to color nodes and translate
    draw_rectangle, draw_trapezoid and draw_error_underline to
    cairo nodes.

 gtk/gskpango.c |   95 ++++++++++++++++++++++++++++---------------------------
 1 files changed, 48 insertions(+), 47 deletions(-)
---
diff --git a/gtk/gskpango.c b/gtk/gskpango.c
index ef8aab3..c96d3bb 100644
--- a/gtk/gskpango.c
+++ b/gtk/gskpango.c
@@ -69,17 +69,17 @@ struct _GskPangoRendererClass
 
 G_DEFINE_TYPE (GskPangoRenderer, gsk_pango_renderer, PANGO_TYPE_RENDERER)
 
-static void
-set_color (GskPangoRenderer *crenderer,
-           cairo_t          *cr,
-           PangoRenderPart   part)
+static gboolean
+get_color (GskPangoRenderer *crenderer,
+           PangoRenderPart   part,
+           GdkRGBA          *rgba)
 {
   PangoColor *color = pango_renderer_get_color ((PangoRenderer *) (crenderer), part);
   guint16 a = pango_renderer_get_alpha ((PangoRenderer *) (crenderer), part);
   gdouble red, green, blue, alpha;
 
   if (!a && !color)
-    return;
+    return FALSE;
 
   if (color)
     {
@@ -89,24 +89,30 @@ set_color (GskPangoRenderer *crenderer,
       alpha = 1.;
     }
   else
-    {
-      cairo_pattern_t *pattern = cairo_get_source (cr);
-
-      if (pattern && cairo_pattern_get_type (pattern) == CAIRO_PATTERN_TYPE_SOLID)
-        cairo_pattern_get_rgba (pattern, &red, &green, &blue, &alpha);
-      else
-        {
-          red = 0.;
-          green = 0.;
-          blue = 0.;
-          alpha = 1.;
-        }
-    }
+    return FALSE;
 
   if (a)
     alpha = a / 65535.;
 
-  cairo_set_source_rgba (cr, red, green, blue, alpha);
+  rgba->red = red;
+  rgba->green = green;
+  rgba->blue = blue;
+  rgba->alpha = alpha;
+
+  return TRUE;
+}
+
+static void
+set_color (GskPangoRenderer *crenderer,
+           PangoRenderPart   part,
+           cairo_t          *cr)
+{
+  GdkRGBA rgba = { 0, 0, 0, 1 };
+
+  if (get_color (crenderer, part, &rgba))
+    gdk_cairo_set_source_rgba (cr, &rgba);
+  else
+    gdk_cairo_set_source_rgba (cr, crenderer->fg_color);
 }
 
 #if 0
@@ -286,12 +292,9 @@ gsk_pango_renderer_show_text_glyphs (PangoRenderer        *renderer,
   double base_x = crenderer->x_offset + (double)x / PANGO_SCALE;
   double base_y = crenderer->y_offset + (double)y / PANGO_SCALE;
 
-
   cr = gtk_snapshot_append_cairo (crenderer->snapshot, &crenderer->bounds, "Text<%dglyphs>", 
glyphs->num_glyphs);
 
-  gdk_cairo_set_source_rgba (cr, crenderer->fg_color);
-
-  set_color (crenderer, cr, PANGO_RENDER_PART_FOREGROUND);
+  set_color (crenderer, PANGO_RENDER_PART_FOREGROUND, cr);
 
   if (!_pango_cairo_font_install (font, cr))
     {
@@ -451,20 +454,19 @@ gsk_pango_renderer_draw_rectangle (PangoRenderer     *renderer,
                                      int                width,
                                      int                height)
 {
-#if 0
   GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer);
+  GdkRGBA rgba;
+  graphene_rect_t bounds;
 
-  cairo_save (crenderer->cr);
-  set_color (crenderer, part);
+  if (!get_color (crenderer, part, &rgba))
+    rgba = *crenderer->fg_color;
 
-  cairo_rectangle (crenderer->cr,
-                   crenderer->x_offset + (double)x / PANGO_SCALE,
-                   crenderer->y_offset + (double)y / PANGO_SCALE,
-                   (double)width / PANGO_SCALE, (double)height / PANGO_SCALE);
+  graphene_rect_init (&bounds,
+                      crenderer->x_offset + (double)x / PANGO_SCALE,
+                      crenderer->y_offset + (double)y / PANGO_SCALE,
+                      (double)width / PANGO_SCALE, (double)height / PANGO_SCALE);
 
-  cairo_fill (crenderer->cr);
-  cairo_restore (crenderer->cr);
-#endif
+  gtk_snapshot_append_color (crenderer->snapshot, &rgba, &bounds, "DrawRectangle");
 }
 
 static void
@@ -477,16 +479,14 @@ gsk_pango_renderer_draw_trapezoid (PangoRenderer     *renderer,
                                      double             x12,
                                      double             x22)
 {
-#if 0
   GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer);
   cairo_t *cr;
-  double x, y;
+  GdkRGBA rgba = { 0, 0, 0, 1 };
+  gdouble x, y;
 
-  cr = crenderer->cr;
+  cr = gtk_snapshot_append_cairo (crenderer->snapshot, &crenderer->bounds, "DrawTrapezoid");
 
-  cairo_save (cr);
-
-  set_color (crenderer, part);
+  set_color (crenderer, part, cr);
 
   x = crenderer->x_offset,
   y = crenderer->y_offset;
@@ -502,8 +502,7 @@ gsk_pango_renderer_draw_trapezoid (PangoRenderer     *renderer,
 
   cairo_fill (cr);
 
-  cairo_restore (cr);
-#endif
+  cairo_destroy (cr);
 }
 
 /* Draws an error underline that looks like one of:
@@ -586,13 +585,16 @@ gsk_pango_renderer_draw_error_underline (PangoRenderer *renderer,
                                            int            width,
                                            int            height)
 {
-#if 0
   GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer);
-  cairo_t *cr = crenderer->cr;
+  cairo_t *cr;
+  GdkRGBA rgba = { 0, 0, 0, 1 };
 
-  cairo_save (cr);
+  cr = gtk_snapshot_append_cairo (crenderer->snapshot, &crenderer->bounds, "DrawTrapezoid");
 
-  set_color (crenderer, PANGO_RENDER_PART_UNDERLINE);
+  if (get_color (crenderer, PANGO_RENDER_PART_UNDERLINE, &rgba))
+    gdk_cairo_set_source_rgba (cr, &rgba);
+  else
+    gdk_cairo_set_source_rgba (cr, crenderer->fg_color);
 
   cairo_new_path (cr);
 
@@ -603,8 +605,7 @@ gsk_pango_renderer_draw_error_underline (PangoRenderer *renderer,
 
   cairo_fill (cr);
 
-  cairo_restore (cr);
-#endif
+  cairo_destroy (cr);
 }
 
 static void


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