summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen W. Taylor <[email protected]>2010-10-06 18:47:57 +0200
committerinfirit <[email protected]>2015-09-14 18:44:29 +0200
commit8bcb4f8f0348d1a2971dbd741d48af9de2934ae6 (patch)
tree7bfb572eb4e2b10157c0b9eab4bdd07d93703c51
parent6674089ba3e66d6ac671d02be03dd5dcaa8eb784 (diff)
downloadmarco-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.c35
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);
}