summaryrefslogtreecommitdiffstats
path: root/dom/base/DOMQuad.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/base/DOMQuad.cpp')
-rw-r--r--dom/base/DOMQuad.cpp160
1 files changed, 160 insertions, 0 deletions
diff --git a/dom/base/DOMQuad.cpp b/dom/base/DOMQuad.cpp
new file mode 100644
index 000000000..3e10f05e5
--- /dev/null
+++ b/dom/base/DOMQuad.cpp
@@ -0,0 +1,160 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/DOMQuad.h"
+
+#include "mozilla/dom/DOMQuadBinding.h"
+#include "mozilla/dom/DOMPoint.h"
+#include "mozilla/dom/DOMRect.h"
+#include <algorithm>
+
+using namespace mozilla;
+using namespace mozilla::dom;
+using namespace mozilla::gfx;
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(DOMQuad, mParent, mBounds, mPoints[0],
+ mPoints[1], mPoints[2], mPoints[3])
+
+NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(DOMQuad, AddRef)
+NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(DOMQuad, Release)
+
+DOMQuad::DOMQuad(nsISupports* aParent, CSSPoint aPoints[4])
+ : mParent(aParent)
+{
+ for (uint32_t i = 0; i < 4; ++i) {
+ mPoints[i] = new DOMPoint(aParent, aPoints[i].x, aPoints[i].y);
+ }
+}
+
+DOMQuad::DOMQuad(nsISupports* aParent)
+ : mParent(aParent)
+{
+}
+
+DOMQuad::~DOMQuad()
+{
+}
+
+JSObject*
+DOMQuad::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return DOMQuadBinding::Wrap(aCx, this, aGivenProto);
+}
+
+already_AddRefed<DOMQuad>
+DOMQuad::Constructor(const GlobalObject& aGlobal,
+ const DOMPointInit& aP1,
+ const DOMPointInit& aP2,
+ const DOMPointInit& aP3,
+ const DOMPointInit& aP4,
+ ErrorResult& aRV)
+{
+ RefPtr<DOMQuad> obj = new DOMQuad(aGlobal.GetAsSupports());
+ obj->mPoints[0] = DOMPoint::Constructor(aGlobal, aP1, aRV);
+ obj->mPoints[1] = DOMPoint::Constructor(aGlobal, aP2, aRV);
+ obj->mPoints[2] = DOMPoint::Constructor(aGlobal, aP3, aRV);
+ obj->mPoints[3] = DOMPoint::Constructor(aGlobal, aP4, aRV);
+ return obj.forget();
+}
+
+already_AddRefed<DOMQuad>
+DOMQuad::Constructor(const GlobalObject& aGlobal, const DOMRectReadOnly& aRect,
+ ErrorResult& aRV)
+{
+ CSSPoint points[4];
+ Float x = aRect.X(), y = aRect.Y(), w = aRect.Width(), h = aRect.Height();
+ points[0] = CSSPoint(x, y);
+ points[1] = CSSPoint(x + w, y);
+ points[2] = CSSPoint(x + w, y + h);
+ points[3] = CSSPoint(x, y + h);
+ RefPtr<DOMQuad> obj = new DOMQuad(aGlobal.GetAsSupports(), points);
+ return obj.forget();
+}
+
+class DOMQuad::QuadBounds final : public DOMRectReadOnly
+{
+public:
+ explicit QuadBounds(DOMQuad* aQuad)
+ : DOMRectReadOnly(aQuad->GetParentObject())
+ , mQuad(aQuad)
+ {}
+
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(QuadBounds, DOMRectReadOnly)
+ NS_DECL_ISUPPORTS_INHERITED
+
+ virtual double X() const override
+ {
+ double x1, x2;
+ GetHorizontalMinMax(&x1, &x2);
+ return x1;
+ }
+ virtual double Y() const override
+ {
+ double y1, y2;
+ GetVerticalMinMax(&y1, &y2);
+ return y1;
+ }
+ virtual double Width() const override
+ {
+ double x1, x2;
+ GetHorizontalMinMax(&x1, &x2);
+ return x2 - x1;
+ }
+ virtual double Height() const override
+ {
+ double y1, y2;
+ GetVerticalMinMax(&y1, &y2);
+ return y2 - y1;
+ }
+
+ void GetHorizontalMinMax(double* aX1, double* aX2) const
+ {
+ double x1, x2;
+ x1 = x2 = mQuad->Point(0)->X();
+ for (uint32_t i = 1; i < 4; ++i) {
+ double x = mQuad->Point(i)->X();
+ x1 = std::min(x1, x);
+ x2 = std::max(x2, x);
+ }
+ *aX1 = x1;
+ *aX2 = x2;
+ }
+
+ void GetVerticalMinMax(double* aY1, double* aY2) const
+ {
+ double y1, y2;
+ y1 = y2 = mQuad->Point(0)->Y();
+ for (uint32_t i = 1; i < 4; ++i) {
+ double y = mQuad->Point(i)->Y();
+ y1 = std::min(y1, y);
+ y2 = std::max(y2, y);
+ }
+ *aY1 = y1;
+ *aY2 = y2;
+ }
+
+protected:
+ virtual ~QuadBounds() {}
+
+ RefPtr<DOMQuad> mQuad;
+};
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(DOMQuad::QuadBounds, DOMRectReadOnly, mQuad)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DOMQuad::QuadBounds)
+NS_INTERFACE_MAP_END_INHERITING(DOMRectReadOnly)
+
+NS_IMPL_ADDREF_INHERITED(DOMQuad::QuadBounds, DOMRectReadOnly)
+NS_IMPL_RELEASE_INHERITED(DOMQuad::QuadBounds, DOMRectReadOnly)
+
+DOMRectReadOnly*
+DOMQuad::Bounds() const
+{
+ if (!mBounds) {
+ mBounds = new QuadBounds(const_cast<DOMQuad*>(this));
+ }
+ return mBounds;
+}