summaryrefslogtreecommitdiffstats
path: root/widget/nsNativeBasicTheme.h
diff options
context:
space:
mode:
Diffstat (limited to 'widget/nsNativeBasicTheme.h')
-rw-r--r--widget/nsNativeBasicTheme.h334
1 files changed, 334 insertions, 0 deletions
diff --git a/widget/nsNativeBasicTheme.h b/widget/nsNativeBasicTheme.h
new file mode 100644
index 0000000000..94b3cdc62e
--- /dev/null
+++ b/widget/nsNativeBasicTheme.h
@@ -0,0 +1,334 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * 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 nsNativeBasicTheme_h
+#define nsNativeBasicTheme_h
+
+#include "Units.h"
+#include "mozilla/StaticPrefs_layout.h"
+#include "mozilla/ClearOnShutdown.h"
+#include "mozilla/dom/HTMLMeterElement.h"
+#include "mozilla/dom/HTMLProgressElement.h"
+#include "mozilla/gfx/2D.h"
+#include "mozilla/gfx/Rect.h"
+#include "mozilla/gfx/Types.h"
+#include "nsColorControlFrame.h"
+#include "nsDateTimeControlFrame.h"
+#include "nsDeviceContext.h"
+#include "nsITheme.h"
+#include "nsMeterFrame.h"
+#include "nsNativeTheme.h"
+#include "nsProgressFrame.h"
+#include "nsRangeFrame.h"
+
+namespace mozilla {
+namespace widget {
+
+static const gfx::sRGBColor sColorWhite(gfx::sRGBColor::OpaqueWhite());
+static const gfx::sRGBColor sColorWhiteAlpha50(gfx::sRGBColor::White(0.5f));
+static const gfx::sRGBColor sColorWhiteAlpha80(gfx::sRGBColor::White(0.8f));
+static const gfx::sRGBColor sColorBlack(gfx::sRGBColor::OpaqueBlack());
+
+static const gfx::sRGBColor sColorGrey10(
+ gfx::sRGBColor::UnusualFromARGB(0xffe9e9ed));
+static const gfx::sRGBColor sColorGrey10Alpha50(
+ gfx::sRGBColor::UnusualFromARGB(0x7fe9e9ed));
+static const gfx::sRGBColor sColorGrey20(
+ gfx::sRGBColor::UnusualFromARGB(0xffd0d0d7));
+static const gfx::sRGBColor sColorGrey30(
+ gfx::sRGBColor::UnusualFromARGB(0xffb1b1b9));
+static const gfx::sRGBColor sColorGrey40(
+ gfx::sRGBColor::UnusualFromARGB(0xff8f8f9d));
+static const gfx::sRGBColor sColorGrey40Alpha50(
+ gfx::sRGBColor::UnusualFromARGB(0x7f8f8f9d));
+static const gfx::sRGBColor sColorGrey50(
+ gfx::sRGBColor::UnusualFromARGB(0xff676774));
+static const gfx::sRGBColor sColorGrey50Alpha50(
+ gfx::sRGBColor::UnusualFromARGB(0x7f676774));
+static const gfx::sRGBColor sColorGrey60(
+ gfx::sRGBColor::UnusualFromARGB(0xff484851));
+static const gfx::sRGBColor sColorGrey60Alpha50(
+ gfx::sRGBColor::UnusualFromARGB(0x7f484851));
+
+static const gfx::sRGBColor sColorAccentLight(
+ gfx::sRGBColor::UnusualFromARGB(0x4d008deb));
+static const gfx::sRGBColor sColorAccent(
+ gfx::sRGBColor::UnusualFromARGB(0xff0060df));
+static const gfx::sRGBColor sColorAccentDark(
+ gfx::sRGBColor::UnusualFromARGB(0xff0250bb));
+static const gfx::sRGBColor sColorAccentDarker(
+ gfx::sRGBColor::UnusualFromARGB(0xff054096));
+
+static const gfx::sRGBColor sColorMeterGreen10(
+ gfx::sRGBColor::UnusualFromARGB(0xff00ab60));
+static const gfx::sRGBColor sColorMeterGreen20(
+ gfx::sRGBColor::UnusualFromARGB(0xff056139));
+static const gfx::sRGBColor sColorMeterYellow10(
+ gfx::sRGBColor::UnusualFromARGB(0xffffbd4f));
+static const gfx::sRGBColor sColorMeterYellow20(
+ gfx::sRGBColor::UnusualFromARGB(0xffd2811e));
+static const gfx::sRGBColor sColorMeterRed10(
+ gfx::sRGBColor::UnusualFromARGB(0xffe22850));
+static const gfx::sRGBColor sColorMeterRed20(
+ gfx::sRGBColor::UnusualFromARGB(0xff810220));
+
+static const gfx::sRGBColor sScrollbarColor(
+ gfx::sRGBColor::UnusualFromARGB(0xfff0f0f0));
+static const gfx::sRGBColor sScrollbarBorderColor(gfx::sRGBColor(1.0f, 1.0f,
+ 1.0f));
+static const gfx::sRGBColor sScrollbarThumbColor(
+ gfx::sRGBColor::UnusualFromARGB(0xffcdcdcd));
+static const gfx::sRGBColor sScrollbarThumbColorActive(gfx::sRGBColor(0.375f,
+ 0.375f,
+ 0.375f));
+static const gfx::sRGBColor sScrollbarThumbColorHover(gfx::sRGBColor(0.65f,
+ 0.65f,
+ 0.65f));
+static const gfx::sRGBColor sScrollbarArrowColor(gfx::sRGBColor(0.375f, 0.375f,
+ 0.375f));
+static const gfx::sRGBColor sScrollbarArrowColorActive(gfx::sRGBColor(1.0f,
+ 1.0f,
+ 1.0f));
+static const gfx::sRGBColor sScrollbarArrowColorHover(gfx::sRGBColor(0.0f, 0.0f,
+ 0.0f));
+static const gfx::sRGBColor sScrollbarButtonColor(sScrollbarColor);
+static const gfx::sRGBColor sScrollbarButtonActiveColor(gfx::sRGBColor(0.375f,
+ 0.375f,
+ 0.375f));
+static const gfx::sRGBColor sScrollbarButtonHoverColor(gfx::sRGBColor(0.86f,
+ 0.86f,
+ 0.86f));
+
+static const CSSCoord kMinimumWidgetSize = 14.0f;
+static const CSSCoord kMinimumScrollbarSize = 17.0f;
+static const CSSCoord kMinimumThinScrollbarSize = 6.0f;
+static const CSSCoord kMinimumColorPickerHeight = 32.0f;
+static const CSSCoord kMinimumRangeThumbSize = 20.0f;
+static const CSSCoord kMinimumDropdownArrowButtonWidth = 18.0f;
+static const CSSCoord kMinimumSpinnerButtonWidth = 18.0f;
+static const CSSCoord kMinimumSpinnerButtonHeight = 9.0f;
+static const CSSCoord kButtonBorderWidth = 1.0f;
+static const CSSCoord kMenulistBorderWidth = 1.0f;
+static const CSSCoord kTextFieldBorderWidth = 1.0f;
+static const CSSCoord kSpinnerBorderWidth = 1.0f;
+static const CSSCoord kRangeHeight = 6.0f;
+static const CSSCoord kProgressbarHeight = 6.0f;
+static const CSSCoord kMeterHeight = 12.0f;
+
+// nsCheckboxRadioFrame takes the bottom of the content box as the baseline.
+// This border-width makes its baseline 2px under the bottom, which is nice.
+static const CSSCoord kCheckboxRadioBorderWidth = 2.0f;
+
+} // namespace widget
+} // namespace mozilla
+
+class nsNativeBasicTheme : protected nsNativeTheme, public nsITheme {
+ protected:
+ using sRGBColor = mozilla::gfx::sRGBColor;
+ using CSSCoord = mozilla::CSSCoord;
+ using CSSPoint = mozilla::CSSPoint;
+ using CSSIntCoord = mozilla::CSSIntCoord;
+ using ComputedStyle = mozilla::ComputedStyle;
+ using EventStates = mozilla::EventStates;
+ using DrawTarget = mozilla::gfx::DrawTarget;
+ using Path = mozilla::gfx::Path;
+ using Rect = mozilla::gfx::Rect;
+ using Point = mozilla::gfx::Point;
+ using RectCornerRadii = mozilla::gfx::RectCornerRadii;
+ using LayoutDeviceCoord = mozilla::LayoutDeviceCoord;
+ using LayoutDeviceRect = mozilla::LayoutDeviceRect;
+
+ public:
+ using DPIRatio = mozilla::CSSToLayoutDeviceScale;
+
+ NS_DECL_ISUPPORTS_INHERITED
+
+ // The nsITheme interface.
+ NS_IMETHOD DrawWidgetBackground(gfxContext* aContext, nsIFrame* aFrame,
+ StyleAppearance aAppearance,
+ const nsRect& aRect,
+ const nsRect& aDirtyRect) override;
+ /*bool CreateWebRenderCommandsForWidget(mozilla::wr::DisplayListBuilder&
+ aBuilder, mozilla::wr::IpcResourceUpdateQueue& aResources, const
+ mozilla::layers::StackingContextHelper& aSc,
+ mozilla::layers::RenderRootStateManager*
+ aManager, nsIFrame* aFrame, StyleAppearance aAppearance, const nsRect&
+ aRect) override;*/
+ [[nodiscard]] LayoutDeviceIntMargin GetWidgetBorder(
+ nsDeviceContext* aContext, nsIFrame* aFrame,
+ StyleAppearance aAppearance) override;
+ bool GetWidgetPadding(nsDeviceContext* aContext, nsIFrame* aFrame,
+ StyleAppearance aAppearance,
+ LayoutDeviceIntMargin* aResult) override;
+ bool GetWidgetOverflow(nsDeviceContext* aContext, nsIFrame* aFrame,
+ StyleAppearance aAppearance,
+ nsRect* aOverflowRect) override;
+ NS_IMETHOD GetMinimumWidgetSize(nsPresContext* aPresContext, nsIFrame* aFrame,
+ StyleAppearance aAppearance,
+ mozilla::LayoutDeviceIntSize* aResult,
+ bool* aIsOverridable) override;
+ Transparency GetWidgetTransparency(nsIFrame* aFrame,
+ StyleAppearance aAppearance) override;
+ NS_IMETHOD WidgetStateChanged(nsIFrame* aFrame, StyleAppearance aAppearance,
+ nsAtom* aAttribute, bool* aShouldRepaint,
+ const nsAttrValue* aOldValue) override;
+ NS_IMETHOD ThemeChanged() override;
+ bool WidgetAppearanceDependsOnWindowFocus(
+ StyleAppearance aAppearance) override;
+ /*bool NeedToClearBackgroundBehindWidget(
+ nsIFrame* aFrame, StyleAppearance aAppearance) override;*/
+ ThemeGeometryType ThemeGeometryTypeForWidget(
+ nsIFrame* aFrame, StyleAppearance aAppearance) override;
+ bool ThemeSupportsWidget(nsPresContext* aPresContext, nsIFrame* aFrame,
+ StyleAppearance aAppearance) override;
+ bool WidgetIsContainer(StyleAppearance aAppearance) override;
+ bool ThemeDrawsFocusForWidget(StyleAppearance aAppearance) override;
+ bool ThemeNeedsComboboxDropmarker() override;
+
+ protected:
+ nsNativeBasicTheme() = default;
+ virtual ~nsNativeBasicTheme() = default;
+
+ static DPIRatio GetDPIRatio(nsIFrame* aFrame);
+ static bool IsDateTimeResetButton(nsIFrame* aFrame);
+ static bool IsDateTimeTextField(nsIFrame* aFrame);
+ static bool IsColorPickerButton(nsIFrame* aFrame);
+ static bool IsRootScrollbar(nsIFrame* aFrame);
+ static LayoutDeviceRect FixAspectRatio(const LayoutDeviceRect& aRect);
+
+ virtual std::pair<sRGBColor, sRGBColor> ComputeCheckboxColors(
+ const EventStates& aState, StyleAppearance aAppearance);
+ virtual sRGBColor ComputeCheckmarkColor(const EventStates& aState);
+ virtual std::pair<sRGBColor, sRGBColor> ComputeRadioCheckmarkColors(
+ const EventStates& aState);
+ virtual sRGBColor ComputeBorderColor(const EventStates& aState);
+
+ virtual std::pair<sRGBColor, sRGBColor> ComputeButtonColors(
+ const EventStates& aState, nsIFrame* aFrame = nullptr);
+ virtual std::pair<sRGBColor, sRGBColor> ComputeTextfieldColors(
+ const EventStates& aState);
+ virtual std::pair<sRGBColor, sRGBColor> ComputeRangeProgressColors(
+ const EventStates& aState);
+ virtual std::pair<sRGBColor, sRGBColor> ComputeRangeTrackColors(
+ const EventStates& aState);
+ virtual std::pair<sRGBColor, sRGBColor> ComputeRangeThumbColors(
+ const EventStates& aState);
+ virtual std::pair<sRGBColor, sRGBColor> ComputeProgressColors();
+ virtual std::pair<sRGBColor, sRGBColor> ComputeProgressTrackColors();
+ virtual std::pair<sRGBColor, sRGBColor> ComputeMeterchunkColors(
+ const EventStates& aMeterState);
+ virtual std::pair<sRGBColor, sRGBColor> ComputeMeterTrackColors();
+ virtual sRGBColor ComputeMenulistArrowButtonColor(const EventStates& aState);
+ virtual std::array<sRGBColor, 3> ComputeFocusRectColors();
+ virtual std::pair<sRGBColor, sRGBColor> ComputeScrollbarColors(
+ nsIFrame* aFrame, const ComputedStyle& aStyle,
+ const EventStates& aDocumentState, bool aIsRoot);
+ virtual sRGBColor ComputeScrollbarThumbColor(
+ nsIFrame* aFrame, const ComputedStyle& aStyle,
+ const EventStates& aElementState, const EventStates& aDocumentState);
+ virtual std::array<sRGBColor, 3> ComputeScrollbarButtonColors(
+ nsIFrame* aFrame, StyleAppearance aAppearance,
+ const ComputedStyle& aStyle, const EventStates& aElementState,
+ const EventStates& aDocumentState);
+
+ void PaintRoundedFocusRect(DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect, DPIRatio aDpiRatio,
+ CSSCoord aRadius, CSSCoord aOffset);
+ void PaintRoundedRect(DrawTarget* aDrawTarget, const LayoutDeviceRect& aRect,
+ const sRGBColor& aBackgroundColor,
+ const sRGBColor& aBorderColor, CSSCoord aBorderWidth,
+ RectCornerRadii aDpiAdjustedRadii, DPIRatio aDpiRatio);
+ void PaintRoundedRectWithRadius(DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect,
+ const sRGBColor& aBackgroundColor,
+ const sRGBColor& aBorderColor,
+ CSSCoord aBorderWidth, CSSCoord aRadius,
+ DPIRatio aDpiRatio);
+ void PaintCheckboxControl(DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect,
+ const EventStates& aState, DPIRatio aDpiRatio);
+ void PaintCheckMark(DrawTarget* aDrawTarget, const LayoutDeviceRect& aRect,
+ const EventStates& aState);
+ void PaintIndeterminateMark(DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect,
+ const EventStates& aState);
+ void PaintStrokedEllipse(DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect,
+ const sRGBColor& aBackgroundColor,
+ const sRGBColor& aBorderColor,
+ const CSSCoord aBorderWidth, DPIRatio aDpiRatio);
+ void PaintEllipseShadow(DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect, float aShadowAlpha,
+ const CSSPoint& aShadowOffset,
+ CSSCoord aShadowBlurStdDev, DPIRatio aDpiRatio);
+ void PaintRadioControl(DrawTarget* aDrawTarget, const LayoutDeviceRect& aRect,
+ const EventStates& aState, DPIRatio aDpiRatio);
+ void PaintRadioCheckmark(DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect,
+ const EventStates& aState, DPIRatio aDpiRatio);
+ void PaintTextField(DrawTarget* aDrawTarget, const LayoutDeviceRect& aRect,
+ const EventStates& aState, DPIRatio aDpiRatio);
+ void PaintListbox(DrawTarget* aDrawTarget, const LayoutDeviceRect& aRect,
+ const EventStates& aState, DPIRatio aDpiRatio);
+ void PaintMenulist(DrawTarget* aDrawTarget, const LayoutDeviceRect& aRect,
+ const EventStates& aState, DPIRatio aDpiRatio);
+ void PaintArrow(DrawTarget* aDrawTarget, const LayoutDeviceRect& aRect,
+ const float aArrowPolygonX[], const float aArrowPolygonY[],
+ const int32_t aArrowNumPoints, const sRGBColor aFillColor);
+ void PaintMenulistArrowButton(nsIFrame* aFrame, DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect,
+ const EventStates& aState);
+ void PaintSpinnerButton(nsIFrame* aFrame, DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect,
+ const EventStates& aState,
+ StyleAppearance aAppearance, DPIRatio aDpiRatio);
+ void PaintRange(nsIFrame* aFrame, DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect, const EventStates& aState,
+ DPIRatio aDpiRatio, bool aHorizontal);
+ void PaintProgressBar(DrawTarget* aDrawTarget, const LayoutDeviceRect& aRect,
+ const EventStates& aState, DPIRatio aDpiRatio);
+ void PaintProgresschunk(nsIFrame* aFrame, DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect,
+ const EventStates& aState, DPIRatio aDpiRatio);
+ void PaintMeter(DrawTarget* aDrawTarget, const LayoutDeviceRect& aRect,
+ const EventStates& aState, DPIRatio aDpiRatio);
+ void PaintMeterchunk(nsIFrame* aFrame, DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect, DPIRatio aDpiRatio);
+ void PaintButton(nsIFrame* aFrame, DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect, const EventStates& aState,
+ DPIRatio aDpiRatio);
+
+ virtual void PaintScrollbarThumb(DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect,
+ bool aHorizontal, nsIFrame* aFrame,
+ const ComputedStyle& aStyle,
+ const EventStates& aElementState,
+ const EventStates& aDocumentState,
+ DPIRatio aDpiRatio);
+ virtual void PaintScrollbar(DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect, bool aHorizontal,
+ nsIFrame* aFrame, const ComputedStyle& aStyle,
+ const EventStates& aDocumentState,
+ DPIRatio aDpiRatio, bool aIsRoot);
+ virtual void PaintScrollbarTrack(DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect,
+ bool aHorizontal, nsIFrame* aFrame,
+ const ComputedStyle& aStyle,
+ const EventStates& aDocumentState,
+ DPIRatio aDpiRatio, bool aIsRoot);
+ virtual void PaintScrollCorner(DrawTarget* aDrawTarget,
+ const LayoutDeviceRect& aRect,
+ nsIFrame* aFrame, const ComputedStyle& aStyle,
+ const EventStates& aDocumentState,
+ DPIRatio aDpiRatio, bool aIsRoot);
+ virtual void PaintScrollbarButton(
+ DrawTarget* aDrawTarget, StyleAppearance aAppearance,
+ const LayoutDeviceRect& aRect, nsIFrame* aFrame,
+ const ComputedStyle& aStyle, const EventStates& aElementState,
+ const EventStates& aDocumentState, DPIRatio aDpiRatio);
+};
+
+#endif