# [Pixman] [PATCH 05/15] pixman-filter: Correct Simpsons integration

Bill Spitzak spitzak at gmail.com
Thu Dec 17 13:50:51 PST 2015

```This was based on looking up Simpson's integration on the web, from the

It cuts the samples into sets of 3, with an overlap of 1. Each set then
weighs 1,4,1 in the average, to simulate the weight of the control points
of a cubic curve. Since the overlapping samples of 1 add to 2 this results
in 1,4,2,4,2,...4,1 as the weights.  As there are two points per set and
the total weight is 1+4+1=6, you divide the full sum by 6/2 = 3.

It appears this implementation attempted to overlap them by 2, resulting in
weights of 1,5,6,...6,5,1. However this is very close to a flat average of
all the points. Also this is a total of 6 for every point so the divisor
should be 6, but it was left at 3.

Based on my reading the new version is correct. However I have not been
able to see any visible difference in the filtering even if I reduce the
number of samples to 3.

On Thu, Dec 17, 2015 at 10:21 AM, Oded Gabbay <oded.gabbay at gmail.com> wrote:

> On Thu, Dec 17, 2015 at 8:20 PM, 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>
> >>
> >> Simpsons uses cubic curve fitting, with 3 samples defining each cubic.
> This
> >> makes the weights of the samples be in a pattern of 1,4,2,4,2...4,1,
> and then
> >> dividing the result by 3.
> >>
> >> The previous code was using weights of 1,2,6,6...6,2,1 which produced
> >> the correct value, as it was still dividing by 3. The filter
> normalization
> >> removed this error. Also this is effectively a linear interpolation
> except for
> >> the ends.
> >> ---
> >>  pixman/pixman-filter.c | 11 +++++++----
> >>  1 file changed, 7 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/pixman/pixman-filter.c b/pixman/pixman-filter.c
> >> index 15f9069..7c1da0d 100644
> >> --- a/pixman/pixman-filter.c
> >> +++ b/pixman/pixman-filter.c
> >> @@ -204,11 +204,14 @@ integral (pixman_kernel_t reconstruct, double x1,
> >>         {
> >>             double a1 = x1 + h * i;
> >>             double a2 = x2 + h * i;
> >> +           s += 4 * SAMPLE(a1, a2);
> >> +       }
> >>
> >> -           s += 2 * SAMPLE (a1, a2);
> >> -
> >> -           if (i >= 2 && i < N_SEGMENTS - 1)
> >> -               s += 4 * SAMPLE (a1, a2);
> >> +       for (i = 2; i < N_SEGMENTS; i += 2)
> >> +       {
> >> +           double a1 = x1 + h * i;
> >> +           double a2 = x2 + h * i;
> >> +           s += 2 * SAMPLE(a1, a2);
> >>         }
> >>
> >>         s += SAMPLE (x1 + width, x2 + width);
> >> --
> >> 1.9.1
> >>
> >> _______________________________________________
> >> Pixman mailing list
> >> Pixman at lists.freedesktop.org
> >> http://lists.freedesktop.org/mailman/listinfo/pixman
> >
> > You say:
> >
> > "The filter normalization removed this error. Also this is effectively
> > a linear interpolation except for the ends."
> >
> > So if the error was removed, why is this change needed ? I can see it
> > is more accurate (similar to the Simpson equation), but it also causes
> > the code to run over the loop twice.
> >
> > Do you have some example we can see the difference ?
> >
> >
> >     Oded
>
> OK, now I see that in the next patch, you reduce the samples from 128
> to 16, so we are now running less iterations.
> I still would be happy to see an example with my own eyes where this
> makes a difference.
>
>         Oded
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/pixman/attachments/20151217/ca412b4d/attachment.html>
```