diff options
Diffstat (limited to 'layout/painting/FrameLayerBuilder.h')
-rw-r--r-- | layout/painting/FrameLayerBuilder.h | 732 |
1 files changed, 732 insertions, 0 deletions
diff --git a/layout/painting/FrameLayerBuilder.h b/layout/painting/FrameLayerBuilder.h new file mode 100644 index 0000000000..8446ce634e --- /dev/null +++ b/layout/painting/FrameLayerBuilder.h @@ -0,0 +1,732 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef FRAMELAYERBUILDER_H_ +#define FRAMELAYERBUILDER_H_ + +#include <cstddef> // for size_t +#include <cstdint> // for uint32_t, UINT32_MAX, int32_t, uint64_t, uint8_t +#include <iosfwd> // for stringstream +#include <vector> // for vector +#include "DisplayItemClip.h" // for DisplayItemClip +#include "LayerState.h" // for LayerState +#include "LayerUserData.h" // for LayerUserData +#include "Units.h" // for LayerIntPoint, LayoutDeviceToLayerScale2D +#include "gfxPoint.h" // for gfxSize +#include "mozilla/AlreadyAddRefed.h" // for already_AddRefed +#include "mozilla/Assertions.h" // for AssertionConditionType, MOZ_ASSERT_HELPER2 +#include "mozilla/FunctionRef.h" // for FunctionRef +#include "mozilla/RefPtr.h" // for RefPtr +#include "mozilla/UniquePtr.h" // for UniquePtr +#include "mozilla/gfx/Matrix.h" // for Matrix, Matrix4x4 +#include "mozilla/gfx/Point.h" // for Size +#include "mozilla/layers/LayerManager.h" // for LayerManager, LayerManager::NONE, LayerManager::PaintedLayerCreationHint, LayerMetricsW... +#include "mozilla/layers/LayersTypes.h" // for DrawRegionClip, EventRegions +#include "nsColor.h" // for NS_RGBA, nscolor +#include "nsDebug.h" // for NS_WARNING +#include "nsDisplayItemTypes.h" // for DisplayItemType +#include "nsISupports.h" // for NS_INLINE_DECL_REFCOUNTING, NS_LOG_ADDREF, NS_LOG_RELEASE +#include "nsPoint.h" // for nsIntPoint +#include "nsRect.h" // for nsRect (ptr only), nsIntRect +#include "nsRegion.h" // for nsIntRegion, nsRegion +#include "nsTArray.h" // for AutoTArray, nsTArray_Impl +#include "nscore.h" // for nsrefcnt + +class gfxContext; +class nsDisplayItem; +class nsDisplayItemGeometry; +class nsDisplayList; +class nsDisplayListBuilder; +class nsDisplayMasksAndClipPaths; +class nsIFrame; +class nsPaintedDisplayItem; +class nsPresContext; +class nsRootPresContext; + +namespace mozilla { +struct ActiveScrolledRoot; +struct DisplayItemClipChain; +class TransformClipNode; +template <class T> +class Maybe; +template <typename T> +class SmallPointerArray; + +namespace layers { +class ContainerLayer; +class Layer; +class BasicLayerManager; +class PaintedLayer; +class ImageLayer; +struct LayerProperties; +} // namespace layers + +class FrameLayerBuilder; +class LayerManagerData; +class PaintedLayerData; +class ContainerState; +class PaintedDisplayItemLayerUserData; + +enum class DisplayItemEntryType : uint8_t { + Item, + PushOpacity, + PushOpacityWithBg, + PopOpacity, + PushTransform, + PopTransform, + HitTestInfo, +}; + +/** + * Retained data storage: + * + * Each layer manager (widget, and inactive) stores a LayerManagerData object + * that keeps a hash-set of DisplayItemData items that were drawn into it. + * Each frame also keeps a list of DisplayItemData pointers that were + * created for that frame. DisplayItemData objects manage these lists + * automatically. + * + * During layer construction we update the data in the LayerManagerData object, + * marking items that are modified. At the end we sweep the LayerManagerData + * hash-set and remove all items that haven't been modified. + */ + +/** + * Retained data for a display item. + */ +class DisplayItemData final { + public: + friend class FrameLayerBuilder; + friend class ContainerState; + + uint32_t GetDisplayItemKey() { return mDisplayItemKey; } + layers::Layer* GetLayer() const { return mLayer; } + nsDisplayItemGeometry* GetGeometry() const { return mGeometry.get(); } + const DisplayItemClip& GetClip() const { return mClip; } + void Invalidate() { mIsInvalid = true; } + void NotifyRemoved(); + void SetItem(nsPaintedDisplayItem* aItem) { mItem = aItem; } + nsPaintedDisplayItem* GetItem() const { return mItem; } + nsIFrame* FirstFrame() const { return mFrameList[0]; } + layers::BasicLayerManager* InactiveManager() const { + return mInactiveManager; + } + + bool HasMergedFrames() const { return mFrameList.Length() > 1; } + + static DisplayItemData* AssertDisplayItemData(DisplayItemData* aData); + + void* operator new(size_t sz, nsPresContext* aPresContext); + + nsrefcnt AddRef() { + if (mRefCnt == UINT32_MAX) { + NS_WARNING("refcount overflow, leaking object"); + return mRefCnt; + } + ++mRefCnt; + NS_LOG_ADDREF(this, mRefCnt, "DisplayItemData", sizeof(DisplayItemData)); + return mRefCnt; + } + + nsrefcnt Release() { + if (mRefCnt == UINT32_MAX) { + NS_WARNING("refcount overflow, leaking object"); + return mRefCnt; + } + --mRefCnt; + NS_LOG_RELEASE(this, mRefCnt, "DisplayItemData"); + if (mRefCnt == 0) { + Destroy(); + return 0; + } + return mRefCnt; + } + + RefPtr<TransformClipNode> mTransform; + RefPtr<TransformClipNode> mOldTransform; + + private: + DisplayItemData(LayerManagerData* aParent, uint32_t aKey, + layers::Layer* aLayer, nsIFrame* aFrame = nullptr); + + /** + * Removes any references to this object from frames + * in mFrameList. + */ + ~DisplayItemData(); + + void Destroy(); + + /** + * Associates this DisplayItemData with a frame, and adds it + * to the LayerManagerDataProperty list on the frame. + */ + void AddFrame(nsIFrame* aFrame); + void RemoveFrame(nsIFrame* aFrame); + const nsRegion& GetChangedFrameInvalidations(); + + /** + * Updates the contents of this item to a new set of data, instead of + * allocating a new object. Set the passed in parameters, and clears the opt + * layer and inactive manager. Parent, and display item key are assumed to be + * the same. + * + * EndUpdate must be called before the end of the transaction to complete the + * update. + */ + void BeginUpdate(layers::Layer* aLayer, LayerState aState, bool aFirstUpdate, + nsPaintedDisplayItem* aItem = nullptr); + void BeginUpdate(layers::Layer* aLayer, LayerState aState, + nsPaintedDisplayItem* aItem, bool aIsReused, bool aIsMerged); + + /** + * Completes the update of this, and removes any references to data that won't + * live longer than the transaction. + * + * Updates the geometry, frame list and clip. + * For items within a PaintedLayer, a geometry object must be specified to + * retain until the next transaction. + * + */ + void EndUpdate(mozilla::UniquePtr<nsDisplayItemGeometry>&& aGeometry); + void EndUpdate(); + + uint32_t mRefCnt; + LayerManagerData* mParent; + RefPtr<layers::Layer> mLayer; + RefPtr<layers::Layer> mOptLayer; + RefPtr<layers::BasicLayerManager> mInactiveManager; + AutoTArray<nsIFrame*, 1> mFrameList; + mozilla::UniquePtr<nsDisplayItemGeometry> mGeometry; + DisplayItemClip mClip; + uint32_t mDisplayItemKey; + LayerState mLayerState; + + /** + * Temporary stoarage of the display item being referenced, only valid between + * BeginUpdate and EndUpdate. + */ + nsPaintedDisplayItem* mItem; + nsRegion mChangedFrameInvalidations; + + /** + * Used to track if data currently stored in mFramesWithLayers (from an + * existing paint) has been updated in the current paint. + */ + bool mUsed; + bool mIsInvalid; + bool mReusedItem; +}; + +class RefCountedRegion { + private: + ~RefCountedRegion() = default; + + public: + NS_INLINE_DECL_REFCOUNTING(RefCountedRegion) + + RefCountedRegion() : mIsInfinite(false) {} + nsRegion mRegion; + bool mIsInfinite; +}; + +struct AssignedDisplayItem; + +struct ContainerLayerParameters { + ContainerLayerParameters() + : mXScale(1), + mYScale(1), + mLayerContentsVisibleRect(nullptr), + mBackgroundColor(NS_RGBA(0, 0, 0, 0)), + mScrollMetadataASR(nullptr), + mCompositorASR(nullptr), + mInTransformedSubtree(false), + mInActiveTransformedSubtree(false), + mDisableSubpixelAntialiasingInDescendants(false), + mLayerCreationHint(layers::LayerManager::NONE) {} + ContainerLayerParameters(float aXScale, float aYScale) + : mXScale(aXScale), + mYScale(aYScale), + mLayerContentsVisibleRect(nullptr), + mItemVisibleRect(nullptr), + mBackgroundColor(NS_RGBA(0, 0, 0, 0)), + mScrollMetadataASR(nullptr), + mCompositorASR(nullptr), + mInTransformedSubtree(false), + mInActiveTransformedSubtree(false), + mDisableSubpixelAntialiasingInDescendants(false), + mLayerCreationHint(layers::LayerManager::NONE) {} + ContainerLayerParameters(float aXScale, float aYScale, + const nsIntPoint& aOffset, + const ContainerLayerParameters& aParent) + : mXScale(aXScale), + mYScale(aYScale), + mLayerContentsVisibleRect(nullptr), + mItemVisibleRect(nullptr), + mOffset(aOffset), + mBackgroundColor(aParent.mBackgroundColor), + mScrollMetadataASR(aParent.mScrollMetadataASR), + mCompositorASR(aParent.mCompositorASR), + mInTransformedSubtree(aParent.mInTransformedSubtree), + mInActiveTransformedSubtree(aParent.mInActiveTransformedSubtree), + mDisableSubpixelAntialiasingInDescendants( + aParent.mDisableSubpixelAntialiasingInDescendants), + mLayerCreationHint(aParent.mLayerCreationHint) {} + + float mXScale, mYScale; + + LayoutDeviceToLayerScale2D Scale() const { + return LayoutDeviceToLayerScale2D(mXScale, mYScale); + } + + /** + * If non-null, the rectangle in which BuildContainerLayerFor stores the + * visible rect of the layer, in the coordinate system of the created layer. + */ + nsIntRect* mLayerContentsVisibleRect; + + /** + * If non-null, the rectangle which stores the item's visible rect. + */ + nsRect* mItemVisibleRect; + + /** + * An offset to apply to all child layers created. + */ + nsIntPoint mOffset; + + LayerIntPoint Offset() const { + return LayerIntPoint::FromUnknownPoint(mOffset); + } + + nscolor mBackgroundColor; + const ActiveScrolledRoot* mScrollMetadataASR; + const ActiveScrolledRoot* mCompositorASR; + + bool mInTransformedSubtree; + bool mInActiveTransformedSubtree; + bool mDisableSubpixelAntialiasingInDescendants; + layers::LayerManager::PaintedLayerCreationHint mLayerCreationHint; + + /** + * When this is false, PaintedLayer coordinates are drawn to with an integer + * translation and the scale in mXScale/mYScale. + */ + bool AllowResidualTranslation() { + // If we're in a transformed subtree, but no ancestor transform is actively + // changing, we'll use the residual translation when drawing into the + // PaintedLayer to ensure that snapping exactly matches the ideal transform. + return mInTransformedSubtree && !mInActiveTransformedSubtree; + } +}; + +/** + * The FrameLayerBuilder is responsible for converting display lists + * into layer trees. Every LayerManager needs a unique FrameLayerBuilder + * to build layers. + * + * The most important API in this class is BuildContainerLayerFor. This + * method takes a display list as input and constructs a ContainerLayer + * with child layers that render the contents of the display list. It + * records the relationship between frames and layers. + * + * That data enables us to retain layer trees. When constructing a + * ContainerLayer, we first check to see if there's an existing + * ContainerLayer for the same frame that can be recycled. If we recycle + * it, we also try to reuse its existing PaintedLayer children to render + * the display items without layers of their own. The idea is that by + * recycling layers deterministically, we can ensure that when nothing + * changes in a display list, we will reuse the existing layers without + * changes. + * + * We expose a GetLeafLayerFor method that can be called by display items + * that make their own layers (e.g. canvas and video); this method + * locates the last layer used to render the display item, if any, and + * return it as a candidate for recycling. + * + * FrameLayerBuilder sets up PaintedLayers so that 0,0 in the Painted layer + * corresponds to the (pixel-snapped) top-left of the aAnimatedGeometryRoot. + * It sets up ContainerLayers so that 0,0 in the container layer + * corresponds to the snapped top-left of the display item reference frame. + * + * When we construct a container layer, we know the transform that will be + * applied to the layer. If the transform scales the content, we can get + * better results when intermediate buffers are used by pushing some scale + * from the container's transform down to the children. For PaintedLayer + * children, the scaling can be achieved by changing the size of the layer + * and drawing into it with increased or decreased resolution. By convention, + * integer types (nsIntPoint/nsIntSize/nsIntRect/nsIntRegion) are all in layer + * coordinates, post-scaling, whereas appunit types are all pre-scaling. + */ +class FrameLayerBuilder : public layers::LayerUserData { + public: + typedef layers::ContainerLayer ContainerLayer; + typedef layers::Layer Layer; + typedef layers::PaintedLayer PaintedLayer; + typedef layers::ImageLayer ImageLayer; + typedef layers::LayerManager LayerManager; + typedef layers::BasicLayerManager BasicLayerManager; + typedef layers::EventRegions EventRegions; + + FrameLayerBuilder(); + ~FrameLayerBuilder() override; + + static gfx::Size ChooseScale(nsIFrame* aContainerFrame, + nsDisplayItem* aContainerItem, + const nsRect& aVisibleRect, float aXScale, + float aYScale, const gfx::Matrix& aTransform2d, + bool aCanDraw2D); + + static void Shutdown(); + + void Init(nsDisplayListBuilder* aBuilder, LayerManager* aManager, + PaintedLayerData* aLayerData = nullptr, + bool aIsInactiveLayerManager = false, + const DisplayItemClip* aInactiveLayerClip = nullptr); + + /** + * Call this to notify that we have just started a transaction on the + * retained layer manager aManager. + */ + void DidBeginRetainedLayerTransaction(LayerManager* aManager); + + /** + * Call this just before we end a transaction. + */ + void WillEndTransaction(); + + /** + * Call this after we end a transaction. + */ + void DidEndTransaction(); + + enum { + /** + * Set this when pulling an opaque background color from behind the + * container layer into the container doesn't change the visual results, + * given the effects you're going to apply to the container layer. + * For example, this is compatible with opacity or clipping/masking, but + * not with non-OVER blend modes or filters. + */ + CONTAINER_ALLOW_PULL_BACKGROUND_COLOR = 0x01 + }; + /** + * Build a container layer for a display item that contains a child + * list, either reusing an existing one or creating a new one. It + * sets the container layer children to layers which together render + * the contents of the display list. It reuses existing layers from + * the retained layer manager if possible. + * aContainerItem may be null, in which case we construct a root layer. + * This gets called by display list code. It calls BuildLayer on the + * items in the display list, making items with their own layers + * children of the new container, and assigning all other items to + * PaintedLayer children created and managed by the FrameLayerBuilder. + * Returns a layer with clip rect cleared; it is the + * caller's responsibility to add any clip rect. The visible region + * is set based on what's in the layer. + * The container layer is transformed by aTransform (if non-null), and + * the result is transformed by the scale factors in aContainerParameters. + * aChildren is modified due to display item merging and flattening. + * The visible region of the returned layer is set only if aContainerItem + * is null. + */ + already_AddRefed<ContainerLayer> BuildContainerLayerFor( + nsDisplayListBuilder* aBuilder, LayerManager* aManager, + nsIFrame* aContainerFrame, nsDisplayItem* aContainerItem, + nsDisplayList* aChildren, + const ContainerLayerParameters& aContainerParameters, + const gfx::Matrix4x4* aTransform, uint32_t aFlags = 0); + + /** + * Get a retained layer for a display item that needs to create its own + * layer for rendering (i.e. under nsDisplayItem::BuildLayer). Returns + * null if no retained layer is available, which usually means that this + * display item didn't have a layer before so the caller will + * need to create one. + * Returns a layer with clip rect cleared; it is the + * caller's responsibility to add any clip rect and set the visible + * region. + */ + Layer* GetLeafLayerFor(nsDisplayListBuilder* aBuilder, nsDisplayItem* aItem); + + /** + * Call this to force all retained layers to be discarded and recreated at + * the next paint. + */ + static void InvalidateAllLayers(LayerManager* aManager); + static void InvalidateAllLayersForFrame(nsIFrame* aFrame); + + /** + * Call this to determine if a frame has a dedicated (non-Painted) layer + * for the given display item key. If there isn't one, we return null, + * otherwise we return the layer. + */ + static Layer* GetDedicatedLayer(nsIFrame* aFrame, + DisplayItemType aDisplayItemType); + + using AnimationGenerationCallback = FunctionRef<bool( + const Maybe<uint64_t>& aGeneration, DisplayItemType aDisplayItemType)>; + /** + * Enumerates layers for the all display item types that correspond to + * properties we can animate on layers and calls |aCallback| + * with the animation generation for the layer. If there is no corresponding + * layer for the display item or the layer has no animation, the animation + * generation is Nothing(). + * + * The enumeration stops if |aCallback| returns false. + */ + static void EnumerateGenerationForDedicatedLayers( + const nsIFrame* aFrame, AnimationGenerationCallback); + + /** + * This callback must be provided to EndTransaction. The callback data + * must be the nsDisplayListBuilder containing this FrameLayerBuilder. + * This function can be called multiple times in a row to draw + * different regions. This will occur when, for example, progressive paint is + * enabled. In these cases aDirtyRegion can be used to specify a larger region + * than aRegionToDraw that will be drawn during the transaction, possibly + * allowing the callback to make optimizations. + */ + static void DrawPaintedLayer(PaintedLayer* aLayer, gfxContext* aContext, + const nsIntRegion& aRegionToDraw, + const nsIntRegion& aDirtyRegion, + mozilla::layers::DrawRegionClip aClip, + const nsIntRegion& aRegionToInvalidate, + void* aCallbackData); + + /** + * Dumps this FrameLayerBuilder's retained layer manager's retained + * layer tree. Defaults to dumping to stdout in non-HTML format. + */ + static void DumpRetainedLayerTree(LayerManager* aManager, + std::stringstream& aStream, + bool aDumpHtml = false); + + /** + * Returns the most recently allocated geometry item for the given display + * item. + * + * XXX(seth): The current implementation must iterate through all display + * items allocated for this display item's frame. This may lead to O(n^2) + * behavior in some situations. + */ + static nsDisplayItemGeometry* GetMostRecentGeometry(nsDisplayItem* aItem); + + /******* PRIVATE METHODS to FrameLayerBuilder.cpp ********/ + /* These are only in the public section because they need + * to be called by file-scope helper functions in FrameLayerBuilder.cpp. + */ + + /** + * Record aItem as a display item that is rendered by the PaintedLayer + * aLayer, with aClipRect, where aContainerLayerFrame is the frame + * for the container layer this ThebesItem belongs to. + * aItem must have an underlying frame. + * @param aTopLeft offset from active scrolled root to reference frame + */ + void AddPaintedDisplayItem(PaintedLayerData* aLayerData, + AssignedDisplayItem& aAssignedDisplayItem, + Layer* aLayer); + + /** + * Calls GetOldLayerForFrame on the underlying frame of the display item, + * and each subsequent merged frame if no layer is found for the underlying + * frame. + */ + Layer* GetOldLayerFor(nsDisplayItem* aItem, + nsDisplayItemGeometry** aOldGeometry = nullptr, + DisplayItemClip** aOldClip = nullptr); + + static DisplayItemData* GetOldDataFor(nsDisplayItem* aItem); + + /** + * Destroy any stored LayerManagerDataProperty and the associated data for + * aFrame. + */ + static void DestroyDisplayItemDataFor(nsIFrame* aFrame); + + LayerManager* GetRetainingLayerManager() { return mRetainingManager; } + + /** + * Returns true if the given display item was rendered during the previous + * paint. Returns false otherwise. + */ + static bool HasRetainedDataFor(nsIFrame* aFrame, uint32_t aDisplayItemKey); + + typedef void (*DisplayItemDataCallback)(nsIFrame* aFrame, + DisplayItemData* aItem); + + /** + * Return the resolution at which we expect to render aFrame's contents, + * assuming they are being painted to retained layers. This takes into account + * the resolution the contents of the ContainerLayer containing aFrame are + * being rendered at, as well as any currently-inactive transforms between + * aFrame and that container layer. + */ + static gfxSize GetPaintedLayerScaleForFrame(nsIFrame* aFrame); + + static void RemoveFrameFromLayerManager( + const nsIFrame* aFrame, SmallPointerArray<DisplayItemData>& aArray); + + /** + * Given a frame and a display item key that uniquely identifies a + * display item for the frame, find the layer that was last used to + * render that display item. Returns null if there is no such layer. + * This could be a dedicated layer for the display item, or a PaintedLayer + * that renders many display items. + */ + DisplayItemData* GetOldLayerForFrame( + nsIFrame* aFrame, uint32_t aDisplayItemKey, + DisplayItemData* aOldData = nullptr, + LayerManager* aOldLayerManager = nullptr); + + /** + * Stores DisplayItemData associated with aFrame, stores the data in + * mNewDisplayItemData. + */ + DisplayItemData* StoreDataForFrame(nsPaintedDisplayItem* aItem, Layer* aLayer, + LayerState aState, DisplayItemData* aData); + void StoreDataForFrame(nsIFrame* aFrame, uint32_t aDisplayItemKey, + Layer* aLayer, LayerState aState); + + protected: + friend class LayerManagerData; + + // Flash the area within the context clip if paint flashing is enabled. + static void FlashPaint(gfxContext* aContext); + + /* + * Get the DisplayItemData array associated with this frame, or null if one + * doesn't exist. + * + * Note that the pointer returned here is only valid so long as you don't + * poke the LayerManagerData's mFramesWithLayers hashtable. + */ + DisplayItemData* GetDisplayItemData(nsIFrame* aFrame, uint32_t aKey); + + /* + * Get the DisplayItemData associated with this display item, + * using the LayerManager instead of FrameLayerBuilder. + */ + static DisplayItemData* GetDisplayItemDataForManager( + nsPaintedDisplayItem* aItem, LayerManager* aManager); + + /** + * We store one of these for each display item associated with a + * PaintedLayer, in a hashtable that maps each PaintedLayer to an array + * of ClippedDisplayItems. (PaintedLayerItemsEntry is the hash entry + * for that hashtable.) + * These are only stored during the paint process, so that the + * DrawPaintedLayer callback can figure out which items to draw for the + * PaintedLayer. + */ + + static void RecomputeVisibilityForItems( + std::vector<AssignedDisplayItem>& aItems, nsDisplayListBuilder* aBuilder, + const nsIntRegion& aRegionToDraw, nsRect& aPreviousRectToDraw, + const nsIntPoint& aOffset, int32_t aAppUnitsPerDevPixel, float aXScale, + float aYScale); + + void PaintItems(std::vector<AssignedDisplayItem>& aItems, + const nsIntRect& aRect, gfxContext* aContext, + nsDisplayListBuilder* aBuilder, nsPresContext* aPresContext, + const nsIntPoint& aOffset, float aXScale, float aYScale); + + /** + * We accumulate ClippedDisplayItem elements in a hashtable during + * the paint process. This is the hashentry for that hashtable. + */ + public: + /** + * Add the PaintedDisplayItemLayerUserData object as being used in this + * transaction so that we do some end-of-paint maintenance on it. + */ + void AddPaintedLayerItemsEntry(PaintedDisplayItemLayerUserData* aData); + + PaintedLayerData* GetContainingPaintedLayerData() { + return mContainingPaintedLayer; + } + + const DisplayItemClip* GetInactiveLayerClip() const { + return mInactiveLayerClip; + } + + /* + * If we're building layers for an item with an inactive layer tree, + * this function saves the item's clip, which will later be applied + * to the event regions. The clip should be relative to + * mContainingPaintedLayer->mReferenceFrame. + */ + void SetInactiveLayerClip(const DisplayItemClip* aClip) { + mInactiveLayerClip = aClip; + } + + bool IsBuildingRetainedLayers() { + return !mIsInactiveLayerManager && mRetainingManager; + } + + /** + * Attempt to build the most compressed layer tree possible, even if it means + * throwing away existing retained buffers. + */ + void SetLayerTreeCompressionMode() { mInLayerTreeCompressionMode = true; } + bool CheckInLayerTreeCompressionMode(); + + void ComputeGeometryChangeForItem(DisplayItemData* aData); + + // Defined and used only in dom/base/nsDOMWindowUtils.cpp + template <class T> + static T* GetDebugSingleOldLayerForFrame(nsIFrame* aFrame); + + protected: + /** + * The layer manager belonging to the widget that is being retained + * across paints. + */ + LayerManager* mRetainingManager; + /** + * The root prescontext for the display list builder reference frame + */ + RefPtr<nsRootPresContext> mRootPresContext; + + /** + * The display list builder being used. + */ + nsDisplayListBuilder* mDisplayListBuilder; + /** + * An array of PaintedLayer user data objects containing the + * list of display items (plus clipping data) to be rendered in the + * layer. We clean these up at the end of the transaction to + * remove references to display items. + */ + AutoTArray<RefPtr<PaintedDisplayItemLayerUserData>, 5> mPaintedLayerItems; + + /** + * When building layers for an inactive layer, this is where the + * inactive layer will be placed. + */ + PaintedLayerData* mContainingPaintedLayer; + + /** + * When building layers for an inactive layer, this stores the clip + * of the display item that built the inactive layer. + */ + const DisplayItemClip* mInactiveLayerClip; + + /** + * Indicates that the entire layer tree should be rerendered + * during this paint. + */ + bool mInvalidateAllLayers; + + bool mInLayerTreeCompressionMode; + + bool mIsInactiveLayerManager; +}; + +} // namespace mozilla + +#endif /* FRAMELAYERBUILDER_H_ */ |