Fix misbehavior when drawing three-pixel high horizontal dividers (Bug#29353)

* src/xterm.c (x_draw_window_divider):
* src/w32term.c (w32_draw_window_divider): Fix misbehavior when
drawing three-pixel high horizontal dividers (Bug#29353).

The misbehavior was noted by Keith David Bershatsky and analyzed by Alan
Third.
This commit is contained in:
Martin Rudalics 2017-11-20 09:18:59 +01:00
parent 1b082c886c
commit 4da87999c2
2 changed files with 16 additions and 8 deletions

View file

@ -660,21 +660,25 @@ w32_draw_window_divider (struct window *w, int x0, int x1, int y0, int y1)
? face_last->foreground ? face_last->foreground
: FRAME_FOREGROUND_PIXEL (f)); : FRAME_FOREGROUND_PIXEL (f));
if (y1 - y0 > x1 - x0 && x1 - x0 > 2) if ((y1 - y0 > x1 - x0) && (x1 - x0 >= 3))
/* Vertical. */ /* A vertical divider, at least three pixels wide: Draw first and
last pixels differently. */
{ {
w32_fill_area_abs (f, hdc, color_first, x0, y0, x0 + 1, y1); w32_fill_area_abs (f, hdc, color_first, x0, y0, x0 + 1, y1);
w32_fill_area_abs (f, hdc, color, x0 + 1, y0, x1 - 1, y1); w32_fill_area_abs (f, hdc, color, x0 + 1, y0, x1 - 1, y1);
w32_fill_area_abs (f, hdc, color_last, x1 - 1, y0, x1, y1); w32_fill_area_abs (f, hdc, color_last, x1 - 1, y0, x1, y1);
} }
else if (x1 - x0 > y1 - y0 && y1 - y0 > 3) else if ((x1 - x0 > y1 - y0) && (y1 - y0 >= 3))
/* Horizontal. */ /* A horizontal divider, at least three pixels high: Draw first and
last pixels differently. */
{ {
w32_fill_area_abs (f, hdc, color_first, x0, y0, x1, y0 + 1); w32_fill_area_abs (f, hdc, color_first, x0, y0, x1, y0 + 1);
w32_fill_area_abs (f, hdc, color, x0, y0 + 1, x1, y1 - 1); w32_fill_area_abs (f, hdc, color, x0, y0 + 1, x1, y1 - 1);
w32_fill_area_abs (f, hdc, color_last, x0, y1 - 1, x1, y1); w32_fill_area_abs (f, hdc, color_last, x0, y1 - 1, x1, y1);
} }
else else
/* In any other case do not draw the first and last pixels
differently. */
w32_fill_area_abs (f, hdc, color, x0, y0, x1, y1); w32_fill_area_abs (f, hdc, color, x0, y0, x1, y1);
release_frame_dc (f, hdc); release_frame_dc (f, hdc);

View file

@ -1104,8 +1104,9 @@ x_draw_window_divider (struct window *w, int x0, int x1, int y0, int y1)
: FRAME_FOREGROUND_PIXEL (f)); : FRAME_FOREGROUND_PIXEL (f));
Display *display = FRAME_X_DISPLAY (f); Display *display = FRAME_X_DISPLAY (f);
if (y1 - y0 > x1 - x0 && x1 - x0 > 2) if ((y1 - y0 > x1 - x0) && (x1 - x0 >= 3))
/* Vertical. */ /* A vertical divider, at least three pixels wide: Draw first and
last pixels differently. */
{ {
XSetForeground (display, f->output_data.x->normal_gc, color_first); XSetForeground (display, f->output_data.x->normal_gc, color_first);
x_fill_rectangle (f, f->output_data.x->normal_gc, x_fill_rectangle (f, f->output_data.x->normal_gc,
@ -1117,8 +1118,9 @@ x_draw_window_divider (struct window *w, int x0, int x1, int y0, int y1)
x_fill_rectangle (f, f->output_data.x->normal_gc, x_fill_rectangle (f, f->output_data.x->normal_gc,
x1 - 1, y0, 1, y1 - y0); x1 - 1, y0, 1, y1 - y0);
} }
else if (x1 - x0 > y1 - y0 && y1 - y0 > 3) else if ((x1 - x0 > y1 - y0) && (y1 - y0 >= 3))
/* Horizontal. */ /* A horizontal divider, at least three pixels high: Draw first and
last pixels differently. */
{ {
XSetForeground (display, f->output_data.x->normal_gc, color_first); XSetForeground (display, f->output_data.x->normal_gc, color_first);
x_fill_rectangle (f, f->output_data.x->normal_gc, x_fill_rectangle (f, f->output_data.x->normal_gc,
@ -1132,6 +1134,8 @@ x_draw_window_divider (struct window *w, int x0, int x1, int y0, int y1)
} }
else else
{ {
/* In any other case do not draw the first and last pixels
differently. */
XSetForeground (display, f->output_data.x->normal_gc, color); XSetForeground (display, f->output_data.x->normal_gc, color);
x_fill_rectangle (f, f->output_data.x->normal_gc, x_fill_rectangle (f, f->output_data.x->normal_gc,
x0, y0, x1 - x0, y1 - y0); x0, y0, x1 - x0, y1 - y0);