147 if (wid->
h < 1 || wid->
w < 1) {
153 const int margin_left =
155 const int margin_top =
157 const int margin_right =
159 const int margin_bottom =
179 wid->
h - margin_top - margin_bottom - top / 2.0 - bottom / 2.0;
181 wid->
w - margin_left - margin_right - left / 2.0 - right / 2.0;
182 if ((radius_bl + radius_tl) > (vspace)) {
183 int j = ((vspace) / 2.0);
184 radius_bl = MIN(radius_bl, j);
185 radius_tl = MIN(radius_tl, j);
187 if ((radius_br + radius_tr) > (vspace)) {
188 int j = ((vspace) / 2.0);
189 radius_br = MIN(radius_br, j);
190 radius_tr = MIN(radius_tr, j);
192 if ((radius_tl + radius_tr) > (hspace)) {
193 int j = ((hspace) / 2.0);
194 radius_tr = MIN(radius_tr, j);
195 radius_tl = MIN(radius_tl, j);
197 if ((radius_bl + radius_br) > (hspace)) {
198 int j = ((hspace) / 2.0);
199 radius_br = MIN(radius_br, j);
200 radius_bl = MIN(radius_bl, j);
205 cairo_translate(d, wid->
x, wid->
y);
206 cairo_set_line_width(d, 0);
209 double x1, y1, x2, y2;
210 x1 = margin_left + left / 2.0, y1 = margin_top + top / 2.0,
211 x2 = wid->
w - margin_right - right / 2.0,
212 y2 = wid->
h - margin_bottom - bottom / 2.0;
215 cairo_move_to(d, x1, y1 + radius_tl);
216 cairo_arc(d, x1 + radius_tl, y1 + radius_tl, radius_tl, -1.0 * G_PI,
219 cairo_move_to(d, x1, y1);
222 cairo_line_to(d, x2 - radius_tr, y1);
223 cairo_arc(d, x2 - radius_tr, y1 + radius_tr, radius_tr, -G_PI_2,
226 cairo_line_to(d, x2, y1);
229 cairo_line_to(d, x2, y2 - radius_br);
230 cairo_arc(d, x2 - radius_br, y2 - radius_br, radius_br, 0.0 * G_PI,
233 cairo_line_to(d, x2, y2);
236 cairo_line_to(d, x1 + radius_bl, y2);
237 cairo_arc(d, x1 + radius_bl, y2 - radius_bl, radius_bl, G_PI_2,
240 cairo_line_to(d, x1, y2);
244 cairo_set_source_rgba(d, 1.0, 1.0, 1.0, 1.0);
246 cairo_fill_preserve(d);
248 cairo_fill_preserve(d);
257 if (left != 0 || top != 0 || right != 0 || bottom != 0) {
260 cairo_set_antialias(d, CAIRO_ANTIALIAS_NONE);
263 cairo_set_operator(d, CAIRO_OPERATOR_ADD);
265 cairo_translate(d, wid->
x, wid->
y);
270 double minof_tr = MIN(right / 2.0, top / 2.0);
271 double minof_tl = MIN(left / 2.0, top / 2.0);
272 double minof_br = MIN(right / 2.0, bottom / 2.0);
273 double minof_bl = MIN(left / 2.0, bottom / 2.0);
275 double radius_inner_tl = radius_tl - minof_tl;
276 double radius_inner_tr = radius_tr - minof_tr;
277 double radius_inner_bl = radius_bl - minof_bl;
278 double radius_inner_br = radius_br - minof_br;
296 (radius_inner_tl > 0) ? (left) + radius_inner_tl : left;
298 (radius_inner_tr > 0) ? (right) + radius_inner_tr : right;
300 (radius_inner_bl > 0) ? (left) + radius_inner_bl : left;
302 (radius_inner_br > 0) ? (right) + radius_inner_br : right;
304 double offset_ttl = (radius_inner_tl > 0) ? (top) + radius_inner_tl
305 : (radius_tl > 0) ? top
307 double offset_ttr = (radius_inner_tr > 0) ? (top) + radius_inner_tr
308 : (radius_tr > 0) ? top
310 double offset_bbl = (radius_inner_bl > 0) ? (bottom) + radius_inner_bl
311 : (radius_bl > 0) ? bottom
313 double offset_bbr = (radius_inner_br > 0) ? (bottom) + radius_inner_br
314 : (radius_br > 0) ? bottom
318 cairo_set_line_width(d, left);
320 cairo_move_to(d, x1, margin_top + offset_ttl);
321 cairo_line_to(d, x1, wid->
h - margin_bottom - offset_bbl);
325 cairo_set_line_width(d, right);
327 cairo_move_to(d, x2, margin_top + offset_ttr);
328 cairo_line_to(d, x2, wid->
h - margin_bottom - offset_bbr);
332 cairo_set_line_width(d, top);
334 cairo_move_to(d, margin_left + offset_ltl, y1);
335 cairo_line_to(d, wid->
w - margin_right - offset_rtr, y1);
339 cairo_set_line_width(d, bottom);
341 cairo_move_to(d, margin_left + offset_lbl, y2);
342 cairo_line_to(d, wid->
w - margin_right - offset_rbr, y2);
346 double radius_outer = radius_tl + minof_tl;
347 cairo_arc(d, margin_left + radius_outer, margin_top + radius_outer,
348 radius_outer, -G_PI, -G_PI_2);
349 cairo_line_to(d, margin_left + offset_ltl, margin_top);
350 cairo_line_to(d, margin_left + offset_ltl, margin_top + top);
351 if (radius_inner_tl > 0) {
352 cairo_arc_negative(d, margin_left + left + radius_inner_tl,
353 margin_top + top + radius_inner_tl,
354 radius_inner_tl, -G_PI_2, G_PI);
355 cairo_line_to(d, margin_left + left, margin_top + offset_ttl);
357 cairo_line_to(d, margin_left, margin_top + offset_ttl);
362 double radius_outer = radius_tr + minof_tr;
363 cairo_arc(d, wid->
w - margin_right - radius_outer,
364 margin_top + radius_outer, radius_outer, -G_PI_2, 0);
365 cairo_line_to(d, wid->
w - margin_right, margin_top + offset_ttr);
366 cairo_line_to(d, wid->
w - margin_right - right,
367 margin_top + offset_ttr);
368 if (radius_inner_tr > 0) {
369 cairo_arc_negative(d, wid->
w - margin_right - right - radius_inner_tr,
370 margin_top + top + radius_inner_tr,
371 radius_inner_tr, 0, -G_PI_2);
372 cairo_line_to(d, wid->
w - margin_right - offset_rtr,
375 cairo_line_to(d, wid->
w - margin_right - offset_rtr, margin_top);
380 double radius_outer = radius_br + minof_br;
381 cairo_arc(d, wid->
w - margin_right - radius_outer,
382 wid->
h - margin_bottom - radius_outer, radius_outer, 0.0,
384 cairo_line_to(d, wid->
w - margin_right - offset_rbr,
385 wid->
h - margin_bottom);
386 cairo_line_to(d, wid->
w - margin_right - offset_rbr,
387 wid->
h - margin_bottom - bottom);
388 if (radius_inner_br > 0) {
389 cairo_arc_negative(d, wid->
w - margin_right - right - radius_inner_br,
390 wid->
h - margin_bottom - bottom - radius_inner_br,
391 radius_inner_br, G_PI_2, 0.0);
392 cairo_line_to(d, wid->
w - margin_right - right,
393 wid->
h - margin_bottom - offset_bbr);
395 cairo_line_to(d, wid->
w - margin_right,
396 wid->
h - margin_bottom - offset_bbr);
401 double radius_outer = radius_bl + minof_bl;
402 cairo_arc(d, margin_left + radius_outer,
403 wid->
h - margin_bottom - radius_outer, radius_outer, G_PI_2,
405 cairo_line_to(d, margin_left, wid->
h - margin_bottom - offset_bbl);
406 cairo_line_to(d, margin_left + left,
407 wid->
h - margin_bottom - offset_bbl);
408 if (radius_inner_bl > 0) {
409 cairo_arc_negative(d, margin_left + left + radius_inner_bl,
410 wid->
h - margin_bottom - bottom - radius_inner_bl,
411 radius_inner_bl, G_PI, G_PI_2);
412 cairo_line_to(d, margin_left + offset_lbl,
413 wid->
h - margin_bottom - bottom);
415 cairo_line_to(d, margin_left + offset_lbl, wid->
h - margin_bottom);