blob: 6bac59f1886e3a9aad2a9b06ea432c8375b85b5f [file] [log] [blame]
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef DoublePoint_h
#define DoublePoint_h
#include <iosfwd>
#include "platform/geometry/DoubleSize.h"
#include "platform/geometry/FloatPoint.h"
#include "platform/geometry/IntPoint.h"
#include "platform/wtf/Allocator.h"
#include "platform/wtf/Forward.h"
namespace blink {
class LayoutPoint;
class PLATFORM_EXPORT DoublePoint {
DISALLOW_NEW();
public:
DoublePoint() : x_(0), y_(0) {}
DoublePoint(double x, double y) : x_(x), y_(y) {}
DoublePoint(const IntPoint& p) : x_(p.X()), y_(p.Y()) {}
DoublePoint(const FloatPoint& p) : x_(p.X()), y_(p.Y()) {}
explicit DoublePoint(const LayoutPoint&);
explicit DoublePoint(const IntSize& size)
: x_(size.Width()), y_(size.Height()) {}
explicit DoublePoint(const FloatSize&);
explicit DoublePoint(const DoubleSize& size)
: x_(size.Width()), y_(size.Height()) {}
static DoublePoint Zero() { return DoublePoint(); }
DoublePoint ExpandedTo(const DoublePoint&) const;
DoublePoint ShrunkTo(const DoublePoint&) const;
double X() const { return x_; }
double Y() const { return y_; }
void SetX(double x) { x_ = x; }
void SetY(double y) { y_ = y; }
void Move(const DoubleSize& s) {
x_ += s.Width();
y_ += s.Height();
}
void Move(double x, double y) {
x_ += x;
y_ += y;
}
void MoveBy(const DoublePoint& p) {
x_ += p.X();
y_ += p.Y();
}
void Scale(float sx, float sy) {
x_ *= sx;
y_ *= sy;
}
DoublePoint ScaledBy(float scale) const {
return DoublePoint(x_ * scale, y_ * scale);
}
String ToString() const;
private:
double x_, y_;
};
inline bool operator==(const DoublePoint& a, const DoublePoint& b) {
return a.X() == b.X() && a.Y() == b.Y();
}
inline bool operator!=(const DoublePoint& a, const DoublePoint& b) {
return a.X() != b.X() || a.Y() != b.Y();
}
inline DoublePoint& operator+=(DoublePoint& a, const DoubleSize& b) {
a.SetX(a.X() + b.Width());
a.SetY(a.Y() + b.Height());
return a;
}
inline DoublePoint& operator-=(DoublePoint& a, const DoubleSize& b) {
a.SetX(a.X() - b.Width());
a.SetY(a.Y() - b.Height());
return a;
}
inline DoublePoint operator+(const DoublePoint& a, const DoubleSize& b) {
return DoublePoint(a.X() + b.Width(), a.Y() + b.Height());
}
inline DoubleSize operator-(const DoublePoint& a, const DoublePoint& b) {
return DoubleSize(a.X() - b.X(), a.Y() - b.Y());
}
inline DoublePoint operator-(const DoublePoint& a) {
return DoublePoint(-a.X(), -a.Y());
}
inline DoublePoint operator-(const DoublePoint& a, const DoubleSize& b) {
return DoublePoint(a.X() - b.Width(), a.Y() - b.Height());
}
inline IntPoint RoundedIntPoint(const DoublePoint& p) {
return IntPoint(clampTo<int>(roundf(p.X())), clampTo<int>(roundf(p.Y())));
}
inline IntPoint CeiledIntPoint(const DoublePoint& p) {
return IntPoint(clampTo<int>(ceil(p.X())), clampTo<int>(ceil(p.Y())));
}
inline IntPoint FlooredIntPoint(const DoublePoint& p) {
return IntPoint(clampTo<int>(floor(p.X())), clampTo<int>(floor(p.Y())));
}
inline FloatPoint ToFloatPoint(const DoublePoint& a) {
return FloatPoint(a.X(), a.Y());
}
inline DoubleSize ToDoubleSize(const DoublePoint& a) {
return DoubleSize(a.X(), a.Y());
}
PLATFORM_EXPORT std::ostream& operator<<(std::ostream&, const DoublePoint&);
// Redeclared here to avoid ODR issues.
// See platform/testing/GeometryPrinters.h.
void PrintTo(const DoublePoint&, std::ostream*);
} // namespace blink
#endif