Bug 1464722 part 1 - Move functions related to custom scrollbars into nsNativeTheme. r?jimm
MozReview-Commit-ID: 4URdu5Tj5dg
--- a/widget/nsNativeTheme.cpp
+++ b/widget/nsNativeTheme.cpp
@@ -804,8 +804,76 @@ nsNativeTheme::IsDarkBackground(nsIFrame
// Consider the background color dark if the sum of the r, g and b values is
// less than 384 in a semi-transparent document. This heuristic matches what
// WebKit does, and we can improve it later if needed.
return NS_GET_A(bgColor) > 127 &&
NS_GET_R(bgColor) + NS_GET_G(bgColor) + NS_GET_B(bgColor) < 384;
}
return false;
}
+
+bool
+nsNativeTheme::IsWidgetScrollbarPart(uint8_t aWidgetType)
+{
+ switch (aWidgetType) {
+ case NS_THEME_SCROLLBAR:
+ case NS_THEME_SCROLLBAR_SMALL:
+ case NS_THEME_SCROLLBAR_VERTICAL:
+ case NS_THEME_SCROLLBAR_HORIZONTAL:
+ case NS_THEME_SCROLLBARBUTTON_UP:
+ case NS_THEME_SCROLLBARBUTTON_DOWN:
+ case NS_THEME_SCROLLBARBUTTON_LEFT:
+ case NS_THEME_SCROLLBARBUTTON_RIGHT:
+ case NS_THEME_SCROLLBARTHUMB_VERTICAL:
+ case NS_THEME_SCROLLBARTHUMB_HORIZONTAL:
+ case NS_THEME_SCROLLCORNER:
+ return true;
+ default:
+ return false;
+ }
+}
+
+static nscolor
+GetOpaqueBackgroundColor(ComputedStyle* aStyle)
+{
+ nscolor color = aStyle->StyleBackground()->BackgroundColor(aStyle);
+ if (NS_GET_A(color) == 255) {
+ return color;
+ }
+ // Compose white background with the background color.
+ return NS_ComposeColors(NS_RGB(255, 255, 255), color);
+}
+
+nscolor
+nsNativeTheme::GetScrollbarFaceColor(ComputedStyle* aStyle,
+ AutoColorGetter aAutoGetter)
+{
+ StyleComplexColor complexColor =
+ aStyle->StyleUserInterface()->mScrollbarFaceColor;
+ if (complexColor.IsAuto()) {
+ return aAutoGetter(aStyle);
+ }
+ nscolor color = complexColor.CalcColor(aStyle);
+ if (NS_GET_A(color) == 255) {
+ return color;
+ }
+ nscolor bgColor = GetOpaqueBackgroundColor(aStyle);
+ return NS_ComposeColors(bgColor, color);
+}
+
+nscolor
+nsNativeTheme::GetScrollbarTrackColor(ComputedStyle* aStyle,
+ AutoColorGetter aAutoGetter)
+{
+ StyleComplexColor complexColor =
+ aStyle->StyleUserInterface()->mScrollbarTrackColor;
+ nscolor color;
+ if (complexColor.IsAuto()) {
+ color = aAutoGetter(aStyle);
+ } else {
+ color = complexColor.CalcColor(aStyle);
+ }
+ if (NS_GET_A(color) == 255) {
+ return color;
+ }
+ nscolor bgColor = GetOpaqueBackgroundColor(aStyle);
+ return NS_ComposeColors(bgColor, color);
+}
--- a/widget/nsNativeTheme.h
+++ b/widget/nsNativeTheme.h
@@ -20,16 +20,17 @@
#include "nsITimer.h"
#include "nsIContent.h"
class nsIFrame;
class nsIPresShell;
class nsPresContext;
namespace mozilla {
+class ComputedStyle;
class EventStates;
} // namespace mozilla
class nsNativeTheme : public nsITimerCallback, public nsINamed
{
protected:
virtual ~nsNativeTheme() {}
@@ -179,16 +180,23 @@ class nsNativeTheme : public nsITimerCal
nsIFrame* GetAdjacentSiblingFrameWithSameAppearance(nsIFrame* aFrame,
bool aNextSibling);
bool IsRangeHorizontal(nsIFrame* aFrame);
// scrollbar
bool IsDarkBackground(nsIFrame* aFrame);
+ // custom scrollbar
+ typedef nscolor (*AutoColorGetter)(mozilla::ComputedStyle*);
+ bool IsWidgetScrollbarPart(uint8_t aWidgetType);
+ nscolor GetScrollbarFaceColor(mozilla::ComputedStyle* aStyle,
+ AutoColorGetter aAutoGetter);
+ nscolor GetScrollbarTrackColor(mozilla::ComputedStyle* aStyle,
+ AutoColorGetter aAutoGetter);
private:
uint32_t mAnimatedContentTimeout;
nsCOMPtr<nsITimer> mAnimatedContentTimer;
AutoTArray<nsCOMPtr<nsIContent>, 20> mAnimatedContentList;
};
#endif // _NSNATIVETHEME_H_
--- a/widget/windows/nsNativeThemeWin.cpp
+++ b/widget/windows/nsNativeThemeWin.cpp
@@ -1521,37 +1521,16 @@ GetThemeDpiScaleFactor(nsIFrame* aFrame)
if (rootWidget) {
double systemScale = WinUtils::SystemScaleFactor();
return rootWidget->GetDefaultScale().scale / systemScale;
}
}
return 1.0;
}
-static bool
-IsWidgetScrollbarPart(uint8_t aWidgetType)
-{
- switch (aWidgetType) {
- case NS_THEME_SCROLLBAR:
- case NS_THEME_SCROLLBAR_SMALL:
- case NS_THEME_SCROLLBAR_VERTICAL:
- case NS_THEME_SCROLLBAR_HORIZONTAL:
- case NS_THEME_SCROLLBARBUTTON_UP:
- case NS_THEME_SCROLLBARBUTTON_DOWN:
- case NS_THEME_SCROLLBARBUTTON_LEFT:
- case NS_THEME_SCROLLBARBUTTON_RIGHT:
- case NS_THEME_SCROLLBARTHUMB_VERTICAL:
- case NS_THEME_SCROLLBARTHUMB_HORIZONTAL:
- case NS_THEME_SCROLLCORNER:
- return true;
- default:
- return false;
- }
-}
-
NS_IMETHODIMP
nsNativeThemeWin::DrawWidgetBackground(gfxContext* aContext,
nsIFrame* aFrame,
uint8_t aWidgetType,
const nsRect& aRect,
const nsRect& aDirtyRect)
{
if (IsWidgetScrollbarPart(aWidgetType)) {
@@ -1954,17 +1933,17 @@ RENDER_AGAIN:
goto RENDER_AGAIN;
nativeDrawing.PaintToContext();
return NS_OK;
}
static nscolor
-GetScrollbarFaceColorForAuto()
+GetScrollbarFaceColorForAuto(ComputedStyle* aStyle)
{
// Do we want to derive from scrollbar-track-color when possible?
DWORD sysColor = ::GetSysColor(COLOR_SCROLLBAR);
return NS_RGB(GetRValue(sysColor),
GetGValue(sysColor),
GetBValue(sysColor));
}
@@ -1987,17 +1966,17 @@ nsNativeThemeWin::GetWidgetAutoColor(Com
case NS_THEME_SCROLLBARBUTTON_UP:
case NS_THEME_SCROLLBARBUTTON_DOWN:
case NS_THEME_SCROLLBARBUTTON_LEFT:
case NS_THEME_SCROLLBARBUTTON_RIGHT:
return GetScrollbarTrackColorForAuto(aStyle);
case NS_THEME_SCROLLBARTHUMB_VERTICAL:
case NS_THEME_SCROLLBARTHUMB_HORIZONTAL:
- return GetScrollbarFaceColorForAuto();
+ return GetScrollbarFaceColorForAuto(aStyle);
default:
return nsITheme::GetWidgetAutoColor(aStyle, aWidgetType);
}
}
static void
ScaleForFrameDPI(LayoutDeviceIntMargin* aMargin, nsIFrame* aFrame)
@@ -4127,61 +4106,16 @@ nsNativeThemeWin::GetWidgetNativeDrawing
}
static COLORREF
ToColorRef(nscolor aColor)
{
return RGB(NS_GET_R(aColor), NS_GET_G(aColor), NS_GET_B(aColor));
}
-static nscolor
-GetOpaqueBackgroundColor(ComputedStyle* aStyle)
-{
- nscolor color = aStyle->StyleBackground()->BackgroundColor(aStyle);
- if (NS_GET_A(color) == 255) {
- return color;
- }
- // Compose white background with the background color.
- return NS_ComposeColors(NS_RGB(255, 255, 255), color);
-}
-
-static nscolor
-GetScrollbarFaceColor(ComputedStyle* aStyle)
-{
- StyleComplexColor complexColor =
- aStyle->StyleUserInterface()->mScrollbarFaceColor;
- if (complexColor.IsAuto()) {
- return GetScrollbarFaceColorForAuto();
- }
- nscolor color = complexColor.CalcColor(aStyle);
- if (NS_GET_A(color) == 255) {
- return color;
- }
- nscolor bgColor = GetOpaqueBackgroundColor(aStyle);
- return NS_ComposeColors(bgColor, color);
-}
-
-static nscolor
-GetScrollbarTrackColor(ComputedStyle* aStyle)
-{
- StyleComplexColor complexColor =
- aStyle->StyleUserInterface()->mScrollbarTrackColor;
- nscolor color;
- if (complexColor.IsAuto()) {
- color = GetScrollbarTrackColorForAuto(aStyle);
- } else {
- color = complexColor.CalcColor(aStyle);
- }
- if (NS_GET_A(color) == 255) {
- return color;
- }
- nscolor bgColor = GetOpaqueBackgroundColor(aStyle);
- return NS_ComposeColors(bgColor, color);
-}
-
static float
ComputeColorComponentLuminance(uint8_t aComponent)
{
float v = float(aComponent) / 255.0f;
if (v <= 0.03928f) {
return v / 12.92f;
}
return std::pow((v + 0.055f) / 1.055f, 2.4f);
@@ -4277,17 +4211,18 @@ nsNativeThemeWin::DrawCustomScrollbarPar
{
MOZ_ASSERT(!aStyle->StyleUserInterface()->mScrollbarFaceColor.IsAuto() ||
!aStyle->StyleUserInterface()->mScrollbarTrackColor.IsAuto());
gfxRect tr(aRect.X(), aRect.Y(), aRect.Width(), aRect.Height()),
dr(aClipRect.X(), aClipRect.Y(),
aClipRect.Width(), aClipRect.Height());
- nscolor trackColor = GetScrollbarTrackColor(aStyle);
+ nscolor trackColor =
+ GetScrollbarTrackColor(aStyle, &GetScrollbarTrackColorForAuto);
HBRUSH dcBrush = (HBRUSH) GetStockObject(DC_BRUSH);
gfxFloat p2a = gfxFloat(aFrame->PresContext()->AppUnitsPerDevPixel());
tr.Scale(1.0 / p2a);
dr.Scale(1.0 / p2a);
RefPtr<gfxContext> ctx = aContext;
@@ -4313,17 +4248,18 @@ nsNativeThemeWin::DrawCustomScrollbarPar
gfxRect tr2 = tr;
gfxFloat dev2css = round(AppUnitsPerCSSPixel() / p2a);
if (aWidgetType == NS_THEME_SCROLLBARTHUMB_VERTICAL) {
tr2.Deflate(dev2css, 0);
} else {
tr2.Deflate(0, dev2css);
}
nativeDrawing.TransformToNativeRect(tr2, widgetRect);
- nscolor faceColor = GetScrollbarFaceColor(aStyle);
+ nscolor faceColor =
+ GetScrollbarFaceColor(aStyle, &GetScrollbarFaceColorForAuto);
::SetDCBrushColor(hdc, ToColorRef(faceColor));
::FillRect(hdc, &widgetRect, dcBrush);
break;
}
case NS_THEME_SCROLLBARBUTTON_UP:
case NS_THEME_SCROLLBARBUTTON_DOWN:
case NS_THEME_SCROLLBARBUTTON_LEFT:
case NS_THEME_SCROLLBARBUTTON_RIGHT: {