X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fcc%2Fbase%2Fmath_util.cc;h=5b01da998d9138bf8da81711c262240b5bafb3c6;hb=3545e9f2671f595d2a2f3ee75ca0393b01e35ef6;hp=7f6178dc60de5ec3b5c7b5a99b34200944693087;hpb=7d210d4c7e9ba36e635eabc5b5780495f8a63292;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/cc/base/math_util.cc b/src/cc/base/math_util.cc index 7f6178d..5b01da9 100644 --- a/src/cc/base/math_util.cc +++ b/src/cc/base/math_util.cc @@ -121,11 +121,9 @@ static inline void AddVertexToClippedQuad3d(const gfx::Point3F& new_vertex, gfx::Rect MathUtil::MapEnclosingClippedRect(const gfx::Transform& transform, const gfx::Rect& src_rect) { if (transform.IsIdentityOrIntegerTranslation()) { - return src_rect + - gfx::Vector2d( - static_cast(SkMScalarToFloat(transform.matrix().get(0, 3))), - static_cast( - SkMScalarToFloat(transform.matrix().get(1, 3)))); + gfx::Vector2d offset(static_cast(transform.matrix().getFloat(0, 3)), + static_cast(transform.matrix().getFloat(1, 3))); + return src_rect + offset; } return gfx::ToEnclosingRect(MapClippedRect(transform, gfx::RectF(src_rect))); } @@ -133,9 +131,9 @@ gfx::Rect MathUtil::MapEnclosingClippedRect(const gfx::Transform& transform, 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. @@ -163,11 +161,9 @@ gfx::RectF MathUtil::MapClippedRect(const gfx::Transform& transform, gfx::Rect MathUtil::ProjectEnclosingClippedRect(const gfx::Transform& transform, const gfx::Rect& src_rect) { if (transform.IsIdentityOrIntegerTranslation()) { - return src_rect + - gfx::Vector2d( - static_cast(SkMScalarToFloat(transform.matrix().get(0, 3))), - static_cast( - SkMScalarToFloat(transform.matrix().get(1, 3)))); + gfx::Vector2d offset(static_cast(transform.matrix().getFloat(0, 3)), + static_cast(transform.matrix().getFloat(1, 3))); + return src_rect + offset; } return gfx::ToEnclosingRect( ProjectClippedRect(transform, gfx::RectF(src_rect))); @@ -176,9 +172,9 @@ gfx::Rect MathUtil::ProjectEnclosingClippedRect(const gfx::Transform& transform, 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. @@ -191,6 +187,41 @@ gfx::RectF MathUtil::ProjectClippedRect(const gfx::Transform& transform, 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(transform.matrix().getFloat(0, 3)), + static_cast(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], @@ -436,9 +467,8 @@ gfx::QuadF MathUtil::MapQuad(const gfx::Transform& transform, 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; } @@ -469,9 +499,8 @@ gfx::QuadF MathUtil::MapQuad3d(const gfx::Transform& transform, 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);