pixman-filter: Speed up BOX/BOX filter
authorSøren Sandmann Pedersen <soren.sandmann@gmail.com>
Wed, 31 Aug 2016 05:03:12 +0000 (22:03 -0700)
committerSøren Sandmann Pedersen <soren.sandmann@gmail.com>
Fri, 2 Sep 2016 04:40:12 +0000 (00:40 -0400)
The convolution of two BOX filters is simply the length of the
interval where both are non-zero, so we can simply return width from
the integral() function because the integration region has already
been restricted to be such that both functions are non-zero on it.

This is both faster and more accurate than doing numerical integration.

This patch is based on one by Bill Spitzak

    https://lists.freedesktop.org/archives/pixman/2016-March/004446.html

with these changes:

- Rebased to not assume any changes in the arguments to integral().

- Dropped the multiplication by scale

- Added more details in the commit message.

Signed-off-by: Søren Sandmann <soren.sandmann@gmail.com>
Reviewed-by: Bill Spitzak <spitzak@gmail.com>
pixman/pixman-filter.c

index 878cf9d491a49ab5805f2acf06250e7227e5191b..11e7d0e934f7979114930514517b360fe0e64555 100644 (file)
@@ -160,11 +160,15 @@ integral (pixman_kernel_t kernel1, double x1,
          pixman_kernel_t kernel2, double scale, double x2,
          double width)
 {
+    if (kernel1 == PIXMAN_KERNEL_BOX && kernel2 == PIXMAN_KERNEL_BOX)
+    {
+       return width;
+    }
     /* The LINEAR filter is not differentiable at 0, so if the
      * integration interval crosses zero, break it into two
      * separate integrals.
      */
-    if (kernel1 == PIXMAN_KERNEL_LINEAR && x1 < 0 && x1 + width > 0)
+    else if (kernel1 == PIXMAN_KERNEL_LINEAR && x1 < 0 && x1 + width > 0)
     {
        return
            integral (kernel1, x1, kernel2, scale, x2, - x1) +