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 : #include "SVGPreserveAspectRatio.h"
8 :
9 : #include "mozilla/dom/SVGPreserveAspectRatioBinding.h"
10 : #include "nsWhitespaceTokenizer.h"
11 : #include "SVGAnimatedPreserveAspectRatio.h"
12 :
13 : using namespace mozilla;
14 : using namespace dom;
15 :
16 0 : NS_SVG_VAL_IMPL_CYCLE_COLLECTION_WRAPPERCACHED(DOMSVGPreserveAspectRatio, mSVGElement)
17 :
18 0 : NS_IMPL_CYCLE_COLLECTING_ADDREF(DOMSVGPreserveAspectRatio)
19 0 : NS_IMPL_CYCLE_COLLECTING_RELEASE(DOMSVGPreserveAspectRatio)
20 :
21 0 : NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(DOMSVGPreserveAspectRatio)
22 0 : NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
23 0 : NS_INTERFACE_MAP_ENTRY(nsISupports)
24 0 : NS_INTERFACE_MAP_END
25 :
26 : static const char *sAlignStrings[] =
27 : { "none", "xMinYMin", "xMidYMin", "xMaxYMin", "xMinYMid", "xMidYMid",
28 : "xMaxYMid", "xMinYMax", "xMidYMax", "xMaxYMax" };
29 :
30 : static const char *sMeetOrSliceStrings[] = { "meet", "slice" };
31 :
32 : static uint16_t
33 3 : GetAlignForString(const nsAString &aAlignString)
34 : {
35 8 : for (uint32_t i = 0 ; i < ArrayLength(sAlignStrings) ; i++) {
36 8 : if (aAlignString.EqualsASCII(sAlignStrings[i])) {
37 3 : return (i + SVG_ALIGN_MIN_VALID);
38 : }
39 : }
40 :
41 0 : return SVG_PRESERVEASPECTRATIO_UNKNOWN;
42 : }
43 :
44 : static uint16_t
45 0 : GetMeetOrSliceForString(const nsAString &aMeetOrSlice)
46 : {
47 0 : for (uint32_t i = 0 ; i < ArrayLength(sMeetOrSliceStrings) ; i++) {
48 0 : if (aMeetOrSlice.EqualsASCII(sMeetOrSliceStrings[i])) {
49 0 : return (i + SVG_MEETORSLICE_MIN_VALID);
50 : }
51 : }
52 :
53 0 : return SVG_MEETORSLICE_UNKNOWN;
54 : }
55 :
56 : /* static */ nsresult
57 3 : SVGPreserveAspectRatio::FromString(const nsAString& aString,
58 : SVGPreserveAspectRatio* aValue)
59 : {
60 3 : nsWhitespaceTokenizerTemplate<IsSVGWhitespace> tokenizer(aString);
61 6 : if (tokenizer.whitespaceBeforeFirstToken() ||
62 3 : !tokenizer.hasMoreTokens()) {
63 0 : return NS_ERROR_DOM_SYNTAX_ERR;
64 : }
65 6 : const nsAString &token = tokenizer.nextToken();
66 :
67 : nsresult rv;
68 3 : SVGPreserveAspectRatio val;
69 :
70 3 : rv = val.SetAlign(GetAlignForString(token));
71 :
72 3 : if (NS_FAILED(rv)) {
73 0 : return NS_ERROR_DOM_SYNTAX_ERR;
74 : }
75 :
76 3 : if (tokenizer.hasMoreTokens()) {
77 0 : rv = val.SetMeetOrSlice(GetMeetOrSliceForString(tokenizer.nextToken()));
78 0 : if (NS_FAILED(rv)) {
79 0 : return NS_ERROR_DOM_SYNTAX_ERR;
80 : }
81 : } else {
82 3 : val.SetMeetOrSlice(SVG_MEETORSLICE_MEET);
83 : }
84 :
85 3 : if (tokenizer.whitespaceAfterCurrentToken()) {
86 0 : return NS_ERROR_DOM_SYNTAX_ERR;
87 : }
88 :
89 3 : *aValue = val;
90 3 : return NS_OK;
91 : }
92 :
93 : void
94 0 : SVGPreserveAspectRatio::ToString(nsAString& aValueAsString) const
95 : {
96 0 : MOZ_ASSERT(mAlign >= SVG_ALIGN_MIN_VALID && mAlign <= SVG_ALIGN_MAX_VALID,
97 : "Unknown align");
98 0 : aValueAsString.AssignASCII(sAlignStrings[mAlign - SVG_ALIGN_MIN_VALID]);
99 :
100 0 : if (mAlign != uint8_t(SVG_PRESERVEASPECTRATIO_NONE)) {
101 0 : MOZ_ASSERT(mMeetOrSlice >= SVG_MEETORSLICE_MIN_VALID &&
102 : mMeetOrSlice <= SVG_MEETORSLICE_MAX_VALID,
103 : "Unknown meetOrSlice");
104 0 : aValueAsString.Append(' ');
105 0 : aValueAsString.AppendASCII(sMeetOrSliceStrings[mMeetOrSlice - SVG_MEETORSLICE_MIN_VALID]);
106 : }
107 0 : }
108 :
109 : bool
110 0 : SVGPreserveAspectRatio::operator==(const SVGPreserveAspectRatio& aOther) const
111 : {
112 0 : return mAlign == aOther.mAlign &&
113 0 : mMeetOrSlice == aOther.mMeetOrSlice;
114 : }
115 :
116 : JSObject*
117 0 : DOMSVGPreserveAspectRatio::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
118 : {
119 0 : return mozilla::dom::SVGPreserveAspectRatioBinding::Wrap(aCx, this, aGivenProto);
120 : }
121 :
122 : uint16_t
123 0 : DOMSVGPreserveAspectRatio::Align()
124 : {
125 0 : if (mIsBaseValue) {
126 0 : return mVal->GetBaseValue().GetAlign();
127 : }
128 :
129 0 : mSVGElement->FlushAnimations();
130 0 : return mVal->GetAnimValue().GetAlign();
131 : }
132 :
133 : void
134 0 : DOMSVGPreserveAspectRatio::SetAlign(uint16_t aAlign, ErrorResult& rv)
135 : {
136 0 : if (!mIsBaseValue) {
137 0 : rv.Throw(NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR);
138 0 : return;
139 : }
140 0 : rv = mVal->SetBaseAlign(aAlign, mSVGElement);
141 : }
142 :
143 : uint16_t
144 0 : DOMSVGPreserveAspectRatio::MeetOrSlice()
145 : {
146 0 : if (mIsBaseValue) {
147 0 : return mVal->GetBaseValue().GetMeetOrSlice();
148 : }
149 :
150 0 : mSVGElement->FlushAnimations();
151 0 : return mVal->GetAnimValue().GetMeetOrSlice();
152 : }
153 :
154 : void
155 0 : DOMSVGPreserveAspectRatio::SetMeetOrSlice(uint16_t aMeetOrSlice, ErrorResult& rv)
156 : {
157 0 : if (!mIsBaseValue) {
158 0 : rv.Throw(NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR);
159 0 : return;
160 : }
161 0 : rv = mVal->SetBaseMeetOrSlice(aMeetOrSlice, mSVGElement);
162 : }
163 :
|