[PATCH weston 0/8] wl_viewport enhancements

Bill Spitzak spitzak at gmail.com
Thu Mar 20 11:58:11 PDT 2014


Pekka Paalanen wrote:

> The sampling really goes into hair-splitting. It depends on how you
> interpret a texel image; is each pixel a solid-colored tile, or does
> the color vary smoothly from texel to the next. Then you have the
> source rectangle, which is divided into dst_width x dst_height pixels
> (let's assume output_scale=1). For each pixel, do you take a point
> sample from its middle, or do you integrate an average over the pixel's
> area in the source texture. In any case, I see that point sampling is
> well-defined always, and a theoretical prerequisite for the integration
> since we can and will sample "between texels". In that respect, a 0x0
> source rectangle would just mean that all pixels will be point samples
> at src_x,src_y.

I see the source image as being solid-colored tiles for the pixels, but 
accessing a value from it involves integrating the product of these 
tiles with a "sampling filter". Actual implementations convert the 
continuous filter to a weight for each pixel's color, note that these 
weights depend on the fractional part of the sample position.

The bilinear interpolation that I believe you are considering is 
equivalent to making the filter a 1x1 square centered on the sample 
position.

This interpretation is necessary to produce correct sampling when an 
image is scaled down. The filter is then bigger than 1x1. This cannot be 
done with a point-sampled continuous source unless that source varies 
depending on the scale, an approach which I find much harder to deal 
with than sampling filters.

It also makes it possible to do more complex filters such as sync 
filters. For continous filters with a frequency of 1/2 or less (such as 
the sync at scales <= 1) it is accurate to use the value of the filter 
at the center of each pixel as the weight for that pixel.

Normally when scaling *up* the filter does not get smaller, it stops at 
the same size it is at scale=1. This is what bilinear interpolation 
does. However this scheme can well-define a scaling up that lets the 
user see pixels as blocks but with anti-aliased edges. This can be done 
with a filter that is smaller than 1x1. There is some desire for this 
behavior, for instance OS/X does it by default.

> So, better forget that and do what seems natural. The minimum sampling
> area (source rect) will be 1/256 x 1/256 texels per surface pixel,
> then. Output_scale would make that respectively smaller, too.

Okay I was unaware that the source did not align with pixels. I thought 
the reason you were using fixed-point is to allow it to be aligned with 
pixels even if buffer scale is not 1.

As I saw it the scaling was expected to transform the center of each 
output pixel to a location in the input and center a filter there. If 
you assume you are scaling up and a 1x1 box filter is used, the center 
of the samples will never be closer than .5 to the edge of the source 
rectangle and thus the filtering will never multiply any point outside 
the source rectangle by non-zero.

This assumption is false if the box is allowed to be smaller than 1x1. 
It is also somewhat false if the box does not align with pixels (the 
filter is still inside, but when translated to weights at pixel centers 
it puts a non-zero weight outside the box.

The filter also goes outside if there is scaling down instead of up, or 
if a more complex filter than a box is used. I was under the impression 
that an implementation was either required, or at least allowed, to 
clamp the filter locations to be inside the box. It now sounds like the 
box should be ignored except to calculate a scale+translate that should 
be done, followed by a crop to the destination rectangle.

>> As far as negative size -> disable goes, I like it.  We need some way of
>> disabling them, and that works fine.  You could make an argument about how
>> we should send an actual error and kill the client, but I think just
>> turning off crop-and-scale is sufficient.

Yes I'm ok with negative meaning disable. I was just recommending that 
zero *also* mean disable.


More information about the wayland-devel mailing list