summaryrefslogtreecommitdiffstats
path: root/dom/smil/SMILCSSValueType.h
blob: 72c66bdc435b57f21db0714cb8a26b3cedbfc8df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

/* representation of a value for a SMIL-animated CSS property */

#ifndef DOM_SMIL_SMILCSSVALUETYPE_H_
#define DOM_SMIL_SMILCSSVALUETYPE_H_

#include "mozilla/Attributes.h"
#include "mozilla/SMILType.h"
#include "nsCSSPropertyID.h"
#include "nsStringFwd.h"

namespace mozilla {
struct AnimationValue;
class DeclarationBlock;
namespace dom {
class Element;
}  // namespace dom

/*
 * SMILCSSValueType: Represents a SMIL-animated CSS value.
 */
class SMILCSSValueType : public SMILType {
 public:
  // Singleton for SMILValue objects to hold onto.
  static SMILCSSValueType sSingleton;

 protected:
  // SMILType Methods
  // -------------------
  void Init(SMILValue& aValue) const override;
  void Destroy(SMILValue&) const override;
  nsresult Assign(SMILValue& aDest, const SMILValue& aSrc) const override;
  bool IsEqual(const SMILValue& aLeft, const SMILValue& aRight) const override;
  nsresult Add(SMILValue& aDest, const SMILValue& aValueToAdd,
               uint32_t aCount) const override;
  nsresult SandwichAdd(SMILValue& aDest,
                       const SMILValue& aValueToAdd) const override;
  nsresult ComputeDistance(const SMILValue& aFrom, const SMILValue& aTo,
                           double& aDistance) const override;
  nsresult Interpolate(const SMILValue& aStartVal, const SMILValue& aEndVal,
                       double aUnitDistance, SMILValue& aResult) const override;

 public:
  // Helper Methods
  // --------------
  /**
   * Sets up the given SMILValue to represent the given string value.  The
   * string is interpreted as a value for the given property on the given
   * element.
   *
   * On failure, this method leaves aValue.mType == SMILNullType::sSingleton.
   * Otherwise, this method leaves aValue.mType == this class's singleton.
   *
   * @param       aPropID         The property for which we're parsing a value.
   * @param       aTargetElement  The target element to whom the property/value
   *                              setting applies.
   * @param       aString         The string to be parsed as a CSS value.
   * @param [out] aValue          The SMILValue to be populated. Should
   *                              initially be null-typed.
   * @param [out] aIsContextSensitive Set to true if |aString| may produce
   *                                  a different |aValue| depending on other
   *                                  CSS properties on |aTargetElement|
   *                                  or its ancestors (e.g. 'inherit).
   *                                  false otherwise. May be nullptr.
   *                                  Not set if the method fails.
   * @pre  aValue.IsNull()
   * @post aValue.IsNull() || aValue.mType == SMILCSSValueType::sSingleton
   */
  static void ValueFromString(nsCSSPropertyID aPropID,
                              dom::Element* aTargetElement,
                              const nsAString& aString, SMILValue& aValue,
                              bool* aIsContextSensitive);

  /**
   * Creates a SMILValue to wrap the given animation value.
   *
   * @param aPropID         The property that |aValue| corresponds to.
   * @param aTargetElement  The target element to which the animation value
   *                        applies.
   * @param aValue          The animation value to use.
   * @return                A new SMILValue. On failure, returns a
   *                        SMILValue with the null type (i.e. rv.IsNull()
   *                        returns true).
   */
  static SMILValue ValueFromAnimationValue(nsCSSPropertyID aPropID,
                                           dom::Element* aTargetElement,
                                           const AnimationValue& aValue);

  /**
   * Sets the relevant property values in the declaration block.
   *
   * Returns whether the declaration changed.
   */
  static bool SetPropertyValues(const SMILValue&, mozilla::DeclarationBlock&);

  /**
   * Return the CSS property animated by the specified value.
   *
   * @param   aValue   The SMILValue to examine.
   * @return           The nsCSSPropertyID enum value of the property animated
   *                   by |aValue|, or eCSSProperty_UNKNOWN if the type of
   *                   |aValue| is not SMILCSSValueType.
   */
  static nsCSSPropertyID PropertyFromValue(const SMILValue& aValue);

  /**
   * If |aValue| is an empty value, converts it to a suitable zero value by
   * matching the type of value stored in |aValueToMatch|.
   *
   * There is no indication if this method fails. If a suitable zero value could
   * not be created, |aValue| is simply unmodified.
   *
   * @param aValue        The SMILValue (of type SMILCSSValueType) to
   *                      possibly update.
   * @param aValueToMatch A SMILValue (of type SMILCSSValueType) for which
   *                      a corresponding zero value will be created if |aValue|
   *                      is empty.
   */
  static void FinalizeValue(SMILValue& aValue, const SMILValue& aValueToMatch);

 private:
  // Private constructor: prevent instances beyond my singleton.
  constexpr SMILCSSValueType() = default;
};

}  // namespace mozilla

#endif  // DOM_SMIL_SMILCSSVALUETYPE_H_