author | Rob Arnold <robarnold@cmu.edu> & Robert O'Callahan <robert@ocallahan.org> |
Fri, 11 Jun 2010 10:53:57 +1200 | |
changeset 43487 | ba0db81cc412be0182d83da4bf76f13ebe976223 |
parent 43486 | 5c70615b4ff4a51b7ffa8e17bb8271a5357d0007 |
child 43488 | f21132993dc239f3e86512a5f7b8b3742647ddae |
push id | 13732 |
push user | ktomlinson@mozilla.com |
push date | Thu, 10 Jun 2010 22:53:40 +0000 |
treeherder | mozilla-central@ba0db81cc412 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | roc, rob, vlad |
bugs | 555133 |
milestone | 1.9.3a6pre |
first release with | nightly win64
ba0db81cc412
/
3.7a6pre
/
20100610171650
/
files
nightly linux32
nightly linux64
nightly mac
nightly win32
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
releases | nightly win64
3.7a6pre
/
20100610171650
/
pushlog to previous
|
--- a/gfx/public/nsITheme.h +++ b/gfx/public/nsITheme.h @@ -54,18 +54,17 @@ class nsIRenderingContext; class nsIDeviceContext; class nsIFrame; class nsIContent; class nsIAtom; // IID for the nsITheme interface // {887e8902-db6b-41b4-8481-a80f49c5a93a} #define NS_ITHEME_IID \ -{ 0x887e8902, 0xdb6b, 0x41b4, { 0x84, 0x81, 0xa8, 0x0f, 0x49, 0xc5, 0xa9, 0x3a } } - +{ 0x23db7c13, 0x873d, 0x4fb5, { 0xaf, 0x29, 0xc1, 0xe9, 0xed, 0x91, 0x23, 0xf9 } } // {D930E29B-6909-44e5-AB4B-AF10D6923705} #define NS_THEMERENDERER_CID \ { 0xd930e29b, 0x6909, 0x44e5, { 0xab, 0x4b, 0xaf, 0x10, 0xd6, 0x92, 0x37, 0x5 } } enum nsTransparencyMode { eTransparencyOpaque = 0, // Fully opaque eTransparencyTransparent, // Parts of the window may be transparent eTransparencyGlass // Transparent parts of the window have Vista AeroGlass effect applied @@ -134,17 +133,28 @@ public: * widget. */ NS_IMETHOD GetMinimumWidgetSize(nsIRenderingContext* aContext, nsIFrame* aFrame, PRUint8 aWidgetType, nsIntSize* aResult, PRBool* aIsOverridable)=0; - virtual nsTransparencyMode GetWidgetTransparency(PRUint8 aWidgetType)=0; + + enum Transparency { + eOpaque = 0, + eTransparent, + eUnknownTransparency + }; + + /** + * Returns what we know about the transparency of the widget. + */ + virtual Transparency GetWidgetTransparency(nsIFrame* aFrame, PRUint8 aWidgetType) + { return eUnknownTransparency; } NS_IMETHOD WidgetStateChanged(nsIFrame* aFrame, PRUint8 aWidgetType, nsIAtom* aAttribute, PRBool* aShouldRepaint)=0; NS_IMETHOD ThemeChanged()=0; /** * Can the nsITheme implementation handle this widget?
--- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -670,17 +670,17 @@ static PRBool RoundedRectContainsRect(co return PR_FALSE; } PRBool nsDisplayBackground::IsOpaque(nsDisplayListBuilder* aBuilder) { // theme background overrides any other background if (mIsThemed) - return PR_FALSE; + return mThemeTransparency == nsITheme::eOpaque; nsStyleContext *bgSC; if (!nsCSSRendering::FindBackground(mFrame->PresContext(), mFrame, &bgSC)) return PR_FALSE; const nsStyleBackground* bg = bgSC->GetStyleBackground(); const nsStyleBackground::Layer& bottomLayer = bg->BottomLayer();
--- a/layout/base/nsDisplayList.h +++ b/layout/base/nsDisplayList.h @@ -1252,17 +1252,17 @@ private: }; /** * The standard display item to paint the CSS background of a frame. */ class nsDisplayBackground : public nsDisplayItem { public: nsDisplayBackground(nsIFrame* aFrame) : nsDisplayItem(aFrame) { - mIsThemed = mFrame->IsThemed(); + mIsThemed = mFrame->IsThemed(&mThemeTransparency); MOZ_COUNT_CTOR(nsDisplayBackground); } #ifdef NS_BUILD_REFCNT_LOGGING virtual ~nsDisplayBackground() { MOZ_COUNT_DTOR(nsDisplayBackground); } #endif @@ -1273,18 +1273,19 @@ public: } virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder); virtual PRBool IsVaryingRelativeToMovingFrame(nsDisplayListBuilder* aBuilder); virtual PRBool IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor); virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder); virtual void Paint(nsDisplayListBuilder* aBuilder, nsIRenderingContext* aCtx); NS_DISPLAY_DECL_NAME("Background") private: - /* Used to cache mFrame->IsThemed() since it isn't a cheap call */ - PRPackedBool mIsThemed; + /* Used to cache mFrame->IsThemed() since it isn't a cheap call */ + PRPackedBool mIsThemed; + nsITheme::Transparency mThemeTransparency; }; /** * The standard display item to paint the outer CSS box-shadows of a frame. */ class nsDisplayBoxShadowOuter : public nsDisplayItem { public: nsDisplayBoxShadowOuter(nsIFrame* aFrame) : nsDisplayItem(aFrame) {
--- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -3211,19 +3211,21 @@ nsLayoutUtils::HasNonZeroCornerOnSide(co nsLayoutUtils::GetFrameTransparency(nsIFrame* aBackgroundFrame, nsIFrame* aCSSRootFrame) { if (aCSSRootFrame->GetStyleContext()->GetStyleDisplay()->mOpacity < 1.0f) return eTransparencyTransparent; if (HasNonZeroCorner(aCSSRootFrame->GetStyleContext()->GetStyleBorder()->mBorderRadius)) return eTransparencyTransparent; - nsTransparencyMode transparency; + nsITheme::Transparency transparency; if (aCSSRootFrame->IsThemed(&transparency)) - return transparency; + return transparency == nsITheme::eTransparent + ? eTransparencyTransparent + : eTransparencyOpaque; if (aCSSRootFrame->GetStyleDisplay()->mAppearance == NS_THEME_WIN_GLASS) return eTransparencyGlass; // We need an uninitialized window to be treated as opaque because // doing otherwise breaks window display effects on some platforms, // specifically Vista. (bug 450322) if (aBackgroundFrame->GetType() == nsGkAtoms::viewportFrame &&
--- a/layout/generic/nsIFrame.h +++ b/layout/generic/nsIFrame.h @@ -992,29 +992,30 @@ public: /** * Get the preferred caret color at the offset. * * @param aOffset is offset of the content. */ virtual nscolor GetCaretColorAt(PRInt32 aOffset); - PRBool IsThemed(nsTransparencyMode* aTransparencyMode = nsnull) { - return IsThemed(GetStyleDisplay(), aTransparencyMode); + + PRBool IsThemed(nsITheme::Transparency* aTransparencyState = nsnull) { + return IsThemed(GetStyleDisplay(), aTransparencyState); } PRBool IsThemed(const nsStyleDisplay* aDisp, - nsTransparencyMode* aTransparencyMode = nsnull) { + nsITheme::Transparency* aTransparencyState = nsnull) { if (!aDisp->mAppearance) return PR_FALSE; nsPresContext* pc = PresContext(); nsITheme *theme = pc->GetTheme(); if(!theme || !theme->ThemeSupportsWidget(pc, this, aDisp->mAppearance)) return PR_FALSE; - if (aTransparencyMode) { - *aTransparencyMode = theme->GetWidgetTransparency(aDisp->mAppearance); + if (aTransparencyState) { + *aTransparencyState = theme->GetWidgetTransparency(this, aDisp->mAppearance); } return PR_TRUE; } /** * Builds a display list for the content represented by this frame, * treating this frame as the root of a stacking context. * @param aDirtyRect content outside this rectangle can be ignored; the
--- a/widget/src/cocoa/nsNativeThemeCocoa.h +++ b/widget/src/cocoa/nsNativeThemeCocoa.h @@ -85,17 +85,17 @@ public: nsIntSize* aResult, PRBool* aIsOverridable); NS_IMETHOD WidgetStateChanged(nsIFrame* aFrame, PRUint8 aWidgetType, nsIAtom* aAttribute, PRBool* aShouldRepaint); NS_IMETHOD ThemeChanged(); PRBool ThemeSupportsWidget(nsPresContext* aPresContext, nsIFrame* aFrame, PRUint8 aWidgetType); PRBool WidgetIsContainer(PRUint8 aWidgetType); PRBool ThemeDrawsFocusForWidget(nsPresContext* aPresContext, nsIFrame* aFrame, PRUint8 aWidgetType); PRBool ThemeNeedsComboboxDropmarker(); - virtual nsTransparencyMode GetWidgetTransparency(PRUint8 aWidgetType); + virtual Transparency GetWidgetTransparency(nsIFrame* aFrame, PRUint8 aWidgetType); protected: nsresult GetSystemColor(PRUint8 aWidgetType, nsILookAndFeel::nsColorID& aColorID); nsresult GetSystemFont(PRUint8 aWidgetType, nsSystemFontID& aFont); nsIntMargin RTLAwareMargin(const nsIntMargin& aMargin, nsIFrame* aFrame); // HITheme drawing routines
--- a/widget/src/cocoa/nsNativeThemeCocoa.mm +++ b/widget/src/cocoa/nsNativeThemeCocoa.mm @@ -2475,17 +2475,17 @@ nsNativeThemeCocoa::ThemeDrawsFocusForWi } PRBool nsNativeThemeCocoa::ThemeNeedsComboboxDropmarker() { return PR_FALSE; } -nsTransparencyMode -nsNativeThemeCocoa::GetWidgetTransparency(PRUint8 aWidgetType) +nsITheme::Transparency +nsNativeThemeCocoa::GetWidgetTransparency(nsIFrame* aFrame, PRUint8 aWidgetType) { if (aWidgetType == NS_THEME_MENUPOPUP || aWidgetType == NS_THEME_TOOLTIP) - return eTransparencyTransparent; + return eTransparent; - return eTransparencyOpaque; + return eUnknownTransparency; }
--- a/widget/src/gtk2/nsNativeThemeGTK.cpp +++ b/widget/src/gtk2/nsNativeThemeGTK.cpp @@ -1337,14 +1337,8 @@ nsNativeThemeGTK::ThemeDrawsFocusForWidg return PR_FALSE; } PRBool nsNativeThemeGTK::ThemeNeedsComboboxDropmarker() { return PR_FALSE; } - -nsTransparencyMode -nsNativeThemeGTK::GetWidgetTransparency(PRUint8 aWidgetType) -{ - return eTransparencyOpaque; -}
--- a/widget/src/gtk2/nsNativeThemeGTK.h +++ b/widget/src/gtk2/nsNativeThemeGTK.h @@ -87,18 +87,16 @@ public: NS_IMETHOD_(PRBool) WidgetIsContainer(PRUint8 aWidgetType); NS_IMETHOD_(PRBool) ThemeDrawsFocusForWidget(nsPresContext* aPresContext, nsIFrame* aFrame, PRUint8 aWidgetType); PRBool ThemeNeedsComboboxDropmarker(); - virtual nsTransparencyMode GetWidgetTransparency(PRUint8 aWidgetType); - nsNativeThemeGTK(); virtual ~nsNativeThemeGTK(); private: PRBool GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame, GtkThemeWidgetType& aGtkWidgetType, GtkWidgetState* aState, gint* aWidgetFlags);
--- a/widget/src/qt/nsNativeThemeQt.cpp +++ b/widget/src/qt/nsNativeThemeQt.cpp @@ -622,22 +622,16 @@ nsNativeThemeQt::ThemeDrawsFocusForWidge } PRBool nsNativeThemeQt::ThemeNeedsComboboxDropmarker() { return PR_TRUE; } -nsTransparencyMode -nsNativeThemeQt::GetWidgetTransparency(PRUint8 aWidgetType) -{ - return eTransparencyOpaque; -} - void nsNativeThemeQt::InitButtonStyle(PRUint8 aWidgetType, nsIFrame* aFrame, QRect rect, QStyleOptionButton &opt) { PRInt32 eventState = GetContentState(aFrame, aWidgetType);
--- a/widget/src/qt/nsNativeThemeQt.h +++ b/widget/src/qt/nsNativeThemeQt.h @@ -94,18 +94,16 @@ public: PRUint8 aWidgetType, nsIntMargin* aResult); NS_IMETHOD_(PRBool) ThemeDrawsFocusForWidget(nsPresContext* aPresContext, nsIFrame* aFrame, PRUint8 aWidgetType); PRBool ThemeNeedsComboboxDropmarker(); - virtual nsTransparencyMode GetWidgetTransparency(PRUint8 aWidgetType); - nsNativeThemeQt(); virtual ~nsNativeThemeQt(); private: inline nsresult DrawWidgetBackground(QPainter *qPainter, nsIRenderingContext* aContext, nsIFrame* aFrame,
--- a/widget/src/windows/nsNativeThemeWin.cpp +++ b/widget/src/windows/nsNativeThemeWin.cpp @@ -392,16 +392,23 @@ nsNativeThemeWin::IsMenuActive(nsIFrame nsIContent* content = aFrame->GetContent(); if (content->IsXUL() && content->NodeInfo()->Equals(nsWidgetAtoms::richlistitem)) return CheckBooleanAttr(aFrame, nsWidgetAtoms::selected); return CheckBooleanAttr(aFrame, nsWidgetAtoms::mozmenuactive); } +/** + * aPart is filled in with the UXTheme part code. On return, values > 0 + * are the actual UXTheme part code; -1 means the widget will be drawn by + * us; 0 means that we should use part code 0, which isn't a real part code + * but elicits some kind of default behaviour from UXTheme when drawing + * (but isThemeBackgroundPartiallyTransparent may not work). + */ nsresult nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType, PRInt32& aPart, PRInt32& aState) { if (!nsUXThemeData::sIsVistaOrLater) { // See GetTheme if (aWidgetType == NS_THEME_DROPDOWN) aWidgetType = NS_THEME_TEXTFIELD; @@ -1771,20 +1778,38 @@ nsNativeThemeWin::ThemeDrawsFocusForWidg } PRBool nsNativeThemeWin::ThemeNeedsComboboxDropmarker() { return PR_TRUE; } -nsTransparencyMode -nsNativeThemeWin::GetWidgetTransparency(PRUint8 aWidgetType) +nsITheme::Transparency +nsNativeThemeWin::GetWidgetTransparency(nsIFrame* aFrame, PRUint8 aWidgetType) { - return eTransparencyOpaque; + HANDLE theme = GetTheme(aWidgetType); + // For the classic theme we don't really have a way of knowing + if (!theme) + return eUnknownTransparency; + + PRInt32 part, state; + nsresult rv = GetThemePartAndState(aFrame, aWidgetType, part, state); + // Fail conservatively + NS_ENSURE_SUCCESS(rv, eUnknownTransparency); + + if (part <= 0) { + // Not a real part code, so isThemeBackgroundPartiallyTransparent may + // not work, so don't call it. + return eUnknownTransparency; + } + + if (nsUXThemeData::isThemeBackgroundPartiallyTransparent(theme, part, state)) + return eTransparent; + return eOpaque; } /* Windows 9x/NT/2000/Classic XP Theme Support */ PRBool nsNativeThemeWin::ClassicThemeSupportsWidget(nsPresContext* aPresContext, nsIFrame* aFrame, PRUint8 aWidgetType)
--- a/widget/src/windows/nsNativeThemeWin.h +++ b/widget/src/windows/nsNativeThemeWin.h @@ -73,17 +73,17 @@ public: PRUint8 aWidgetType, nsRect* aOverflowRect); NS_IMETHOD GetMinimumWidgetSize(nsIRenderingContext* aContext, nsIFrame* aFrame, PRUint8 aWidgetType, nsIntSize* aResult, PRBool* aIsOverridable); - virtual nsTransparencyMode GetWidgetTransparency(PRUint8 aWidgetType); + virtual Transparency GetWidgetTransparency(nsIFrame* aFrame, PRUint8 aWidgetType); NS_IMETHOD WidgetStateChanged(nsIFrame* aFrame, PRUint8 aWidgetType, nsIAtom* aAttribute, PRBool* aShouldRepaint); NS_IMETHOD ThemeChanged(); PRBool ThemeSupportsWidget(nsPresContext* aPresContext, nsIFrame* aFrame,
--- a/widget/src/windows/nsUXThemeData.cpp +++ b/widget/src/windows/nsUXThemeData.cpp @@ -78,16 +78,17 @@ nsUXThemeData::GetThemeContentRectPtr ns nsUXThemeData::GetThemeBackgroundRegionPtr nsUXThemeData::getThemeBackgroundRegion = NULL; nsUXThemeData::GetThemePartSizePtr nsUXThemeData::getThemePartSize = NULL; nsUXThemeData::GetThemeSysFontPtr nsUXThemeData::getThemeSysFont = NULL; nsUXThemeData::GetThemeColorPtr nsUXThemeData::getThemeColor = NULL; nsUXThemeData::GetThemeMarginsPtr nsUXThemeData::getThemeMargins = NULL; nsUXThemeData::IsAppThemedPtr nsUXThemeData::isAppThemed = NULL; nsUXThemeData::GetCurrentThemeNamePtr nsUXThemeData::getCurrentThemeName = NULL; nsUXThemeData::GetThemeSysColorPtr nsUXThemeData::getThemeSysColor = NULL; +nsUXThemeData::IsThemeBackgroundPartiallyTransparentPtr nsUXThemeData::isThemeBackgroundPartiallyTransparent = NULL; #if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN nsUXThemeData::DwmExtendFrameIntoClientAreaProc nsUXThemeData::dwmExtendFrameIntoClientAreaPtr = NULL; nsUXThemeData::DwmIsCompositionEnabledProc nsUXThemeData::dwmIsCompositionEnabledPtr = NULL; nsUXThemeData::DwmSetIconicThumbnailProc nsUXThemeData::dwmSetIconicThumbnailPtr = NULL; nsUXThemeData::DwmSetIconicLivePreviewBitmapProc nsUXThemeData::dwmSetIconicLivePreviewBitmapPtr = NULL; nsUXThemeData::DwmSetWindowAttributeProc nsUXThemeData::dwmSetWindowAttributePtr = NULL; nsUXThemeData::DwmInvalidateIconicBitmapsProc nsUXThemeData::dwmInvalidateIconicBitmapsPtr = NULL; @@ -119,16 +120,17 @@ nsUXThemeData::Initialize() getThemeBackgroundRegion = (GetThemeBackgroundRegionPtr)GetProcAddress(sThemeDLL, "GetThemeBackgroundRegion"); getThemePartSize = (GetThemePartSizePtr)GetProcAddress(sThemeDLL, "GetThemePartSize"); getThemeSysFont = (GetThemeSysFontPtr)GetProcAddress(sThemeDLL, "GetThemeSysFont"); getThemeColor = (GetThemeColorPtr)GetProcAddress(sThemeDLL, "GetThemeColor"); getThemeMargins = (GetThemeMarginsPtr)GetProcAddress(sThemeDLL, "GetThemeMargins"); isAppThemed = (IsAppThemedPtr)GetProcAddress(sThemeDLL, "IsAppThemed"); getCurrentThemeName = (GetCurrentThemeNamePtr)GetProcAddress(sThemeDLL, "GetCurrentThemeName"); getThemeSysColor = (GetThemeSysColorPtr)GetProcAddress(sThemeDLL, "GetThemeSysColor"); + isThemeBackgroundPartiallyTransparent = (IsThemeBackgroundPartiallyTransparentPtr)GetProcAddress(sThemeDLL, "IsThemeBackgroundPartiallyTransparent"); } #if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN sDwmDLL = ::LoadLibraryW(kDwmLibraryName); if(sDwmDLL) { dwmExtendFrameIntoClientAreaPtr = (DwmExtendFrameIntoClientAreaProc)::GetProcAddress(sDwmDLL, "DwmExtendFrameIntoClientArea"); dwmIsCompositionEnabledPtr = (DwmIsCompositionEnabledProc)::GetProcAddress(sDwmDLL, "DwmIsCompositionEnabled"); dwmSetIconicThumbnailPtr = (DwmSetIconicThumbnailProc)::GetProcAddress(sDwmDLL, "DwmSetIconicThumbnail"); dwmSetIconicLivePreviewBitmapPtr = (DwmSetIconicLivePreviewBitmapProc)::GetProcAddress(sDwmDLL, "DwmSetIconicLivePreviewBitmap");
--- a/widget/src/windows/nsUXThemeData.h +++ b/widget/src/windows/nsUXThemeData.h @@ -148,30 +148,32 @@ public: typedef HRESULT (WINAPI*GetThemeMarginsPtr)(HANDLE hTheme, HDC hdc, int iPartId, int iStateid, int iPropId, LPRECT prc, MARGINS *pMargins); typedef BOOL (WINAPI*IsAppThemedPtr)(VOID); typedef HRESULT (WINAPI*GetCurrentThemeNamePtr)(LPWSTR pszThemeFileName, int dwMaxNameChars, LPWSTR pszColorBuff, int cchMaxColorChars, LPWSTR pszSizeBuff, int cchMaxSizeChars); typedef COLORREF (WINAPI*GetThemeSysColorPtr)(HANDLE hTheme, int iColorID); + typedef BOOL (WINAPI*IsThemeBackgroundPartiallyTransparentPtr)(HANDLE hTheme, int iPartId, int iStateId); static OpenThemeDataPtr openTheme; static CloseThemeDataPtr closeTheme; static DrawThemeBackgroundPtr drawThemeBG; static DrawThemeEdgePtr drawThemeEdge; static GetThemeContentRectPtr getThemeContentRect; static GetThemeBackgroundRegionPtr getThemeBackgroundRegion; static GetThemePartSizePtr getThemePartSize; static GetThemeSysFontPtr getThemeSysFont; static GetThemeColorPtr getThemeColor; static GetThemeMarginsPtr getThemeMargins; static IsAppThemedPtr isAppThemed; static GetCurrentThemeNamePtr getCurrentThemeName; static GetThemeSysColorPtr getThemeSysColor; + static IsThemeBackgroundPartiallyTransparentPtr isThemeBackgroundPartiallyTransparent; #if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN // dwmapi.dll function typedefs and declarations typedef HRESULT (WINAPI*DwmExtendFrameIntoClientAreaProc)(HWND hWnd, const MARGINS *pMarInset); typedef HRESULT (WINAPI*DwmIsCompositionEnabledProc)(BOOL *pfEnabled); typedef HRESULT (WINAPI*DwmSetIconicThumbnailProc)(HWND hWnd, HBITMAP hBitmap, DWORD dwSITFlags); typedef HRESULT (WINAPI*DwmSetIconicLivePreviewBitmapProc)(HWND hWnd, HBITMAP hBitmap, POINT *pptClient, DWORD dwSITFlags); typedef HRESULT (WINAPI*DwmSetWindowAttributeProc)(HWND hWnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute);