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

Oded Gabbay oded.gabbay at gmail.com
Thu Dec 17 10:21:53 PST 2015

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 about 2x
>> 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