Bug 1754698 - add environment variables to interactive tasks. r=releng-reviewers...
[gecko.git] / widget / ScrollbarDrawing.h
blobdc15249e4798badbbc1edf2febd5813f5726525a
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"
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 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;
31 public:
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,
45 Overlay);
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) {
52 return Nothing();
55 bool IsScrollbarTrackOpaque(nsIFrame*);
56 virtual sRGBColor ComputeScrollbarTrackColor(
57 nsIFrame*, const ComputedStyle&, const EventStates& aDocumentState,
58 const Colors&);
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,
70 const Colors&);
72 virtual bool PaintScrollbarButton(DrawTarget&, StyleAppearance,
73 const LayoutDeviceRect&, nsIFrame*,
74 const ComputedStyle&,
75 const EventStates& aElementState,
76 const EventStates& aDocumentState,
77 const Colors&, const DPIRatio&);
79 virtual bool PaintScrollbarThumb(DrawTarget&, const LayoutDeviceRect&,
80 bool aHorizontal, nsIFrame*,
81 const ComputedStyle&,
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*,
95 const ComputedStyle&,
96 const EventStates& aElementState,
97 const EventStates& aDocumentState, const Colors&,
98 const DPIRatio&);
99 virtual bool PaintScrollbar(DrawTarget&, const LayoutDeviceRect&,
100 bool aHorizontal, nsIFrame*, const ComputedStyle&,
101 const EventStates& aElementState,
102 const EventStates& aDocumentState, const Colors&,
103 const DPIRatio&);
104 virtual bool PaintScrollbar(WebRenderBackendData&, const LayoutDeviceRect&,
105 bool aHorizontal, nsIFrame*, const ComputedStyle&,
106 const EventStates& aElementState,
107 const EventStates& aDocumentState, const Colors&,
108 const DPIRatio&);
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.
116 return true;
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.
124 return true;
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; }
150 protected:
151 uint32_t mHorizontalScrollbarHeight = 0;
152 uint32_t mVerticalScrollbarWidth = 0;
155 } // namespace mozilla::widget
157 #endif