File: ScrollbarDrawing.h

package info (click to toggle)
firefox 146.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,653,260 kB
  • sloc: cpp: 7,587,892; javascript: 6,509,455; ansic: 3,755,295; python: 1,410,813; xml: 629,201; asm: 438,677; java: 186,096; sh: 62,697; makefile: 18,086; objc: 13,087; perl: 12,811; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10; exp: 6
file content (152 lines) | stat: -rw-r--r-- 6,310 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/* -*- 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"

class nsScrollbarFrame;

namespace mozilla::widget {

class ScrollbarDrawing {
 protected:
  using DPIRatio = mozilla::CSSToLayoutDeviceScale;
  using ElementState = dom::ElementState;
  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 nsScrollbarFrame* GetParentScrollbarFrame(nsIFrame* aFrame);
  static bool IsParentScrollbarRolledOver(nsIFrame* aFrame);
  static bool IsParentScrollbarHoveredOrActive(nsIFrame* aFrame);

  static bool IsScrollbarWidthThin(const ComputedStyle& aStyle);

  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 Colors&);
  virtual sRGBColor ComputeScrollbarThumbColor(nsIFrame*, const ComputedStyle&,
                                               const ElementState&,
                                               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 Colors&);

  virtual bool PaintScrollbarButton(DrawTarget&, StyleAppearance,
                                    const LayoutDeviceRect&, ScrollbarKind,
                                    nsIFrame*, const ComputedStyle&,
                                    const ElementState&, const Colors&,
                                    const DPIRatio&);

  virtual bool PaintScrollbarThumb(DrawTarget&, const LayoutDeviceRect&,
                                   ScrollbarKind, nsIFrame*,
                                   const ComputedStyle&, const ElementState&,
                                   const Colors&, const DPIRatio&) = 0;
  virtual bool PaintScrollbarThumb(WebRenderBackendData&,
                                   const LayoutDeviceRect&, ScrollbarKind,
                                   nsIFrame*, const ComputedStyle&,
                                   const ElementState&, const Colors&,
                                   const DPIRatio&) = 0;

  template <typename PaintBackendData>
  bool DoPaintDefaultScrollbar(PaintBackendData&, const LayoutDeviceRect&,
                               ScrollbarKind, nsIFrame*, const ComputedStyle&,
                               const ElementState&, const Colors&,
                               const DPIRatio&);
  virtual bool PaintScrollbar(DrawTarget&, const LayoutDeviceRect&,
                              ScrollbarKind, nsIFrame*, const ComputedStyle&,
                              const ElementState&, const Colors&,
                              const DPIRatio&);
  virtual bool PaintScrollbar(WebRenderBackendData&, const LayoutDeviceRect&,
                              ScrollbarKind, nsIFrame*, const ComputedStyle&,
                              const ElementState&, const Colors&,
                              const DPIRatio&);

  template <typename PaintBackendData>
  bool DoPaintDefaultScrollCorner(PaintBackendData&, const LayoutDeviceRect&,
                                  ScrollbarKind, nsIFrame*,
                                  const ComputedStyle&, const Colors&,
                                  const DPIRatio&);
  virtual bool PaintScrollCorner(DrawTarget&, const LayoutDeviceRect&,
                                 ScrollbarKind, nsIFrame*, const ComputedStyle&,
                                 const Colors&, const DPIRatio&);
  virtual bool PaintScrollCorner(WebRenderBackendData&, const LayoutDeviceRect&,
                                 ScrollbarKind, nsIFrame*, const ComputedStyle&,
                                 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