00001 #include <stdio.h> 00002 #include <stdlib.h> 00003 #include <string.h> 00004 #include "mb_types.h" 00005 #include "mb_shapes.h" 00006 00007 typedef struct _sh_rect { 00008 shape_t shape; 00009 co_aix x, y; 00010 co_aix w, h; 00011 co_aix rx, ry; 00012 co_aix poses[12][2]; 00013 } sh_rect_t; 00014 00015 static void sh_rect_free(shape_t *shape) { 00016 free(shape); 00017 } 00018 00019 shape_t *rdman_shape_rect_new(redraw_man_t *rdman, 00020 co_aix x, co_aix y, co_aix w, co_aix h, 00021 co_aix rx, co_aix ry) { 00022 sh_rect_t *rect; 00023 00024 rect = (sh_rect_t *)malloc(sizeof(sh_rect_t)); 00025 if(rect == NULL) 00026 return NULL; 00027 00028 memset(rect, 0, sizeof(sh_rect_t)); 00029 00030 rect->shape.sh_type = SHT_RECT; 00031 rect->x = x; 00032 rect->y = y; 00033 rect->w = w; 00034 rect->h = h; 00035 rect->rx = rx; 00036 rect->ry = ry; 00037 rect->shape.free = sh_rect_free; 00038 00039 rdman_shape_man(rdman, (shape_t *)rect); 00040 00041 return (shape_t *)rect; 00042 } 00043 00044 void sh_rect_set(shape_t *shape, co_aix x, co_aix y, 00045 co_aix w, co_aix h, co_aix rx, co_aix ry) { 00046 sh_rect_t *rect = (sh_rect_t *)shape; 00047 00048 rect->x = x; 00049 rect->y = y; 00050 rect->w = w; 00051 rect->h = h; 00052 rect->rx = rx; 00053 rect->ry = ry; 00054 } 00055 00056 void sh_rect_transform(shape_t *shape) { 00057 sh_rect_t *rect = (sh_rect_t *)shape; 00058 co_aix x, y, w, h, rx, ry; 00059 co_aix (*poses)[2]; 00060 co_aix width; 00061 area_t *area; 00062 int i; 00063 00064 x = rect->x; 00065 y = rect->y; 00066 w = rect->w; 00067 h = rect->h; 00068 rx = rect->rx; 00069 ry = rect->ry; 00070 00071 poses = rect->poses; 00072 00073 if(rect->rx != 0 && rect->ry != 0) { 00074 poses[0][0] = x + w - rx; 00075 poses[0][1] = y; 00076 poses[1][0] = x + w; 00077 poses[1][1] = y; 00078 poses[2][0] = x + w; 00079 poses[2][1] = y + ry; 00080 00081 poses[3][0] = x + w; 00082 poses[3][1] = y + h - ry; 00083 poses[4][0] = x + w; 00084 poses[4][1] = y + h; 00085 poses[5][0] = x + w - rx; 00086 poses[5][1] = y + h; 00087 00088 poses[6][0] = x + rx; 00089 poses[6][1] = y + h; 00090 poses[7][0] = x; 00091 poses[7][1] = y + h; 00092 poses[8][0] = x; 00093 poses[8][1] = y + h - ry; 00094 00095 poses[9][0] = x; 00096 poses[9][1] = y + ry; 00097 poses[10][0] = x; 00098 poses[10][1] = y; 00099 poses[11][0] = x + rx; 00100 poses[11][1] = y; 00101 00102 for(i = 0; i < 12; i++) 00103 coord_trans_pos(shape->coord, &poses[i][0], &poses[i][1]); 00104 00105 geo_from_positions(shape->geo, 12, poses); 00106 } else { 00107 poses[0][0] = x; 00108 poses[0][1] = y; 00109 poses[1][0] = x + w; 00110 poses[1][1] = y; 00111 poses[2][0] = x + w; 00112 poses[2][1] = y + h; 00113 poses[3][0] = x; 00114 poses[3][1] = y + h; 00115 00116 for(i = 0; i < 4; i++) 00117 coord_trans_pos(shape->coord, &poses[i][0], &poses[i][1]); 00118 00119 geo_from_positions(shape->geo, 4, poses); 00120 } 00121 00122 if(shape->stroke) { 00123 area = shape->geo->cur_area; 00124 width = shape->stroke_width; 00125 area->x -= width / 2 + 1; 00126 area->y -= width / 2 + 1; 00127 area->w += width + 2; 00128 area->h += width + 2; 00129 } 00130 } 00131 00132 void sh_rect_draw(shape_t *shape, cairo_t *cr) { 00133 sh_rect_t *rect = (sh_rect_t *)shape; 00134 int i; 00135 co_aix (*poses)[2]; 00136 00137 poses = rect->poses; 00138 if(rect->rx != 0 && rect->ry != 0) { 00139 cairo_move_to(cr, poses[11][0], poses[11][1]); 00140 for(i = 0; i < 12; i += 3) { 00141 cairo_line_to(cr, poses[i][0], poses[i][1]); 00142 cairo_curve_to(cr, 00143 poses[i + 1][0], poses[i + 1][1], 00144 poses[i + 1][0], poses[i + 1][1], 00145 poses[i + 2][0], poses[i + 2][1]); 00146 } 00147 } else { 00148 cairo_move_to(cr, poses[3][0], poses[3][1]); 00149 for(i = 0; i < 4; i++) 00150 cairo_line_to(cr, poses[i][0], poses[i][1]); 00151 } 00152 }