Bug 601603. Part 5 - Ensure that the layer that holds the window background is never opaque for glass windows. r=roc a=beta8

This commit is contained in:
Felipe Gomes 2010-10-19 15:02:25 -02:00
parent d51ae139e7
commit 82fe7096ba
9 changed files with 166 additions and 58 deletions

View File

@ -162,7 +162,8 @@ protected:
ThebesLayerData() :
mActiveScrolledRoot(nsnull), mLayer(nsnull),
mIsSolidColorInVisibleRegion(PR_FALSE),
mHasText(PR_FALSE), mHasTextOverTransparent(PR_FALSE) {}
mHasText(PR_FALSE), mHasTextOverTransparent(PR_FALSE),
mForceTransparentSurface(PR_FALSE) {}
/**
* Record that an item has been added to the ThebesLayer, so we
* need to update our regions.
@ -240,6 +241,13 @@ protected:
* transparent pixels in the layer.
*/
PRPackedBool mHasTextOverTransparent;
/**
* Set if the layer should be treated as transparent, even if its entire
* area is covered by opaque display items. For example, this needs to
* be set if something is going to "punch holes" in the layer by clearing
* part of its surface.
*/
PRPackedBool mForceTransparentSurface;
};
/**
@ -861,7 +869,7 @@ ContainerState::PopThebesLayerData()
userData->mForcedBackgroundColor = backgroundColor;
}
PRUint32 flags =
(isOpaque ? Layer::CONTENT_OPAQUE : 0) |
((isOpaque && !data->mForceTransparentSurface) ? Layer::CONTENT_OPAQUE : 0) |
(data->mHasText ? 0 : Layer::CONTENT_NO_TEXT) |
(data->mHasTextOverTransparent ? 0 : Layer::CONTENT_NO_TEXT_OVER_TRANSPARENT);
layer->SetContentFlags(flags);
@ -912,7 +920,8 @@ ContainerState::ThebesLayerData::Accumulate(nsDisplayListBuilder* aBuilder,
mDrawRegion.Or(mDrawRegion, aDrawRect);
mDrawRegion.SimplifyOutward(4);
if (aItem->IsOpaque(aBuilder)) {
PRBool forceTransparentSurface = PR_FALSE;
if (aItem->IsOpaque(aBuilder, &forceTransparentSurface)) {
// We don't use SimplifyInward here since it's not defined exactly
// what it will discard. For our purposes the most important case
// is a large opaque background at the bottom of z-order (e.g.,
@ -929,6 +938,7 @@ ContainerState::ThebesLayerData::Accumulate(nsDisplayListBuilder* aBuilder,
mHasTextOverTransparent = PR_TRUE;
}
}
mForceTransparentSurface = mForceTransparentSurface || forceTransparentSurface;
}
already_AddRefed<ThebesLayer>
@ -1392,7 +1402,8 @@ FrameLayerBuilder::BuildContainerLayerFor(nsDisplayListBuilder* aBuilder,
state.ProcessDisplayItems(aChildren, clip);
state.Finish();
PRUint32 flags = aChildren.IsOpaque() ? Layer::CONTENT_OPAQUE : 0;
PRUint32 flags = aChildren.IsOpaque() &&
!aChildren.NeedsTransparentSurface() ? Layer::CONTENT_OPAQUE : 0;
containerLayer->SetContentFlags(flags);
return containerLayer.forget();
}

View File

@ -320,6 +320,8 @@ nsDisplayList::ComputeVisibilityForSublist(nsDisplayListBuilder* aBuilder,
nsAutoTArray<nsDisplayItem*, 512> elements;
FlattenTo(&elements);
PRBool forceTransparentSurface = PR_FALSE;
for (PRInt32 i = elements.Length() - 1; i >= 0; --i) {
nsDisplayItem* item = elements[i];
nsDisplayItem* belowItem = i < 1 ? nsnull : elements[i - 1];
@ -339,15 +341,18 @@ nsDisplayList::ComputeVisibilityForSublist(nsDisplayListBuilder* aBuilder,
if (item->ComputeVisibility(aBuilder, aVisibleRegion)) {
anyVisible = PR_TRUE;
nsIFrame* f = item->GetUnderlyingFrame();
if (item->IsOpaque(aBuilder) && f) {
PRBool transparentBackground = PR_FALSE;
if (item->IsOpaque(aBuilder, &transparentBackground) && f) {
// Subtract opaque item from the visible region
aBuilder->SubtractFromVisibleRegion(aVisibleRegion, nsRegion(bounds));
}
forceTransparentSurface = forceTransparentSurface || transparentBackground;
}
AppendToBottom(item);
}
mIsOpaque = !aVisibleRegion->Intersects(mVisibleRect);
mForceTransparentSurface = forceTransparentSurface;
#ifdef DEBUG
mDidComputeVisibility = PR_TRUE;
#endif
@ -845,10 +850,20 @@ nsDisplayBackground::ComputeVisibility(nsDisplayListBuilder* aBuilder,
}
PRBool
nsDisplayBackground::IsOpaque(nsDisplayListBuilder* aBuilder) {
nsDisplayBackground::IsOpaque(nsDisplayListBuilder* aBuilder,
PRBool* aForceTransparentSurface) {
if (aForceTransparentSurface) {
*aForceTransparentSurface = PR_FALSE;
}
// theme background overrides any other background
if (mIsThemed)
if (mIsThemed) {
if (aForceTransparentSurface) {
const nsStyleDisplay* disp = mFrame->GetStyleDisplay();
*aForceTransparentSurface = disp->mAppearance == NS_THEME_WIN_BORDERLESS_GLASS ||
disp->mAppearance == NS_THEME_WIN_GLASS;
}
return mThemeTransparency == nsITheme::eOpaque;
}
nsStyleContext* bgSC;
if (!nsCSSRendering::FindBackground(mFrame->PresContext(), mFrame, &bgSC))
@ -1230,7 +1245,11 @@ nsDisplayWrapList::ComputeVisibility(nsDisplayListBuilder* aBuilder,
}
PRBool
nsDisplayWrapList::IsOpaque(nsDisplayListBuilder* aBuilder) {
nsDisplayWrapList::IsOpaque(nsDisplayListBuilder* aBuilder,
PRBool* aForceTransparentSurface) {
if (aForceTransparentSurface) {
*aForceTransparentSurface = PR_FALSE;
}
return mList.IsOpaque();
}
@ -1369,7 +1388,11 @@ nsDisplayOpacity::~nsDisplayOpacity() {
}
#endif
PRBool nsDisplayOpacity::IsOpaque(nsDisplayListBuilder* aBuilder) {
PRBool nsDisplayOpacity::IsOpaque(nsDisplayListBuilder* aBuilder,
PRBool* aForceTransparentSurface) {
if (aForceTransparentSurface) {
*aForceTransparentSurface = PR_FALSE;
}
// We are never opaque, if our opacity was < 1 then we wouldn't have
// been created.
return PR_FALSE;
@ -1539,8 +1562,12 @@ nsDisplayClipRoundedRect::~nsDisplayClipRoundedRect()
}
#endif
PRBool nsDisplayClipRoundedRect::IsOpaque(nsDisplayListBuilder* aBuilder)
PRBool nsDisplayClipRoundedRect::IsOpaque(nsDisplayListBuilder* aBuilder,
PRBool* aForceTransparentSurface)
{
if (aForceTransparentSurface) {
*aForceTransparentSurface = PR_FALSE;
}
return PR_FALSE;
}
@ -1948,8 +1975,12 @@ nsRect nsDisplayTransform::GetBounds(nsDisplayListBuilder *aBuilder)
*
* We need b and c to be zero.
*/
PRBool nsDisplayTransform::IsOpaque(nsDisplayListBuilder *aBuilder)
PRBool nsDisplayTransform::IsOpaque(nsDisplayListBuilder *aBuilder,
PRBool* aForceTransparentSurface)
{
if (aForceTransparentSurface) {
*aForceTransparentSurface = PR_FALSE;
}
const nsStyleDisplay* disp = mFrame->GetStyleDisplay();
return disp->mTransform.GetMainMatrixEntry(1) == 0.0f &&
disp->mTransform.GetMainMatrixEntry(2) == 0.0f &&
@ -2078,8 +2109,12 @@ nsDisplaySVGEffects::~nsDisplaySVGEffects()
}
#endif
PRBool nsDisplaySVGEffects::IsOpaque(nsDisplayListBuilder* aBuilder)
PRBool nsDisplaySVGEffects::IsOpaque(nsDisplayListBuilder* aBuilder,
PRBool* aForceTransparentSurface)
{
if (aForceTransparentSurface) {
*aForceTransparentSurface = PR_FALSE;
}
return PR_FALSE;
}

View File

@ -55,6 +55,7 @@
#include "Layers.h"
#include "nsRegion.h"
#include "FrameLayerBuilder.h"
#include "nsThemeConstants.h"
#include <stdlib.h>
@ -517,7 +518,14 @@ public:
* @return PR_TRUE if the item is definitely opaque --- i.e., paints
* every pixel within its bounds opaquely
*/
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder) { return PR_FALSE; }
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
PRBool* aForceTransparentSurface = nsnull)
{
if (aForceTransparentSurface) {
*aForceTransparentSurface = PR_FALSE;
}
return PR_FALSE;
}
/**
* If this returns true, then aColor is set to the uniform color
* @return PR_TRUE if the item is guaranteed to paint every pixel in its
@ -894,6 +902,15 @@ public:
NS_ASSERTION(mDidComputeVisibility, "Need to have called ComputeVisibility");
return mIsOpaque;
}
/**
* Returns true if during ComputeVisibility any display item
* set the surface to be transparent.
*/
PRBool NeedsTransparentSurface() const {
NS_ASSERTION(mDidComputeVisibility, "Need to have called ComputeVisibility");
return mForceTransparentSurface;
}
/**
* Paint the list to the rendering context. We assume that (0,0) in aCtx
* corresponds to the origin of the reference frame. For best results,
@ -964,6 +981,10 @@ private:
// is empty (i.e. everything that was visible is covered by some
// opaque content in this list).
PRPackedBool mIsOpaque;
// This is set to true by ComputeVisibility if any display item in this
// list needs to force the surface to be transparent (e.g. if the
// item "punch holes" on the surface by clearing part of its area).
PRPackedBool mForceTransparentSurface;
#ifdef DEBUG
PRPackedBool mDidComputeVisibility;
#endif
@ -1291,7 +1312,11 @@ public:
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder) { return mBounds; }
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder) {
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
PRBool* aOutTransparentBackground = nsnull) {
if (aOutTransparentBackground) {
*aOutTransparentBackground = PR_FALSE;
}
return (NS_GET_A(mColor) == 255);
}
@ -1308,6 +1333,7 @@ public:
private:
nsRect mBounds;
nscolor mColor;
PRBool mTransparentBackground;
};
/**
@ -1326,7 +1352,8 @@ public:
HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames);
virtual PRBool ComputeVisibility(nsDisplayListBuilder* aBuilder,
nsRegion* aVisibleRegion);
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder);
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
PRBool* aForceTransparentSurface = nsnull);
virtual PRBool IsVaryingRelativeToMovingFrame(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame);
virtual PRBool IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor);
@ -1461,7 +1488,8 @@ public:
virtual void HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames);
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder);
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder);
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
PRBool* aForceTransparentSurface = nsnull);
virtual PRBool IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor);
virtual PRBool IsVaryingRelativeToMovingFrame(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame);
@ -1544,7 +1572,8 @@ public:
virtual ~nsDisplayOpacity();
#endif
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder);
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
PRBool* aForceTransparentSurface = nsnull);
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager);
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
@ -1641,7 +1670,8 @@ public:
virtual ~nsDisplayClipRoundedRect();
#endif
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder);
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
PRBool* aForceTransparentSurface = nsnull);
virtual void HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames);
virtual PRBool ComputeVisibility(nsDisplayListBuilder* aBuilder,
@ -1710,7 +1740,8 @@ public:
virtual ~nsDisplaySVGEffects();
#endif
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder);
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
PRBool* aForceTransparentSurface = nsnull);
virtual void HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames);
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder) {
@ -1768,7 +1799,8 @@ public:
virtual void HitTest(nsDisplayListBuilder *aBuilder, const nsRect& aRect,
HitTestState *aState, nsTArray<nsIFrame*> *aOutFrames);
virtual nsRect GetBounds(nsDisplayListBuilder *aBuilder);
virtual PRBool IsOpaque(nsDisplayListBuilder *aBuilder);
virtual PRBool IsOpaque(nsDisplayListBuilder *aBuilder,
PRBool* aForceTransparentSurface = nsnull);
virtual PRBool IsUniform(nsDisplayListBuilder *aBuilder, nscolor* aColor);
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
LayerManager* aManager);

View File

@ -3362,18 +3362,18 @@ nsLayoutUtils::GetFrameTransparency(nsIFrame* aBackgroundFrame,
if (HasNonZeroCorner(aCSSRootFrame->GetStyleContext()->GetStyleBorder()->mBorderRadius))
return eTransparencyTransparent;
nsITheme::Transparency transparency;
if (aCSSRootFrame->IsThemed(&transparency))
return transparency == nsITheme::eTransparent
? eTransparencyTransparent
: eTransparencyOpaque;
if (aCSSRootFrame->GetStyleDisplay()->mAppearance == NS_THEME_WIN_GLASS)
return eTransparencyGlass;
if (aCSSRootFrame->GetStyleDisplay()->mAppearance == NS_THEME_WIN_BORDERLESS_GLASS)
return eTransparencyBorderlessGlass;
nsITheme::Transparency transparency;
if (aCSSRootFrame->IsThemed(&transparency))
return transparency == nsITheme::eTransparent
? eTransparencyTransparent
: eTransparencyOpaque;
// We need an uninitialized window to be treated as opaque because
// doing otherwise breaks window display effects on some platforms,
// specifically Vista. (bug 450322)

View File

@ -177,8 +177,12 @@ public:
return NS_GET_A(mExtraBackgroundColor) > 0 ||
nsDisplayBackground::ComputeVisibility(aBuilder, aVisibleRegion);
}
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder)
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
PRBool* aForceTransparentSurface = nsnull)
{
if (aForceTransparentSurface) {
*aForceTransparentSurface = PR_FALSE;
}
return NS_GET_A(mExtraBackgroundColor) == 255 ||
nsDisplayBackground::IsOpaque(aBuilder);
}

View File

@ -77,7 +77,11 @@ public:
NS_DISPLAY_DECL_NAME("nsDisplayCanvas", TYPE_CANVAS)
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder) {
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
PRBool* aForceTransparentSurface = nsnull) {
if (aForceTransparentSurface) {
*aForceTransparentSurface = PR_FALSE;
}
nsIFrame* f = GetUnderlyingFrame();
nsHTMLCanvasElement *canvas = CanvasElementFromContent(f->GetContent());
return canvas->GetIsOpaque();

View File

@ -1267,8 +1267,12 @@ nsDisplayPlugin::ComputeVisibility(nsDisplayListBuilder* aBuilder,
}
PRBool
nsDisplayPlugin::IsOpaque(nsDisplayListBuilder* aBuilder)
nsDisplayPlugin::IsOpaque(nsDisplayListBuilder* aBuilder,
PRBool* aForceTransparentSurface)
{
if (aForceTransparentSurface) {
*aForceTransparentSurface = PR_FALSE;
}
nsObjectFrame* f = static_cast<nsObjectFrame*>(mFrame);
return f->IsOpaque();
}

View File

@ -315,7 +315,8 @@ public:
#endif
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder);
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder);
virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder,
PRBool* aForceTransparentSurface = nsnull);
virtual void Paint(nsDisplayListBuilder* aBuilder,
nsIRenderingContext* aCtx);
virtual PRBool ComputeVisibility(nsDisplayListBuilder* aBuilder,

View File

@ -429,6 +429,8 @@ nsNativeThemeWin::GetTheme(PRUint8 aWidgetType)
case NS_THEME_WINDOW_BUTTON_RESTORE:
case NS_THEME_WINDOW_BUTTON_BOX:
case NS_THEME_WINDOW_BUTTON_BOX_MAXIMIZED:
case NS_THEME_WIN_GLASS:
case NS_THEME_WIN_BORDERLESS_GLASS:
return nsUXThemeData::GetTheme(eUXWindowFrame);
}
return NULL;
@ -1090,6 +1092,8 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
return NS_OK;
case NS_THEME_WINDOW_BUTTON_BOX:
case NS_THEME_WINDOW_BUTTON_BOX_MAXIMIZED:
case NS_THEME_WIN_GLASS:
case NS_THEME_WIN_BORDERLESS_GLASS:
aPart = -1;
aState = 0;
return NS_OK;
@ -1114,6 +1118,37 @@ nsNativeThemeWin::DrawWidgetBackground(nsIRenderingContext* aContext,
if (!nsUXThemeData::drawThemeBG)
return NS_ERROR_FAILURE;
#if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN
// ^^ without the right sdk, assume xp theming and fall through.
if (nsUXThemeData::CheckForCompositor()) {
switch (aWidgetType) {
case NS_THEME_WINDOW_TITLEBAR:
case NS_THEME_WINDOW_TITLEBAR_MAXIMIZED:
case NS_THEME_WINDOW_FRAME_LEFT:
case NS_THEME_WINDOW_FRAME_RIGHT:
case NS_THEME_WINDOW_FRAME_BOTTOM:
// Nothing to draw, these areas are glass. Minimum dimensions
// should be set, so xul content should be layed out correctly.
return NS_OK;
break;
case NS_THEME_WINDOW_BUTTON_CLOSE:
case NS_THEME_WINDOW_BUTTON_MINIMIZE:
case NS_THEME_WINDOW_BUTTON_MAXIMIZE:
case NS_THEME_WINDOW_BUTTON_RESTORE:
// Not conventional bitmaps, can't be retrieved. If we fall
// through here and call the theme library we'll get aero
// basic bitmaps.
return NS_OK;
break;
case NS_THEME_WIN_GLASS:
case NS_THEME_WIN_BORDERLESS_GLASS:
// Nothing to draw, this is the glass background.
return NS_OK;
break;
}
}
#endif // MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN
PRInt32 part, state;
nsresult rv = GetThemePartAndState(aFrame, aWidgetType, part, state);
if (NS_FAILED(rv))
@ -1143,32 +1178,6 @@ nsNativeThemeWin::DrawWidgetBackground(nsIRenderingContext* aContext,
dr.size.height += 2.0;
}
#if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN
// ^^ without the right sdk, assume xp theming and fall through.
if (nsUXThemeData::CheckForCompositor()) {
switch (aWidgetType) {
case NS_THEME_WINDOW_TITLEBAR:
case NS_THEME_WINDOW_TITLEBAR_MAXIMIZED:
case NS_THEME_WINDOW_FRAME_LEFT:
case NS_THEME_WINDOW_FRAME_RIGHT:
case NS_THEME_WINDOW_FRAME_BOTTOM:
// Nothing to draw, these areas are glass. Minimum dimensions
// should be set, so xul content should be layed out correctly.
return NS_OK;
break;
case NS_THEME_WINDOW_BUTTON_CLOSE:
case NS_THEME_WINDOW_BUTTON_MINIMIZE:
case NS_THEME_WINDOW_BUTTON_MAXIMIZE:
case NS_THEME_WINDOW_BUTTON_RESTORE:
// Not conventional bitmaps, can't be retrieved. If we fall
// through here and call the theme library we'll get aero
// basic bitmaps.
return NS_OK;
break;
}
}
#endif // MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN
nsRefPtr<gfxContext> ctx = aContext->ThebesContext();
gfxWindowsNativeDrawing nativeDrawing(ctx, dr, GetWidgetNativeDrawingFlags(aWidgetType));
@ -1489,7 +1498,8 @@ nsNativeThemeWin::GetWidgetBorder(nsIDeviceContext* aContext,
aWidgetType == NS_THEME_MENUITEM || aWidgetType == NS_THEME_CHECKMENUITEM ||
aWidgetType == NS_THEME_RADIOMENUITEM || aWidgetType == NS_THEME_MENUPOPUP ||
aWidgetType == NS_THEME_MENUIMAGE || aWidgetType == NS_THEME_MENUITEMTEXT ||
aWidgetType == NS_THEME_TOOLBAR_SEPARATOR)
aWidgetType == NS_THEME_TOOLBAR_SEPARATOR ||
aWidgetType == NS_THEME_WIN_GLASS || aWidgetType == NS_THEME_WIN_BORDERLESS_GLASS)
return NS_OK; // Don't worry about it.
if (!nsUXThemeData::getThemeContentRect)
@ -1769,6 +1779,8 @@ nsNativeThemeWin::GetMinimumWidgetSize(nsIRenderingContext* aContext, nsIFrame*
case NS_THEME_LISTBOX:
case NS_THEME_TREEVIEW:
case NS_THEME_MENUITEMTEXT:
case NS_THEME_WIN_GLASS:
case NS_THEME_WIN_BORDERLESS_GLASS:
return NS_OK; // Don't worry about it.
}
@ -1990,7 +2002,9 @@ nsNativeThemeWin::WidgetStateChanged(nsIFrame* aFrame, PRUint8 aWidgetType,
aWidgetType == NS_THEME_TOOLTIP ||
aWidgetType == NS_THEME_TAB_PANELS ||
aWidgetType == NS_THEME_TAB_PANEL ||
aWidgetType == NS_THEME_TOOLBAR_SEPARATOR) {
aWidgetType == NS_THEME_TOOLBAR_SEPARATOR ||
aWidgetType == NS_THEME_WIN_GLASS ||
aWidgetType == NS_THEME_WIN_BORDERLESS_GLASS) {
*aShouldRepaint = PR_FALSE;
return NS_OK;
}
@ -2118,6 +2132,9 @@ nsNativeThemeWin::GetWidgetTransparency(nsIFrame* aFrame, PRUint8 aWidgetType)
// true across all Windows themes! If it's not true, we should
// paint an opaque background for them to make it true!
return eOpaque;
case NS_THEME_WIN_GLASS:
case NS_THEME_WIN_BORDERLESS_GLASS:
return eTransparent;
}
HANDLE theme = GetTheme(aWidgetType);