#include <math.h>
#include "gtkborderimageprivate.h"
+#include "gtkcssbordervalueprivate.h"
#include "gtkcssimagevalueprivate.h"
+#include "gtkcssnumbervalueprivate.h"
#include "gtkcssrepeatvalueprivate.h"
#include "gtkstylepropertiesprivate.h"
#include "gtkthemingengineprivate.h"
_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 = *(GtkBorder *) _gtk_css_value_get_boxed (_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->slice = _gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE);
+ 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;
};
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,
+ double start_border_width,
+ double 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
void
_gtk_border_image_render (GtkBorderImage *image,
- GtkBorder *border_width,
+ const double border_width[4],
cairo_t *cr,
gdouble x,
gdouble y,
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,
gtk_border_image_compute_slice_size (horizontal_slice,
source_width,
- image->slice.left,
- image->slice.right);
+ _gtk_css_number_value_get (_gtk_css_border_value_get_left (image->slice), source_width),
+ _gtk_css_number_value_get (_gtk_css_border_value_get_right (image->slice), source_width));
gtk_border_image_compute_slice_size (vertical_slice,
source_height,
- image->slice.top,
- image->slice.bottom);
+ _gtk_css_number_value_get (_gtk_css_border_value_get_top (image->slice), source_height),
+ _gtk_css_number_value_get (_gtk_css_border_value_get_bottom (image->slice), source_height));
gtk_border_image_compute_border_size (horizontal_border,
x,
width,
- border_width->left,
- border_width->right);
+ border_width[GTK_CSS_LEFT],
+ border_width[GTK_CSS_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[GTK_CSS_TOP],
+ border_width[GTK_CSS_BOTTOM],
+ _gtk_css_border_value_get_top (image->width),
+ _gtk_css_border_value_get_bottom(image->width));
for (v = 0; v < 3; v++)
{