gfx::Rect MathUtil::MapEnclosingClippedRect(const gfx::Transform& transform,
const gfx::Rect& src_rect) {
if (transform.IsIdentityOrIntegerTranslation()) {
- return src_rect +
- gfx::Vector2d(
- static_cast<int>(SkMScalarToFloat(transform.matrix().get(0, 3))),
- static_cast<int>(
- SkMScalarToFloat(transform.matrix().get(1, 3))));
+ gfx::Vector2d offset(static_cast<int>(transform.matrix().getFloat(0, 3)),
+ static_cast<int>(transform.matrix().getFloat(1, 3)));
+ return src_rect + offset;
}
return gfx::ToEnclosingRect(MapClippedRect(transform, gfx::RectF(src_rect)));
}
gfx::RectF MathUtil::MapClippedRect(const gfx::Transform& transform,
const gfx::RectF& src_rect) {
if (transform.IsIdentityOrTranslation()) {
- return src_rect +
- gfx::Vector2dF(SkMScalarToFloat(transform.matrix().get(0, 3)),
- SkMScalarToFloat(transform.matrix().get(1, 3)));
+ gfx::Vector2dF offset(transform.matrix().getFloat(0, 3),
+ transform.matrix().getFloat(1, 3));
+ return src_rect + offset;
}
// Apply the transform, but retain the result in homogeneous coordinates.
gfx::Rect MathUtil::ProjectEnclosingClippedRect(const gfx::Transform& transform,
const gfx::Rect& src_rect) {
if (transform.IsIdentityOrIntegerTranslation()) {
- return src_rect +
- gfx::Vector2d(
- static_cast<int>(SkMScalarToFloat(transform.matrix().get(0, 3))),
- static_cast<int>(
- SkMScalarToFloat(transform.matrix().get(1, 3))));
+ gfx::Vector2d offset(static_cast<int>(transform.matrix().getFloat(0, 3)),
+ static_cast<int>(transform.matrix().getFloat(1, 3)));
+ return src_rect + offset;
}
return gfx::ToEnclosingRect(
ProjectClippedRect(transform, gfx::RectF(src_rect)));
gfx::RectF MathUtil::ProjectClippedRect(const gfx::Transform& transform,
const gfx::RectF& src_rect) {
if (transform.IsIdentityOrTranslation()) {
- return src_rect +
- gfx::Vector2dF(SkMScalarToFloat(transform.matrix().get(0, 3)),
- SkMScalarToFloat(transform.matrix().get(1, 3)));
+ gfx::Vector2dF offset(transform.matrix().getFloat(0, 3),
+ transform.matrix().getFloat(1, 3));
+ return src_rect + offset;
}
// Perform the projection, but retain the result in homogeneous coordinates.
return ComputeEnclosingClippedRect(h1, h2, h3, h4);
}
+gfx::Rect MathUtil::MapEnclosedRectWith2dAxisAlignedTransform(
+ const gfx::Transform& transform,
+ const gfx::Rect& rect) {
+ DCHECK(transform.Preserves2dAxisAlignment());
+
+ if (transform.IsIdentityOrIntegerTranslation()) {
+ gfx::Vector2d offset(static_cast<int>(transform.matrix().getFloat(0, 3)),
+ static_cast<int>(transform.matrix().getFloat(1, 3)));
+ return rect + offset;
+ }
+ if (transform.IsIdentityOrTranslation()) {
+ gfx::Vector2dF offset(transform.matrix().getFloat(0, 3),
+ transform.matrix().getFloat(1, 3));
+ return gfx::ToEnclosedRect(rect + offset);
+ }
+
+ SkMScalar quad[2 * 2]; // input: 2 x 2D points
+ quad[0] = rect.x();
+ quad[1] = rect.y();
+ quad[2] = rect.right();
+ quad[3] = rect.bottom();
+
+ SkMScalar result[4 * 2]; // output: 2 x 4D homogeneous points
+ transform.matrix().map2(quad, 2, result);
+
+ HomogeneousCoordinate hc0(result[0], result[1], result[2], result[3]);
+ HomogeneousCoordinate hc1(result[4], result[5], result[6], result[7]);
+ DCHECK(!hc0.ShouldBeClipped());
+ DCHECK(!hc1.ShouldBeClipped());
+
+ gfx::PointF top_left(hc0.CartesianPoint2d());
+ gfx::PointF bottom_right(hc1.CartesianPoint2d());
+ return gfx::ToEnclosedRect(gfx::BoundingRect(top_left, bottom_right));
+}
+
void MathUtil::MapClippedQuad(const gfx::Transform& transform,
const gfx::QuadF& src_quad,
gfx::PointF clipped_quad[8],
bool* clipped) {
if (transform.IsIdentityOrTranslation()) {
gfx::QuadF mapped_quad(q);
- mapped_quad +=
- gfx::Vector2dF(SkMScalarToFloat(transform.matrix().get(0, 3)),
- SkMScalarToFloat(transform.matrix().get(1, 3)));
+ mapped_quad += gfx::Vector2dF(transform.matrix().getFloat(0, 3),
+ transform.matrix().getFloat(1, 3));
*clipped = false;
return mapped_quad;
}
bool* clipped) {
if (transform.IsIdentityOrTranslation()) {
gfx::QuadF mapped_quad(q);
- mapped_quad +=
- gfx::Vector2dF(SkMScalarToFloat(transform.matrix().get(0, 3)),
- SkMScalarToFloat(transform.matrix().get(1, 3)));
+ mapped_quad += gfx::Vector2dF(transform.matrix().getFloat(0, 3),
+ transform.matrix().getFloat(1, 3));
*clipped = false;
p[0] = gfx::Point3F(mapped_quad.p1().x(), mapped_quad.p1().y(), 0.0f);
p[1] = gfx::Point3F(mapped_quad.p2().x(), mapped_quad.p2().y(), 0.0f);