diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2010-01-31 22:29:01 +0000 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2010-01-31 22:29:01 +0000 |
commit | d4977e28bad2b03eac90adba88a1334932ecf72a (patch) | |
tree | e70b5c6a47988d981b18aacc31d032be7a9e3302 /src | |
parent | bf36ea80c319f307831f38c069d4e67442e4e81b (diff) | |
download | libnsfb-d4977e28bad2b03eac90adba88a1334932ecf72a.tar.gz libnsfb-d4977e28bad2b03eac90adba88a1334932ecf72a.tar.bz2 |
Improve rounding of fill span endpoints for polygon plotter.
svn path=/trunk/libnsfb/; revision=9946
Diffstat (limited to 'src')
-rw-r--r-- | src/plot/generic.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/plot/generic.c b/src/plot/generic.c index e6856dc..3bd06a5 100644 --- a/src/plot/generic.c +++ b/src/plot/generic.c @@ -173,9 +173,22 @@ static bool find_span(const int *p, int n, int x, int y, int *x0, int *x1) } else { /* find crossing (intersection of this line and * current y level) */ - x_new = p_x0 + ((long long) - (y - p_y0) * (p_x1 - p_x0)) / - (p_y1 - p_y0); + int numerator = (y - p_y0) * (p_x1 - p_x0); + int denominator = (p_y1 - p_y0); + + /* To round to nearest (rather than down) + * half the denominator is either added to + * or subtracted from the numerator, + * depending on whether the numerator and + * denominator have the same sign */ + if ((numerator < 0) == (denominator < 0)) + x_new = p_x0 + (numerator + + (denominator / 2)) / + denominator; + else + x_new = p_x0 + (numerator - + (denominator / 2)) / + denominator; } /* ignore crossings before current x */ |