#include <math.h>
#include "gtkborderimageprivate.h"
+#include "gtkstylepropertiesprivate.h"
+
+/* this is in case round() is not provided by the compiler,
+ * such as in the case of C89 compilers, like MSVC
+ */
+#include "fallback-c89.c"
G_DEFINE_BOXED_TYPE (GtkBorderImage, _gtk_border_image,
_gtk_border_image_ref, _gtk_border_image_unref)
struct _GtkBorderImage {
cairo_pattern_t *source;
- GtkGradient *source_gradient;
+ gpointer source_boxed;
+ GType boxed_type;
GtkBorder slice;
+ GtkBorder *width;
GtkCssBorderImageRepeat repeat;
gint ref_count;
};
GtkBorderImage *
-_gtk_border_image_new (cairo_pattern_t *pattern,
- GtkBorder *slice,
+_gtk_border_image_new (cairo_pattern_t *pattern,
+ GtkBorder *slice,
+ GtkBorder *width,
GtkCssBorderImageRepeat *repeat)
{
GtkBorderImage *image;
if (slice != NULL)
image->slice = *slice;
+ if (width != NULL)
+ image->width = gtk_border_copy (width);
+
if (repeat != NULL)
image->repeat = *repeat;
}
GtkBorderImage *
-_gtk_border_image_new_for_gradient (GtkGradient *gradient,
- GtkBorder *slice,
- GtkCssBorderImageRepeat *repeat)
+_gtk_border_image_new_for_boxed (GType boxed_type,
+ gpointer boxed,
+ GtkBorder *slice,
+ GtkBorder *width,
+ GtkCssBorderImageRepeat *repeat)
{
GtkBorderImage *image;
image = g_slice_new0 (GtkBorderImage);
+
image->ref_count = 1;
- if (gradient != NULL)
- image->source_gradient = gtk_gradient_ref (gradient);
+ if (boxed != NULL)
+ image->source_boxed = g_boxed_copy (boxed_type, boxed);
+ image->boxed_type = boxed_type;
if (slice != NULL)
image->slice = *slice;
+ if (width != NULL)
+ image->width = gtk_border_copy (width);
+
if (repeat != NULL)
image->repeat = *repeat;
if (image->source != NULL)
cairo_pattern_destroy (image->source);
- if (image->source_gradient != NULL)
- gtk_gradient_unref (image->source_gradient);
+ if (image->source_boxed != NULL)
+ g_boxed_free (image->boxed_type, image->source_boxed);
+
+ if (image->width != NULL)
+ gtk_border_free (image->width);
g_slice_free (GtkBorderImage, image);
}
_gtk_border_image_unpack (const GValue *value,
guint *n_params)
{
- GParameter *parameter = g_new0 (GParameter, 3);
+ GParameter *parameter = g_new0 (GParameter, 4);
GtkBorderImage *image = g_value_get_boxed (value);
parameter[0].name = "border-image-source";
- g_value_init (¶meter[0].value, CAIRO_GOBJECT_TYPE_PATTERN);
+
+ if ((image != NULL) &&
+ (image->source_boxed != NULL))
+ g_value_init (¶meter[0].value, image->boxed_type);
+ else
+ g_value_init (¶meter[0].value, CAIRO_GOBJECT_TYPE_PATTERN);
parameter[1].name = "border-image-slice";
g_value_init (¶meter[1].value, GTK_TYPE_BORDER);
parameter[2].name = "border-image-repeat";
g_value_init (¶meter[2].value, GTK_TYPE_CSS_BORDER_IMAGE_REPEAT);
+ parameter[3].name = "border-image-width";
+ g_value_init (¶meter[3].value, GTK_TYPE_BORDER);
+
if (image != NULL)
{
- g_value_set_boxed (¶meter[0].value, image->source);
+ if (image->source_boxed != NULL)
+ g_value_set_boxed (¶meter[0].value, image->source_boxed);
+ else
+ g_value_set_boxed (¶meter[0].value, image->source);
+
g_value_set_boxed (¶meter[1].value, &image->slice);
g_value_set_boxed (¶meter[2].value, &image->repeat);
+ g_value_set_boxed (¶meter[3].value, image->width);
}
- *n_params = 3;
+ *n_params = 4;
return parameter;
}
void
_gtk_border_image_pack (GValue *value,
GtkStyleProperties *props,
- GtkStateFlags state)
+ GtkStateFlags state,
+ GtkStylePropertyContext *context)
{
GtkBorderImage *image;
cairo_pattern_t *source;
- GtkBorder *slice;
+ GtkBorder *slice, *width;
GtkCssBorderImageRepeat *repeat;
- gtk_style_properties_get (props, state,
- "border-image-source", &source,
- "border-image-slice", &slice,
- "border-image-repeat", &repeat,
- NULL);
+ _gtk_style_properties_get (props, state, context,
+ "border-image-source", &source,
+ "border-image-slice", &slice,
+ "border-image-repeat", &repeat,
+ "border-image-width", &width,
+ NULL);
if (source == NULL)
{
}
else
{
- image = _gtk_border_image_new (source, slice, repeat);
+ image = _gtk_border_image_new (source, slice, width, repeat);
g_value_take_boxed (value, image);
cairo_pattern_destroy (source);
if (slice != NULL)
gtk_border_free (slice);
+ if (width != NULL)
+ gtk_border_free (width);
+
if (repeat != NULL)
g_free (repeat);
}
double y,
double width,
double height,
- GtkCssRepeatStyle hrepeat,
- GtkCssRepeatStyle vrepeat)
+ GtkCssBorderRepeatStyle hrepeat,
+ GtkCssBorderRepeatStyle vrepeat)
{
double hscale, vscale;
double xstep, ystep;
cairo_pattern_t *pattern;
/* We can't draw center tiles yet */
- g_assert (hrepeat == GTK_CSS_REPEAT_STYLE_NONE || vrepeat == GTK_CSS_REPEAT_STYLE_NONE);
+ g_assert (hrepeat == GTK_CSS_REPEAT_STYLE_STRETCH || vrepeat == GTK_CSS_REPEAT_STYLE_STRETCH);
hscale = width / slice_width;
vscale = height / slice_height;
width -= 2 * space;
}
break;
- case GTK_CSS_REPEAT_STYLE_NONE:
+ case GTK_CSS_REPEAT_STYLE_STRETCH:
break;
case GTK_CSS_REPEAT_STYLE_ROUND:
extend = CAIRO_EXTEND_REPEAT;
height -= 2 * space;
}
break;
- case GTK_CSS_REPEAT_STYLE_NONE:
+ case GTK_CSS_REPEAT_STYLE_STRETCH:
break;
case GTK_CSS_REPEAT_STYLE_ROUND:
extend = CAIRO_EXTEND_REPEAT;
int surface_width, surface_height;
int h, v;
+ if (image->width != NULL)
+ border_width = image->width;
+
if (cairo_pattern_get_type (image->source) != CAIRO_PATTERN_TYPE_SURFACE)
{
cairo_matrix_t matrix;
horizontal_slice[h].size,
vertical_slice[v].size);
- /* xxx: we scale to border-width here, that's wrong, isn't it? */
gtk_border_image_render_slice (cr,
slice,
horizontal_slice[h].size,
vertical_border[v].offset,
horizontal_border[h].size,
vertical_border[v].size,
- h == 1 ? image->repeat.hrepeat : GTK_CSS_REPEAT_STYLE_NONE,
- v == 1 ? image->repeat.vrepeat : GTK_CSS_REPEAT_STYLE_NONE);
+ h == 1 ? image->repeat.hrepeat : GTK_CSS_REPEAT_STYLE_STRETCH,
+ v == 1 ? image->repeat.vrepeat : GTK_CSS_REPEAT_STYLE_STRETCH);
cairo_surface_destroy (slice);
}
}
+
+ cairo_surface_destroy (surface);
}