[Pixman] Supersampling

Adrian Johnson ajohnson at redneon.com
Mon Apr 2 04:48:47 PDT 2012


As there has been no update to the supersampling patch posted by
Krzysztof Kosiński in 2010 [1] I have rebased the patch and incorporated
Søren's review comments [2]. The patches are at:

http://cgit.freedesktop.org/~ajohnson/pixman/log/?h=supersampling

My responses to the review comments are below.


On 24/08/10 01:09, Soeren Sandmann wrote:
> Krzysztof Kosiński <tweenk.pl at gmail.com> writes:
>
>> Hello
>>
>> This is the second attempt at bitmap supersampling in Pixman.
>
> Some general comments:
>
> I generally like where this is going. It's certainly a large quality
> improvement, and the code is well-written. And of course, it fixes
> what is probably the biggest image quality issue in pixman.
>
> As I mentioned elsewhere, I don't think there should be any
> automatically computed supersampling. While it might be nice to make
> image scaling look good without any changes to cairo, I think we are
> going to want more fine grained control over the API. Also, simply
> changing pixman behavior will cause the X server behavior to change,
> which seems undesirable. So by default pixman should still just point
> sample.
>
> A question is, what should the API look like? It is probably useful to
> make sure we can user other algorithms than regular supersampling in
> the future. Suggestions welcome.

As a result of an irc discussion with Søren the suggested api is:

typedef enum
{
    PIXMAN_SAMPLE_POINT,
    PIXMAN_SAMPLE_BOX
} pixman_sample_t;

void pixman_image_set_sampling (pixman_image_t  *image,
			        pixman_sample_t  sampling);

The default sampling is PIXMAN_SAMPLE_POINT. When sampling is
PIXMAN_SAMPLE_BOX the supersampling rate is automatically computed.

>
> Some more specific comments on the code:
>
> - Is it possible to share the supersampling code between the affine
>   and projective cases? Maybe the super sampling could be done in an
>   inline function that takes other inline functions as arguments.

I could not figure out a good way to do this.

>
> - The NO_SUPERSAMPLING flag needs to be added all over the place. None
>   of the existing fast paths can deal with super sampling. Also, maybe
>   it should be renamed to POINT_SAMPLING instead; that would get rid
>   of the negative in the name.

I've renamed it to POINT_SAMPLING and added it where ever it appeared to
be needed.

>
> - Can we get away with using a simpler algorithm? I can see why you do
>   the computation of all the remainders and I appreciate the attention
>   to correctness.
>
>   However, in most cases, the rate_x/rate_y is going to be small
>   compared to the fixed point unit of 65536, so it might be possible
>   to just compute a "small step" and a "big step":
>
>         normal_step = ux/rate_x
>         initial_step = (ux - (rate - 1) * big_step) / 2
>
>   and then just use those instead of the remainder computations.

I've removed the remainder computations.

>
>> +    uxstart = (ux * (rate_x-1) + rate_x) / (2*rate_x);
>
> This seems to compute a uxstart of
>
>         ux / 2 - ux / (2 * rate_x)
>
> which later gets subtracted from the transformed x coordinate to get
> the first subsample coordinate. So far, so good. ux/(2 * rate_x) is
> the small initial step inside the transformed pixel, and we do need to
> subtract ux/2 to get to the corner of the pixel. But then it seems
> that _before_ actually sampling for the first time, you end up adding
> ux_frac:
>
>> +		    spx += uxfrac;
>
> which offsets the position by uxfrac.

I've moved the small step addition to the end of the loop.

>
> Also, just to make sure, the "+ rate_x" in the first expression is a
> rounding correction, and that is the reason it shouldn't converted to
> fixed point? (Adding a fixed point and an integer triggers a red flag
> for me, but it might be correct).

I don't know. I left it as is.

>
> Finally, I suspect getting rid of the four per-pixel divisions with
> samples is going to be a noticable performance win. It should be
> possible to just compute (1/samples) up front and then multiply with
> it.

Fixed.

>
>
> Thanks,
> Soren
>
> --
> cairo mailing list
> cairo at cairographics.org
> http://lists.cairographics.org/mailman/listinfo/cairo


[1] http://lists.cairographics.org/archives/cairo/2010-August/020490.html

[2] http://lists.cairographics.org/archives/cairo/2010-August/020655.html


More information about the Pixman mailing list