diff options
author | Owen W. Taylor <[email protected]> | 2010-10-06 18:47:57 +0200 |
---|---|---|
committer | infirit <[email protected]> | 2015-09-14 18:44:29 +0200 |
commit | 8bcb4f8f0348d1a2971dbd741d48af9de2934ae6 (patch) | |
tree | 7bfb572eb4e2b10157c0b9eab4bdd07d93703c51 | |
parent | 6674089ba3e66d6ac671d02be03dd5dcaa8eb784 (diff) | |
download | marco-8bcb4f8f0348d1a2971dbd741d48af9de2934ae6.tar.bz2 marco-8bcb4f8f0348d1a2971dbd741d48af9de2934ae6.tar.xz |
Clean up antialiasing fixes
Simplify the code by noting that when we have square end-caps, the
results of generic line path give the right pixel-aligned rectangle
for horizontal/vertical lines.
Add comments and remove some extra braces.
https://bugzilla.gnome.org/show_bug.cgi?id=630426
-rw-r--r-- | src/ui/theme.c | 35 |
1 files changed, 11 insertions, 24 deletions
diff --git a/src/ui/theme.c b/src/ui/theme.c index e348f62e..b5b6308e 100644 --- a/src/ui/theme.c +++ b/src/ui/theme.c @@ -3758,44 +3758,31 @@ meta_draw_op_draw_with_env (const MetaDrawOp *op, y2 = y1; /* This is one of the cases where we are matching the exact - * pixel aligned rectangle produced by X. + * pixel aligned rectangle produced by X; for zero-width lines + * the generic algorithm produces the right result so we don't + * need to handle them here. */ - if (y1 == y2 || x1 == x2) + if ((y1 == y2 || x1 == x2) && op->data.line.width != 0) { - double offset = (op->data.line.width == 0 || - op->data.line.width % 2) ? .5 : 0; - /* X includes end points for lines of width 0 */ - double line_extend = op->data.line.width == 0 ? 1. : 0.; + double offset = op->data.line.width % 2 ? .5 : 0; if (y1 == y2) { - if (x2 < x1) - { - x1 ^= x2; - x2 ^= x1; - x1 ^= x2; - } cairo_move_to (cr, x1, y1 + offset); - cairo_line_to (cr, x2 + line_extend, y2 + offset); + cairo_line_to (cr, x2, y2 + offset); } else { - if (y2 < y1) - { - y1 ^= y2; - y2 ^= y1; - y1 ^= y2; - } cairo_move_to (cr, x1 + offset, y1); - cairo_line_to (cr, x2 + offset, y2 + line_extend); + cairo_line_to (cr, x2 + offset, y2); } } else { - if (op->data.line.width <= 0) - { - cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); - } + /* zero-width lines include both end-points in X, unlike wide lines */ + if (op->data.line.width == 0) + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + cairo_move_to (cr, x1 + .5, y1 + .5); cairo_line_to (cr, x2 + .5, y2 + .5); } |