[Pixman] [PATCH v14 16/22] pixman-filter: distribute normalization error over filter
Søren Sandmann
soren.sandmann at gmail.com
Sat Mar 19 02:06:39 UTC 2016
On Fri, Mar 18, 2016 at 9:54 PM, Søren Sandmann <soren.sandmann at gmail.com>
wrote:
> On Sun, Mar 6, 2016 at 8:06 PM, <spitzak at gmail.com> wrote:
>
>> From: Bill Spitzak <spitzak at gmail.com>
>>
>> This removes a high-frequency spike in the middle of some filters that is
>> caused by math errors all being in the same direction.
>>
>> Signed-off-by: Bill Spitzak <spitzak at gmail.com>
>> ---
>> pixman/pixman-filter.c | 12 +++++++++++-
>> 1 file changed, 11 insertions(+), 1 deletion(-)
>>
>> diff --git a/pixman/pixman-filter.c b/pixman/pixman-filter.c
>> index 36dd811..ab62e0a 100644
>> --- a/pixman/pixman-filter.c
>> +++ b/pixman/pixman-filter.c
>> @@ -282,8 +282,18 @@ create_1d_filter (int width,
>> p[x] = t;
>> }
>>
>> + /* Distribute any remaining error over all samples */
>> if (new_total != pixman_fixed_1)
>> - p[width / 2] += (pixman_fixed_1 - new_total);
>> + {
>> + pixman_fixed_t delta = new_total - pixman_fixed_1;
>> + pixman_fixed_t t = 0;
>> + for (x = 0; x < width; ++x)
>> + {
>> + pixman_fixed_t new_t = delta * (x + 1) / width;
>> + p[x] += new_t - t;
>> + t = new_t;
>> + }
>> + }
>>
>
> I think there is a sign error in this code: delta is new_total - 1, which
> is positive when new_total is bigger than 1. But this positive delta is
> then added to the samples, making the total even bigger.
>
> Also, I would write the code like this:
>
> pixman_fixed_t error = pixman_fixed_1 - new_total;
> for (x = 0; x < width; ++x)
> {
> pixman_fixed_t d = error * (x + 1) / width;
> p[x] += d;
> error -= d;
> }
>
> to get rid of the temporary and to make it more obvious that there is an
> error that is being distributed.
>
> Another possibility is to do error diffusion in the /* Normalize */ loop.
>
Also, a test that generates a bunch of filters and verifies that all the
phases sum to 1 would be useful.
Søren
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/pixman/attachments/20160318/47bc1cd3/attachment.html>
More information about the Pixman
mailing list