summaryrefslogtreecommitdiffstats
path: root/layout/painting/nsDisplayListInvalidation.h
diff options
context:
space:
mode:
Diffstat (limited to 'layout/painting/nsDisplayListInvalidation.h')
-rw-r--r--layout/painting/nsDisplayListInvalidation.h236
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_*/