[Pixman] [PATCH v10 13/15] pixman-filter: Negative subsample values produces scaled result
Oded Gabbay
oded.gabbay at gmail.com
Thu Feb 4 02:47:00 PST 2016
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
More information about the Pixman
mailing list