[Pixman] [PATCH v10 13/15] pixman-filter: Negative subsample values produces scaled result

Bill Spitzak spitzak at gmail.com
Thu Feb 4 20:11:26 PST 2016


On 02/04/2016 02:47 AM, Oded Gabbay wrote:
> On Tue, Feb 2, 2016 at 8:28 AM,  <spitzak at gmail.com> wrote:
>> From: Bill Spitzak <spitzak at gmail.com>
>>
>> If a negative value is used for the subsampling, then -n subsamples are
>> used at scale==1, and fewer are used at larger scale, more are used at
>> smaller scale, so that the total number of samples is approximately
>> the same. The computed value is rounded up to the next power of 2.
>>
>> The scale demo is modified to allow these negative numbers, and initially
>> uses -12.
>>
>> Signed-off-by: Bill Spitzak <spitzak at gmail.com>
>> ---
>>   demos/scale.ui         |  5 +++--
>>   pixman/pixman-filter.c | 24 ++++++++++++++++++++++++
>>   2 files changed, 27 insertions(+), 2 deletions(-)
>>
>> diff --git a/demos/scale.ui b/demos/scale.ui
>> index b62cbfb..1e77f56 100644
>> --- a/demos/scale.ui
>> +++ b/demos/scale.ui
>> @@ -24,12 +24,12 @@
>>       <property name="page_size">10</property>
>>     </object>
>>     <object class="GtkAdjustment" id="subsample_adjustment">
>> -    <property name="lower">0</property>
>> +    <property name="lower">-256</property>
>>       <property name="upper">12</property>
>>       <property name="step_increment">1</property>
>>       <property name="page_increment">1</property>
>>       <property name="page_size">0</property>
>> -    <property name="value">4</property>
>> +    <property name="value">-12</property>
>>     </object>
>>     <object class="GtkWindow" id="main">
>>       <child>
>> @@ -321,6 +321,7 @@
>>                         <object class="GtkSpinButton" id="subsample_spin_button">
>>                           <property name="visible">True</property>
>>                          <property name="adjustment">subsample_adjustment</property>
>> +                       <property name="value">-12</property>
>>                         </object>
>>                         <packing>
>>                           <property name="left_attach">1</property>
>> diff --git a/pixman/pixman-filter.c b/pixman/pixman-filter.c
>> index f28cc29..6e8024a 100644
>> --- a/pixman/pixman-filter.c
>> +++ b/pixman/pixman-filter.c
>> @@ -342,14 +342,38 @@ filter_width(pixman_kernel_t reconstruct, pixman_kernel_t sample,
>>               double* size, int* subsample_bits)
>>   {
>>       int width;
>> +    /* IMPULSE.x does not work for size < 1.0 */
>>       if (reconstruct == PIXMAN_KERNEL_IMPULSE && *size < 1.0)
>>          *size = 1.0;
>> +    /* Convolution adds the widths of the filters together */
>>       width = ceil (filters[reconstruct].width + *size * filters[sample].width);
>> +    /* If there will only be one sample, it must be 1.0 due to normalization,
>> +       and subsampling is useless. */
>>       if (width <= 1)
>>       {
>>          width = 1;
>>          *subsample_bits = 0;
>>       }
>> +    else if (*subsample_bits < 0)
>> +    {
>> +       /* The intention was to do -n / size rounded up to the next power of 2,
>> +          but this non-linear function seems to work better. For large size
>> +          it is the width of the BOX.BOX filter. For small size it reduces
>> +          samples by 2 at maximum. */
>> +       double desired_samples = -*subsample_bits;
>> +       if (sample == PIXMAN_KERNEL_IMPULSE)
>> +           ; /* For x.IMPULSE no scaling is done */
>> +       else if (*size >= 1.0)
>> +           desired_samples *= 2.0 / (*size + 1.0);
>> +       else
>> +           desired_samples *= 2.0 / ((*size + 1.0) * *size);
>> +       *subsample_bits = (int) ceil (log2(desired_samples) - .01);
>> +       if (*subsample_bits < 0)
>> +           *subsample_bits = 0;
>> +       else if (*subsample_bits > 8)
>> +           /* Assume we cannot see more than 256 different shades and limit subsampling */
>> +           *subsample_bits = 8;
>> +    }
>>       return width;
>>   }
>>
>> --
>> 1.9.1
>>
>> _______________________________________________
>> Pixman mailing list
>> Pixman at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/pixman
>
> I tried applying just the first hunk (the scale.ui change) without the
> second hunk to see If I get any visual errors in scale demo, but
> couldn't see anything wrong. So, I would need to see some form of
> test/example that is affected by this patch, as I don't have the
> knowledge to even ACK it.
>
> Otherwise, you will need to get someone else to review this (Soren ?).
>
> Oded
>
Run it with the graph output and you will see that the new one produces 
far fewer subsamples and changes the number of them as the scale changes.



More information about the Pixman mailing list