Drawing rounded rectangles
by Richard Russell, January 2021
Neither BBC BASIC for Windows nor BBC BASIC for SDL 2.0 supports drawing anti-aliased rounded rectangles (that is, boxes with radiused corners). Fortunately it is easy enough to decompose that shape into simpler components (straight lines and 90° arcs) which can be drawn using the supplied anti-aliased graphics libraries (gdiplib.bbc or aagfxlib.bbc respectively).
Here are the two routines. The parameters are the x and y coordinates of the bottom left-hand corner, the width and height, the corner radius (all in BBC BASIC graphics units), the line thickness (pixels) and the colour. Note that the colour value has a different format depending on the library, &AARRGGBB for gdiplib and &AABBGGRR for aagfxlib.
BB4W version:
DEF PROCroundrect(x, y, w, h, r, t, C%) LOCAL pen% pen% = FN_gdipcreatepen(C%, 0, t) PROC_gdiparc(pen%, x+r, y+h-r, r, r, 180, 90) PROC_gdiparc(pen%, x+w-r, y+h-r, r, r, 270, 90) PROC_gdiparc(pen%, x+r, y+r, r, r, 90, 90) PROC_gdiparc(pen%, x+w-r, y+r, r, r, 0, 90) r -= 0.3 : REM overlap 0.15 pixels PROC_gdipline(pen%, x+r, y+h, x+w-r, y+h) PROC_gdipline(pen%, x+r, y, x+w-r, y) PROC_gdipline(pen%, x, y+r, x, y+h-r) PROC_gdipline(pen%, x+w, y+r, x+w, y+h-r) PROC_gdipdeletepen(pen%) ENDPROC
BBCSDL version:
DEF PROCroundrect(x, y, w, h, r, t, C%) PROC_aaarc(x+r, y+h-r, r, r, 180, 90, t, C%, 0) PROC_aaarc(x+w-r, y+h-r, r, r, 270, 90, t, C%, 0) PROC_aaarc(x+r, y+r, r, r, 90, 90, t, C%, 0) PROC_aaarc(x+w-r, y+r, r, r, 0, 90, t, C%, 0) r -= 0.3 : REM overlap 0.15 pixels PROC_aaline(x+r, y+h, x+w-r, y+h, t, C%, 0) PROC_aaline(x+r, y, x+w-r, y, t, C%, 0) PROC_aaline(x, y+r, x, y+h-r, t, C%, 0) PROC_aaline(x+w, y+r, x+w, y+h-r, t, C%, 0) ENDPROC