<div dir="ltr">On Wed, Sep 2, 2015 at 7:56 AM, Pekka Paalanen <span dir="ltr"><<a href="mailto:ppaalanen@gmail.com" target="_blank">ppaalanen@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Right. I looked at fast_bilinear_cover_iter_init() and<br>
fast_fetch_bilinear_cover() -> fetch_horizontal(), and yes, that really<br>
is how it is implemented. The leftmost pixel is chosen essentially by<br>
n = pixman_fixed_to_int(x - pixman_fixed_1 / 2).<br>
<br>
So, pixman_fixed_1 / 2 -> 0, not -1.<br>
<br>
The thing that confuses me is that with nearest, x=0 will sample pixel<br>
n=-1. However with bilinear, x=0.5 will sample pixels n=0 and n=1, not<br>
n=-1 and n=0.<br>
<br></blockquote><div><br></div><div>Pixman's rounding rules can be confusing, but they do have an internal logic:<br>The important thing to understand is that pixel 0 has coordinate 0.5, pixel -1<br>has coordinate -0.5, pixel 1 has coordinate 1.5. In general, pixel n has coordinate<br>n + 0.5.<br><br>Given that, and given that we always break ties by rounding down, we find that,<br>for NEAREST: a coordinate of 0.5 is exactly at pixel 0, so we should use that.<br>A coordinate of 0 is precisely midways between pixels -1 and 0, so since we round<br>down, pixel -1 is the one to use.<br><br></div><div>For BILINEAR, x=0.5 is precisely at pixel 0, so that must be used with a weight of 1.<br>The other pixel could be either -1 or 1 since it will have a weight of 0 in either case.<br>But since we round down, -1 it is.<br><br></div><div>There are some more details about rounding in the file pixman/rounding.txt.<br></div><div><br><br><br></div><div>Søren<br></div></div></div></div>