diff options
author | Benjamin Otte <otte@redhat.com> | 2012-04-04 17:42:45 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2012-04-17 08:59:19 +0200 |
commit | 1170ecfd2ef2043330c961339948bf89021d9816 (patch) | |
tree | 0b2457d206450a28b22697995ccb464f3e8dfceb /gtk/gtkborderimage.c | |
parent | 56f79fecce885e05b7fe1677a70b98c64ea4a85c (diff) | |
download | gtk+-1170ecfd2ef2043330c961339948bf89021d9816.tar.gz |
cssvalue: Convert border-image-width to border value
Diffstat (limited to 'gtk/gtkborderimage.c')
-rw-r--r-- | gtk/gtkborderimage.c | 63 |
1 files changed, 36 insertions, 27 deletions
diff --git a/gtk/gtkborderimage.c b/gtk/gtkborderimage.c index f75d7e0e4e..337dba3f47 100644 --- a/gtk/gtkborderimage.c +++ b/gtk/gtkborderimage.c @@ -41,22 +41,12 @@ gboolean _gtk_border_image_init (GtkBorderImage *image, GtkThemingEngine *engine) { - GtkBorder *width; - image->source = _gtk_css_image_value_get_image (_gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE)); if (image->source == NULL) return FALSE; image->slice = _gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE); - width = _gtk_css_value_get_boxed (_gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH)); - if (width) - { - image->width = *width; - image->has_width = TRUE; - } - else - image->has_width = FALSE; - + image->width = _gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH); image->repeat = _gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT); return TRUE; @@ -69,20 +59,38 @@ struct _GtkBorderImageSliceSize { }; static void -gtk_border_image_compute_border_size (GtkBorderImageSliceSize sizes[3], - double offset, - double area_size, - int start_border, - int end_border) +gtk_border_image_compute_border_size (GtkBorderImageSliceSize sizes[3], + double offset, + double area_size, + int start_border_width, + int end_border_width, + const GtkCssValue *start_border, + const GtkCssValue *end_border) { - /* This code assumes area_size >= start_border + end_border */ + double start, end; + + if (_gtk_css_number_value_get_unit (start_border) == GTK_CSS_NUMBER) + start = start_border_width * _gtk_css_number_value_get (start_border, 100); + else + start = _gtk_css_number_value_get (start_border, area_size); + if (_gtk_css_number_value_get_unit (end_border) == GTK_CSS_NUMBER) + end = end_border_width * _gtk_css_number_value_get (end_border, 100); + else + end = _gtk_css_number_value_get (end_border, area_size); + + /* XXX: reduce vertical and horizontal by the same factor */ + if (start + end > area_size) + { + start = start * area_size / (start + end); + end = end * area_size / (start + end); + } sizes[0].offset = offset; - sizes[0].size = start_border; - sizes[1].offset = offset + start_border; - sizes[1].size = area_size - start_border - end_border; - sizes[2].offset = offset + area_size - end_border; - sizes[2].size = end_border; + sizes[0].size = start; + sizes[1].offset = offset + start; + sizes[1].size = area_size - start - end; + sizes[2].offset = offset + area_size - end; + sizes[2].size = end; } static void @@ -240,9 +248,6 @@ _gtk_border_image_render (GtkBorderImage *image, double source_width, source_height; int h, v; - if (image->has_width) - border_width = &image->width; - _gtk_css_image_get_concrete_size (image->source, 0, 0, width, height, @@ -266,12 +271,16 @@ _gtk_border_image_render (GtkBorderImage *image, x, width, border_width->left, - border_width->right); + border_width->right, + _gtk_css_border_value_get_left (image->width), + _gtk_css_border_value_get_right (image->width)); gtk_border_image_compute_border_size (vertical_border, y, height, border_width->top, - border_width->bottom); + border_width->bottom, + _gtk_css_border_value_get_top (image->width), + _gtk_css_border_value_get_bottom(image->width)); for (v = 0; v < 3; v++) { |