diff options
Diffstat (limited to 'layout/painting/nsDisplayListInvalidation.h')
-rw-r--r-- | layout/painting/nsDisplayListInvalidation.h | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/layout/painting/nsDisplayListInvalidation.h b/layout/painting/nsDisplayListInvalidation.h new file mode 100644 index 0000000000..3e07713301 --- /dev/null +++ b/layout/painting/nsDisplayListInvalidation.h @@ -0,0 +1,236 @@ +/* -*- 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 NSDISPLAYLISTINVALIDATION_H_ +#define NSDISPLAYLISTINVALIDATION_H_ + +#include "mozilla/Attributes.h" +#include "mozilla/layers/WebRenderUserData.h" +#include "ImgDrawResult.h" +#include "nsRect.h" +#include "nsColor.h" +#include "gfxRect.h" +#include "mozilla/gfx/MatrixFwd.h" + +namespace mozilla { +class nsDisplayBackgroundImage; +class nsCharClipDisplayItem; +class nsDisplayItem; +class nsDisplayListBuilder; +class nsDisplayTableItem; +class nsDisplayThemedBackground; +class nsDisplayEffectsBase; +class nsDisplayMasksAndClipPaths; +class nsDisplayFilters; + +namespace gfx { +struct sRGBColor; +} + +/** + * This stores the geometry of an nsDisplayItem, and the area + * that will be affected when painting the item. + * + * It is used to retain information about display items so they + * can be compared against new display items in the next paint. + */ +class nsDisplayItemGeometry { + public: + nsDisplayItemGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder); + virtual ~nsDisplayItemGeometry(); + + /** + * Compute the area required to be invalidated if this + * display item is removed. + */ + const nsRect& ComputeInvalidationRegion() { return mBounds; } + + /** + * Shifts all retained areas of the nsDisplayItemGeometry by the given offset. + * + * This is used to compensate for scrolling, since the destination buffer + * can scroll without requiring a full repaint. + * + * @param aOffset Offset to shift by. + */ + virtual void MoveBy(const nsPoint& aOffset) { mBounds.MoveBy(aOffset); } + + /** + * Bounds of the display item + */ + nsRect mBounds; +}; + +/** + * A default geometry implementation, used by nsDisplayItem. Retains + * and compares the bounds, and border rect. + * + * This should be sufficient for the majority of display items. + */ +class nsDisplayItemGenericGeometry : public nsDisplayItemGeometry { + public: + nsDisplayItemGenericGeometry(nsDisplayItem* aItem, + nsDisplayListBuilder* aBuilder); + + void MoveBy(const nsPoint& aOffset) override; + + nsRect mBorderRect; +}; + +bool ShouldSyncDecodeImages(nsDisplayListBuilder* aBuilder); + +nsDisplayItemGeometry* GetPreviousGeometry(nsDisplayItem*); + +class nsDisplayItemBoundsGeometry : public nsDisplayItemGeometry { + public: + nsDisplayItemBoundsGeometry(nsDisplayItem* aItem, + nsDisplayListBuilder* aBuilder); + + bool mHasRoundedCorners; +}; + +class nsDisplayBorderGeometry : public nsDisplayItemGeometry { + public: + nsDisplayBorderGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder); +}; + +class nsDisplayBackgroundGeometry : public nsDisplayItemGeometry { + public: + nsDisplayBackgroundGeometry(nsDisplayBackgroundImage* aItem, + nsDisplayListBuilder* aBuilder); + + void MoveBy(const nsPoint& aOffset) override; + + nsRect mPositioningArea; + nsRect mDestRect; +}; + +class nsDisplayThemedBackgroundGeometry : public nsDisplayItemGeometry { + public: + nsDisplayThemedBackgroundGeometry(nsDisplayThemedBackground* aItem, + nsDisplayListBuilder* aBuilder); + + void MoveBy(const nsPoint& aOffset) override; + + nsRect mPositioningArea; + bool mWindowIsActive; +}; + +class nsDisplayTreeBodyGeometry : public nsDisplayItemGenericGeometry { + public: + nsDisplayTreeBodyGeometry(nsDisplayItem* aItem, + nsDisplayListBuilder* aBuilder, + bool aWindowIsActive) + : nsDisplayItemGenericGeometry(aItem, aBuilder), + mWindowIsActive(aWindowIsActive) {} + + bool mWindowIsActive = false; +}; + +class nsDisplayBoxShadowInnerGeometry : public nsDisplayItemGeometry { + public: + nsDisplayBoxShadowInnerGeometry(nsDisplayItem* aItem, + nsDisplayListBuilder* aBuilder); + + void MoveBy(const nsPoint& aOffset) override; + + nsRect mPaddingRect; +}; + +class nsDisplaySolidColorGeometry : public nsDisplayItemBoundsGeometry { + public: + nsDisplaySolidColorGeometry(nsDisplayItem* aItem, + nsDisplayListBuilder* aBuilder, nscolor aColor) + : nsDisplayItemBoundsGeometry(aItem, aBuilder), mColor(aColor) {} + + nscolor mColor; +}; + +class nsDisplaySolidColorRegionGeometry : public nsDisplayItemBoundsGeometry { + public: + nsDisplaySolidColorRegionGeometry(nsDisplayItem* aItem, + nsDisplayListBuilder* aBuilder, + const nsRegion& aRegion, + mozilla::gfx::sRGBColor aColor) + : nsDisplayItemBoundsGeometry(aItem, aBuilder), + mRegion(aRegion), + mColor(aColor) {} + + void MoveBy(const nsPoint& aOffset) override; + + nsRegion mRegion; + mozilla::gfx::sRGBColor mColor; +}; + +class nsDisplaySVGEffectGeometry : public nsDisplayItemGeometry { + public: + nsDisplaySVGEffectGeometry(nsDisplayEffectsBase* aItem, + nsDisplayListBuilder* aBuilder); + + void MoveBy(const nsPoint& aOffset) override; + + gfxRect mBBox; + gfxPoint mUserSpaceOffset; + nsPoint mFrameOffsetToReferenceFrame; + bool mHandleOpacity; +}; + +class nsDisplayMasksAndClipPathsGeometry : public nsDisplaySVGEffectGeometry { + public: + nsDisplayMasksAndClipPathsGeometry(nsDisplayMasksAndClipPaths* aItem, + nsDisplayListBuilder* aBuilder); + + nsTArray<nsRect> mDestRects; +}; + +class nsDisplayFiltersGeometry : public nsDisplaySVGEffectGeometry { + public: + nsDisplayFiltersGeometry(nsDisplayFilters* aItem, + nsDisplayListBuilder* aBuilder); +}; + +class nsDisplayTableItemGeometry : public nsDisplayItemGenericGeometry { + public: + nsDisplayTableItemGeometry(nsDisplayTableItem* aItem, + nsDisplayListBuilder* aBuilder, + const nsPoint& aFrameOffsetToViewport); + + nsPoint mFrameOffsetToViewport; +}; + +class nsDisplayOpacityGeometry : public nsDisplayItemGenericGeometry { + public: + nsDisplayOpacityGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder, + float aOpacity) + : nsDisplayItemGenericGeometry(aItem, aBuilder), mOpacity(aOpacity) {} + + float mOpacity; +}; + +class nsDisplayTransformGeometry : public nsDisplayItemGeometry { + public: + nsDisplayTransformGeometry(nsDisplayItem* aItem, + nsDisplayListBuilder* aBuilder, + const mozilla::gfx::Matrix4x4Flagged& aTransform, + int32_t aAppUnitsPerDevPixel) + : nsDisplayItemGeometry(aItem, aBuilder), + mTransform(aTransform), + mAppUnitsPerDevPixel(aAppUnitsPerDevPixel) {} + + void MoveBy(const nsPoint& aOffset) override { + nsDisplayItemGeometry::MoveBy(aOffset); + mTransform.PostTranslate( + NSAppUnitsToFloatPixels(aOffset.x, mAppUnitsPerDevPixel), + NSAppUnitsToFloatPixels(aOffset.y, mAppUnitsPerDevPixel), 0.0f); + } + + mozilla::gfx::Matrix4x4Flagged mTransform; + int32_t mAppUnitsPerDevPixel; +}; + +} // namespace mozilla + +#endif /*NSDISPLAYLISTINVALIDATION_H_*/ |