transformPoint method Null safety

Offset transformPoint(
  1. Matrix4 transform,
  2. Offset point
)

Applies the given matrix as a perspective transform to the given point.

This function assumes the given point has a z-coordinate of 0.0. The z-coordinate of the result is ignored.

While not common, this method may return (NaN, NaN), iff the given point results in a "point at infinity" in homogeneous coordinates after applying the transform. For example, a RenderObject may set its transform to the zero matrix to indicate its content is currently not visible. Trying to convert an Offset to its coordinate space always results in (NaN, NaN).

Implementation

static Offset transformPoint(Matrix4 transform, Offset point) {
  final Float64List storage = transform.storage;
  final double x = point.dx;
  final double y = point.dy;

  // Directly simulate the transform of the vector (x, y, 0, 1),
  // dropping the resulting Z coordinate, and normalizing only
  // if needed.

  final double rx = storage[0] * x + storage[4] * y + storage[12];
  final double ry = storage[1] * x + storage[5] * y + storage[13];
  final double rw = storage[3] * x + storage[7] * y + storage[15];
  if (rw == 1.0) {
    return Offset(rx, ry);
  } else {
    return Offset(rx / rw, ry / rw);
  }
}