diff options
Diffstat (limited to 'dom/svg/DOMSVGPoint.h')
-rw-r--r-- | dom/svg/DOMSVGPoint.h | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/dom/svg/DOMSVGPoint.h b/dom/svg/DOMSVGPoint.h new file mode 100644 index 000000000..3c8780a20 --- /dev/null +++ b/dom/svg/DOMSVGPoint.h @@ -0,0 +1,113 @@ +/* -*- 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/. */ + +#ifndef MOZILLA_DOMSVGPOINT_H__ +#define MOZILLA_DOMSVGPOINT_H__ + +#include "DOMSVGPointList.h" +#include "mozilla/gfx/2D.h" +#include "nsDebug.h" +#include "nsISVGPoint.h" +#include "SVGPoint.h" +#include "mozilla/Attributes.h" +#include "mozilla/FloatingPoint.h" + +class nsSVGElement; + +namespace mozilla { + +namespace dom { +class SVGMatrix; +} // namespace dom + +/** + * Class DOMSVGPoint + * + * This class creates the DOM objects that wrap internal SVGPoint objects that + * are in an SVGPointList. It is also used to create the objects returned by + * SVGSVGElement.createSVGPoint() and other functions that return DOM SVGPoint + * objects. + * + * See the architecture comment in DOMSVGPointList.h for an overview of the + * important points regarding these DOM wrapper structures. + * + * See the architecture comment in DOMSVGLength.h (yes, LENGTH) for an overview + * of the important points regarding how this specific class works. + */ +class DOMSVGPoint final : public nsISVGPoint +{ + friend class AutoChangePointNotifier; + + typedef mozilla::gfx::Point Point; + +public: + /** + * Generic ctor for DOMSVGPoint objects that are created for an attribute. + */ + DOMSVGPoint(DOMSVGPointList *aList, + uint32_t aListIndex, + bool aIsAnimValItem) + : nsISVGPoint() + { + mList = aList; + mListIndex = aListIndex; + mIsAnimValItem = aIsAnimValItem; + + // These shifts are in sync with the members. + MOZ_ASSERT(aList && aListIndex <= MaxListIndex(), "bad arg"); + + MOZ_ASSERT(IndexIsValid(), "Bad index for DOMSVGPoint!"); + } + + explicit DOMSVGPoint(const DOMSVGPoint *aPt = nullptr) + : nsISVGPoint() + { + if (aPt) { + mPt = aPt->ToSVGPoint(); + } + } + + DOMSVGPoint(float aX, float aY) + : nsISVGPoint() + { + mPt.mX = aX; + mPt.mY = aY; + } + + explicit DOMSVGPoint(const Point& aPt) + : nsISVGPoint() + { + mPt.mX = aPt.x; + mPt.mY = aPt.y; + NS_ASSERTION(IsFinite(mPt.mX) && IsFinite(mPt.mX), + "DOMSVGPoint coords are not finite"); + } + + + // WebIDL + virtual float X() override; + virtual void SetX(float aX, ErrorResult& rv) override; + virtual float Y() override; + virtual void SetY(float aY, ErrorResult& rv) override; + virtual already_AddRefed<nsISVGPoint> MatrixTransform(dom::SVGMatrix& matrix) override; + nsISupports* GetParentObject() override { + return mList; + } + + virtual DOMSVGPoint* Copy() override { + return new DOMSVGPoint(this); + } + +protected: + + nsSVGElement* Element() { + return mList->Element(); + } +}; + +} // namespace mozilla + +#endif // MOZILLA_DOMSVGPOINT_H__ |