summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Hake <nh@nosebud.de>2016-07-11 13:20:41 +0200
committerMatthias Clasen <mclasen@redhat.com>2017-04-07 21:54:29 -0400
commitf7927ff53afb8bbfdf7cc8f7b621c811f53ac6c5 (patch)
tree042b457c4b8f2d6df4cbde90f6a6378b7c79120d
parentbb774bce7f99e839851834c1688c12d898f9c5ab (diff)
downloadpango-f7927ff53afb8bbfdf7cc8f7b621c811f53ac6c5.tar.gz
Win32: Enable colored underline drawing
Underline drawing was using the pen selected into DC before pango_win32_render_layout_line was called. Since layout allow the user to select underline colors, we have to create a temporary pen in the correct color before drawing it. https://bugzilla.gnome.org/show_bug.cgi?id=768679
-rw-r--r--pango/pangowin32.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/pango/pangowin32.c b/pango/pangowin32.c
index bdebc5fa..d39cf8b5 100644
--- a/pango/pangowin32.c
+++ b/pango/pangowin32.c
@@ -84,6 +84,8 @@ static double pango_win32_font_real_get_metrics_factor (PangoFont *font);
static void pango_win32_get_item_properties (PangoItem *item,
PangoUnderline *uline,
+ PangoAttrColor *uline_color,
+ gboolean *uline_set,
PangoAttrColor *fg_color,
gboolean *fg_set,
PangoAttrColor *bg_color,
@@ -1027,15 +1029,18 @@ pango_win32_render_layout_line (HDC hdc,
{
COLORREF oldfg = 0;
HBRUSH brush = NULL;
+ HPEN uline_pen, old_pen;
POINT points[2];
PangoUnderline uline = PANGO_UNDERLINE_NONE;
PangoLayoutRun *run = tmp_list->data;
- PangoAttrColor fg_color, bg_color;
- gboolean fg_set, bg_set;
+ PangoAttrColor fg_color, bg_color, uline_color;
+ gboolean fg_set, bg_set, uline_set;
tmp_list = tmp_list->next;
- pango_win32_get_item_properties (run->item, &uline, &fg_color, &fg_set, &bg_color, &bg_set);
+ pango_win32_get_item_properties (run->item, &uline, &uline_color, &uline_set, &fg_color, &fg_set, &bg_color, &bg_set);
+ if (!uline_set)
+ uline_color = fg_color;
if (uline == PANGO_UNDERLINE_NONE)
pango_glyph_string_extents (run->glyphs, run->item->analysis.font,
@@ -1074,6 +1079,15 @@ pango_win32_render_layout_line (HDC hdc,
if (fg_set)
SetTextColor (hdc, oldfg);
+ if (uline != PANGO_UNDERLINE_NONE)
+ {
+ COLORREF uline_col = RGB ((uline_color.color.red) >> 8,
+ (uline_color.color.green) >> 8,
+ (uline_color.color.blue) >> 8);
+ uline_pen = CreatePen (PS_SOLID, 1, uline_col);
+ old_pen = SelectObject (hdc, uline_pen);
+ }
+
switch (uline)
{
case PANGO_UNDERLINE_NONE:
@@ -1123,6 +1137,11 @@ pango_win32_render_layout_line (HDC hdc,
break;
}
+ if (uline != PANGO_UNDERLINE_NONE)
+ {
+ SelectObject (hdc, old_pen);
+ DeleteObject (uline_pen);
+ }
x_off += logical_rect.width;
}
@@ -1177,6 +1196,8 @@ pango_win32_render_layout (HDC hdc,
static void
pango_win32_get_item_properties (PangoItem *item,
PangoUnderline *uline,
+ PangoAttrColor *uline_color,
+ gboolean *uline_set,
PangoAttrColor *fg_color,
gboolean *fg_set,
PangoAttrColor *bg_color,
@@ -1201,6 +1222,14 @@ pango_win32_get_item_properties (PangoItem *item,
*uline = ((PangoAttrInt *)attr)->value;
break;
+ case PANGO_ATTR_UNDERLINE_COLOR:
+ if (uline_color)
+ *uline_color = *((PangoAttrColor *)attr);
+ if (uline_set)
+ *uline_set = TRUE;
+
+ break;
+
case PANGO_ATTR_FOREGROUND:
if (fg_color)
*fg_color = *((PangoAttrColor *)attr);