summaryrefslogtreecommitdiff
path: root/gtk/gtkborderimage.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2012-04-04 17:42:45 +0200
committerBenjamin Otte <otte@redhat.com>2012-04-17 08:59:19 +0200
commit1170ecfd2ef2043330c961339948bf89021d9816 (patch)
tree0b2457d206450a28b22697995ccb464f3e8dfceb /gtk/gtkborderimage.c
parent56f79fecce885e05b7fe1677a70b98c64ea4a85c (diff)
downloadgtk+-1170ecfd2ef2043330c961339948bf89021d9816.tar.gz
cssvalue: Convert border-image-width to border value
Diffstat (limited to 'gtk/gtkborderimage.c')
-rw-r--r--gtk/gtkborderimage.c63
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++)
{