Bug 1270023 - Make nsDisplayBullet respect DisableComponentAlpha(). r?mattwoodrow
MozReview-Commit-ID: BlPpm24Knwc
--- a/layout/generic/nsBulletFrame.cpp
+++ b/layout/generic/nsBulletFrame.cpp
@@ -183,18 +183,20 @@ public:
mOrdinal = f->GetOrdinal();
}
int32_t mOrdinal;
};
class nsDisplayBullet final : public nsDisplayItem {
public:
- nsDisplayBullet(nsDisplayListBuilder* aBuilder, nsBulletFrame* aFrame) :
- nsDisplayItem(aBuilder, aFrame) {
+ nsDisplayBullet(nsDisplayListBuilder* aBuilder, nsBulletFrame* aFrame)
+ : nsDisplayItem(aBuilder, aFrame)
+ , mDisableSubpixelAA(false)
+ {
MOZ_COUNT_CTOR(nsDisplayBullet);
}
#ifdef NS_BUILD_REFCNT_LOGGING
virtual ~nsDisplayBullet() {
MOZ_COUNT_DTOR(nsDisplayBullet);
}
#endif
@@ -214,16 +216,20 @@ public:
NS_DISPLAY_DECL_NAME("Bullet", TYPE_BULLET)
virtual nsRect GetComponentAlphaBounds(nsDisplayListBuilder* aBuilder) override
{
bool snap;
return GetBounds(aBuilder, &snap);
}
+ virtual void DisableComponentAlpha() override {
+ mDisableSubpixelAA = true;
+ }
+
virtual nsDisplayItemGeometry* AllocateGeometry(nsDisplayListBuilder* aBuilder) override
{
return new nsDisplayBulletGeometry(this, aBuilder);
}
virtual void ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder,
const nsDisplayItemGeometry* aGeometry,
nsRegion *aInvalidRegion) override
@@ -241,28 +247,32 @@ public:
if (aBuilder->ShouldSyncDecodeImages() && image &&
geometry->ShouldInvalidateToSyncDecodeImages()) {
bool snap;
aInvalidRegion->Or(*aInvalidRegion, GetBounds(aBuilder, &snap));
}
return nsDisplayItem::ComputeInvalidationRegion(aBuilder, aGeometry, aInvalidRegion);
}
+
+protected:
+ bool mDisableSubpixelAA;
};
void nsDisplayBullet::Paint(nsDisplayListBuilder* aBuilder,
nsRenderingContext* aCtx)
{
uint32_t flags = imgIContainer::FLAG_NONE;
if (aBuilder->ShouldSyncDecodeImages()) {
flags |= imgIContainer::FLAG_SYNC_DECODE;
}
DrawResult result = static_cast<nsBulletFrame*>(mFrame)->
- PaintBullet(*aCtx, ToReferenceFrame(), mVisibleRect, flags);
+ PaintBullet(*aCtx, ToReferenceFrame(), mVisibleRect, flags,
+ mDisableSubpixelAA);
nsDisplayBulletGeometry::UpdateDrawResult(this, result);
}
void
nsBulletFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
const nsRect& aDirtyRect,
const nsDisplayListSet& aLists)
@@ -273,17 +283,18 @@ nsBulletFrame::BuildDisplayList(nsDispla
DO_GLOBAL_REFLOW_COUNT_DSP("nsBulletFrame");
aLists.Content()->AppendNewToTop(
new (aBuilder) nsDisplayBullet(aBuilder, this));
}
DrawResult
nsBulletFrame::PaintBullet(nsRenderingContext& aRenderingContext, nsPoint aPt,
- const nsRect& aDirtyRect, uint32_t aFlags)
+ const nsRect& aDirtyRect, uint32_t aFlags,
+ bool aDisableSubpixelAA)
{
const nsStyleList* myList = StyleList();
CounterStyle* listStyleType = myList->GetCounterStyle();
nsMargin padding = mPadding.GetPhysicalMargin(GetWritingMode());
if (myList->GetListStyleImage() && mImageRequest) {
uint32_t status;
mImageRequest->GetImageStatus(&status);
@@ -403,16 +414,19 @@ nsBulletFrame::PaintBullet(nsRenderingCo
}
RefPtr<Path> path = builder->Finish();
drawTarget->Fill(path, color);
}
break;
default:
{
+ DrawTargetAutoDisableSubpixelAntialiasing
+ disable(aRenderingContext.GetDrawTarget(), aDisableSubpixelAA);
+
aRenderingContext.ThebesContext()->SetColor(
Color::FromABGR(nsLayoutUtils::GetColor(this, eCSSProperty_color)));
RefPtr<nsFontMetrics> fm =
nsLayoutUtils::GetFontMetricsForFrame(this, GetFontSizeInflation());
nsAutoString text;
GetListItemText(text);
WritingMode wm = GetWritingMode();
--- a/layout/generic/nsBulletFrame.h
+++ b/layout/generic/nsBulletFrame.h
@@ -92,17 +92,18 @@ public:
int32_t aIncrement);
/* get list item text, with prefix & suffix */
void GetListItemText(nsAString& aResult);
void GetSpokenText(nsAString& aText);
DrawResult PaintBullet(nsRenderingContext& aRenderingContext, nsPoint aPt,
- const nsRect& aDirtyRect, uint32_t aFlags);
+ const nsRect& aDirtyRect, uint32_t aFlags,
+ bool aDisableSubpixelAA);
virtual bool IsEmpty() override;
virtual bool IsSelfEmpty() override;
virtual nscoord GetLogicalBaseline(mozilla::WritingMode aWritingMode) const override;
float GetFontSizeInflation() const;
bool HasFontSizeInflation() const {
return (GetStateBits() & BULLET_FRAME_HAS_FONT_INFLATION) != 0;