1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| struct _DevianceRadius {
gdouble rx;
gdouble ry;
};
struct _DevianceCorners {
DevianceRadius top_left;
DevianceRadius top_right;
DevianceRadius bottom_right;
DevianceRadius bottom_left;
};
void
deviance_graphics_data_path_rectangle(cairo_t *cr,
DevianceRectangle *rect,
DevianceCorners *corners)
{
double x = rect->x,
y = rect->y,
width = rect->width,
height = rect->height;
cairo_new_sub_path (cr);
if (0.0==corners->top_left.rx || 0.0==corners->top_left.ry) {
cairo_move_to(cr, x, y);
} else {
cairo_move_to(cr, x+corners->top_left.rx, y);
}
if (0.0==corners->top_right.rx || 0.0==corners->top_right.ry) {
cairo_line_to(cr, x+width, y);
} else {
cairo_line_to(cr, x+width-corners->top_right.rx, y);
cairo_curve_to(cr,
x+width-corners->top_right.rx*0.44771525016, y,
x+width, y+corners->top_right.ry*0.44771525016,
x+width, y+corners->top_right.ry);
}
if (0.0==corners->bottom_right.rx || 0.0==corners->bottom_right.ry) {
cairo_line_to(cr, x+width, y+height);
} else {
cairo_line_to(cr, x+width, y+height-corners->bottom_right.ry);
cairo_curve_to(cr,
x+width, y+height-corners->bottom_right.ry*0.44771525016,
x+width-corners->bottom_right.rx*0.44771525016, y+height,
x+width-corners->bottom_right.rx, y+height);
}
if (0.0==corners->bottom_left.rx || 0.0==corners->bottom_left.ry) {
cairo_line_to(cr, x+corners->bottom_left.rx, y+height);
} else {
cairo_line_to(cr, x+corners->bottom_left.rx, y+height);
cairo_curve_to(cr,
x+corners->bottom_left.rx*0.44771525016, y+height,
x, y+height-corners->bottom_left.ry*0.44771525016,
x, y+height-corners->bottom_left.ry);
}
if (0.0==corners->top_left.rx || 0.0==corners->top_left.ry) {
cairo_line_to(cr, x, y);
} else {
cairo_line_to(cr, x, y+corners->top_left.ry);
cairo_curve_to(cr,
x, y+corners->top_left.ry*0.44771525016,
x+corners->top_left.rx*0.44771525016, y,
x+corners->top_left.rx, y);
}
}
// @see: <a href="http://stackoverflow.com/questions/1734745/how-to-create-circle-with-b%C3%A9zier-curves" target="_blank">http://stackoverflow.com/questions/1...%A9zier-curves</a>
// @note: 0.44771525016 = 1-0.552284749831 |
Partager