1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* ***** BEGIN LICENSE BLOCK *****
3 : * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 : *
5 : * The contents of this file are subject to the Mozilla Public License Version
6 : * 1.1 (the "License"); you may not use this file except in compliance with
7 : * the License. You may obtain a copy of the License at
8 : * http://www.mozilla.org/MPL/
9 : *
10 : * Software distributed under the License is distributed on an "AS IS" basis,
11 : * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 : * for the specific language governing rights and limitations under the
13 : * License.
14 : *
15 : * The Original Code is the Mozilla SVG project.
16 : *
17 : * The Initial Developer of the Original Code is Robert Longson.
18 : * Portions created by the Initial Developer are Copyright (C) 2011
19 : * the Initial Developer. All Rights Reserved.
20 : *
21 : * Contributor(s):
22 : *
23 : * Alternatively, the contents of this file may be used under the terms of
24 : * either of the GNU General Public License Version 2 or later (the "GPL"),
25 : * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 : * in which case the provisions of the GPL or the LGPL are applicable instead
27 : * of those above. If you wish to allow use of your version of this file only
28 : * under the terms of either the GPL or the LGPL, and not to allow others to
29 : * use your version of this file under the terms of the MPL, indicate your
30 : * decision by deleting the provisions above and replace them with the notice
31 : * and other provisions required by the GPL or the LGPL. If you do not delete
32 : * the provisions above, a recipient may use your version of this file under
33 : * the terms of any one of the MPL, the GPL or the LGPL.
34 : *
35 : * ***** END LICENSE BLOCK ***** */
36 :
37 : #include "SVGIntegerPairSMILType.h"
38 : #include "nsSMILValue.h"
39 : #include "nsMathUtils.h"
40 : #include "nsDebug.h"
41 : #include <math.h>
42 :
43 : namespace mozilla {
44 :
45 1464 : /*static*/ SVGIntegerPairSMILType SVGIntegerPairSMILType::sSingleton;
46 :
47 : void
48 0 : SVGIntegerPairSMILType::Init(nsSMILValue& aValue) const
49 : {
50 0 : NS_ABORT_IF_FALSE(aValue.IsNull(), "Unexpected value type");
51 :
52 0 : aValue.mU.mIntPair[0] = 0;
53 0 : aValue.mU.mIntPair[1] = 0;
54 0 : aValue.mType = this;
55 0 : }
56 :
57 : void
58 0 : SVGIntegerPairSMILType::Destroy(nsSMILValue& aValue) const
59 : {
60 0 : NS_PRECONDITION(aValue.mType == this, "Unexpected SMIL value");
61 0 : aValue.mU.mIntPair[0] = 0;
62 0 : aValue.mU.mIntPair[1] = 0;
63 0 : aValue.mType = &nsSMILNullType::sSingleton;
64 0 : }
65 :
66 : nsresult
67 0 : SVGIntegerPairSMILType::Assign(nsSMILValue& aDest, const nsSMILValue& aSrc) const
68 : {
69 0 : NS_PRECONDITION(aDest.mType == aSrc.mType, "Incompatible SMIL types");
70 0 : NS_PRECONDITION(aDest.mType == this, "Unexpected SMIL value");
71 :
72 0 : aDest.mU.mIntPair[0] = aSrc.mU.mIntPair[0];
73 0 : aDest.mU.mIntPair[1] = aSrc.mU.mIntPair[1];
74 0 : return NS_OK;
75 : }
76 :
77 : bool
78 0 : SVGIntegerPairSMILType::IsEqual(const nsSMILValue& aLeft,
79 : const nsSMILValue& aRight) const
80 : {
81 0 : NS_PRECONDITION(aLeft.mType == aRight.mType, "Incompatible SMIL types");
82 0 : NS_PRECONDITION(aLeft.mType == this, "Unexpected type for SMIL value");
83 :
84 0 : return aLeft.mU.mIntPair[0] == aRight.mU.mIntPair[0] &&
85 0 : aLeft.mU.mIntPair[1] == aRight.mU.mIntPair[1];
86 : }
87 :
88 : nsresult
89 0 : SVGIntegerPairSMILType::Add(nsSMILValue& aDest, const nsSMILValue& aValueToAdd,
90 : PRUint32 aCount) const
91 : {
92 0 : NS_PRECONDITION(aValueToAdd.mType == aDest.mType,
93 : "Trying to add invalid types");
94 0 : NS_PRECONDITION(aValueToAdd.mType == this, "Unexpected source type");
95 :
96 0 : aDest.mU.mIntPair[0] += aValueToAdd.mU.mIntPair[0] * aCount;
97 0 : aDest.mU.mIntPair[1] += aValueToAdd.mU.mIntPair[1] * aCount;
98 :
99 0 : return NS_OK;
100 : }
101 :
102 : nsresult
103 0 : SVGIntegerPairSMILType::ComputeDistance(const nsSMILValue& aFrom,
104 : const nsSMILValue& aTo,
105 : double& aDistance) const
106 : {
107 0 : NS_PRECONDITION(aFrom.mType == aTo.mType,"Trying to compare different types");
108 0 : NS_PRECONDITION(aFrom.mType == this, "Unexpected source type");
109 :
110 : double delta[2];
111 0 : delta[0] = aTo.mU.mIntPair[0] - aFrom.mU.mIntPair[0];
112 0 : delta[1] = aTo.mU.mIntPair[1] - aFrom.mU.mIntPair[1];
113 :
114 0 : aDistance = NS_hypot(delta[0], delta[1]);
115 0 : return NS_OK;
116 : }
117 :
118 : nsresult
119 0 : SVGIntegerPairSMILType::Interpolate(const nsSMILValue& aStartVal,
120 : const nsSMILValue& aEndVal,
121 : double aUnitDistance,
122 : nsSMILValue& aResult) const
123 : {
124 0 : NS_PRECONDITION(aStartVal.mType == aEndVal.mType,
125 : "Trying to interpolate different types");
126 0 : NS_PRECONDITION(aStartVal.mType == this,
127 : "Unexpected types for interpolation");
128 0 : NS_PRECONDITION(aResult.mType == this, "Unexpected result type");
129 :
130 : double currentVal[2];
131 0 : currentVal[0] = aStartVal.mU.mIntPair[0] +
132 0 : (aEndVal.mU.mIntPair[0] - aStartVal.mU.mIntPair[0]) * aUnitDistance;
133 0 : currentVal[1] = aStartVal.mU.mIntPair[1] +
134 0 : (aEndVal.mU.mIntPair[1] - aStartVal.mU.mIntPair[1]) * aUnitDistance;
135 :
136 0 : aResult.mU.mIntPair[0] = NS_lround(currentVal[0]);
137 0 : aResult.mU.mIntPair[1] = NS_lround(currentVal[1]);
138 0 : return NS_OK;
139 : }
140 :
141 4392 : } // namespace mozilla
|