AnimationEffect.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /*
  2. * Copyright (c) 2023-2024, Matthew Olsson <mattco@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Optional.h>
  8. #include <AK/String.h>
  9. #include <AK/Variant.h>
  10. #include <LibWeb/Animations/TimingFunction.h>
  11. #include <LibWeb/Bindings/AnimationEffectPrototype.h>
  12. #include <LibWeb/Bindings/PlatformObject.h>
  13. #include <LibWeb/CSS/Enums.h>
  14. namespace Web::Animations {
  15. // // https://www.w3.org/TR/web-animations-1/#the-effecttiming-dictionaries
  16. struct OptionalEffectTiming {
  17. Optional<double> delay {};
  18. Optional<double> end_delay {};
  19. Optional<Bindings::FillMode> fill {};
  20. Optional<double> iteration_start {};
  21. Optional<double> iterations {};
  22. Optional<Variant<double, String>> duration;
  23. Optional<Bindings::PlaybackDirection> direction {};
  24. Optional<String> easing {};
  25. };
  26. // // https://www.w3.org/TR/web-animations-1/#the-effecttiming-dictionaries
  27. struct EffectTiming {
  28. double delay { 0 };
  29. double end_delay { 0 };
  30. Bindings::FillMode fill { Bindings::FillMode::Auto };
  31. double iteration_start { 0.0 };
  32. double iterations { 1.0 };
  33. Variant<double, String> duration { "auto"_string };
  34. Bindings::PlaybackDirection direction { Bindings::PlaybackDirection::Normal };
  35. String easing { "linear"_string };
  36. OptionalEffectTiming to_optional_effect_timing() const;
  37. };
  38. // https://www.w3.org/TR/web-animations-1/#the-computedeffecttiming-dictionary
  39. struct ComputedEffectTiming : public EffectTiming {
  40. double end_time;
  41. double active_duration;
  42. Optional<double> local_time;
  43. Optional<double> progress;
  44. Optional<double> current_iteration;
  45. };
  46. enum class AnimationDirection {
  47. Forwards,
  48. Backwards,
  49. };
  50. Bindings::FillMode css_fill_mode_to_bindings_fill_mode(CSS::AnimationFillMode mode);
  51. Bindings::PlaybackDirection css_animation_direction_to_bindings_playback_direction(CSS::AnimationDirection direction);
  52. // https://www.w3.org/TR/web-animations-1/#the-animationeffect-interface
  53. class AnimationEffect : public Bindings::PlatformObject {
  54. WEB_PLATFORM_OBJECT(AnimationEffect, Bindings::PlatformObject);
  55. JS_DECLARE_ALLOCATOR(AnimationEffect);
  56. public:
  57. static JS::NonnullGCPtr<AnimationEffect> create(JS::Realm&);
  58. EffectTiming get_timing() const;
  59. ComputedEffectTiming get_computed_timing() const;
  60. WebIDL::ExceptionOr<void> update_timing(OptionalEffectTiming timing = {});
  61. double start_delay() const { return m_start_delay; }
  62. void set_start_delay(double start_delay) { m_start_delay = start_delay; }
  63. double end_delay() const { return m_end_delay; }
  64. void set_end_delay(double end_delay) { m_end_delay = end_delay; }
  65. Bindings::FillMode fill_mode() const { return m_fill_mode; }
  66. void set_fill_mode(Bindings::FillMode fill_mode) { m_fill_mode = fill_mode; }
  67. double iteration_start() const { return m_iteration_start; }
  68. void set_iteration_start(double iteration_start) { m_iteration_start = iteration_start; }
  69. double iteration_count() const { return m_iteration_count; }
  70. void set_iteration_count(double iteration_count) { m_iteration_count = iteration_count; }
  71. Variant<double, String> const& iteration_duration() const { return m_iteration_duration; }
  72. void set_iteration_duration(Variant<double, String> iteration_duration) { m_iteration_duration = move(iteration_duration); }
  73. Bindings::PlaybackDirection playback_direction() const { return m_playback_direction; }
  74. void set_playback_direction(Bindings::PlaybackDirection playback_direction) { m_playback_direction = playback_direction; }
  75. String const& easing_function() const { return m_easing_function; }
  76. void set_easing_function(String easing_function) { m_easing_function = move(easing_function); }
  77. TimingFunction const& timing_function() { return m_timing_function; }
  78. void set_timing_function(TimingFunction value) { m_timing_function = move(value); }
  79. JS::GCPtr<Animation> associated_animation() const { return m_associated_animation; }
  80. void set_associated_animation(JS::GCPtr<Animation> value);
  81. AnimationDirection animation_direction() const;
  82. double end_time() const;
  83. Optional<double> local_time() const;
  84. double active_duration() const;
  85. Optional<double> active_time() const;
  86. Optional<double> active_time_using_fill(Bindings::FillMode) const;
  87. bool is_in_play() const;
  88. bool is_current() const;
  89. bool is_in_effect() const;
  90. double before_active_boundary_time() const;
  91. double after_active_boundary_time() const;
  92. bool is_in_the_before_phase() const;
  93. bool is_in_the_after_phase() const;
  94. bool is_in_the_active_phase() const;
  95. bool is_in_the_idle_phase() const;
  96. enum class Phase {
  97. Before,
  98. Active,
  99. After,
  100. Idle,
  101. };
  102. Phase phase() const;
  103. Phase previous_phase() const { return m_previous_phase; }
  104. void set_previous_phase(Phase value) { m_previous_phase = value; }
  105. double previous_current_iteration() const { return m_previous_current_iteration; }
  106. void set_previous_current_iteration(double value) { m_previous_current_iteration = value; }
  107. Optional<double> overall_progress() const;
  108. Optional<double> directed_progress() const;
  109. AnimationDirection current_direction() const;
  110. Optional<double> simple_iteration_progress() const;
  111. Optional<double> current_iteration() const;
  112. Optional<double> transformed_progress() const;
  113. HashTable<CSS::PropertyID> const& target_properties() const { return m_target_properties; }
  114. virtual DOM::Element* target() const { return {}; }
  115. virtual bool is_keyframe_effect() const { return false; }
  116. protected:
  117. AnimationEffect(JS::Realm&);
  118. virtual ~AnimationEffect() = default;
  119. virtual void initialize(JS::Realm&) override;
  120. // https://www.w3.org/TR/web-animations-1/#start-delay
  121. double m_start_delay { 0.0 };
  122. // https://www.w3.org/TR/web-animations-1/#end-delay
  123. double m_end_delay { 0.0 };
  124. // https://www.w3.org/TR/web-animations-1/#fill-mode
  125. Bindings::FillMode m_fill_mode { Bindings::FillMode::Auto };
  126. // https://www.w3.org/TR/web-animations-1/#iteration-start
  127. double m_iteration_start { 0.0 };
  128. // https://www.w3.org/TR/web-animations-1/#iteration-count
  129. double m_iteration_count { 1.0 };
  130. // https://www.w3.org/TR/web-animations-1/#iteration-duration
  131. Variant<double, String> m_iteration_duration { 0.0 };
  132. // https://www.w3.org/TR/web-animations-1/#playback-direction
  133. Bindings::PlaybackDirection m_playback_direction { Bindings::PlaybackDirection::Normal };
  134. // https://www.w3.org/TR/css-easing-1/#easing-function
  135. String m_easing_function { "linear"_string };
  136. // https://www.w3.org/TR/web-animations-1/#animation-associated-effect
  137. JS::GCPtr<Animation> m_associated_animation {};
  138. // https://www.w3.org/TR/web-animations-1/#time-transformations
  139. TimingFunction m_timing_function { linear_timing_function };
  140. // Used for calculating transitions in StyleComputer
  141. Phase m_previous_phase { Phase::Idle };
  142. double m_previous_current_iteration { 0.0 };
  143. // https://www.w3.org/TR/web-animations-1/#target-property
  144. // Note: Only modified by child classes
  145. HashTable<CSS::PropertyID> m_target_properties;
  146. };
  147. }