Bug 1805294 [wpt PR 37463] - WebKit export of https://bugs.webkit.org/show_bug.cgi...
[gecko.git] / widget / ScrollbarDrawing.h
blobfa653d8b22f66c1813545ff57630162f1ca8ab02
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef mozilla_widget_ScrollbarDrawing_h
8 #define mozilla_widget_ScrollbarDrawing_h
10 #include "mozilla/dom/RustTypes.h"
11 #include "mozilla/gfx/2D.h"
12 #include "nsColor.h"
13 #include "nsITheme.h"
14 #include "ThemeColors.h"
15 #include "ThemeDrawing.h"
16 #include "Units.h"
18 namespace mozilla::widget {
20 class ScrollbarDrawing {
21 protected:
22 using DPIRatio = mozilla::CSSToLayoutDeviceScale;
23 using ElementState = dom::ElementState;
24 using DocumentState = dom::DocumentState;
25 using DrawTarget = mozilla::gfx::DrawTarget;
26 using sRGBColor = mozilla::gfx::sRGBColor;
27 using Colors = ThemeColors;
28 using ScrollbarSizes = nsITheme::ScrollbarSizes;
29 using Overlay = nsITheme::Overlay;
30 using WebRenderBackendData = mozilla::widget::WebRenderBackendData;
32 enum class Kind : uint8_t {
33 Android,
34 Cocoa,
35 Gtk,
36 Win10,
37 Win11,
40 explicit ScrollbarDrawing(Kind aKind) : mKind(aKind) {}
42 public:
43 virtual ~ScrollbarDrawing() = default;
45 enum class ScrollbarKind : uint8_t {
46 Horizontal,
47 VerticalLeft,
48 VerticalRight,
51 static DPIRatio GetDPIRatioForScrollbarPart(nsPresContext*);
53 static nsIFrame* GetParentScrollbarFrame(nsIFrame* aFrame);
54 static bool IsParentScrollbarRolledOver(nsIFrame* aFrame);
55 static bool IsParentScrollbarHoveredOrActive(nsIFrame* aFrame);
57 static bool IsScrollbarWidthThin(const ComputedStyle& aStyle);
58 static bool IsScrollbarWidthThin(nsIFrame* aFrame);
60 virtual ScrollbarSizes GetScrollbarSizes(nsPresContext*, StyleScrollbarWidth,
61 Overlay);
62 ScrollbarSizes GetScrollbarSizes(nsPresContext*, nsIFrame*);
63 virtual LayoutDeviceIntSize GetMinimumWidgetSize(nsPresContext*,
64 StyleAppearance aAppearance,
65 nsIFrame* aFrame) = 0;
66 virtual Maybe<nsITheme::Transparency> GetScrollbarPartTransparency(
67 nsIFrame* aFrame, StyleAppearance aAppearance) {
68 return Nothing();
71 bool IsScrollbarTrackOpaque(nsIFrame*);
72 virtual sRGBColor ComputeScrollbarTrackColor(nsIFrame*, const ComputedStyle&,
73 const DocumentState&,
74 const Colors&);
75 virtual sRGBColor ComputeScrollbarThumbColor(nsIFrame*, const ComputedStyle&,
76 const ElementState&,
77 const DocumentState&,
78 const Colors&);
80 nscolor GetScrollbarButtonColor(nscolor aTrackColor, ElementState);
81 Maybe<nscolor> GetScrollbarArrowColor(nscolor aButtonColor);
83 // Returned colors are button, arrow.
84 virtual std::pair<sRGBColor, sRGBColor> ComputeScrollbarButtonColors(
85 nsIFrame*, StyleAppearance, const ComputedStyle&, const ElementState&,
86 const DocumentState&, const Colors&);
88 virtual bool PaintScrollbarButton(DrawTarget&, StyleAppearance,
89 const LayoutDeviceRect&, ScrollbarKind,
90 nsIFrame*, const ComputedStyle&,
91 const ElementState&, const DocumentState&,
92 const Colors&, const DPIRatio&);
94 virtual bool PaintScrollbarThumb(DrawTarget&, const LayoutDeviceRect&,
95 ScrollbarKind, nsIFrame*,
96 const ComputedStyle&, const ElementState&,
97 const DocumentState&, const Colors&,
98 const DPIRatio&) = 0;
99 virtual bool PaintScrollbarThumb(WebRenderBackendData&,
100 const LayoutDeviceRect&, ScrollbarKind,
101 nsIFrame*, const ComputedStyle&,
102 const ElementState&, const DocumentState&,
103 const Colors&, const DPIRatio&) = 0;
105 template <typename PaintBackendData>
106 bool DoPaintDefaultScrollbar(PaintBackendData&, const LayoutDeviceRect&,
107 ScrollbarKind, nsIFrame*, const ComputedStyle&,
108 const ElementState&, const DocumentState&,
109 const Colors&, const DPIRatio&);
110 bool PaintScrollbar(DrawTarget&, const LayoutDeviceRect&, ScrollbarKind,
111 nsIFrame*, const ComputedStyle&, const ElementState&,
112 const DocumentState&, const Colors&, const DPIRatio&);
113 bool PaintScrollbar(WebRenderBackendData&, const LayoutDeviceRect&,
114 ScrollbarKind, nsIFrame*, const ComputedStyle&,
115 const ElementState&, const DocumentState&, const Colors&,
116 const DPIRatio&);
118 virtual bool PaintScrollbarTrack(DrawTarget&, const LayoutDeviceRect&,
119 ScrollbarKind, nsIFrame*,
120 const ComputedStyle&, const DocumentState&,
121 const Colors&, const DPIRatio&) {
122 // Draw nothing by default. Subclasses can override this.
123 return true;
125 virtual bool PaintScrollbarTrack(WebRenderBackendData&,
126 const LayoutDeviceRect&, ScrollbarKind,
127 nsIFrame*, const ComputedStyle&,
128 const DocumentState&, const Colors&,
129 const DPIRatio&) {
130 // Draw nothing by default. Subclasses can override this.
131 return true;
134 template <typename PaintBackendData>
135 bool DoPaintDefaultScrollCorner(PaintBackendData&, const LayoutDeviceRect&,
136 ScrollbarKind, nsIFrame*,
137 const ComputedStyle&, const DocumentState&,
138 const Colors&, const DPIRatio&);
139 virtual bool PaintScrollCorner(DrawTarget&, const LayoutDeviceRect&,
140 ScrollbarKind, nsIFrame*, const ComputedStyle&,
141 const DocumentState&, const Colors&,
142 const DPIRatio&);
143 virtual bool PaintScrollCorner(WebRenderBackendData&, const LayoutDeviceRect&,
144 ScrollbarKind, nsIFrame*, const ComputedStyle&,
145 const DocumentState&, const Colors&,
146 const DPIRatio&);
148 virtual void RecomputeScrollbarParams() = 0;
150 virtual bool ShouldDrawScrollbarButtons() { return true; }
152 uint32_t GetHorizontalScrollbarHeight() const {
153 return mHorizontalScrollbarHeight;
155 uint32_t GetVerticalScrollbarWidth() const { return mVerticalScrollbarWidth; }
157 protected:
158 // For some kind of style differences a full virtual method is overkill, so we
159 // store the kind here so we can branch on it if necessary.
160 Kind mKind;
161 uint32_t mHorizontalScrollbarHeight = 0;
162 uint32_t mVerticalScrollbarWidth = 0;
165 } // namespace mozilla::widget
167 #endif