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"
14 #include "ThemeColors.h"
15 #include "ThemeDrawing.h"
18 namespace mozilla::widget
{
20 class ScrollbarDrawing
{
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 {
40 explicit ScrollbarDrawing(Kind aKind
) : mKind(aKind
) {}
43 virtual ~ScrollbarDrawing() = default;
45 enum class ScrollbarKind
: uint8_t {
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
,
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
) {
71 bool IsScrollbarTrackOpaque(nsIFrame
*);
72 virtual sRGBColor
ComputeScrollbarTrackColor(nsIFrame
*, const ComputedStyle
&,
75 virtual sRGBColor
ComputeScrollbarThumbColor(nsIFrame
*, const ComputedStyle
&,
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
&,
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
&,
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.
125 virtual bool PaintScrollbarTrack(WebRenderBackendData
&,
126 const LayoutDeviceRect
&, ScrollbarKind
,
127 nsIFrame
*, const ComputedStyle
&,
128 const DocumentState
&, const Colors
&,
130 // Draw nothing by default. Subclasses can override this.
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
&,
143 virtual bool PaintScrollCorner(WebRenderBackendData
&, const LayoutDeviceRect
&,
144 ScrollbarKind
, nsIFrame
*, const ComputedStyle
&,
145 const DocumentState
&, const Colors
&,
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
; }
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.
161 uint32_t mHorizontalScrollbarHeight
= 0;
162 uint32_t mVerticalScrollbarWidth
= 0;
165 } // namespace mozilla::widget