From: Artem Garmash Date: Sun, 24 Jan 2010 17:04:57 +0000 (+0200) Subject: Change rounded_rectange to support per-corner flag for rounded and use it for all... X-Git-Url: http://vcs.maemo.org/git/?p=conv-inbox;a=commitdiff_plain;h=c888dfbc774c96def17015b7c8d8f9ff80d83844 Change rounded_rectange to support per-corner flag for rounded and use it for all rectangels with some rounded corners. --- diff --git a/src/el-home-applet.c b/src/el-home-applet.c index 606b92e..44dcf4b 100644 --- a/src/el-home-applet.c +++ b/src/el-home-applet.c @@ -154,34 +154,79 @@ el_home_applet_realize (GtkWidget *widget) GTK_WIDGET_CLASS (el_home_applet_parent_class)->realize (widget); } -/* - * Thanks http://cairographics.org/cookbook/roundedrectangles/ +enum { + ROUND_CORNER_TL = 1, + ROUND_CORNER_TR = 1<<1, + ROUND_CORNER_BL = 1<<2, + ROUND_CORNER_BR = 1<<3, + ROUND_CORNER_ALL = ROUND_CORNER_TL | ROUND_CORNER_TR | + ROUND_CORNER_BL | ROUND_CORNER_BR +}; + +/** + * Draw rectangle with optional round corners. + * + * @x + * @y + * @w width + * @h height + * @r round corner radious + * @round_corners define which corners draw round, ROUND_CORNER_TL, + * ROUND_CORNER_TR, ROUND_CORNER_BL, ROUND_CORNER_BR */ static void rounded_rectangle (cairo_t *cr, - double x, - double y, - double w, - double h, - double r) + double x, + double y, + double w, + double h, + double r, + guint round_corners) { - cairo_move_to (cr, x + r, y); - cairo_line_to (cr, x + w - r, y); - cairo_curve_to (cr, x + w, y, - x + w, y, - x + w, y + r); - cairo_line_to (cr, x + w, y + h - r); - cairo_curve_to (cr, x + w, y + h, - x + w, y + h, - x + w - r, y + h); - cairo_line_to (cr, x + r, y + h); - cairo_curve_to (cr, x, y + h, - x, y + h, - x, y + h - r); - cairo_line_to (cr, x, y + r); - cairo_curve_to (cr, x, y, - x, y, - x + r, y); + if (round_corners & ROUND_CORNER_TL) + cairo_move_to (cr, x + r, y); + else + cairo_move_to (cr, x, y); + + if (round_corners & ROUND_CORNER_TR) { + cairo_line_to (cr, x + w - r, y); + cairo_rel_curve_to (cr, + r, 0, + r, 0, + r, r); + } + else + cairo_line_to (cr, x + w, y); + + if (round_corners & ROUND_CORNER_BR) { + cairo_line_to (cr, x + w, y + h - r); + cairo_rel_curve_to (cr, + 0, r, + 0, r, + -r, r); + } + else + cairo_line_to (cr, x + w, y + h); + + if (round_corners & ROUND_CORNER_BL) { + cairo_line_to (cr, x + r, y + h); + cairo_rel_curve_to (cr, + -r, 0, + -r, 0, + -r, -r); + } + else + cairo_line_to (cr, x, y + h); + + if (round_corners & ROUND_CORNER_TL) { + cairo_line_to (cr, x, y + r); + cairo_rel_curve_to (cr, + 0, -r, + 0, -r, + r, -r); + } + else + cairo_line_to (cr, x, y); } static cairo_surface_t* @@ -332,7 +377,8 @@ expose_event (GtkWidget *self, GdkEventExpose *event) CONTENT_OFFSET_Y_TOP, BOX_WIDTH - 2*CONTENT_OFFSET_X, BOX_HEIGHT - (CONTENT_OFFSET_Y_TOP + CONTENT_OFFSET_Y_BOTTOM), - BOX_RADIOUS); + BOX_RADIOUS, + ROUND_CORNER_ALL); cairo_close_path (cr); cairo_stroke (cr); @@ -341,14 +387,11 @@ expose_event (GtkWidget *self, GdkEventExpose *event) cairo_set_line_width (cr, 1.0f); cairo_translate (cr, CONTENT_OFFSET_X, CONTENT_OFFSET_Y_TOP); - cairo_move_to (cr, 0, HEADER_HEIGHT); - cairo_line_to (cr, 0, BOX_RADIOUS); - cairo_curve_to (cr, 0, 0, 0, 0, BOX_RADIOUS, 0); - cairo_line_to (cr, C_WIDTH - BOX_RADIOUS, 0); - cairo_curve_to (cr, C_WIDTH, 0, C_WIDTH, 0, C_WIDTH, BOX_RADIOUS); - cairo_line_to (cr, C_WIDTH, HEADER_HEIGHT); - cairo_line_to (cr, 0, HEADER_HEIGHT); - + rounded_rectangle (cr, + 0, 0, + C_WIDTH, HEADER_HEIGHT, + BOX_RADIOUS, + ROUND_CORNER_TL | ROUND_CORNER_TR); cairo_close_path (cr); switch (priv->active) { @@ -376,13 +419,11 @@ expose_event (GtkWidget *self, GdkEventExpose *event) /* draw body */ if (!priv->message) { - cairo_move_to (cr, 0, HEADER_HEIGHT); - cairo_line_to (cr, 0, C_HEIGHT - BOX_RADIOUS); - cairo_curve_to (cr, 0, C_HEIGHT, 0, C_HEIGHT, BOX_RADIOUS, C_HEIGHT); - cairo_line_to (cr, C_WIDTH - BOX_RADIOUS, C_HEIGHT); - cairo_curve_to (cr, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT - BOX_RADIOUS); - cairo_line_to (cr, C_WIDTH, HEADER_HEIGHT); - cairo_line_to (cr, 0, HEADER_HEIGHT); + rounded_rectangle (cr, + 0, HEADER_HEIGHT, + C_WIDTH, C_HEIGHT, + BOX_RADIOUS, + ROUND_CORNER_BL | ROUND_CORNER_BR); cairo_close_path (cr); } else @@ -422,12 +463,11 @@ expose_event (GtkWidget *self, GdkEventExpose *event) if (priv->message) { /* draw footer unread part bg */ - cairo_move_to (cr, 0, C_HEIGHT - FOOTER_HEIGHT); - cairo_line_to (cr, 0, C_HEIGHT - BOX_RADIOUS); - cairo_curve_to (cr, 0, C_HEIGHT, 0, C_HEIGHT, BOX_RADIOUS, C_HEIGHT); - cairo_line_to (cr, FOOTER_WIDTH, C_HEIGHT); - cairo_line_to (cr, FOOTER_WIDTH, C_HEIGHT - FOOTER_HEIGHT); - cairo_line_to (cr, 0, C_HEIGHT - FOOTER_HEIGHT); + rounded_rectangle (cr, + 0, C_HEIGHT - FOOTER_HEIGHT, + FOOTER_WIDTH, FOOTER_HEIGHT, + BOX_RADIOUS, + ROUND_CORNER_BL); cairo_close_path (cr); /* draw body filling depending on (in)active state */ @@ -445,12 +485,11 @@ expose_event (GtkWidget *self, GdkEventExpose *event) cairo_fill (cr); /* draw footer received part bg */ - cairo_move_to (cr, FOOTER_WIDTH, C_HEIGHT - FOOTER_HEIGHT); - cairo_rel_line_to (cr, 0, FOOTER_HEIGHT); - cairo_rel_line_to (cr, C_WIDTH - FOOTER_WIDTH - BOX_RADIOUS, 0); - cairo_rel_curve_to (cr, BOX_RADIOUS, 0, BOX_RADIOUS, 0, BOX_RADIOUS, -BOX_RADIOUS); - cairo_rel_line_to (cr, 0, -(FOOTER_HEIGHT - BOX_RADIOUS)); - cairo_rel_line_to (cr, -(C_WIDTH - FOOTER_WIDTH), 0); + rounded_rectangle (cr, + FOOTER_WIDTH, C_HEIGHT - FOOTER_HEIGHT, + C_WIDTH - FOOTER_WIDTH, FOOTER_HEIGHT, + BOX_RADIOUS, + ROUND_CORNER_BR); cairo_close_path (cr); cairo_set_source_rgba (cr, 0.2f, 0.2f, 0.2f, 0.8f);