diff options
author | Benjamin Otte <otte@redhat.com> | 2012-01-17 16:09:35 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2012-02-02 03:14:01 +0100 |
commit | 2434dbc10a287499585f52ba2116ab65a44b0cec (patch) | |
tree | fe7dc69a757b63e0cd36660fb6a28c6201ac1de1 /gtk/gtkthemingbackground.c | |
parent | 82b739c490310808f1aac5810906dbb79eec12a1 (diff) | |
download | gtk+-2434dbc10a287499585f52ba2116ab65a44b0cec.tar.gz |
themingbackground: Implement background-size support
Diffstat (limited to 'gtk/gtkthemingbackground.c')
-rw-r--r-- | gtk/gtkthemingbackground.c | 53 |
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) |