Compare commits

...

4 Commits

Author SHA1 Message Date
Matthias Clasen
e74e7766d1 Implement dashed and dotted underlines
This is implementing new support in Pango for
rendering dashed and dotted lines. This is currently
using a linear gradient for dashes and a repeat node
for dots.
2021-03-31 18:57:03 -04:00
Matthias Clasen
3973a14c07 cellrenderertext: Quiet compiler warnings
Handle new values of the PangoUnderline enumeration.
2021-03-31 18:57:03 -04:00
Matthias Clasen
68ab1576ce atspipango: Quiet compiler warnings
Handle new values of the PangoUnderline enum.
2021-03-31 18:57:03 -04:00
Matthias Clasen
8713aa911b Add missing overline color support
This was overlooked when overlines were added.

Without this, overlines will come out in the the
wrong color.
2021-03-31 17:51:16 -04:00
3 changed files with 129 additions and 3 deletions

View File

@@ -86,11 +86,27 @@ pango_underline_to_string (PangoUnderline value)
return "none";
case PANGO_UNDERLINE_SINGLE:
case PANGO_UNDERLINE_SINGLE_LINE:
#if PANGO_VERSION_CHECK(1,49,0)
case PANGO_UNDERLINE_SINGLE_DOTTED:
case PANGO_UNDERLINE_SINGLE_LINE_DOTTED:
case PANGO_UNDERLINE_SINGLE_DASHED:
case PANGO_UNDERLINE_SINGLE_LINE_DASHED:
#endif
return "single";
case PANGO_UNDERLINE_DOUBLE:
case PANGO_UNDERLINE_DOUBLE_LINE:
#if PANGO_VERSION_CHECK(1,49,0)
case PANGO_UNDERLINE_DOUBLE_DOTTED:
case PANGO_UNDERLINE_DOUBLE_LINE_DOTTED:
case PANGO_UNDERLINE_DOUBLE_DASHED:
case PANGO_UNDERLINE_DOUBLE_LINE_DASHED:
#endif
return "double";
case PANGO_UNDERLINE_LOW:
#if PANGO_VERSION_CHECK(1,49,0)
case PANGO_UNDERLINE_LOW_DOTTED:
case PANGO_UNDERLINE_LOW_DASHED:
#endif
return "low";
case PANGO_UNDERLINE_ERROR:
case PANGO_UNDERLINE_ERROR_LINE:
@@ -196,7 +212,7 @@ gtk_pango_get_default_attributes (PangoLayout *layout,
pango_wrap_mode_to_string (mode));
g_variant_builder_add (builder, "{ss}", "strikethrough", "false");
g_variant_builder_add (builder, "{ss}", "underline", "false");
g_variant_builder_add (builder, "{ss}", "underline", "none");
g_variant_builder_add (builder, "{ss}", "rise", "0");
g_variant_builder_add (builder, "{ss}", "scale", "1");
g_variant_builder_add (builder, "{ss}", "bg-full-height", "0");

View File

@@ -127,6 +127,85 @@ gsk_pango_renderer_draw_rectangle (PangoRenderer *renderer,
(double)height / PANGO_SCALE));
}
#if PANGO_VERSION_CHECK(1,49,0)
static void
gsk_pango_renderer_draw_line (PangoRenderer *renderer,
PangoRenderPart part,
PangoRenderLineStyle style,
int x,
int y,
int width,
int height)
{
GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer);
GdkRGBA rgba;
double xx, yy, ww, hh;
xx = (double)x / PANGO_SCALE;
yy = (double)y / PANGO_SCALE;
ww = (double)width / PANGO_SCALE;
hh = (double)height / PANGO_SCALE;
get_color (crenderer, part, &rgba);
switch (style)
{
case PANGO_RENDER_LINE_SOLID:
gtk_snapshot_append_color (crenderer->snapshot,
&rgba,
&GRAPHENE_RECT_INIT (xx, yy, ww, hh));
break;
case PANGO_RENDER_LINE_DOTTED:
{
GskRoundedRect dot;
double d = MIN (ww, hh);
graphene_rect_t bounds = GRAPHENE_RECT_INIT (xx, yy, d, d);
graphene_size_t rr = GRAPHENE_SIZE_INIT (d/2, d/2);
GdkRGBA transparent = { 0.f, 0.f, 0.f, 0.f };
gsk_rounded_rect_init (&dot, &bounds, &rr, &rr, &rr, &rr);
gtk_snapshot_push_repeat (crenderer->snapshot,
&GRAPHENE_RECT_INIT (xx, yy, ww, hh),
NULL);
gtk_snapshot_push_rounded_clip (crenderer->snapshot, &dot);
gtk_snapshot_append_color (crenderer->snapshot, &rgba, &bounds);
gtk_snapshot_pop (crenderer->snapshot);
gtk_snapshot_append_color (crenderer->snapshot, &transparent, &GRAPHENE_RECT_INIT (xx + d, yy, 0.5 * d, d));
gtk_snapshot_pop (crenderer->snapshot);
}
break;
case PANGO_RENDER_LINE_DASHED:
{
GskColorStop stops[4];
GdkRGBA transparent = { 0.f, 0.f, 0.f, 0.f };
stops[0].offset = 0;
stops[0].color = rgba;
stops[1].offset = 0.66;
stops[1].color = rgba;
stops[2].offset = 0.66;
stops[2].color = transparent;
stops[3].offset = 1;
stops[3].color = transparent;
gtk_snapshot_append_repeating_linear_gradient (
crenderer->snapshot,
&GRAPHENE_RECT_INIT (xx, yy, ww, hh),
&GRAPHENE_POINT_INIT (xx, yy),
&GRAPHENE_POINT_INIT (xx + 9 * MIN (ww, hh), yy),
stops, 4);
}
break;
default:
g_assert_not_reached ();
}
}
#endif
static void
gsk_pango_renderer_draw_trapezoid (PangoRenderer *renderer,
PangoRenderPart part,
@@ -409,6 +488,11 @@ gsk_pango_renderer_prepare_run (PangoRenderer *renderer,
}
else
text_renderer_set_rgba (crenderer, PANGO_RENDER_PART_UNDERLINE, fg_rgba);
if (appearance->overline_rgba)
text_renderer_set_rgba (crenderer, PANGO_RENDER_PART_OVERLINE, appearance->overline_rgba);
else
text_renderer_set_rgba (crenderer, PANGO_RENDER_PART_OVERLINE, fg_rgba);
}
static void
@@ -426,6 +510,9 @@ gsk_pango_renderer_class_init (GskPangoRendererClass *klass)
renderer_class->draw_trapezoid = gsk_pango_renderer_draw_trapezoid;
renderer_class->draw_error_underline = gsk_pango_renderer_draw_error_underline;
renderer_class->draw_shape = gsk_pango_renderer_draw_shape;
#if PANGO_VERSION_CHECK(1,49,0)
renderer_class->draw_line = gsk_pango_renderer_draw_line;
#endif
renderer_class->prepare_run = gsk_pango_renderer_prepare_run;
}

View File

@@ -1527,10 +1527,33 @@ get_layout (GtkCellRendererText *celltext,
uline = PANGO_UNDERLINE_DOUBLE_LINE;
break;
case PANGO_UNDERLINE_DOUBLE_LINE:
case PANGO_UNDERLINE_ERROR_LINE:
#if PANGO_VERSION_CHECK(1,49,0)
case PANGO_UNDERLINE_SINGLE_DASHED:
uline = PANGO_UNDERLINE_DOUBLE_DASHED;
break;
case PANGO_UNDERLINE_SINGLE_LINE_DASHED:
uline = PANGO_UNDERLINE_DOUBLE_LINE_DASHED;
break;
case PANGO_UNDERLINE_SINGLE_DOTTED:
uline = PANGO_UNDERLINE_DOUBLE_DOTTED;
break;
case PANGO_UNDERLINE_SINGLE_LINE_DOTTED:
uline = PANGO_UNDERLINE_DOUBLE_LINE_DOTTED;
break;
case PANGO_UNDERLINE_DOUBLE_DASHED:
case PANGO_UNDERLINE_DOUBLE_LINE_DASHED:
case PANGO_UNDERLINE_DOUBLE_DOTTED:
case PANGO_UNDERLINE_DOUBLE_LINE_DOTTED:
case PANGO_UNDERLINE_LOW_DASHED:
case PANGO_UNDERLINE_LOW_DOTTED:
#endif
case PANGO_UNDERLINE_DOUBLE_LINE:
case PANGO_UNDERLINE_ERROR_LINE:
case PANGO_UNDERLINE_DOUBLE:
case PANGO_UNDERLINE_LOW:
case PANGO_UNDERLINE_ERROR: