1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef UI_GFX_GEOMETRY_QUAD_F_H_
6 #define UI_GFX_GEOMETRY_QUAD_F_H_
12 #include "ui/gfx/geometry/point_f.h"
13 #include "ui/gfx/geometry/rect_f.h"
14 #include "ui/gfx/gfx_export.h"
18 // A Quad is defined by four corners, allowing it to have edges that are not
19 // axis-aligned, unlike a Rect.
20 class GFX_EXPORT QuadF
{
23 QuadF(const PointF
& p1
, const PointF
& p2
, const PointF
& p3
, const PointF
& p4
)
29 explicit QuadF(const RectF
& rect
)
30 : p1_(rect
.x(), rect
.y()),
31 p2_(rect
.right(), rect
.y()),
32 p3_(rect
.right(), rect
.bottom()),
33 p4_(rect
.x(), rect
.bottom()) {}
35 void operator=(const RectF
& rect
);
37 void set_p1(const PointF
& p
) { p1_
= p
; }
38 void set_p2(const PointF
& p
) { p2_
= p
; }
39 void set_p3(const PointF
& p
) { p3_
= p
; }
40 void set_p4(const PointF
& p
) { p4_
= p
; }
42 const PointF
& p1() const { return p1_
; }
43 const PointF
& p2() const { return p2_
; }
44 const PointF
& p3() const { return p3_
; }
45 const PointF
& p4() const { return p4_
; }
47 // Returns true if the quad is an axis-aligned rectangle.
48 bool IsRectilinear() const;
50 // Returns true if the points of the quad are in counter-clockwise order. This
51 // assumes that the quad is convex, and that no three points are collinear.
52 bool IsCounterClockwise() const;
54 // Returns true if the |point| is contained within the quad, or lies on on
55 // edge of the quad. This assumes that the quad is convex.
56 bool Contains(const gfx::PointF
& point
) const;
58 // Returns a rectangle that bounds the four points of the quad. The points of
59 // the quad may lie on the right/bottom edge of the resulting rectangle,
60 // rather than being strictly inside it.
61 RectF
BoundingBox() const {
62 float rl
= std::min(std::min(p1_
.x(), p2_
.x()), std::min(p3_
.x(), p4_
.x()));
63 float rr
= std::max(std::max(p1_
.x(), p2_
.x()), std::max(p3_
.x(), p4_
.x()));
64 float rt
= std::min(std::min(p1_
.y(), p2_
.y()), std::min(p3_
.y(), p4_
.y()));
65 float rb
= std::max(std::max(p1_
.y(), p2_
.y()), std::max(p3_
.y(), p4_
.y()));
66 return RectF(rl
, rt
, rr
- rl
, rb
- rt
);
69 // Add a vector to the quad, offseting each point in the quad by the vector.
70 void operator+=(const Vector2dF
& rhs
);
71 // Subtract a vector from the quad, offseting each point in the quad by the
72 // inverse of the vector.
73 void operator-=(const Vector2dF
& rhs
);
75 // Scale each point in the quad by the |scale| factor.
76 void Scale(float scale
) { Scale(scale
, scale
); }
78 // Scale each point in the quad by the scale factors along each axis.
79 void Scale(float x_scale
, float y_scale
);
81 // Returns a string representation of quad.
82 std::string
ToString() const;
91 inline bool operator==(const QuadF
& lhs
, const QuadF
& rhs
) {
93 lhs
.p1() == rhs
.p1() && lhs
.p2() == rhs
.p2() &&
94 lhs
.p3() == rhs
.p3() && lhs
.p4() == rhs
.p4();
97 inline bool operator!=(const QuadF
& lhs
, const QuadF
& rhs
) {
101 // Add a vector to a quad, offseting each point in the quad by the vector.
102 GFX_EXPORT QuadF
operator+(const QuadF
& lhs
, const Vector2dF
& rhs
);
103 // Subtract a vector from a quad, offseting each point in the quad by the
104 // inverse of the vector.
105 GFX_EXPORT QuadF
operator-(const QuadF
& lhs
, const Vector2dF
& rhs
);
109 #endif // UI_GFX_GEOMETRY_QUAD_F_H_