Draw border on only some sides (issue #580, thanks @stophe)

This commit is contained in:
o9000
2016-05-17 21:59:43 +02:00
parent 5a5d8fd978
commit 78bc8b5c74
5 changed files with 85 additions and 15 deletions

View File

@@ -508,20 +508,53 @@ Imlib_Image adjust_icon(Imlib_Image original, int alpha, int saturation, int bri
void draw_rect(cairo_t *c, double x, double y, double w, double h, double r)
{
if (r > 0.0) {
double c1 = 0.55228475 * r;
draw_rect_on_sides(c, x, y, w, h, r, BORDER_ALL);
}
cairo_move_to(c, x + r, y);
void draw_rect_on_sides(cairo_t *c, double x, double y, double w, double h, double r, int border_mask)
{
double c1 = 0.55228475 * r;
cairo_move_to(c, x + r, y);
// Top line
if (border_mask & BORDER_TOP)
cairo_rel_line_to(c, w - 2 * r, 0);
else
cairo_rel_move_to(c, w - 2 * r, y);
// Top right corner
if (r > 0 && (border_mask & BORDER_TOP) && (border_mask & BORDER_RIGHT))
cairo_rel_curve_to(c, c1, 0.0, r, c1, r, r);
else
cairo_rel_move_to(c, r, r);
// Right line
if (border_mask & BORDER_RIGHT)
cairo_rel_line_to(c, 0, h - 2 * r);
else
cairo_rel_move_to(c, 0, h - 2 * r);
// Bottom right corner
if (r > 0 && (border_mask & BORDER_RIGHT) && (border_mask & BORDER_BOTTOM))
cairo_rel_curve_to(c, 0.0, c1, c1 - r, r, -r, r);
else
cairo_rel_move_to(c, -r, r);
// Bottom line
if (border_mask & BORDER_BOTTOM)
cairo_rel_line_to(c, -w + 2 * r, 0);
else
cairo_rel_move_to(c, -w + 2 * r, 0);
// Bottom left corner
if (r > 0 && (border_mask & BORDER_LEFT) && (border_mask & BORDER_BOTTOM))
cairo_rel_curve_to(c, -c1, 0, -r, -c1, -r, -r);
else
cairo_rel_move_to(c, -r, -r);
// Left line
if (border_mask & BORDER_LEFT)
cairo_rel_line_to(c, 0, -h + 2 * r);
else
cairo_rel_move_to(c, 0, -h + 2 * r);
// Top left corner
if (r > 0 && (border_mask & BORDER_LEFT) && (border_mask & BORDER_TOP))
cairo_rel_curve_to(c, 0, -c1, r - c1, -r, r, -r);
} else
cairo_rectangle(c, x, y, w, h);
else
cairo_rel_move_to(c, r, -r);
}
void clear_pixmap(Pixmap p, int x, int y, int w, int h)