[RFC] wl_surface scale and crop protocol extension

Bill Spitzak spitzak at gmail.com
Tue Apr 30 14:21:41 PDT 2013



Pekka Paalanen wrote:
> Hi all,
> 
> below is my first draft for a wl_surface scaling and cropping
> extension. I called it wl_scaler in the lack of a better name. It is
> designed similarly to the other wl_surface extensions wl_shell_surface
> and wl_subsurface.
> 
> There probably isn't any interesting details to debate, right? ;-)
> 
> I'd like to have a better name for it, and you might want the set
> request split into two or three, or not, but otherwise I'm quite
> satisfied with it. I tried to take into account all existing protocol
> that interacts with this.
> 
> Comments? Is the language clear?

"scalar" is often used to identify a single number in linear algebra. A 
different name would be better. "transform" might work but that also 
would cover the subsurface and surface transforms, perhaps that can be 
moved to this api as well.

I think the buffer_transform and surface x,y should be part of this. Ie 
when this is created it is initialized with these values, and changes to 
these values make identical changes to the transform values.

There is a whole stack of transforms and clips that need to be applied 
and possibly the methods for all of these should be put into this api. I 
think all of the following transforms should work. Transforms are affine 
matrix defined by 6 numbers and include translation.

First there is the actual pixels in the buffer. The buffer has a width 
and height and starts out oriented with the width horizontal and the 
corner at 0,0. Pixels outside this rectangle have implementation-defined 
values (depending on the renderer they may be black or the edges 
replicated).

There is a "drawing transform". The *inverse* of this transform is 
applied to the pixels. The current buffer_transform is incorporated into 
this matrix. The purpose is so if a client can figure out the total 
transform it can compensate for it when drawing. It also allows a client 
to use a single very large buffer and lay out the drawings of multiple 
surfaces inside it. The reason it is inverted and not merged with the 
scaling transform is so the compositor can divide by it accurately, and 
so it matches the matrix passed to cairo.

Then there is the "scaling transform". The pixels are transformed by 
this to "surface space". The translation is used to set the corner of 
the crop. Events sent to the surface are reported in surface space, as 
in your proposal, and opaque and input regions are defined in this space.

Then there is the "crop", which is a width and height. This and 0,0 
determine a rectangle in "surface space" and determine the surface size. 
The compositor replaces all pixels outside this rectangle with 
transparent black.

Then there is a "surface transform". The current x,y of wl_surface is 
the translation component of this. This already exists.

It is further transformed by the surface transform of a parent surface 
for a subsurface, and recursively for it's parent, etc.

Finally it is transformed by the "output transform" which handles RandR 
of the outputs.


More information about the wayland-devel mailing list