diff options
author | Christoph Gysin <christoph.gysin@gmail.com> | 2015-11-25 22:26:21 +0200 |
---|---|---|
committer | Christoph Gysin <christoph.gysin@gmail.com> | 2015-11-25 22:32:02 +0200 |
commit | be3fae148bc2a48a1d828b72221c0fd69bea79f7 (patch) | |
tree | eb872cf8e54e08d6ee6205564d8959a11430b9b3 /swaybg | |
parent | swaybg: implement scaling mode "tile" (diff) | |
download | sway-be3fae148bc2a48a1d828b72221c0fd69bea79f7.tar.gz sway-be3fae148bc2a48a1d828b72221c0fd69bea79f7.tar.zst sway-be3fae148bc2a48a1d828b72221c0fd69bea79f7.zip |
swaybg: implement scaling mode "fit"
Diffstat (limited to 'swaybg')
-rw-r--r-- | swaybg/main.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/swaybg/main.c b/swaybg/main.c index 7cfe1320..e4c699c1 100644 --- a/swaybg/main.c +++ b/swaybg/main.c | |||
@@ -15,6 +15,7 @@ struct registry *registry; | |||
15 | enum scaling_mode_t { | 15 | enum scaling_mode_t { |
16 | SCALING_MODE_STRETCH, | 16 | SCALING_MODE_STRETCH, |
17 | SCALING_MODE_FILL, | 17 | SCALING_MODE_FILL, |
18 | SCALING_MODE_FIT, | ||
18 | SCALING_MODE_CENTER, | 19 | SCALING_MODE_CENTER, |
19 | SCALING_MODE_TILE, | 20 | SCALING_MODE_TILE, |
20 | }; | 21 | }; |
@@ -66,6 +67,8 @@ int main(int argc, const char **argv) { | |||
66 | scaling_mode = SCALING_MODE_STRETCH; | 67 | scaling_mode = SCALING_MODE_STRETCH; |
67 | } else if (strcmp(scaling_mode_str, "fill") == 0) { | 68 | } else if (strcmp(scaling_mode_str, "fill") == 0) { |
68 | scaling_mode = SCALING_MODE_FILL; | 69 | scaling_mode = SCALING_MODE_FILL; |
70 | } else if (strcmp(scaling_mode_str, "fit") == 0) { | ||
71 | scaling_mode = SCALING_MODE_FIT; | ||
69 | } else if (strcmp(scaling_mode_str, "center") == 0) { | 72 | } else if (strcmp(scaling_mode_str, "center") == 0) { |
70 | scaling_mode = SCALING_MODE_CENTER; | 73 | scaling_mode = SCALING_MODE_CENTER; |
71 | } else if (strcmp(scaling_mode_str, "tile") == 0) { | 74 | } else if (strcmp(scaling_mode_str, "tile") == 0) { |
@@ -105,6 +108,26 @@ int main(int argc, const char **argv) { | |||
105 | } | 108 | } |
106 | } | 109 | } |
107 | break; | 110 | break; |
111 | case SCALING_MODE_FIT: | ||
112 | { | ||
113 | double window_ratio = (double) window->width / window->height; | ||
114 | double bg_ratio = width / height; | ||
115 | |||
116 | if (window_ratio > bg_ratio) { | ||
117 | double scale = (double) window->height / height; | ||
118 | cairo_scale(window->cairo, scale, scale); | ||
119 | cairo_set_source_surface(window->cairo, image, | ||
120 | (double) window->width/2 / scale - width/2, | ||
121 | 0); | ||
122 | } else { | ||
123 | double scale = (double) window->width / width; | ||
124 | cairo_scale(window->cairo, scale, scale); | ||
125 | cairo_set_source_surface(window->cairo, image, | ||
126 | 0, | ||
127 | (double) window->height/2 / scale - height/2); | ||
128 | } | ||
129 | } | ||
130 | break; | ||
108 | case SCALING_MODE_CENTER: | 131 | case SCALING_MODE_CENTER: |
109 | cairo_set_source_surface(window->cairo, image, | 132 | cairo_set_source_surface(window->cairo, image, |
110 | (double) window->width/2 - width/2, | 133 | (double) window->width/2 - width/2, |