Bug 1805294 [wpt PR 37463] - WebKit export of https://bugs.webkit.org/show_bug.cgi...
[gecko.git] / widget / ScrollbarDrawingAndroid.cpp
blob8b1adb3d9b57a2de1c1e45e166610dff3d08a911
1 /* -*- Mode: C++; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "ScrollbarDrawingAndroid.h"
8 #include "nsIFrame.h"
9 #include "nsNativeTheme.h"
10 #include "mozilla/StaticPrefs_widget.h"
12 using namespace mozilla;
13 using namespace mozilla::widget;
15 LayoutDeviceIntSize ScrollbarDrawingAndroid::GetMinimumWidgetSize(
16 nsPresContext* aPresContext, StyleAppearance aAppearance,
17 nsIFrame* aFrame) {
18 MOZ_ASSERT(nsNativeTheme::IsWidgetScrollbarPart(aAppearance));
20 auto sizes =
21 GetScrollbarSizes(aPresContext, StyleScrollbarWidth::Auto, Overlay::Yes);
22 MOZ_ASSERT(sizes.mHorizontal == sizes.mVertical);
24 return LayoutDeviceIntSize{sizes.mHorizontal, sizes.mVertical};
27 auto ScrollbarDrawingAndroid::GetScrollbarSizes(nsPresContext* aPresContext,
28 StyleScrollbarWidth aWidth,
29 Overlay aOverlay)
30 -> ScrollbarSizes {
31 // We force auto-width scrollbars because scrollbars on android are already
32 // thin enough.
33 return ScrollbarDrawing::GetScrollbarSizes(
34 aPresContext, StyleScrollbarWidth::Auto, aOverlay);
37 template <typename PaintBackendData>
38 void ScrollbarDrawingAndroid::DoPaintScrollbarThumb(
39 PaintBackendData& aPaintData, const LayoutDeviceRect& aRect,
40 ScrollbarKind aScrollbarKind, nsIFrame* aFrame, const ComputedStyle& aStyle,
41 const ElementState& aElementState, const DocumentState& aDocumentState,
42 const Colors& aColors, const DPIRatio& aDpiRatio) {
43 // TODO(emilio): Maybe do like macOS and draw a stroke?
44 const auto color = ComputeScrollbarThumbColor(aFrame, aStyle, aElementState,
45 aDocumentState, aColors);
46 const bool horizontal = aScrollbarKind == ScrollbarKind::Horizontal;
48 // Draw the thumb rect centered in the scrollbar.
49 LayoutDeviceRect thumbRect(aRect);
50 if (horizontal) {
51 thumbRect.height *= 0.5f;
52 thumbRect.y += thumbRect.height * 0.5f;
53 } else {
54 thumbRect.width *= 0.5f;
55 thumbRect.x += thumbRect.width * 0.5f;
58 const LayoutDeviceCoord radius =
59 (horizontal ? thumbRect.height : thumbRect.width) / 2.0f;
60 ThemeDrawing::PaintRoundedRectWithRadius(aPaintData, thumbRect, color,
61 sRGBColor::White(0.0f), 0.0f,
62 radius / aDpiRatio, aDpiRatio);
65 bool ScrollbarDrawingAndroid::PaintScrollbarThumb(
66 DrawTarget& aDt, const LayoutDeviceRect& aRect,
67 ScrollbarKind aScrollbarKind, nsIFrame* aFrame, const ComputedStyle& aStyle,
68 const ElementState& aElementState, const DocumentState& aDocumentState,
69 const Colors& aColors, const DPIRatio& aDpiRatio) {
70 DoPaintScrollbarThumb(aDt, aRect, aScrollbarKind, aFrame, aStyle,
71 aElementState, aDocumentState, aColors, aDpiRatio);
72 return true;
75 bool ScrollbarDrawingAndroid::PaintScrollbarThumb(
76 WebRenderBackendData& aWrData, const LayoutDeviceRect& aRect,
77 ScrollbarKind aScrollbarKind, nsIFrame* aFrame, const ComputedStyle& aStyle,
78 const ElementState& aElementState, const DocumentState& aDocumentState,
79 const Colors& aColors, const DPIRatio& aDpiRatio) {
80 DoPaintScrollbarThumb(aWrData, aRect, aScrollbarKind, aFrame, aStyle,
81 aElementState, aDocumentState, aColors, aDpiRatio);
82 return true;
85 void ScrollbarDrawingAndroid::RecomputeScrollbarParams() {
86 uint32_t defaultSize = 6;
87 uint32_t overrideSize =
88 StaticPrefs::widget_non_native_theme_scrollbar_size_override();
89 if (overrideSize > 0) {
90 defaultSize = overrideSize;
92 mHorizontalScrollbarHeight = mVerticalScrollbarWidth = defaultSize;