protocol: unify wl_viewport src and dst size rules
authorPekka Paalanen <pekka.paalanen@collabora.co.uk>
Fri, 4 Apr 2014 11:22:12 +0000 (14:22 +0300)
committerKristian Høgsberg <krh@bitplanet.net>
Mon, 7 Apr 2014 05:38:15 +0000 (22:38 -0700)
Let's make the source and destination size rules consistent: neither can
have zero, {-1, -1} disables it, and other negatives are not allowed.

The sanity of allowing zero sized source rectangle as debatable. Now the
minimum becomes 1/256x1/256, and with output_scale the actual samples
may be even smaller. That should be enough.

On not allowed values, raise a protocol error. This should help catch
bugs in clients that accidentally send garbage values.

The old wl_viewport.set request remains the same, and can still produce
zero sized source rectangle.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
protocol/scaler.xml
src/compositor.c

index 5094616..e21ae5b 100644 (file)
@@ -86,7 +86,8 @@
       dst_width, dst_height. The source (rectangle) is scaled to exactly
       this size. This overrides whatever the attached wl_buffer size is,
       unless the wl_buffer is NULL. If the wl_buffer is NULL, the surface
-      has no content and therefore no size.
+      has no content and therefore no size. Otherwise, the size is always
+      at least 1x1 in surface coordinates.
 
       If the source rectangle is set, it defines what area of the
       wl_buffer is taken as the source. If the source rectangle is set and
 
     <enum name="error">
       <entry name="bad_value" value="0"
-             summary="negative values in width or height"/>
+             summary="negative or zero values in width or height"/>
     </enum>
 
     <request name="set">
        wl_viewport for the description, and relation to the wl_buffer
        size.
 
-       If width and/or height are negative, the source rectangle is unset
-       instead.
+       If width is -1.0 and height is -1.0, the destination size is unset
+       instead. Any other pair of values for width and height that
+       contains zero or negative values raises the bad_value protocol
+       error.
 
        The crop and scale state is double-buffered state, and will be
        applied on the next wl_surface.commit.
        wl_viewport for the description, and relation to the wl_buffer
        size.
 
-       If width and/or height are negative or zero, the destination size
-       is unset instead.
+       If width is -1 and height is -1, the destination size is unset
+       instead. Any other pair of values for width and height that
+       contains zero or negative values raises the bad_value protocol
+       error.
 
        The crop and scale state is double-buffered state, and will be
        applied on the next wl_surface.commit.
index ea27be4..a076291 100644 (file)
@@ -3452,16 +3452,27 @@ viewport_set_source(struct wl_client *client,
 
        assert(surface->viewport_resource != NULL);
 
-       if (wl_fixed_to_double(src_width) < 0 ||
-           wl_fixed_to_double(src_height) < 0) {
+       if (src_width == wl_fixed_from_int(-1) &&
+           src_height == wl_fixed_from_int(-1)) {
+               /* unset source size */
                surface->pending.buffer_viewport.buffer.src_width =
                        wl_fixed_from_int(-1);
-       } else {
-               surface->pending.buffer_viewport.buffer.src_x = src_x;
-               surface->pending.buffer_viewport.buffer.src_y = src_y;
-               surface->pending.buffer_viewport.buffer.src_width = src_width;
-               surface->pending.buffer_viewport.buffer.src_height = src_height;
+               return;
        }
+
+       if (src_width <= 0 || src_height <= 0) {
+               wl_resource_post_error(resource,
+                       WL_VIEWPORT_ERROR_BAD_VALUE,
+                       "source size must be positive (%fx%f)",
+                       wl_fixed_to_double(src_width),
+                       wl_fixed_to_double(src_height));
+               return;
+       }
+
+       surface->pending.buffer_viewport.buffer.src_x = src_x;
+       surface->pending.buffer_viewport.buffer.src_y = src_y;
+       surface->pending.buffer_viewport.buffer.src_width = src_width;
+       surface->pending.buffer_viewport.buffer.src_height = src_height;
 }
 
 static void
@@ -3475,12 +3486,22 @@ viewport_set_destination(struct wl_client *client,
 
        assert(surface->viewport_resource != NULL);
 
-       if (dst_width <= 0 || dst_height <= 0) {
+       if (dst_width == -1 && dst_height == -1) {
+               /* unset destination size */
                surface->pending.buffer_viewport.surface.width = -1;
-       } else {
-               surface->pending.buffer_viewport.surface.width = dst_width;
-               surface->pending.buffer_viewport.surface.height = dst_height;
+               return;
+       }
+
+       if (dst_width <= 0 || dst_height <= 0) {
+               wl_resource_post_error(resource,
+                       WL_VIEWPORT_ERROR_BAD_VALUE,
+                       "destination size must be positive (%dx%d)",
+                       dst_width, dst_height);
+               return;
        }
+
+       surface->pending.buffer_viewport.surface.width = dst_width;
+       surface->pending.buffer_viewport.surface.height = dst_height;
 }
 
 static const struct wl_viewport_interface viewport_interface = {