summaryrefslogtreecommitdiffstats
path: root/widget/ScrollbarDrawing.h
diff options
context:
space:
mode:
Diffstat (limited to 'widget/ScrollbarDrawing.h')
-rw-r--r--widget/ScrollbarDrawing.h172
1 files changed, 172 insertions, 0 deletions
diff --git a/widget/ScrollbarDrawing.h b/widget/ScrollbarDrawing.h
new file mode 100644
index 0000000000..656822aeed
--- /dev/null
+++ b/widget/ScrollbarDrawing.h
@@ -0,0 +1,172 @@
+/* -*- 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_widget_ScrollbarDrawing_h
+#define mozilla_widget_ScrollbarDrawing_h
+
+#include "mozilla/dom/RustTypes.h"
+#include "mozilla/gfx/2D.h"
+#include "nsColor.h"
+#include "nsITheme.h"
+#include "ThemeColors.h"
+#include "ThemeDrawing.h"
+#include "Units.h"
+
+namespace mozilla::widget {
+
+class ScrollbarDrawing {
+ protected:
+ using DPIRatio = mozilla::CSSToLayoutDeviceScale;
+ using ElementState = dom::ElementState;
+ using DocumentState = dom::DocumentState;
+ using DrawTarget = mozilla::gfx::DrawTarget;
+ using sRGBColor = mozilla::gfx::sRGBColor;
+ using Colors = ThemeColors;
+ using Overlay = nsITheme::Overlay;
+ using WebRenderBackendData = mozilla::widget::WebRenderBackendData;
+
+ enum class Kind : uint8_t {
+ Android,
+ Cocoa,
+ Gtk,
+ Win10,
+ Win11,
+ };
+
+ explicit ScrollbarDrawing(Kind aKind) : mKind(aKind) {}
+
+ public:
+ virtual ~ScrollbarDrawing() = default;
+
+ enum class ScrollbarKind : uint8_t {
+ Horizontal,
+ VerticalLeft,
+ VerticalRight,
+ };
+
+ DPIRatio GetDPIRatioForScrollbarPart(const nsPresContext*);
+
+ static nsIFrame* GetParentScrollbarFrame(nsIFrame* aFrame);
+ static bool IsParentScrollbarRolledOver(nsIFrame* aFrame);
+ static bool IsParentScrollbarHoveredOrActive(nsIFrame* aFrame);
+
+ static bool IsScrollbarWidthThin(const ComputedStyle& aStyle);
+ static bool IsScrollbarWidthThin(nsIFrame* aFrame);
+
+ CSSIntCoord GetCSSScrollbarSize(StyleScrollbarWidth, Overlay) const;
+ LayoutDeviceIntCoord GetScrollbarSize(const nsPresContext*,
+ StyleScrollbarWidth, Overlay);
+ LayoutDeviceIntCoord GetScrollbarSize(const nsPresContext*, nsIFrame*);
+
+ virtual LayoutDeviceIntSize GetMinimumWidgetSize(nsPresContext*,
+ StyleAppearance aAppearance,
+ nsIFrame* aFrame) = 0;
+ virtual Maybe<nsITheme::Transparency> GetScrollbarPartTransparency(
+ nsIFrame* aFrame, StyleAppearance aAppearance) {
+ return Nothing();
+ }
+
+ bool IsScrollbarTrackOpaque(nsIFrame*);
+ virtual sRGBColor ComputeScrollbarTrackColor(nsIFrame*, const ComputedStyle&,
+ const DocumentState&,
+ const Colors&);
+ virtual sRGBColor ComputeScrollbarThumbColor(nsIFrame*, const ComputedStyle&,
+ const ElementState&,
+ const DocumentState&,
+ const Colors&);
+
+ nscolor GetScrollbarButtonColor(nscolor aTrackColor, ElementState);
+ Maybe<nscolor> GetScrollbarArrowColor(nscolor aButtonColor);
+
+ // Returned colors are button, arrow.
+ virtual std::pair<sRGBColor, sRGBColor> ComputeScrollbarButtonColors(
+ nsIFrame*, StyleAppearance, const ComputedStyle&, const ElementState&,
+ const DocumentState&, const Colors&);
+
+ virtual bool PaintScrollbarButton(DrawTarget&, StyleAppearance,
+ const LayoutDeviceRect&, ScrollbarKind,
+ nsIFrame*, const ComputedStyle&,
+ const ElementState&, const DocumentState&,
+ const Colors&, const DPIRatio&);
+
+ virtual bool PaintScrollbarThumb(DrawTarget&, const LayoutDeviceRect&,
+ ScrollbarKind, nsIFrame*,
+ const ComputedStyle&, const ElementState&,
+ const DocumentState&, const Colors&,
+ const DPIRatio&) = 0;
+ virtual bool PaintScrollbarThumb(WebRenderBackendData&,
+ const LayoutDeviceRect&, ScrollbarKind,
+ nsIFrame*, const ComputedStyle&,
+ const ElementState&, const DocumentState&,
+ const Colors&, const DPIRatio&) = 0;
+
+ template <typename PaintBackendData>
+ bool DoPaintDefaultScrollbar(PaintBackendData&, const LayoutDeviceRect&,
+ ScrollbarKind, nsIFrame*, const ComputedStyle&,
+ const ElementState&, const DocumentState&,
+ const Colors&, const DPIRatio&);
+ bool PaintScrollbar(DrawTarget&, const LayoutDeviceRect&, ScrollbarKind,
+ nsIFrame*, const ComputedStyle&, const ElementState&,
+ const DocumentState&, const Colors&, const DPIRatio&);
+ bool PaintScrollbar(WebRenderBackendData&, const LayoutDeviceRect&,
+ ScrollbarKind, nsIFrame*, const ComputedStyle&,
+ const ElementState&, const DocumentState&, const Colors&,
+ const DPIRatio&);
+
+ virtual bool PaintScrollbarTrack(DrawTarget&, const LayoutDeviceRect&,
+ ScrollbarKind, nsIFrame*,
+ const ComputedStyle&, const DocumentState&,
+ const Colors&, const DPIRatio&) {
+ // Draw nothing by default. Subclasses can override this.
+ return true;
+ }
+ virtual bool PaintScrollbarTrack(WebRenderBackendData&,
+ const LayoutDeviceRect&, ScrollbarKind,
+ nsIFrame*, const ComputedStyle&,
+ const DocumentState&, const Colors&,
+ const DPIRatio&) {
+ // Draw nothing by default. Subclasses can override this.
+ return true;
+ }
+
+ template <typename PaintBackendData>
+ bool DoPaintDefaultScrollCorner(PaintBackendData&, const LayoutDeviceRect&,
+ ScrollbarKind, nsIFrame*,
+ const ComputedStyle&, const DocumentState&,
+ const Colors&, const DPIRatio&);
+ virtual bool PaintScrollCorner(DrawTarget&, const LayoutDeviceRect&,
+ ScrollbarKind, nsIFrame*, const ComputedStyle&,
+ const DocumentState&, const Colors&,
+ const DPIRatio&);
+ virtual bool PaintScrollCorner(WebRenderBackendData&, const LayoutDeviceRect&,
+ ScrollbarKind, nsIFrame*, const ComputedStyle&,
+ const DocumentState&, const Colors&,
+ const DPIRatio&);
+
+ virtual void RecomputeScrollbarParams() = 0;
+
+ virtual bool ShouldDrawScrollbarButtons() { return true; }
+
+ private:
+ // The scrollbar sizes for all our scrollbars. Indices are overlay or not,
+ // then thin or not. Should be configured via ConfigureScrollbarSize.
+ CSSIntCoord mScrollbarSize[2][2]{};
+
+ protected:
+ // For some kind of style differences a full virtual method is overkill, so we
+ // store the kind here so we can branch on it if necessary.
+ Kind mKind;
+
+ // Configures the scrollbar sizes based on a single size.
+ void ConfigureScrollbarSize(CSSIntCoord);
+
+ // Configures a particular scrollbar size.
+ void ConfigureScrollbarSize(StyleScrollbarWidth, Overlay, CSSIntCoord);
+};
+
+} // namespace mozilla::widget
+
+#endif