Bug 1404181 - Part 7: Add a way to check if existing painted items might need to be redrawn for a sync decode. r?mstange
MozReview-Commit-ID: 98qxakaKolI
--- a/layout/generic/nsBulletFrame.cpp
+++ b/layout/generic/nsBulletFrame.cpp
@@ -183,16 +183,21 @@ public:
nsDisplayBulletGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder)
: nsDisplayItemGenericGeometry(aItem, aBuilder)
, nsImageGeometryMixin(aItem, aBuilder)
{
nsBulletFrame* f = static_cast<nsBulletFrame*>(aItem->Frame());
mOrdinal = f->GetOrdinal();
}
+ virtual bool InvalidateForSyncDecodeImages() const override
+ {
+ return ShouldInvalidateToSyncDecodeImages();
+ }
+
int32_t mOrdinal;
};
class BulletRenderer final
{
public:
BulletRenderer(imgIContainer* image, const nsRect& dest)
: mImage(image)
--- a/layout/generic/nsPluginFrame.cpp
+++ b/layout/generic/nsPluginFrame.cpp
@@ -910,16 +910,21 @@ public:
}
LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
const ContainerLayerParameters& aParameters) override
{
return LAYER_ACTIVE;
}
+
+ virtual nsDisplayItemGeometry* AllocateGeometry(nsDisplayListBuilder* aBuilder) override
+ {
+ return new nsDisplayPluginGeometry(this, aBuilder);
+ }
};
static nsRect
GetDisplayItemBounds(nsDisplayListBuilder* aBuilder,
const nsDisplayItem* aItem,
nsIFrame* aFrame)
{
// XXX For slightly more accurate region computations we should pixel-snap this
--- a/layout/generic/nsPluginFrame.h
+++ b/layout/generic/nsPluginFrame.h
@@ -343,16 +343,31 @@ private:
// plugins we register on the root PresContext.
// This is only non-null while we have a plugin registered for geometry
// updates.
RefPtr<nsRootPresContext> mRootPresContextRegisteredWith;
mozilla::UniquePtr<PluginFrameDidCompositeObserver> mDidCompositeObserver;
};
+class nsDisplayPluginGeometry : public nsDisplayItemGenericGeometry
+{
+public:
+ nsDisplayPluginGeometry(nsDisplayItem *aItem, nsDisplayListBuilder* aBuilder)
+ : nsDisplayItemGenericGeometry(aItem, aBuilder)
+ {}
+
+ // Plugins MozPaintWait event depends on sync decode, so we always want
+ // to rebuild the display list when sync decoding.
+ virtual bool InvalidateForSyncDecodeImages() const override
+ {
+ return true;
+ }
+};
+
class nsDisplayPlugin : public nsDisplayItem {
public:
nsDisplayPlugin(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame)
: nsDisplayItem(aBuilder, aFrame)
{
MOZ_COUNT_CTOR(nsDisplayPlugin);
aBuilder->SetContainsPluginItem();
}
@@ -386,16 +401,21 @@ public:
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
const ContainerLayerParameters& aParameters) override
{
return static_cast<nsPluginFrame*>(mFrame)->GetLayerState(aBuilder,
aManager);
}
+ virtual nsDisplayItemGeometry* AllocateGeometry(nsDisplayListBuilder* aBuilder) override
+ {
+ return new nsDisplayPluginGeometry(this, aBuilder);
+ }
+
virtual bool CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
mozilla::wr::IpcResourceUpdateQueue& aResources,
const StackingContextHelper& aSc,
mozilla::layers::WebRenderLayerManager* aManager,
nsDisplayListBuilder* aDisplayListBuilder) override;
};
#endif /* nsPluginFrame_h___ */
--- a/layout/painting/nsDisplayListInvalidation.h
+++ b/layout/painting/nsDisplayListInvalidation.h
@@ -56,16 +56,21 @@ public:
*
* @param aOffset Offset to shift by.
*/
virtual void MoveBy(const nsPoint& aOffset)
{
mBounds.MoveBy(aOffset);
}
+ virtual bool InvalidateForSyncDecodeImages() const
+ {
+ return false;
+ }
+
/**
* Bounds of the display item
*/
nsRect mBounds;
};
/**
* A default geometry implementation, used by nsDisplayItem. Retains
@@ -165,16 +170,21 @@ class nsDisplayItemGenericImageGeometry
, public nsImageGeometryMixin<nsDisplayItemGenericImageGeometry>
{
public:
nsDisplayItemGenericImageGeometry(nsDisplayItem* aItem,
nsDisplayListBuilder* aBuilder)
: nsDisplayItemGenericGeometry(aItem, aBuilder)
, nsImageGeometryMixin(aItem, aBuilder)
{ }
+
+ virtual bool InvalidateForSyncDecodeImages() const override
+ {
+ return ShouldInvalidateToSyncDecodeImages();
+ }
};
class nsDisplayItemBoundsGeometry : public nsDisplayItemGeometry
{
public:
nsDisplayItemBoundsGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder);
bool mHasRoundedCorners;
@@ -184,28 +194,38 @@ class nsDisplayBorderGeometry
: public nsDisplayItemGeometry
, public nsImageGeometryMixin<nsDisplayBorderGeometry>
{
public:
nsDisplayBorderGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder);
virtual void MoveBy(const nsPoint& aOffset) override;
+ virtual bool InvalidateForSyncDecodeImages() const override
+ {
+ return ShouldInvalidateToSyncDecodeImages();
+ }
+
nsRect mContentRect;
};
class nsDisplayBackgroundGeometry
: public nsDisplayItemGeometry
, public nsImageGeometryMixin<nsDisplayBackgroundGeometry>
{
public:
nsDisplayBackgroundGeometry(nsDisplayBackgroundImage* aItem, nsDisplayListBuilder* aBuilder);
virtual void MoveBy(const nsPoint& aOffset) override;
+ virtual bool InvalidateForSyncDecodeImages() const override
+ {
+ return ShouldInvalidateToSyncDecodeImages();
+ }
+
nsRect mPositioningArea;
nsRect mDestRect;
};
class nsDisplayThemedBackgroundGeometry : public nsDisplayItemGeometry
{
public:
nsDisplayThemedBackgroundGeometry(nsDisplayThemedBackground* aItem, nsDisplayListBuilder* aBuilder);
@@ -281,25 +301,35 @@ public:
};
class nsDisplayMaskGeometry : public nsDisplaySVGEffectGeometry
, public nsImageGeometryMixin<nsDisplayMaskGeometry>
{
public:
nsDisplayMaskGeometry(nsDisplayMask* aItem, nsDisplayListBuilder* aBuilder);
+ virtual bool InvalidateForSyncDecodeImages() const override
+ {
+ return ShouldInvalidateToSyncDecodeImages();
+ }
+
nsTArray<nsRect> mDestRects;
};
class nsDisplayFilterGeometry : public nsDisplaySVGEffectGeometry
, public nsImageGeometryMixin<nsDisplayFilterGeometry>
{
public:
nsDisplayFilterGeometry(nsDisplayFilter* aItem,
nsDisplayListBuilder* aBuilder);
+
+ virtual bool InvalidateForSyncDecodeImages() const override
+ {
+ return ShouldInvalidateToSyncDecodeImages();
+ }
};
class nsCharClipGeometry : public nsDisplayItemGenericGeometry
{
public:
nsCharClipGeometry(nsCharClipDisplayItem* aItem,
nsDisplayListBuilder* aBuilder);
@@ -311,12 +341,17 @@ class nsDisplayTableItemGeometry
: public nsDisplayItemGenericGeometry
, public nsImageGeometryMixin<nsDisplayTableItemGeometry>
{
public:
nsDisplayTableItemGeometry(nsDisplayTableItem* aItem,
nsDisplayListBuilder* aBuilder,
const nsPoint& aFrameOffsetToViewport);
+ virtual bool InvalidateForSyncDecodeImages() const override
+ {
+ return ShouldInvalidateToSyncDecodeImages();
+ }
+
nsPoint mFrameOffsetToViewport;
};
#endif /*NSDISPLAYLISTINVALIDATION_H_*/