clients/screenshooter: Fix taking screenshot on multiple outputs 15/26615/1
authorMarius Vlad <marius.vlad@collabora.com>
Fri, 3 Sep 2021 11:46:53 +0000 (14:46 +0300)
committerMarius Vlad <marius.vlad@collabora.com>
Fri, 3 Sep 2021 11:52:44 +0000 (14:52 +0300)
Turns out we were re-initializing the buffers min/max values each time
for each output, thus not computing the entire combined output. This is
a trivial fix.

Bug-AGL: SPEC-4064

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Change-Id: Ie0c7490c902273b42c81e09cd08e480f30a654c0

clients/screenshooter.c

index faced55..64dc76a 100644 (file)
@@ -395,28 +395,15 @@ screenshot_write_png(const struct buffer_size *buff_size,
        free(data);
 }
 
-static int
+static void
 screenshot_set_buffer_size_per_output(struct buffer_size *buff_size,
                                      struct screenshooter_output *output)
 {
-       buff_size->min_x = buff_size->min_y = INT_MAX;
-       buff_size->max_x = buff_size->max_y = INT_MIN;
-
        buff_size->min_x = MIN(buff_size->min_x, output->offset_x);
        buff_size->min_y = MIN(buff_size->min_y, output->offset_y);
-       buff_size->max_x =
-               MAX(buff_size->max_x, output->offset_x + output->width);
-       buff_size->max_y =
-               MAX(buff_size->max_y, output->offset_y + output->height);
-
-       if (buff_size->max_x <= buff_size->min_x ||
-           buff_size->max_y <= buff_size->min_y)
-               return -1;
-
-       buff_size->width = buff_size->max_x - buff_size->min_x;
-       buff_size->height = buff_size->max_y - buff_size->min_y;
+       buff_size->max_x = MAX(buff_size->max_x, output->offset_x + output->width);
+       buff_size->max_y = MAX(buff_size->max_y, output->offset_y + output->height);
 
-       return 0;
 }
 
 static void
@@ -432,12 +419,21 @@ screenshot_set_buffer_size(struct buffer_size *buff_size, struct wl_list *output
        struct screenshooter_output *output;
        int pos = 0;
 
+       buff_size->min_x = buff_size->min_y = INT_MAX;
+       buff_size->max_x = buff_size->max_y = INT_MIN;
+
        wl_list_for_each_reverse(output, output_list, link)
                screenshot_compute_output_offset(&pos, output);
 
        wl_list_for_each(output, output_list, link)
-               if (screenshot_set_buffer_size_per_output(buff_size, output))
-                       return -1;
+               screenshot_set_buffer_size_per_output(buff_size, output);
+
+       if (buff_size->max_x <= buff_size->min_x ||
+           buff_size->max_y <= buff_size->min_y)
+               return -1;
+
+       buff_size->width = buff_size->max_x - buff_size->min_x;
+       buff_size->height = buff_size->max_y - buff_size->min_y;
 
        return 0;
 }