/* -*- 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 ComputeCheckboxColors( const EventStates& aState, StyleAppearance aAppearance); virtual sRGBColor ComputeCheckmarkColor(const EventStates& aState); virtual std::pair ComputeRadioCheckmarkColors( const EventStates& aState); virtual sRGBColor ComputeBorderColor(const EventStates& aState); virtual std::pair ComputeButtonColors( const EventStates& aState, nsIFrame* aFrame = nullptr); virtual std::pair ComputeTextfieldColors( const EventStates& aState); virtual std::pair ComputeRangeProgressColors( const EventStates& aState); virtual std::pair ComputeRangeTrackColors( const EventStates& aState); virtual std::pair ComputeRangeThumbColors( const EventStates& aState); virtual std::pair ComputeProgressColors(); virtual std::pair ComputeProgressTrackColors(); virtual std::pair ComputeMeterchunkColors( const EventStates& aMeterState); virtual std::pair ComputeMeterTrackColors(); virtual sRGBColor ComputeMenulistArrowButtonColor(const EventStates& aState); virtual std::array ComputeFocusRectColors(); virtual std::pair 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 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