[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] cairo 426af0e: Implement wave-style variant of underlining
From: |
YAMAMOTO Mitsuharu |
Subject: |
[Emacs-diffs] cairo 426af0e: Implement wave-style variant of underlining for cairo. |
Date: |
Mon, 16 Feb 2015 01:21:02 +0000 |
branch: cairo
commit 426af0ef9f2008d78633a2f3c1daf1ddbe9d8e6e
Author: YAMAMOTO Mitsuharu <address@hidden>
Commit: YAMAMOTO Mitsuharu <address@hidden>
Implement wave-style variant of underlining for cairo.
* xterm.c (x_draw_horizontal_wave) [USE_CAIRO]: New function.
(x_draw_underwave) [USE_CAIRO]: Use it.
---
src/ChangeLog | 2 ++
src/xterm.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/src/ChangeLog b/src/ChangeLog
index d9b2476..5df51b4 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -2,6 +2,8 @@
* xterm.c (x_draw_window_divider): Use x_fill_rectangle instead of
XFillRectangle.
+ (x_draw_horizontal_wave) [USE_CAIRO]: New function.
+ (x_draw_underwave) [USE_CAIRO]: Use it.
2015-02-14 YAMAMOTO Mitsuharu <address@hidden>
diff --git a/src/xterm.c b/src/xterm.c
index 04d6c06..ae421a8 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -875,6 +875,47 @@ x_fill_trapezoid_for_relief (f, gc, x, y, width, height,
top_p)
cairo_fill (cr);
x_end_cr_clip (f);
}
+
+static void
+x_draw_horizontal_wave (struct frame *f, GC gc, int x, int y,
+ int width, int height, int wave_length)
+{
+ cairo_t *cr;
+ double dx = wave_length, dy = height - 1;
+ int xoffset, n;
+
+ cr = x_begin_cr_clip (f, gc);
+ x_set_cr_source_with_gc_foreground (f, gc);
+ cairo_rectangle (cr, x, y, width, height);
+ cairo_clip (cr);
+
+ if (x >= 0)
+ {
+ xoffset = x % (wave_length * 2);
+ if (xoffset == 0)
+ xoffset = wave_length * 2;
+ }
+ else
+ xoffset = x % (wave_length * 2) + wave_length * 2;
+ n = (width + xoffset) / wave_length + 1;
+ if (xoffset > wave_length)
+ {
+ xoffset -= wave_length;
+ --n;
+ y += height - 1;
+ dy = -dy;
+ }
+
+ cairo_move_to (cr, x - xoffset + 0.5, y + 0.5);
+ while (--n >= 0)
+ {
+ cairo_rel_line_to (cr, dx, dy);
+ dy = -dy;
+ }
+ cairo_set_line_width (cr, 1);
+ cairo_stroke (cr);
+ x_end_cr_clip (f);
+}
#endif
@@ -3255,6 +3296,10 @@ static void
x_draw_underwave (struct glyph_string *s)
{
int wave_height = 3, wave_length = 2;
+#ifdef USE_CAIRO
+ x_draw_horizontal_wave (s->f, s->gc, s->x, s->ybase - wave_height + 3,
+ s->width, wave_height, wave_length);
+#else /* not USE_CAIRO */
int dx, dy, x0, y0, width, x1, y1, x2, y2, xmax;
bool odd;
XRectangle wave_clip, string_clip, final_clip;
@@ -3304,6 +3349,7 @@ x_draw_underwave (struct glyph_string *s)
/* Restore previous clipping rectangle(s) */
XSetClipRectangles (s->display, s->gc, 0, 0, s->clip, s->num_clips,
Unsorted);
+#endif /* not USE_CAIRO */
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] cairo 426af0e: Implement wave-style variant of underlining for cairo.,
YAMAMOTO Mitsuharu <=