summaryrefslogtreecommitdiff
path: root/gtk/gtkthemingbackground.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2012-01-17 16:09:35 +0100
committerBenjamin Otte <otte@redhat.com>2012-02-02 03:14:01 +0100
commit2434dbc10a287499585f52ba2116ab65a44b0cec (patch)
treefe7dc69a757b63e0cd36660fb6a28c6201ac1de1 /gtk/gtkthemingbackground.c
parent82b739c490310808f1aac5810906dbb79eec12a1 (diff)
downloadgtk+-2434dbc10a287499585f52ba2116ab65a44b0cec.tar.gz
themingbackground: Implement background-size support
Diffstat (limited to 'gtk/gtkthemingbackground.c')
-rw-r--r--gtk/gtkthemingbackground.c53
1 files changed, 49 insertions, 4 deletions
diff --git a/gtk/gtkthemingbackground.c b/gtk/gtkthemingbackground.c
index 2d5859f540..4ffdda3723 100644
--- a/gtk/gtkthemingbackground.c
+++ b/gtk/gtkthemingbackground.c
@@ -114,6 +114,39 @@ _gtk_theming_background_apply_clip (GtkThemingBackground *bg)
}
static void
+_gtk_theming_background_get_cover_contain (GtkCssImage *image,
+ gboolean cover,
+ double width,
+ double height,
+ double *concrete_width,
+ double *concrete_height)
+{
+ double aspect, image_aspect;
+
+ image_aspect = _gtk_css_image_get_aspect_ratio (image);
+ if (image_aspect == 0.0)
+ {
+ *concrete_width = width;
+ *concrete_height = height;
+ return;
+ }
+
+ aspect = width / height;
+
+ if ((aspect >= image_aspect && cover) ||
+ (aspect < image_aspect && !cover))
+ {
+ *concrete_width = width;
+ *concrete_height = width / image_aspect;
+ }
+ else
+ {
+ *concrete_height = height;
+ *concrete_width = height * image_aspect;
+ }
+}
+
+static void
_gtk_theming_background_paint (GtkThemingBackground *bg,
cairo_t *cr)
{
@@ -130,9 +163,11 @@ _gtk_theming_background_paint (GtkThemingBackground *bg,
&& bg->image_rect.height > 0)
{
GtkCssBackgroundRepeat hrepeat, vrepeat;
+ GtkCssBackgroundSize *size;
double image_width, image_height;
double width, height;
+ size = g_value_get_boxed (_gtk_theming_engine_peek_property (bg->engine, "background-size"));
gtk_theming_engine_get (bg->engine, bg->flags,
"background-repeat", &hrepeat,
NULL);
@@ -141,10 +176,20 @@ _gtk_theming_background_paint (GtkThemingBackground *bg,
width = bg->image_rect.width;
height = bg->image_rect.height;
- _gtk_css_image_get_concrete_size (bg->image,
- 0, 0, /* XXX: needs background-size support */
- width, height,
- &image_width, &image_height);
+ if (size->contain || size->cover)
+ _gtk_theming_background_get_cover_contain (bg->image,
+ size->cover,
+ width,
+ height,
+ &image_width,
+ &image_height);
+ else
+ _gtk_css_image_get_concrete_size (bg->image,
+ /* note: 0 does the right thing here for 'auto' */
+ _gtk_css_number_get (&size->width, width),
+ _gtk_css_number_get (&size->height, height),
+ width, height,
+ &image_width, &image_height);
/* optimization */
if (image_width == width)