- case GTK_BORDER_STYLE_NONE:
- break;
- case GTK_BORDER_STYLE_SOLID:
- cairo_set_line_width (cr, border_width);
- cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
-
- gdk_cairo_set_source_rgba (cr, &border_color);
-
- cairo_save (cr);
- _cairo_uneven_frame (cr, &border_radius,
- x, y, width, height,
- &border);
- cairo_fill (cr);
- cairo_restore (cr);
-
- break;
- case GTK_BORDER_STYLE_INSET:
- case GTK_BORDER_STYLE_OUTSET:
- cairo_set_line_width (cr, border_width);
- cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT);
-
- if (border_width > 1)
- {
- d1 = (gdouble) border_width / 2;
- d2 = border_width;
- }
- else
- {
- d1 = 0.5;
- d2 = 1;
- }
-
- cairo_save (cr);
-
- if (uniform_border)
- {
- if (border_style == GTK_BORDER_STYLE_INSET)
- gdk_cairo_set_source_rgba (cr, &lighter);
- else
- gdk_cairo_set_source_rgba (cr, &border_color);
-
- _cairo_round_rectangle_sides (cr, &border_radius,
- x + d1, y + d1,
- width - d2, height - d2,
- (SIDE_BOTTOM | SIDE_RIGHT) & ~(hidden_side));
- cairo_stroke (cr);
-
- if (border_style == GTK_BORDER_STYLE_INSET)
- gdk_cairo_set_source_rgba (cr, &border_color);
- else
- gdk_cairo_set_source_rgba (cr, &lighter);
-
- _cairo_round_rectangle_sides (cr, &border_radius,
- x + d1, y + d1,
- width - d2, height - d2,
- (SIDE_TOP | SIDE_LEFT) & ~(hidden_side));
- cairo_stroke (cr);
- }
- else
- {
- cairo_save (cr);
-
- /* Bottom/right */
- if (border_style == GTK_BORDER_STYLE_INSET)
- gdk_cairo_set_source_rgba (cr, &lighter);
- else
- gdk_cairo_set_source_rgba (cr, &border_color);
-
- _cairo_uneven_frame (cr, &border_radius,
- x, y, width, height,
- &border);
- cairo_fill (cr);
-
- /* Top/left */
- cairo_move_to (cr, x, y);
- cairo_line_to (cr, x + width, y);
- cairo_line_to (cr,
- x + width - border.right - border_radius.top_right.horizontal / 2,
- y + border.top + border_radius.top_right.vertical / 2);
- cairo_line_to (cr,
- x + width - border.right - border_radius.bottom_right.horizontal / 2,
- y + height - border.bottom - border_radius.bottom_right.vertical / 2);
- cairo_line_to (cr,
- x + border.left + border_radius.bottom_left.horizontal / 2,
- y + height - border.bottom - border_radius.bottom_left.vertical / 2);
- cairo_line_to (cr, x, y + height);
- cairo_close_path (cr);
-
- cairo_clip (cr);
-
- if (border_style == GTK_BORDER_STYLE_INSET)
- gdk_cairo_set_source_rgba (cr, &border_color);
- else
- gdk_cairo_set_source_rgba (cr, &lighter);
-
- _cairo_uneven_frame (cr, &border_radius,
- x, y, width, height,
- &border);
- cairo_fill (cr);
- cairo_restore (cr);
- }
-
- if (border_width > 1)
- {
- /* overprint top/right and bottom/left corner
- * triangles if there are square corners there,
- * to give the box a 3D-like appearance.
- */
- cairo_save (cr);
-
- if (border_style == GTK_BORDER_STYLE_INSET)
- gdk_cairo_set_source_rgba (cr, &lighter);
- else
- gdk_cairo_set_source_rgba (cr, &border_color);
-
- cairo_set_line_width (cr, 1);
-
- if ((junction & GTK_JUNCTION_CORNER_TOPRIGHT) != 0)
- _cairo_corner_triangle (cr,
- x + width - border_width, y,
- border_width);
-
- if ((junction & GTK_JUNCTION_CORNER_BOTTOMLEFT) != 0)
- _cairo_corner_triangle (cr,
- x, y + height - border_width,
- border_width);
- cairo_stroke (cr);
- cairo_restore (cr);
- }
-
- cairo_restore (cr);
- break;
+ int offset;
+
+ border_style[1] = border_style[2] = border_style[3] = border_style[0];
+ border_width[0] = _gtk_css_number_value_get (_gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_OUTLINE_WIDTH), 100);
+ border_width[3] = border_width[2] = border_width[1] = border_width[0];
+ colors[0] = *_gtk_css_rgba_value_get_rgba (_gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_OUTLINE_COLOR));
+ colors[3] = colors[2] = colors[1] = colors[0];
+ offset = _gtk_css_number_value_get (_gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_OUTLINE_OFFSET), 100);
+
+ /* reinit box here - outlines don't have a border radius */
+ _gtk_rounded_box_init_rect (&border_box, x, y, width, height);
+ _gtk_rounded_box_shrink (&border_box,
+ - border_width[GTK_CSS_TOP] - offset,
+ - border_width[GTK_CSS_RIGHT] - offset,
+ - border_width[GTK_CSS_LEFT] - offset,
+ - border_width[GTK_CSS_BOTTOM] - offset);
+
+ render_border (cr, &border_box, border_width, hidden_side, colors, border_style);