summaryrefslogtreecommitdiffstats
path: root/gfx/layers/ScrollbarData.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/layers/ScrollbarData.h')
-rw-r--r--gfx/layers/ScrollbarData.h137
1 files changed, 137 insertions, 0 deletions
diff --git a/gfx/layers/ScrollbarData.h b/gfx/layers/ScrollbarData.h
new file mode 100644
index 0000000000..bbbf6c276a
--- /dev/null
+++ b/gfx/layers/ScrollbarData.h
@@ -0,0 +1,137 @@
+/* -*- 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/. */
+
+#ifndef mozilla_gfx_layers_ScrollbarData_h
+#define mozilla_gfx_layers_ScrollbarData_h
+
+#include "FrameMetrics.h"
+#include "mozilla/Maybe.h"
+#include "mozilla/gfx/Types.h"
+#include "mozilla/layers/LayersTypes.h"
+#include "mozilla/layers/ScrollableLayerGuid.h"
+
+namespace IPC {
+template <typename T>
+struct ParamTraits;
+} // namespace IPC
+
+namespace mozilla {
+namespace layers {
+
+// clang-format off
+MOZ_DEFINE_ENUM_CLASS_WITH_BASE(ScrollbarLayerType, uint8_t, (
+ None,
+ Thumb,
+ Container
+));
+// clang-format on
+
+/**
+ * It stores data for scroll thumb layer or container layers.
+ */
+struct ScrollbarData {
+ private:
+ /**
+ * This constructor is for Thumb layer type.
+ */
+ ScrollbarData(ScrollDirection aDirection, float aThumbRatio,
+ CSSCoord aThumbStart, CSSCoord aThumbLength,
+ bool aThumbIsAsyncDraggable, CSSCoord aScrollTrackStart,
+ CSSCoord aScrollTrackLength, uint64_t aTargetViewId)
+ : mDirection(Some(aDirection)),
+ mScrollbarLayerType(ScrollbarLayerType::Thumb),
+ mThumbRatio(aThumbRatio),
+ mThumbStart(aThumbStart),
+ mThumbLength(aThumbLength),
+ mThumbIsAsyncDraggable(aThumbIsAsyncDraggable),
+ mScrollTrackStart(aScrollTrackStart),
+ mScrollTrackLength(aScrollTrackLength),
+ mTargetViewId(aTargetViewId) {}
+
+ /**
+ * This constructor is for Container layer type.
+ */
+ ScrollbarData(const Maybe<ScrollDirection>& aDirection,
+ uint64_t aTargetViewId)
+ : mDirection(aDirection),
+ mScrollbarLayerType(ScrollbarLayerType::Container),
+ mTargetViewId(aTargetViewId) {}
+
+ public:
+ ScrollbarData() = default;
+
+ static ScrollbarData CreateForThumb(ScrollDirection aDirection,
+ float aThumbRatio, CSSCoord aThumbStart,
+ CSSCoord aThumbLength,
+ bool aThumbIsAsyncDraggable,
+ CSSCoord aScrollTrackStart,
+ CSSCoord aScrollTrackLength,
+ uint64_t aTargetViewId) {
+ return ScrollbarData(aDirection, aThumbRatio, aThumbStart, aThumbLength,
+ aThumbIsAsyncDraggable, aScrollTrackStart,
+ aScrollTrackLength, aTargetViewId);
+ }
+
+ static ScrollbarData CreateForScrollbarContainer(
+ const Maybe<ScrollDirection>& aDirection, uint64_t aTargetViewId) {
+ return ScrollbarData(aDirection, aTargetViewId);
+ }
+
+ /**
+ * The mDirection contains a direction if mScrollbarLayerType is Thumb
+ * or Container, otherwise it's empty.
+ */
+ Maybe<ScrollDirection> mDirection;
+
+ /**
+ * Indicate what kind of layer this data is for. All possibilities are defined
+ * in enum ScrollbarLayerType
+ */
+ ScrollbarLayerType mScrollbarLayerType = ScrollbarLayerType::None;
+
+ /**
+ * The scrollbar thumb ratio is the ratio of the thumb position (in the CSS
+ * pixels of the scrollframe's parent's space) to the scroll position (in the
+ * CSS pixels of the scrollframe's space).
+ */
+ float mThumbRatio = 0.0f;
+
+ CSSCoord mThumbStart;
+ CSSCoord mThumbLength;
+
+ /**
+ * Whether the scrollbar thumb can be dragged asynchronously.
+ */
+ bool mThumbIsAsyncDraggable = false;
+
+ CSSCoord mScrollTrackStart;
+ CSSCoord mScrollTrackLength;
+ uint64_t mTargetViewId = ScrollableLayerGuid::NULL_SCROLL_ID;
+
+ bool operator==(const ScrollbarData& aOther) const {
+ return mDirection == aOther.mDirection &&
+ mScrollbarLayerType == aOther.mScrollbarLayerType &&
+ mThumbRatio == aOther.mThumbRatio &&
+ mThumbStart == aOther.mThumbStart &&
+ mThumbLength == aOther.mThumbLength &&
+ mThumbIsAsyncDraggable == aOther.mThumbIsAsyncDraggable &&
+ mScrollTrackStart == aOther.mScrollTrackStart &&
+ mScrollTrackLength == aOther.mScrollTrackLength &&
+ mTargetViewId == aOther.mTargetViewId;
+ }
+ bool operator!=(const ScrollbarData& aOther) const {
+ return !(*this == aOther);
+ }
+
+ bool IsThumb() const {
+ return mScrollbarLayerType == ScrollbarLayerType::Thumb;
+ }
+};
+
+} // namespace layers
+} // namespace mozilla
+
+#endif // mozilla_gfx_layers_ScrollbarData_h