[cairo] Downing scaling images
spitzak at gmail.com
Tue Dec 14 13:19:11 PST 2010
A different possible algorithm is to do downscaling in two steps. The
second step uses a scale close enough to 1:1 that bilinear sampling is
acceptable. Advantages of this are:
- The pixman code can be reused without changes
- The integer box filter is by far the fastest possible variable sized
filter you can do.
- The result of the first step can be saved by Cairo, making redrawing
the same transform (or similar ones such as rotations) much faster.
- More blurring due to two filtering passes
- Blur will vary depending on the translation
- Space needed to store the intermediate surface (never more than 1/2
the full size surface).
- If the source is on the server it will have to be copied to cairo's
The algorithm is to reduce the transform to an integer scaling-only
transform and a remainder matrix which scales by more or equal to a
cutoff value. The cutoff needs to be chosen somewhere between .5 and 1,
larger values will make it blurrier but reduce bilinear sampling artifacts.
The integer scale is then used to do very fast box-filtering of the
image into a down-sized one (if it is 1:1 then this is skipped and the
original image is used). This is very fast: for a 1/N by 1/M scale each
output pixel is the average of a NxM rectangle of pixels and these
rectangles do not overlap.
The remainder transform is then used by the pixman bilinear filter to
sample this temporary image.
The temporary image is saved with the source surface, and invalidated
only if that surface is changed or if a different-sized temporary
surface is used.
Note that this is only an idea. I am worried about the blurring
artifacts. A direct comparison to the filtering I described before shows
that it has problems, though it is a lot better than some OpenGL mipmap
scaling I compared it to.
More information about the cairo