[cairo] downscaling capabilities

Frédéric Plourde frederic.plourde at polymtl.ca
Sat Apr 19 10:23:11 PDT 2008

By the way,

Does anybody know what was the first intented uses for filtering modes 

down to pixman, all three are considered equal to the same bilinear 
sampling technique, so we're not making any smart use of them.
I would suggest, since we're turning ourselves toward sampling issues, 
that we make use of these "GOOD" and "BEST" modes in a more clever way.

For example :

    CAIRO_FILTER_BILINEAR : our current bilinear filter
    CAIRO_FILTER_GOOD :       true downscaling to nearest mipmap level + 
bilinear filtering
    CAIRO_FILTER_BEST :         trilinear filtering.


Owen Taylor a écrit :
> On Sat, 2008-04-19 at 09:35 -0400, Frédéric Plourde wrote:
>> Thanks Bill for that "state of the art" about resampling techniques ;-)
>>    Just to answer your last question and to be sure we understand each 
>> other, .. no, no... I was not thinking about MipMaping at all. I don't 
>> think it's well suited to cairo/pixman neither.
>> I said that I was going to implement a simple low-pass filter (surely 
>> gaussian) in space-domain... it means : a convolution kernel (just like 
>> your "box filtering" that you mentionned). I just used another term to 
>> refer to it.
>> However, the important thing is to adaptively adapt the size of that 
>> gaussian convolution kernel to the scaling factor...
>> let's keep in touch 'bout that.
> I'm going to directly disagree here and suggest that for
> CAIRO_FILTER_GOOD, the right algorithm is:
>  - Scale down by factors of 2 repeatedly until you are less than 2 times
>    the target scale factor
>  - Bilinearly sample from the result
> There are certainly disadvantages to this to this approach:
>  - Works worse with non-uniform scales (that contract more in one
>    direction than others)
>  - Produces discontinuities at powers of two (this is why people use
>    trilinear filtering)
>  - Produces noticeable aliasing just above powers of two (another
>    reason to use trilinear filtering)
> It's not good filtering in any sense. But:
>  - It has a cost that's O(num pixels in source), which is hard to do
>    with convolution techniques. (Not going to say impossible, but
>    hard, and especially hard for anything but a pure scale.)
>  - It's easy to make fast in C and optimize with mmx/sse/etc.
>  - It has good memory locality for the scale-down phase
>  - It is easy to apply to transforms that aren't pure scales
> There are certainly all sorts of better things you can do .. use better
> ways of scaling down the image, use better sampling from the scaled
> down image; there may be some interesting things to do with non-uniform
> / random sampling that would allow doing better than O(number of pixels
> in source), but but given the constraints of real-time software
> rendering (and CAIRO_FILTER_GOOD should be shooting for real-time) I'm
> not sure that they are feasible. What we should worry about in the
> short term is improving the worst case appearance (cairo does a really
> bad job here) and keeping the worst case performance within bounds
> (gdk-pixbuf does a really bad job with that.)
> - Owen

More information about the cairo mailing list