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 "nsError.h"
8 : #include "nsSVGAttrTearoffTable.h"
9 : #include "nsSVGInteger.h"
10 : #include "nsSMILValue.h"
11 : #include "SMILIntegerType.h"
12 : #include "SVGContentUtils.h"
13 :
14 : using namespace mozilla;
15 : using namespace mozilla::dom;
16 :
17 : /* Implementation */
18 :
19 : static nsSVGAttrTearoffTable<nsSVGInteger, nsSVGInteger::DOMAnimatedInteger>
20 3 : sSVGAnimatedIntegerTearoffTable;
21 :
22 : nsresult
23 0 : nsSVGInteger::SetBaseValueString(const nsAString &aValueAsString,
24 : nsSVGElement *aSVGElement)
25 : {
26 : int32_t value;
27 :
28 0 : if (!SVGContentUtils::ParseInteger(aValueAsString, value)) {
29 0 : return NS_ERROR_DOM_SYNTAX_ERR;
30 : }
31 :
32 0 : mIsBaseSet = true;
33 0 : mBaseVal = value;
34 0 : if (!mIsAnimated) {
35 0 : mAnimVal = mBaseVal;
36 : }
37 : else {
38 0 : aSVGElement->AnimationNeedsResample();
39 : }
40 0 : return NS_OK;
41 : }
42 :
43 : void
44 0 : nsSVGInteger::GetBaseValueString(nsAString & aValueAsString)
45 : {
46 0 : aValueAsString.Truncate();
47 0 : aValueAsString.AppendInt(mBaseVal);
48 0 : }
49 :
50 : void
51 0 : nsSVGInteger::SetBaseValue(int aValue, nsSVGElement *aSVGElement)
52 : {
53 : // We can't just rely on SetParsedAttrValue (as called by DidChangeInteger)
54 : // detecting redundant changes since it will compare false if the existing
55 : // attribute value has an associated serialized version (a string value) even
56 : // if the integers match due to the way integers are stored in nsAttrValue.
57 0 : if (aValue == mBaseVal && mIsBaseSet) {
58 0 : return;
59 : }
60 :
61 0 : mBaseVal = aValue;
62 0 : mIsBaseSet = true;
63 0 : if (!mIsAnimated) {
64 0 : mAnimVal = mBaseVal;
65 : }
66 : else {
67 0 : aSVGElement->AnimationNeedsResample();
68 : }
69 0 : aSVGElement->DidChangeInteger(mAttrEnum);
70 : }
71 :
72 : void
73 0 : nsSVGInteger::SetAnimValue(int aValue, nsSVGElement *aSVGElement)
74 : {
75 0 : if (mIsAnimated && aValue == mAnimVal) {
76 0 : return;
77 : }
78 0 : mAnimVal = aValue;
79 0 : mIsAnimated = true;
80 0 : aSVGElement->DidAnimateInteger(mAttrEnum);
81 : }
82 :
83 : already_AddRefed<SVGAnimatedInteger>
84 0 : nsSVGInteger::ToDOMAnimatedInteger(nsSVGElement *aSVGElement)
85 : {
86 : RefPtr<DOMAnimatedInteger> domAnimatedInteger =
87 0 : sSVGAnimatedIntegerTearoffTable.GetTearoff(this);
88 0 : if (!domAnimatedInteger) {
89 0 : domAnimatedInteger = new DOMAnimatedInteger(this, aSVGElement);
90 0 : sSVGAnimatedIntegerTearoffTable.AddTearoff(this, domAnimatedInteger);
91 : }
92 :
93 0 : return domAnimatedInteger.forget();
94 : }
95 :
96 0 : nsSVGInteger::DOMAnimatedInteger::~DOMAnimatedInteger()
97 : {
98 0 : sSVGAnimatedIntegerTearoffTable.RemoveTearoff(mVal);
99 0 : }
100 :
101 : UniquePtr<nsISMILAttr>
102 0 : nsSVGInteger::ToSMILAttr(nsSVGElement *aSVGElement)
103 : {
104 0 : return MakeUnique<SMILInteger>(this, aSVGElement);
105 : }
106 :
107 : nsresult
108 0 : nsSVGInteger::SMILInteger::ValueFromString(const nsAString& aStr,
109 : const dom::SVGAnimationElement* /*aSrcElement*/,
110 : nsSMILValue& aValue,
111 : bool& aPreventCachingOfSandwich) const
112 : {
113 : int32_t val;
114 :
115 0 : if (!SVGContentUtils::ParseInteger(aStr, val)) {
116 0 : return NS_ERROR_DOM_SYNTAX_ERR;
117 : }
118 :
119 0 : nsSMILValue smilVal(SMILIntegerType::Singleton());
120 0 : smilVal.mU.mInt = val;
121 0 : aValue = smilVal;
122 0 : aPreventCachingOfSandwich = false;
123 0 : return NS_OK;
124 : }
125 :
126 : nsSMILValue
127 0 : nsSVGInteger::SMILInteger::GetBaseValue() const
128 : {
129 0 : nsSMILValue val(SMILIntegerType::Singleton());
130 0 : val.mU.mInt = mVal->mBaseVal;
131 0 : return val;
132 : }
133 :
134 : void
135 0 : nsSVGInteger::SMILInteger::ClearAnimValue()
136 : {
137 0 : if (mVal->mIsAnimated) {
138 0 : mVal->mIsAnimated = false;
139 0 : mVal->mAnimVal = mVal->mBaseVal;
140 0 : mSVGElement->DidAnimateInteger(mVal->mAttrEnum);
141 : }
142 0 : }
143 :
144 : nsresult
145 0 : nsSVGInteger::SMILInteger::SetAnimValue(const nsSMILValue& aValue)
146 : {
147 0 : NS_ASSERTION(aValue.mType == SMILIntegerType::Singleton(),
148 : "Unexpected type to assign animated value");
149 0 : if (aValue.mType == SMILIntegerType::Singleton()) {
150 0 : mVal->SetAnimValue(int(aValue.mU.mInt), mSVGElement);
151 : }
152 0 : return NS_OK;
153 : }
|