roundedBoxRgba function
int
roundedBoxRgba(
- Pointer<SdlRenderer> renderer,
- int x1,
- int y1,
- int x2,
- int y2,
- int rad,
- int r,
- int g,
- int b,
- int a,
)
Implementation
int roundedBoxRgba(Pointer<SdlRenderer> renderer, int x1, int y1, int x2,
int y2, int rad, int r, int g, int b, int a) {
int result;
int w, h, r2, tmp;
int cx = 0;
int cy = rad;
int ocx = 0xffff;
int ocy = 0xffff;
int df = 1 - rad;
int dE = 3;
int dSe = -2 * rad + 5;
int xpcx, xmcx, xpcy, xmcy;
int ypcy, ymcy, ypcx, ymcx;
int x, y, dx, dy;
/*
* Check destination renderer
*/
if (renderer == nullptr) {
return -1;
}
/*
* Check radius vor valid range
*/
if (rad < 0) {
return -1;
}
/*
* Special case - no rounding
*/
if (rad <= 1) {
return boxRgba(renderer, x1, y1, x2, y2, r, g, b, a);
}
/*
* Test for special cases of straight lines or single point
*/
if (x1 == x2) {
if (y1 == y2) {
return (pixelRgba(renderer, x1, y1, r, g, b, a));
} else {
return (vlineRgba(renderer, x1, y1, y2, r, g, b, a));
}
} else {
if (y1 == y2) {
return (hlineRgba(renderer, x1, x2, y1, r, g, b, a));
}
}
/*
* Swap x1, x2 if required
*/
if (x1 > x2) {
tmp = x1;
x1 = x2;
x2 = tmp;
}
/*
* Swap y1, y2 if required
*/
if (y1 > y2) {
tmp = y1;
y1 = y2;
y2 = tmp;
}
/*
* Calculate width&height
*/
w = x2 - x1 + 1;
h = y2 - y1 + 1;
/*
* Maybe adjust radius
*/
r2 = rad + rad;
if (r2 > w) {
rad = w ~/ 2;
r2 = rad + rad;
}
if (r2 > h) {
rad = h ~/ 2;
}
/* Setup filled circle drawing for corners */
x = x1 + rad;
y = y1 + rad;
dx = x2 - x1 - rad - rad;
dy = y2 - y1 - rad - rad;
/*
* Set color
*/
result = 0;
result |= sdlSetRenderDrawBlendMode(
renderer, (a == 255) ? SDL_BLENDMODE_NONE : SDL_BLENDMODE_BLEND);
result |= sdlSetRenderDrawColor(renderer, r, g, b, a);
/*
* Draw corners
*/
do {
xpcx = x + cx;
xmcx = x - cx;
xpcy = x + cy;
xmcy = x - cy;
if (ocy != cy) {
if (cy > 0) {
ypcy = y + cy;
ymcy = y - cy;
result |= hline(renderer, xmcx, xpcx + dx, ypcy + dy);
result |= hline(renderer, xmcx, xpcx + dx, ymcy);
} else {
result |= hline(renderer, xmcx, xpcx + dx, y);
}
ocy = cy;
}
if (ocx != cx) {
if (cx != cy) {
if (cx > 0) {
ypcx = y + cx;
ymcx = y - cx;
result |= hline(renderer, xmcy, xpcy + dx, ymcx);
result |= hline(renderer, xmcy, xpcy + dx, ypcx + dy);
} else {
result |= hline(renderer, xmcy, xpcy + dx, y);
}
}
ocx = cx;
}
/*
* Update
*/
if (df < 0) {
df += dE;
dE += 2;
dSe += 2;
} else {
df += dSe;
dE += 2;
dSe += 4;
cy--;
}
cx++;
} while (cx <= cy);
/* Inside */
if (dx > 0 && dy > 0) {
result |= boxRgba(renderer, x1, y1 + rad + 1, x2, y2 - rad, r, g, b, a);
}
return (result);
}