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/EventStates.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 EventStates
= mozilla::EventStates
;
24 using DrawTarget
= mozilla::gfx::DrawTarget
;
25 using sRGBColor
= mozilla::gfx::sRGBColor
;
26 using Colors
= ThemeColors
;
27 using ScrollbarSizes
= nsITheme::ScrollbarSizes
;
28 using Overlay
= nsITheme::Overlay
;
29 using WebRenderBackendData
= mozilla::widget::WebRenderBackendData
;
32 ScrollbarDrawing() = default;
33 virtual ~ScrollbarDrawing() = default;
35 static DPIRatio
GetDPIRatioForScrollbarPart(nsPresContext
*);
37 static nsIFrame
* GetParentScrollbarFrame(nsIFrame
* aFrame
);
38 static bool IsParentScrollbarRolledOver(nsIFrame
* aFrame
);
39 static bool IsParentScrollbarHoveredOrActive(nsIFrame
* aFrame
);
41 static bool IsScrollbarWidthThin(const ComputedStyle
& aStyle
);
42 static bool IsScrollbarWidthThin(nsIFrame
* aFrame
);
44 virtual ScrollbarSizes
GetScrollbarSizes(nsPresContext
*, StyleScrollbarWidth
,
46 ScrollbarSizes
GetScrollbarSizes(nsPresContext
*, nsIFrame
*);
47 virtual LayoutDeviceIntSize
GetMinimumWidgetSize(nsPresContext
*,
48 StyleAppearance aAppearance
,
49 nsIFrame
* aFrame
) = 0;
50 virtual Maybe
<nsITheme::Transparency
> GetScrollbarPartTransparency(
51 nsIFrame
* aFrame
, StyleAppearance aAppearance
) {
55 bool IsScrollbarTrackOpaque(nsIFrame
*);
56 virtual sRGBColor
ComputeScrollbarTrackColor(
57 nsIFrame
*, const ComputedStyle
&, const EventStates
& aDocumentState
,
59 virtual sRGBColor
ComputeScrollbarThumbColor(
60 nsIFrame
*, const ComputedStyle
&, const EventStates
& aElementState
,
61 const EventStates
& aDocumentState
, const Colors
&);
63 nscolor
GetScrollbarButtonColor(nscolor aTrackColor
, EventStates
);
64 Maybe
<nscolor
> GetScrollbarArrowColor(nscolor aButtonColor
);
66 // Returned colors are button, arrow.
67 virtual std::pair
<sRGBColor
, sRGBColor
> ComputeScrollbarButtonColors(
68 nsIFrame
*, StyleAppearance
, const ComputedStyle
&,
69 const EventStates
& aElementState
, const EventStates
& aDocumentState
,
72 virtual bool PaintScrollbarButton(DrawTarget
&, StyleAppearance
,
73 const LayoutDeviceRect
&, nsIFrame
*,
75 const EventStates
& aElementState
,
76 const EventStates
& aDocumentState
,
77 const Colors
&, const DPIRatio
&);
79 virtual bool PaintScrollbarThumb(DrawTarget
&, const LayoutDeviceRect
&,
80 bool aHorizontal
, nsIFrame
*,
82 const EventStates
& aElementState
,
83 const EventStates
& aDocumentState
,
84 const Colors
&, const DPIRatio
&) = 0;
85 virtual bool PaintScrollbarThumb(WebRenderBackendData
&,
86 const LayoutDeviceRect
&, bool aHorizontal
,
87 nsIFrame
*, const ComputedStyle
&,
88 const EventStates
& aElementState
,
89 const EventStates
& aDocumentState
,
90 const Colors
&, const DPIRatio
&) = 0;
92 template <typename PaintBackendData
>
93 bool DoPaintDefaultScrollbar(PaintBackendData
&, const LayoutDeviceRect
&,
94 bool aHorizontal
, nsIFrame
*,
96 const EventStates
& aElementState
,
97 const EventStates
& aDocumentState
, const Colors
&,
99 virtual bool PaintScrollbar(DrawTarget
&, const LayoutDeviceRect
&,
100 bool aHorizontal
, nsIFrame
*, const ComputedStyle
&,
101 const EventStates
& aElementState
,
102 const EventStates
& aDocumentState
, const Colors
&,
104 virtual bool PaintScrollbar(WebRenderBackendData
&, const LayoutDeviceRect
&,
105 bool aHorizontal
, nsIFrame
*, const ComputedStyle
&,
106 const EventStates
& aElementState
,
107 const EventStates
& aDocumentState
, const Colors
&,
110 virtual bool PaintScrollbarTrack(DrawTarget
&, const LayoutDeviceRect
&,
111 bool aHorizontal
, nsIFrame
*,
112 const ComputedStyle
&,
113 const EventStates
& aDocumentState
,
114 const Colors
&, const DPIRatio
&) {
115 // Draw nothing by default. Subclasses can override this.
118 virtual bool PaintScrollbarTrack(WebRenderBackendData
&,
119 const LayoutDeviceRect
&, bool aHorizontal
,
120 nsIFrame
*, const ComputedStyle
&,
121 const EventStates
& aDocumentState
,
122 const Colors
&, const DPIRatio
&) {
123 // Draw nothing by default. Subclasses can override this.
127 template <typename PaintBackendData
>
128 bool DoPaintDefaultScrollCorner(PaintBackendData
&, const LayoutDeviceRect
&,
129 nsIFrame
*, const ComputedStyle
&,
130 const EventStates
& aDocumentState
,
131 const Colors
&, const DPIRatio
&);
132 virtual bool PaintScrollCorner(DrawTarget
&, const LayoutDeviceRect
&,
133 nsIFrame
*, const ComputedStyle
&,
134 const EventStates
& aDocumentState
,
135 const Colors
&, const DPIRatio
&);
136 virtual bool PaintScrollCorner(WebRenderBackendData
&, const LayoutDeviceRect
&,
137 nsIFrame
*, const ComputedStyle
&,
138 const EventStates
& aDocumentState
,
139 const Colors
&, const DPIRatio
&);
141 virtual void RecomputeScrollbarParams() = 0;
143 virtual bool ShouldDrawScrollbarButtons() { return true; }
145 uint32_t GetHorizontalScrollbarHeight() const {
146 return mHorizontalScrollbarHeight
;
148 uint32_t GetVerticalScrollbarWidth() const { return mVerticalScrollbarWidth
; }
151 uint32_t mHorizontalScrollbarHeight
= 0;
152 uint32_t mVerticalScrollbarWidth
= 0;
155 } // namespace mozilla::widget