/* 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/. */

#ifndef mozilla_ScrollTypes_h
#define mozilla_ScrollTypes_h

#include "mozilla/TypedEnumBits.h"

// Types used in main-thread scrolling interfaces such as nsIScrollableFrame.

namespace mozilla {

/**
 * Scroll modes for main-thread scroll operations. These are mostly used
 * by nsIScrollableFrame methods.
 *
 * When a scroll operation is requested, we ask for instant, smooth,
 * smooth msd, or normal scrolling.
 *
 * |Smooth| scrolls have a symmetrical acceleration and deceleration curve
 * modeled with a set of splines that guarantee that the destination will be
 * reached over a fixed time interval.  |Smooth| will only be smooth if smooth
 * scrolling is actually enabled.  This behavior is utilized by keyboard and
 * mouse wheel scrolling events.
 *
 * |SmoothMsd| implements a physically based model that approximates the
 * behavior of a mass-spring-damper system.  |SmoothMsd| scrolls have a
 * non-symmetrical acceleration and deceleration curve, can potentially
 * overshoot the destination on intermediate frames, and complete over a
 * variable time interval.  |SmoothMsd| will only be smooth if cssom-view
 * smooth-scrolling is enabled.
 *
 * |Instant| is always synchronous, |Normal| can be asynchronous.
 *
 * If an |Instant| scroll request happens while a |Smooth| or async scroll is
 * already in progress, the async scroll is interrupted and we instantly
 * scroll to the destination.
 *
 * If an |Instant| or |Smooth| scroll request happens while a |SmoothMsd|
 * scroll is already in progress, the |SmoothMsd| scroll is interrupted without
 * first scrolling to the destination.
 */
enum class ScrollMode { Instant, Smooth, SmoothMsd, Normal };

/**
 * When scrolling by a relative amount, we can choose various units.
 */
enum class ScrollUnit { DEVICE_PIXELS, LINES, PAGES, WHOLE };

/**
 * Representing whether there's an on-going animation in APZC and it was
 * triggered by script or by user input.
 */
enum class APZScrollAnimationType {
  No,                   // No animation.
  TriggeredByScript,    // Animation triggered by script.
  TriggeredByUserInput  // Animation triggered by user input.
};

enum class ScrollSnapFlags : uint8_t {
  Disabled = 0,
  // https://drafts.csswg.org/css-scroll-snap/#intended-end-position
  IntendedEndPosition = 1 << 0,
  // https://drafts.csswg.org/css-scroll-snap/#intended-direction
  IntendedDirection = 1 << 1
};

MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(ScrollSnapFlags);

}  // namespace mozilla

#endif  // mozilla_ScrollTypes_h
