Bug 1464722 part 1 - Move functions related to custom scrollbars into nsNativeTheme. r?jimm draft
authorXidorn Quan <me@upsuper.org>
Thu, 21 Jun 2018 16:32:17 +1000
changeset 810010 0d7ce7bf08617440f78087bceac4831f11303fb9
parent 809377 27e90ec610a4c8f6b2a73d79cb1a4df38e822e6a
child 810011 888a6ec0b056ab1dc3a18483a2929e67caacfd5c
push id113861
push userxquan@mozilla.com
push dateMon, 25 Jun 2018 00:17:17 +0000
reviewersjimm
bugs1464722
milestone62.0a1
Bug 1464722 part 1 - Move functions related to custom scrollbars into nsNativeTheme. r?jimm MozReview-Commit-ID: 4URdu5Tj5dg
widget/nsNativeTheme.cpp
widget/nsNativeTheme.h
widget/windows/nsNativeThemeWin.cpp
--- 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: {