[PATCH] compositor-headless: Report a more realistic physical size

Johan Klokkhammer Helsing johan.helsing at qt.io
Thu Apr 12 07:31:48 UTC 2018


Some clients rely on the physical size to determine the physical DPI. With the
previous implementation, we would report 1px==1mm, which is a DPI of 25.4,
which is incredibly low.

The problem is solved by setting a physical size so the DPI is close to 72
instead. If the output is scaled, the DPI is set to the corresponding multiple
of 72.

This makes the headless backend more usable for automated testing of DPI
sensitive functionality such as point sized fonts.

Signed-off-by: Johan Klokkhammer Helsing <johan.helsing at qt.io>
---
 libweston/compositor-headless.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/libweston/compositor-headless.c b/libweston/compositor-headless.c
index 9307a36a..9f1a1a72 100644
--- a/libweston/compositor-headless.c
+++ b/libweston/compositor-headless.c
@@ -180,12 +180,19 @@ err_malloc:
 	return -1;
 }
 
+static int
+physical_size_for_dpi(int pixels, int dpi)
+{
+	static const float mm_per_inch = 25.4;
+	return pixels * mm_per_inch / dpi;
+}
+
 static int
 headless_output_set_size(struct weston_output *base,
 			 int width, int height)
 {
 	struct headless_output *output = to_headless_output(base);
-	int output_width, output_height;
+	int output_width, output_height, output_dpi;
 
 	/* We can only be called once. */
 	assert(!output->base.current_mode);
@@ -207,9 +214,10 @@ headless_output_set_size(struct weston_output *base,
 	output->base.make = "weston";
 	output->base.model = "headless";
 
-	/* XXX: Calculate proper size. */
-	output->base.mm_width = width;
-	output->base.mm_height = height;
+	/* XXX: Make this configurable */
+	output_dpi = 72 * output->base.scale;
+	output->base.mm_width = physical_size_for_dpi(output_width, output_dpi);
+	output->base.mm_height = physical_size_for_dpi(output_height, output_dpi);
 
 	output->base.start_repaint_loop = headless_output_start_repaint_loop;
 	output->base.repaint = headless_output_repaint;
-- 
2.16.3



More information about the wayland-devel mailing list