Line data Source code
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 : #ifndef MOZILLA_CONTENT_SVGPRESERVEASPECTRATIO_H_
8 : #define MOZILLA_CONTENT_SVGPRESERVEASPECTRATIO_H_
9 :
10 : #include "mozilla/HashFunctions.h" // for HashGeneric
11 :
12 : #include "nsWrapperCache.h"
13 : #include "nsCycleCollectionParticipant.h"
14 : #include "mozilla/ErrorResult.h"
15 : #include "nsSVGElement.h"
16 :
17 : namespace mozilla {
18 : // Alignment Types
19 : enum SVGAlign : uint8_t {
20 : SVG_PRESERVEASPECTRATIO_UNKNOWN = 0,
21 : SVG_PRESERVEASPECTRATIO_NONE = 1,
22 : SVG_PRESERVEASPECTRATIO_XMINYMIN = 2,
23 : SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3,
24 : SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4,
25 : SVG_PRESERVEASPECTRATIO_XMINYMID = 5,
26 : SVG_PRESERVEASPECTRATIO_XMIDYMID = 6,
27 : SVG_PRESERVEASPECTRATIO_XMAXYMID = 7,
28 : SVG_PRESERVEASPECTRATIO_XMINYMAX = 8,
29 : SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9,
30 : SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10
31 : };
32 :
33 : // These constants represent the range of valid enum values for the <align>
34 : // parameter. They exclude the sentinel _UNKNOWN value.
35 : const uint16_t SVG_ALIGN_MIN_VALID = SVG_PRESERVEASPECTRATIO_NONE;
36 : const uint16_t SVG_ALIGN_MAX_VALID = SVG_PRESERVEASPECTRATIO_XMAXYMAX;
37 :
38 : // Meet-or-slice Types
39 : enum SVGMeetOrSlice : uint8_t {
40 : SVG_MEETORSLICE_UNKNOWN = 0,
41 : SVG_MEETORSLICE_MEET = 1,
42 : SVG_MEETORSLICE_SLICE = 2
43 : };
44 :
45 : // These constants represent the range of valid enum values for the
46 : // <meetOrSlice> parameter. They exclude the sentinel _UNKNOWN value.
47 : const uint16_t SVG_MEETORSLICE_MIN_VALID = SVG_MEETORSLICE_MEET;
48 : const uint16_t SVG_MEETORSLICE_MAX_VALID = SVG_MEETORSLICE_SLICE;
49 :
50 : class SVGAnimatedPreserveAspectRatio;
51 :
52 : class SVGPreserveAspectRatio final
53 : {
54 : friend class SVGAnimatedPreserveAspectRatio;
55 : public:
56 50 : explicit SVGPreserveAspectRatio()
57 50 : : mAlign(SVG_PRESERVEASPECTRATIO_UNKNOWN)
58 50 : , mMeetOrSlice(SVG_MEETORSLICE_UNKNOWN)
59 50 : {}
60 :
61 118 : SVGPreserveAspectRatio(SVGAlign aAlign, SVGMeetOrSlice aMeetOrSlice)
62 118 : : mAlign(aAlign)
63 118 : , mMeetOrSlice(aMeetOrSlice)
64 118 : {}
65 :
66 : static nsresult FromString(const nsAString& aString,
67 : SVGPreserveAspectRatio* aValue);
68 : void ToString(nsAString& aValueAsString) const;
69 :
70 : bool operator==(const SVGPreserveAspectRatio& aOther) const;
71 :
72 3 : nsresult SetAlign(uint16_t aAlign) {
73 3 : if (aAlign < SVG_ALIGN_MIN_VALID || aAlign > SVG_ALIGN_MAX_VALID)
74 0 : return NS_ERROR_FAILURE;
75 3 : mAlign = static_cast<uint8_t>(aAlign);
76 3 : return NS_OK;
77 : }
78 :
79 539 : SVGAlign GetAlign() const {
80 539 : return static_cast<SVGAlign>(mAlign);
81 : }
82 :
83 3 : nsresult SetMeetOrSlice(uint16_t aMeetOrSlice) {
84 6 : if (aMeetOrSlice < SVG_MEETORSLICE_MIN_VALID ||
85 3 : aMeetOrSlice > SVG_MEETORSLICE_MAX_VALID)
86 0 : return NS_ERROR_FAILURE;
87 3 : mMeetOrSlice = static_cast<uint8_t>(aMeetOrSlice);
88 3 : return NS_OK;
89 : }
90 :
91 539 : SVGMeetOrSlice GetMeetOrSlice() const {
92 539 : return static_cast<SVGMeetOrSlice>(mMeetOrSlice);
93 : }
94 :
95 0 : PLDHashNumber Hash() const {
96 0 : return HashGeneric(mAlign, mMeetOrSlice);
97 : }
98 :
99 : private:
100 : // We can't use enum types here because some compilers fail to pack them.
101 : uint8_t mAlign;
102 : uint8_t mMeetOrSlice;
103 : };
104 :
105 : namespace dom {
106 :
107 : class DOMSVGPreserveAspectRatio final : public nsISupports,
108 : public nsWrapperCache
109 : {
110 : public:
111 : NS_DECL_CYCLE_COLLECTING_ISUPPORTS
112 0 : NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(DOMSVGPreserveAspectRatio)
113 :
114 0 : DOMSVGPreserveAspectRatio(SVGAnimatedPreserveAspectRatio* aVal,
115 : nsSVGElement *aSVGElement,
116 : bool aIsBaseValue)
117 0 : : mVal(aVal), mSVGElement(aSVGElement), mIsBaseValue(aIsBaseValue)
118 : {
119 0 : }
120 :
121 : // WebIDL
122 0 : nsSVGElement* GetParentObject() const { return mSVGElement; }
123 : virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
124 :
125 : uint16_t Align();
126 : void SetAlign(uint16_t aAlign, ErrorResult& rv);
127 : uint16_t MeetOrSlice();
128 : void SetMeetOrSlice(uint16_t aMeetOrSlice, ErrorResult& rv);
129 :
130 : protected:
131 : ~DOMSVGPreserveAspectRatio();
132 :
133 : SVGAnimatedPreserveAspectRatio* mVal; // kept alive because it belongs to mSVGElement
134 : RefPtr<nsSVGElement> mSVGElement;
135 : const bool mIsBaseValue;
136 : };
137 :
138 : } //namespace dom
139 : } //namespace mozilla
140 :
141 : #endif // MOZILLA_CONTENT_SVGPRESERVEASPECTRATIO_H_
|