# [Pixman] [PATCH 08/15] pixman-filter: Don't recurse unnecessarily.

Bill Spitzak spitzak at gmail.com
Tue Dec 22 11:38:06 PST 2015

```On Tue, Dec 22, 2015 at 1:38 AM, Oded Gabbay <oded.gabbay at gmail.com> wrote:

> On Sat, Dec 12, 2015 at 8:06 PM,  <spitzak at gmail.com> wrote:
> > From: Bill Spitzak <spitzak at gmail.com>
> >
> > Only LINEAR is not differentiable at zero,
>
> I'm sorry, I don't understand this sentence. Could you please give me
> a more detailed explanation + reference ?
>

All the other filter functions have a continuous first derivative over
their entire range.

The LINEAR function is a triangle and the first derivative changes from +1
to -1 at 0.0.

I believe SÃ¸ren was concerned that the Simpson's integration would not work
at this point. He solved this by splitting the integral into 2 or 3 at the
zeros, so the integration is not done across these points.

I figured I should keep this, though I suspect the error is really
invisibly tiny. Apparently Simpsons integration will have some error for
any function where the third derivative is not constant, which is true for
all the filters here except box. But the error is really really tiny and
was being ignored for all the other filters, and it may be ok to ignore it
here too.

Thanks,
>
>         Oded
>
> > 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.9.1
> >
> > _______________________________________________
> > Pixman mailing list
> > Pixman at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/pixman
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/pixman/attachments/20151222/82aebfe1/attachment-0001.html>
```