Bug 594983. Look inside display sublists to determine whether there is text for the layer. r=roc,a=blocking

This commit is contained in:
Matt Woodrow 2010-10-11 13:58:20 +13:00
parent 73fec40f97
commit 8a60164429
7 changed files with 37 additions and 19 deletions

View File

@ -884,24 +884,6 @@ ContainerState::PopThebesLayerData()
mThebesLayerDataStack.RemoveElementAt(lastIndex);
}
static PRBool
IsText(nsDisplayItem* aItem) {
switch (aItem->GetType()) {
case nsDisplayItem::TYPE_TEXT:
case nsDisplayItem::TYPE_BULLET:
case nsDisplayItem::TYPE_HEADER_FOOTER:
#ifdef MOZ_MATHML
case nsDisplayItem::TYPE_MATHML_CHAR_FOREGROUND:
#endif
#ifdef MOZ_XUL
case nsDisplayItem::TYPE_XUL_TEXT_BOX:
#endif
return PR_TRUE;
default:
return PR_FALSE;
}
}
void
ContainerState::ThebesLayerData::Accumulate(nsDisplayListBuilder* aBuilder,
nsDisplayItem* aItem,
@ -941,7 +923,7 @@ ContainerState::ThebesLayerData::Accumulate(nsDisplayListBuilder* aBuilder,
if (tmp.GetNumRects() <= 4) {
mOpaqueRegion = tmp;
}
} else if (IsText(aItem)) {
} else if (aItem->HasText()) {
mHasText = PR_TRUE;
if (!mOpaqueRegion.Contains(aVisibleRect)) {
mHasTextOverTransparent = PR_TRUE;

View File

@ -1160,6 +1160,16 @@ PRBool nsDisplayWrapList::ChildrenCanBeInactive(nsDisplayListBuilder* aBuilder,
return PR_TRUE;
}
PRBool nsDisplayWrapList::HasText()
{
for (nsDisplayItem* i = mList.GetBottom(); i; i = i->GetAbove()) {
if (i->HasText()) {
return PR_TRUE;
}
}
return PR_FALSE;
}
static nsresult
WrapDisplayList(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
nsDisplayList* aList, nsDisplayWrapper* aWrapper) {

View File

@ -659,6 +659,12 @@ public:
return mToReferenceFrame;
}
/**
* Checks if this display item (or any children) contains text that might
* be rendered with subpixel antialiasing.
*/
virtual PRBool HasText() { return PR_FALSE; }
protected:
friend class nsDisplayList;
@ -1115,6 +1121,14 @@ public:
mPaint(mFrame, aCtx, mVisibleRect, ToReferenceFrame());
}
NS_DISPLAY_DECL_NAME(mName, mType)
virtual PRBool HasText() {
if (mType == nsDisplayItem::TYPE_HEADER_FOOTER) {
return PR_TRUE;
} else {
return PR_FALSE;
}
}
protected:
PaintCallback mPaint;
#ifdef DEBUG
@ -1467,6 +1481,8 @@ public:
return PR_FALSE;
}
NS_DISPLAY_DECL_NAME("WrapList", TYPE_WRAP_LIST)
virtual PRBool HasText();
virtual nsDisplayList* GetList() { return &mList; }
@ -1751,6 +1767,8 @@ public:
NS_DISPLAY_DECL_NAME("nsDisplayTransform", TYPE_TRANSFORM);
virtual PRBool HasText() { return mStoredList.HasText(); }
#ifdef NS_DEBUG
nsDisplayWrapList* GetStoredList() { return &mStoredList; }
#endif

View File

@ -202,6 +202,8 @@ public:
virtual void Paint(nsDisplayListBuilder* aBuilder,
nsIRenderingContext* aCtx);
NS_DISPLAY_DECL_NAME("Bullet", TYPE_BULLET)
virtual PRBool HasText() { return PR_TRUE; }
};
void nsDisplayBullet::Paint(nsDisplayListBuilder* aBuilder,

View File

@ -3977,6 +3977,8 @@ public:
virtual void Paint(nsDisplayListBuilder* aBuilder,
nsIRenderingContext* aCtx);
NS_DISPLAY_DECL_NAME("Text", TYPE_TEXT)
virtual PRBool HasText() { return PR_TRUE; }
};
void

View File

@ -2016,6 +2016,8 @@ public:
NS_DISPLAY_DECL_NAME("MathMLCharForeground", TYPE_MATHML_CHAR_FOREGROUND)
virtual PRBool HasText() { return PR_TRUE; }
private:
nsMathMLChar* mChar;
PRPackedBool mIsSelected;

View File

@ -346,6 +346,8 @@ public:
nsIRenderingContext* aCtx);
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder);
NS_DISPLAY_DECL_NAME("XULTextBox", TYPE_XUL_TEXT_BOX)
virtual PRBool HasText() { return PR_TRUE; }
};
void