roundedBoxRgba function

int roundedBoxRgba(
  1. Pointer<SdlRenderer> renderer,
  2. int x1,
  3. int y1,
  4. int x2,
  5. int y2,
  6. int rad,
  7. int r,
  8. int g,
  9. int b,
  10. 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);
}