[Pixman] Image resampling [PATCH 0/6]
Behdad Esfahbod
behdad at behdad.org
Fri Nov 23 22:01:13 PST 2012
Hi Søren,
This is a very well done patchset with great commentary. Great job!
Cheers,
behdad
On 12-11-23 10:57 PM, Søren Sandmann wrote:
> Hi,
>
> Reviewing the supersampling patch here:
>
> http://cgit.freedesktop.org/~ajohnson/pixman/log/?h=supersampling
>
> I wasn't happy with either the performance and image quality, and I
> realized that the whole supersampling approach just isn't going to
> fly. Since I told people to do it that way, I apologize for that. The
> approach advocated by Bill Spitzak in the various downsampling threads
> of computing a convolution kernel up front, is the much better way to
> go. To make up for being misleading, the following patches implement
> comprehensive support for high-quality image scaling filters.
>
> Pixman already has a convolution filter, but since it only allows one
> sample per pixel of the filter, it is limited in the quality that it can
> support, so the following patches (to be applied on top of the three
> rounding patches) add a new filter type
>
> PIXMAN_FILTER_SEPARABLE_CONVOLUTION
>
> that supports multiple different convolution matrices that are chosen
> between based on the subpixel source location. The matrices are
> specified as tensor products of x/y vectors, which makes them
> separable by definition.
>
> The patches also add a helper function
>
> pixman_filter_create_separable_convolution()
>
> that will create the parameters for the filter based on scaling
> factors, filter kernels and subsampling resolution. Currently the
> supported kernels are impulse, box, linear, cubic
> (Mitchell-Netravali), lanczos2, lanczos3, lanczos3_stretched
> (aka. Blinn's 'Nice' filter), and Gaussian.
>
> There also a new demo program "demos/scale" that shows how
> the new API can be used.
>
> For some useful math regarding image transformations, see
> http://people.redhat.com/otaylor/gtk/pixbuf-transform-math.ps . For
> some informatino about how to compute the convolution matrices, see
> the additions to rounding.txt in the second patch.
>
>
> -=- Adding support to cairo and further work
>
> Once these patches have landed in Pixman, support will have to be
> added to cairo to make use of them. How to do that exactly requires
> figuring out what new API to offer, and how the tradeoffs between
> performance and quality should be made. This is not something that I
> personally plan to work on anytime soon, except to make three notes:
>
> - While transformations that are not pure scalings will not
> generally result in a separable filter, OK-looking results for
> non-scalings can be achieved by using scaling factors based on the
> bounding box of a transformation
>
> - For equivalent quality to GdkPixbuf do this: In each direction
> compute the scaling factors and then, if the scaling factor is
> less than 1 (ie., a downscaling), use PIXMAN_KERNEL_BOX for both
> reconstruction and sampling, and if it's greater than one, use
> PIXMAN_KERNEL_LINEAR for reconstruction and PIXMAN_KERNEL_IMPULSE
> for sampling.
>
> - If PIXMAN_KERNEL_GAUSSIAN is used with large downscaling factors
> and the resulting filter is then used with an identity transform,
> the result is a Gaussian blur, which is a feature that has
> sometimes been requested.
>
> The code in demos/scale.c may be useful as an example.
>
>
> -=- Further work and examples
>
> There is some additional work that could be done:
>
> - Performance improvements. Low-hanging fruit includes adding new fast
> path iterators that assume the source is a8r8g8b8 or r5g6b5. Higher
> hanging fruit is SIMD optimziations and implementations that take
> advantage of separability. It may also be interesting to speed up
> pixman_filter_create_separable_convolution() by tabularizing some of
> the trigonometric functions etc.
>
> - A non-separable, but subsampled, convolution filter type could be
> interesting to allow correct filters for non-scaling transformations
> and non-separable filters in general.
>
>
> As a reward for reading this entire mail, here are some images:
>
> Original (2.6 MB):
>
> http://www.daimi.au.dk/~sandmann/house.jpg
>
> Scaled down 12.9 times in each dimension:
>
> - With a box filter:
>
> http://www.daimi.au.dk/~sandmann/house-box.png
>
> - With Lanczos3:
>
> http://www.daimi.au.dk/~sandmann/house-lanczos3.png
>
> - With stretched Lanczos3:
>
> http://www.daimi.au.dk/~sandmann/house-nice.png
>
> For more examples, try demos/scale.
>
> The patch series is also available in this repository:
>
> http://cgit.freedesktop.org/~sandmann/pixman/log/?h=separable
>
>
> Soren
> _______________________________________________
> Pixman mailing list
> Pixman at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/pixman
>
--
behdad
http://behdad.org/
More information about the Pixman
mailing list