/src/mozilla-central/dom/svg/nsISVGPoint.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* vim: set ts=8 sts=2 et sw=2 tw=80: */ |
3 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
4 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
5 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
6 | | |
7 | | #pragma once |
8 | | |
9 | | #include "nsCycleCollectionParticipant.h" |
10 | | #include "nsWrapperCache.h" |
11 | | #include "mozilla/dom/SVGPointBinding.h" |
12 | | #include "DOMSVGPointList.h" |
13 | | |
14 | | // {d6b6c440-af8d-40ee-856b-02a317cab275} |
15 | | #define MOZILLA_NSISVGPOINT_IID \ |
16 | | { 0xd6b6c440, 0xaf8d, 0x40ee, \ |
17 | | { 0x85, 0x6b, 0x02, 0xa3, 0x17, 0xca, 0xb2, 0x75 } } |
18 | | |
19 | 0 | #define MOZ_SVG_LIST_INDEX_BIT_COUNT 29 |
20 | | |
21 | | namespace mozilla { |
22 | | |
23 | | namespace dom { |
24 | | class SVGMatrix; |
25 | | } // namespace dom |
26 | | |
27 | | /** |
28 | | * Class nsISVGPoint |
29 | | * |
30 | | * This class creates the DOM objects that wrap internal SVGPoint objects. |
31 | | * An nsISVGPoint can be either a DOMSVGPoint or a DOMSVGTranslatePoint |
32 | | */ |
33 | | class nsISVGPoint : public nsISupports, |
34 | | public nsWrapperCache |
35 | | { |
36 | | public: |
37 | | NS_DECLARE_STATIC_IID_ACCESSOR(MOZILLA_NSISVGPOINT_IID) |
38 | | NS_DECL_CYCLE_COLLECTING_ISUPPORTS |
39 | | NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(nsISVGPoint) |
40 | | |
41 | | /** |
42 | | * Generic ctor for DOMSVGPoint objects that are created for an attribute. |
43 | | */ |
44 | | explicit nsISVGPoint() |
45 | | : mList(nullptr) |
46 | | , mListIndex(0) |
47 | | , mIsReadonly(false) |
48 | | , mIsAnimValItem(false) |
49 | | , mIsTranslatePoint(false) |
50 | 0 | { |
51 | 0 | } |
52 | | |
53 | | explicit nsISVGPoint(SVGPoint* aPt, bool aIsTranslatePoint) |
54 | | : mList(nullptr) |
55 | | , mListIndex(0) |
56 | | , mIsReadonly(false) |
57 | | , mIsAnimValItem(false) |
58 | | , mIsTranslatePoint(aIsTranslatePoint) |
59 | 0 | { |
60 | 0 | mPt.mX = aPt->GetX(); |
61 | 0 | mPt.mY = aPt->GetY(); |
62 | 0 | } |
63 | | |
64 | | protected: |
65 | | virtual ~nsISVGPoint() |
66 | 0 | { |
67 | 0 | // Our mList's weak ref to us must be nulled out when we die. If GC has |
68 | 0 | // unlinked us using the cycle collector code, then that has already |
69 | 0 | // happened, and mList is null. |
70 | 0 | if (mList) { |
71 | 0 | mList->mItems[mListIndex] = nullptr; |
72 | 0 | } |
73 | 0 | } |
74 | | |
75 | | public: |
76 | | /** |
77 | | * Creates an unowned copy of this object's point as a DOMSVGPoint. |
78 | | */ |
79 | | virtual DOMSVGPoint* Copy() = 0; |
80 | | |
81 | 0 | SVGPoint ToSVGPoint() const { |
82 | 0 | return HasOwner() ? const_cast<nsISVGPoint*>(this)->InternalItem() : mPt; |
83 | 0 | } |
84 | | |
85 | 0 | bool IsInList() const { |
86 | 0 | return !!mList; |
87 | 0 | } |
88 | | |
89 | | /** |
90 | | * In future, if this class is used for non-list points, this will be |
91 | | * different to IsInList(). "Owner" here means that the instance has an |
92 | | * internal counterpart from which it gets its values. (A better name may |
93 | | * be HasWrappee().) |
94 | | */ |
95 | 0 | bool HasOwner() const { |
96 | 0 | return !!mList; |
97 | 0 | } |
98 | | |
99 | 0 | bool IsTranslatePoint() const { |
100 | 0 | return mIsTranslatePoint; |
101 | 0 | } |
102 | | |
103 | | /** |
104 | | * This method is called to notify this DOM object that it is being inserted |
105 | | * into a list, and give it the information it needs as a result. |
106 | | * |
107 | | * This object MUST NOT already belong to a list when this method is called. |
108 | | * That's not to say that script can't move these DOM objects between |
109 | | * lists - it can - it's just that the logic to handle that (and send out |
110 | | * the necessary notifications) is located elsewhere (in DOMSVGPointList).) |
111 | | */ |
112 | | void InsertingIntoList(DOMSVGPointList *aList, |
113 | | uint32_t aListIndex, |
114 | | bool aIsAnimValItem); |
115 | | |
116 | 0 | static uint32_t MaxListIndex() { |
117 | 0 | return (1U << MOZ_SVG_LIST_INDEX_BIT_COUNT) - 1; |
118 | 0 | } |
119 | | |
120 | | /// This method is called to notify this object that its list index changed. |
121 | 0 | void UpdateListIndex(uint32_t aListIndex) { |
122 | 0 | mListIndex = aListIndex; |
123 | 0 | } |
124 | | |
125 | | /** |
126 | | * This method is called to notify this DOM object that it is about to be |
127 | | * removed from its current DOM list so that it can first make a copy of its |
128 | | * internal counterpart's values. (If it didn't do this, then it would |
129 | | * "lose" its value on being removed.) |
130 | | */ |
131 | | void RemovingFromList(); |
132 | | |
133 | 0 | bool IsReadonly() const { |
134 | 0 | return mIsReadonly; |
135 | 0 | } |
136 | 0 | void SetReadonly(bool aReadonly) { |
137 | 0 | mIsReadonly = aReadonly; |
138 | 0 | } |
139 | | |
140 | | // WebIDL |
141 | | virtual float X() = 0; |
142 | | virtual void SetX(float aX, ErrorResult& rv) = 0; |
143 | | virtual float Y() = 0; |
144 | | virtual void SetY(float aY, ErrorResult& rv) = 0; |
145 | | virtual already_AddRefed<nsISVGPoint> MatrixTransform(dom::SVGMatrix& matrix) = 0; |
146 | | virtual JSObject* WrapObject(JSContext *cx, JS::Handle<JSObject*> aGivenProto) override |
147 | 0 | { return dom::SVGPoint_Binding::Wrap(cx, this, aGivenProto); } |
148 | | |
149 | | virtual nsISupports* GetParentObject() = 0; |
150 | | |
151 | | protected: |
152 | | #ifdef DEBUG |
153 | | bool IndexIsValid(); |
154 | | #endif |
155 | | |
156 | | RefPtr<DOMSVGPointList> mList; |
157 | | |
158 | | // Bounds for the following are checked in the ctor, so be sure to update |
159 | | // that if you change the capacity of any of the following. |
160 | | |
161 | | uint32_t mListIndex:MOZ_SVG_LIST_INDEX_BIT_COUNT; |
162 | | uint32_t mIsReadonly:1; // These flags are uint32_t because MSVC won't |
163 | | uint32_t mIsAnimValItem:1; // pack otherwise. |
164 | | uint32_t mIsTranslatePoint:1; |
165 | | |
166 | | /** |
167 | | * Get a reference to the internal SVGPoint list item that this DOM wrapper |
168 | | * object currently wraps. |
169 | | * |
170 | | * To simplify the code we just have this one method for obtaining both |
171 | | * baseVal and animVal internal items. This means that animVal items don't |
172 | | * get const protection, but then our setter methods guard against changing |
173 | | * animVal items. |
174 | | */ |
175 | | SVGPoint& InternalItem(); |
176 | | |
177 | | // The following member is only used when we're not in a list: |
178 | | SVGPoint mPt; |
179 | | }; |
180 | | |
181 | | NS_DEFINE_STATIC_IID_ACCESSOR(nsISVGPoint, MOZILLA_NSISVGPOINT_IID) |
182 | | |
183 | | } // namespace mozilla |
184 | | |
185 | | #undef MOZ_SVG_LIST_INDEX_BIT_COUNT |
186 | | |
187 | | |