Whether the point specified by the given offset (which is assumed to be relative to the origin) lies inside the rounded rectangle.
This method may allocate (and cache) a copy of the object with normalized radii the first time it is called on a particular RRect instance. When using this method, prefer to reuse existing RRects rather than recreating the object each time.
Source
bool contains(Offset point) { if (point.dx < left || point.dx >= right || point.dy < top || point.dy >= bottom) return false; // outside bounding box _scaleRadii(); double x; double y; double radiusX; double radiusY; // check whether point is in one of the rounded corner areas // x, y -> translate to ellipse center if (point.dx < left + _scaled.tlRadiusX && point.dy < top + _scaled.tlRadiusY) { x = point.dx - left - _scaled.tlRadiusX; y = point.dy - top - _scaled.tlRadiusY; radiusX = _scaled.tlRadiusX; radiusY = _scaled.tlRadiusY; } else if (point.dx > right - _scaled.trRadiusX && point.dy < top + _scaled.trRadiusY) { x = point.dx - right + _scaled.trRadiusX; y = point.dy - top - _scaled.trRadiusY; radiusX = _scaled.trRadiusX; radiusY = _scaled.trRadiusY; } else if (point.dx > right - _scaled.brRadiusX && point.dy > bottom - _scaled.brRadiusY) { x = point.dx - right + _scaled.brRadiusX; y = point.dy - bottom + _scaled.brRadiusY; radiusX = _scaled.brRadiusX; radiusY = _scaled.brRadiusY; } else if (point.dx < left + _scaled.blRadiusX && point.dy > bottom - _scaled.blRadiusY) { x = point.dx - left - _scaled.blRadiusX; y = point.dy - bottom + _scaled.blRadiusY; radiusX = _scaled.blRadiusX; radiusY = _scaled.blRadiusY; } else { return true; // inside and not within the rounded corner area } x = x / radiusX; y = y / radiusY; // check if the point is outside the unit circle if (x * x + y * y > 1.0) return false; return true; }