AnimationEffect.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /*
  2. * Copyright (c) 2023, 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/Bindings/AnimationEffectPrototype.h>
  11. #include <LibWeb/Bindings/PlatformObject.h>
  12. namespace Web::Animations {
  13. // // https://www.w3.org/TR/web-animations-1/#the-effecttiming-dictionaries
  14. struct OptionalEffectTiming {
  15. Optional<double> delay {};
  16. Optional<double> end_delay {};
  17. Optional<Bindings::FillMode> fill {};
  18. Optional<double> iteration_start {};
  19. Optional<double> iterations {};
  20. Optional<Variant<double, String>> duration;
  21. Optional<Bindings::PlaybackDirection> direction {};
  22. Optional<String> easing {};
  23. };
  24. // // https://www.w3.org/TR/web-animations-1/#the-effecttiming-dictionaries
  25. struct EffectTiming {
  26. double delay { 0 };
  27. double end_delay { 0 };
  28. Bindings::FillMode fill { Bindings::FillMode::Auto };
  29. double iteration_start { 0.0 };
  30. double iterations { 1.0 };
  31. Variant<double, String> duration { "auto"_string };
  32. Bindings::PlaybackDirection direction { Bindings::PlaybackDirection::Normal };
  33. String easing { "linear"_string };
  34. OptionalEffectTiming to_optional_effect_timing() const;
  35. };
  36. // https://www.w3.org/TR/web-animations-1/#the-computedeffecttiming-dictionary
  37. struct ComputedEffectTiming : public EffectTiming {
  38. double end_time;
  39. double active_duration;
  40. Optional<double> local_time;
  41. Optional<double> progress;
  42. Optional<double> current_iteration;
  43. };
  44. enum class AnimationDirection {
  45. Forwards,
  46. Backwards,
  47. };
  48. // https://www.w3.org/TR/web-animations-1/#the-animationeffect-interface
  49. class AnimationEffect : public Bindings::PlatformObject {
  50. WEB_PLATFORM_OBJECT(AnimationEffect, Bindings::PlatformObject);
  51. public:
  52. static JS::NonnullGCPtr<AnimationEffect> create(JS::Realm&);
  53. EffectTiming get_timing() const;
  54. ComputedEffectTiming get_computed_timing() const;
  55. WebIDL::ExceptionOr<void> update_timing(OptionalEffectTiming timing = {});
  56. double start_delay() const { return m_start_delay; }
  57. void set_start_delay(double start_delay) { m_start_delay = start_delay; }
  58. double end_delay() const { return m_end_delay; }
  59. void set_end_delay(double end_delay) { m_end_delay = end_delay; }
  60. Bindings::FillMode fill_mode() const { return m_fill_mode; }
  61. void set_fill_mode(Bindings::FillMode fill_mode) { m_fill_mode = fill_mode; }
  62. double iteration_start() const { return m_iteration_start; }
  63. void set_iteration_start(double iteration_start) { m_iteration_start = iteration_start; }
  64. double iteration_count() const { return m_iteration_count; }
  65. void set_iteration_count(double iteration_count) { m_iteration_count = iteration_count; }
  66. Variant<double, String> const& iteration_duration() const { return m_iteration_duration; }
  67. void set_iteration_duration(Variant<double, String> iteration_duration) { m_iteration_duration = move(iteration_duration); }
  68. Bindings::PlaybackDirection playback_direction() const { return m_playback_direction; }
  69. void set_playback_direction(Bindings::PlaybackDirection playback_direction) { m_playback_direction = playback_direction; }
  70. String const& easing_function() const { return m_easing_function; }
  71. void set_easing_function(String easing_function) { m_easing_function = move(easing_function); }
  72. JS::GCPtr<Animation> associated_animation() const { return m_associated_animation; }
  73. void set_associated_animation(JS::GCPtr<Animation> value) { m_associated_animation = value; }
  74. AnimationDirection animation_direction() const;
  75. protected:
  76. AnimationEffect(JS::Realm&);
  77. virtual void initialize(JS::Realm&) override;
  78. // https://www.w3.org/TR/web-animations-1/#start-delay
  79. double m_start_delay { 0.0 };
  80. // https://www.w3.org/TR/web-animations-1/#end-delay
  81. double m_end_delay { 0.0 };
  82. // https://www.w3.org/TR/web-animations-1/#fill-mode
  83. Bindings::FillMode m_fill_mode { Bindings::FillMode::Auto };
  84. // https://www.w3.org/TR/web-animations-1/#iteration-start
  85. double m_iteration_start { 0.0 };
  86. // https://www.w3.org/TR/web-animations-1/#iteration-count
  87. double m_iteration_count { 1.0 };
  88. // https://www.w3.org/TR/web-animations-1/#iteration-duration
  89. Variant<double, String> m_iteration_duration { 0.0 };
  90. // https://www.w3.org/TR/web-animations-1/#playback-direction
  91. Bindings::PlaybackDirection m_playback_direction { Bindings::PlaybackDirection::Normal };
  92. // https://www.w3.org/TR/css-easing-1/#easing-function
  93. String m_easing_function { "linear"_string };
  94. // https://www.w3.org/TR/web-animations-1/#animation-associated-effect
  95. JS::GCPtr<Animation> m_associated_animation {};
  96. };
  97. }