Only LINEAR is not differentiable at zero, so only do the recursive split of the integral for it. --- pixman/pixman-filter.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/pixman/pixman-filter.c b/pixman/pixman-filter.c index 782f73d..0cd4a68 100644 --- a/pixman/pixman-filter.c +++ b/pixman/pixman-filter.c @@ -160,38 +160,38 @@ integral (pixman_kernel_t reconstruct, double x1, pixman_kernel_t sample, double scale, double x2, double width) { + if (reconstruct == PIXMAN_KERNEL_IMPULSE) + { + assert (width == 0.0); + return filters[sample].func (x2 / scale); + } + else if (reconstruct == PIXMAN_KERNEL_BOX && sample == PIXMAN_KERNEL_BOX) + { + assert (width <= 1.0); + return width; + } + else if (sample == PIXMAN_KERNEL_IMPULSE) + { + assert (width == 0.0); + return filters[reconstruct].func (x1); + } /* If the integration interval crosses zero, break it into * two separate integrals. This ensures that filters such * as LINEAR that are not differentiable at 0 will still * integrate properly. */ - if (x1 < 0 && x1 + width > 0) + else if (reconstruct == PIXMAN_KERNEL_LINEAR && x1 < 0 && x1 + width > 0) { return integral (reconstruct, x1, sample, scale, x2, - x1) + integral (reconstruct, 0, sample, scale, x2 - x1, width + x1); } - else if (x2 < 0 && x2 + width > 0) + else if (sample == PIXMAN_KERNEL_LINEAR && x2 < 0 && x2 + width > 0) { return integral (reconstruct, x1, sample, scale, x2, - x2) + integral (reconstruct, x1 - x2, sample, scale, 0, width + x2); } - else if (reconstruct == PIXMAN_KERNEL_IMPULSE) - { - assert (width == 0.0); - return filters[sample].func (x2 / scale); - } - else if (reconstruct == PIXMAN_KERNEL_BOX && sample == PIXMAN_KERNEL_BOX) - { - assert (width <= 1.0); - return width; - } - else if (sample == PIXMAN_KERNEL_IMPULSE) - { - assert (width == 0.0); - return filters[reconstruct].func (x1); - } else { /* Integration via Simpson's rule */ -- 1.7.9.5 _______________________________________________ Pixman mailing list Pixman@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/pixman