summaryrefslogtreecommitdiffstats
path: root/src/box.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2015-03-15 01:35:46 +0000
committerDavid Robillard <d@drobilla.net>2015-03-15 01:35:46 +0000
commit6391901e7dca631b14364dca7e5e0e664e473a6f (patch)
treeebc97600bb4efafc8d0f679b2755d1c1c636af89 /src/box.c
parentd31536d69b6972c2834c390689fa05f8b118c0e9 (diff)
downloadganv-6391901e7dca631b14364dca7e5e0e664e473a6f.tar.gz
ganv-6391901e7dca631b14364dca7e5e0e664e473a6f.tar.bz2
ganv-6391901e7dca631b14364dca7e5e0e664e473a6f.zip
Add support for beveled box corners.
git-svn-id: http://svn.drobilla.net/lad/trunk/ganv@5631 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/box.c')
-rw-r--r--src/box.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/box.c b/src/box.c
index c5206e1..e883647 100644
--- a/src/box.c
+++ b/src/box.c
@@ -41,7 +41,8 @@ enum {
PROP_RADIUS_TR,
PROP_RADIUS_BR,
PROP_RADIUS_BL,
- PROP_STACKED
+ PROP_STACKED,
+ PROP_BEVELED
};
static void
@@ -58,6 +59,7 @@ ganv_box_init(GanvBox* box)
box->impl->radius_tr = 0.0;
box->impl->radius_br = 0.0;
box->impl->radius_bl = 0.0;
+ box->impl->beveled = FALSE;
}
static void
@@ -94,6 +96,7 @@ ganv_box_set_property(GObject* object,
SET_CASE(RADIUS_BR, double, impl->radius_br);
SET_CASE(RADIUS_BL, double, impl->radius_bl);
SET_CASE(STACKED, boolean, coords->stacked);
+ SET_CASE(BEVELED, boolean, impl->beveled);
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@@ -123,6 +126,7 @@ ganv_box_get_property(GObject* object,
GET_CASE(RADIUS_BR, double, impl->radius_br);
GET_CASE(RADIUS_BL, double, impl->radius_bl);
GET_CASE(STACKED, boolean, impl->coords.stacked);
+ GET_CASE(BEVELED, boolean, impl->beveled);
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@@ -212,6 +216,19 @@ ganv_box_path(GanvBox* box,
&& impl->radius_br == 0.0 && impl->radius_bl == 0.0) {
// Simple rectangle
cairo_rectangle(cr, x1, y1, x2 - x1, y2 - y1);
+ } else if (impl->beveled) {
+ // Beveled rectangle
+ cairo_new_sub_path(cr);
+ cairo_move_to(cr, x1 + impl->radius_tl, y1);
+ cairo_line_to(cr, x2 - impl->radius_tr, y1);
+ cairo_line_to(cr, x2, y1 + impl->radius_tr);
+ cairo_line_to(cr, x2, y2 - impl->radius_br);
+ cairo_line_to(cr, x2 - impl->radius_br, y2);
+ cairo_line_to(cr, x1 + impl->radius_bl, y2);
+ cairo_line_to(cr, x1, y2 - impl->radius_bl);
+ cairo_line_to(cr, x1, y2 - impl->radius_bl);
+ cairo_line_to(cr, x1, y1 + impl->radius_tl);
+ cairo_close_path(cr);
} else {
// Rounded rectangle
cairo_new_sub_path(cr);
@@ -449,7 +466,15 @@ ganv_box_class_init(GanvBoxClass* klass)
gobject_class, PROP_STACKED, g_param_spec_boolean(
"stacked",
_("Stacked"),
- _("Whether to show the box with a stacked appearance."),
+ _("Show box with a stacked appearance."),
+ FALSE,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property(
+ gobject_class, PROP_BEVELED, g_param_spec_boolean(
+ "beveled",
+ _("Beveled"),
+ _("Show radiused corners with a sharp bevel."),
FALSE,
G_PARAM_READWRITE));