emacs-diffs
[Top][All Lists]
Advanced

[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 */
 }
 
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]