diff options
-rw-r--r-- | clients/desktop-shell.c | 27 | ||||
-rw-r--r-- | man/weston.ini.man | 9 |
2 files changed, 29 insertions, 7 deletions
diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c index 3b71403b..40dd1ddf 100644 --- a/clients/desktop-shell.c +++ b/clients/desktop-shell.c @@ -660,6 +660,7 @@ panel_add_launcher(struct panel *panel, const char *icon, const char *path) enum { BACKGROUND_SCALE, + BACKGROUND_SCALE_CROP, BACKGROUND_TILE }; @@ -671,7 +672,9 @@ background_draw(struct widget *widget, void *data) cairo_pattern_t *pattern; cairo_matrix_t matrix; cairo_t *cr; - double sx, sy; + double im_w, im_h; + double sx, sy, s; + double tx, ty; struct rectangle allocation; int type = -1; struct display *display; @@ -691,6 +694,8 @@ background_draw(struct widget *widget, void *data) if (strcmp(key_background_type, "scale") == 0) type = BACKGROUND_SCALE; + else if (strcmp(key_background_type, "scale-crop") == 0) + type = BACKGROUND_SCALE_CROP; else if (strcmp(key_background_type, "tile") == 0) type = BACKGROUND_TILE; else @@ -698,20 +703,32 @@ background_draw(struct widget *widget, void *data) key_background_type); if (image && type != -1) { + im_w = cairo_image_surface_get_width(image); + im_h = cairo_image_surface_get_height(image); + sx = im_w / allocation.width; + sy = im_h / allocation.height; + pattern = cairo_pattern_create_for_surface(image); + switch (type) { case BACKGROUND_SCALE: - sx = (double) cairo_image_surface_get_width(image) / - allocation.width; - sy = (double) cairo_image_surface_get_height(image) / - allocation.height; cairo_matrix_init_scale(&matrix, sx, sy); cairo_pattern_set_matrix(pattern, &matrix); break; + case BACKGROUND_SCALE_CROP: + s = (sx < sy) ? sx : sy; + /* align center */ + tx = (im_w - s * allocation.width) * 0.5; + ty = (im_h - s * allocation.height) * 0.5; + cairo_matrix_init_translate(&matrix, tx, ty); + cairo_matrix_scale(&matrix, s, s); + cairo_pattern_set_matrix(pattern, &matrix); + break; case BACKGROUND_TILE: cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT); break; } + cairo_set_source(cr, pattern); cairo_pattern_destroy (pattern); cairo_surface_destroy(image); diff --git a/man/weston.ini.man b/man/weston.ini.man index d37654aa..c3e5747a 100644 --- a/man/weston.ini.man +++ b/man/weston.ini.man @@ -118,8 +118,13 @@ The entries that can appear in this section are: sets the path for the background image file (string). .TP 7 .BI "background-type=" tile -determines how the background image is drawn (string). Can be scale or -tile (default). +determines how the background image is drawn (string). Can be +.BR scale ", " scale-crop " or " tile " (default)." +Scale means scaled to fit the output precisely, not preserving aspect ratio. +Scale-crop preserves aspect ratio, scales the background image just big +enough to cover the output, and centers it. The image ends up cropped from +left and right, or top and bottom, if the aspect ratio does not match the +output. Tile repeats the background image to fill the output. .TP 7 .BI "background-color=" 0xAARRGGBB sets the color of the background (unsigned integer). The hexadecimal |