diff -r 000000000000 -r 6474c204b198 layout/base/nsDisplayListInvalidation.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layout/base/nsDisplayListInvalidation.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,133 @@ +/*-*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * 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 "nsRect.h" +#include "nsColor.h" + +class nsDisplayItem; +class nsDisplayListBuilder; +class nsDisplayBackgroundImage; +class nsDisplayThemedBackground; + +/** + * 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) = 0; + + /** + * 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); + + virtual void MoveBy(const nsPoint& aOffset) MOZ_OVERRIDE; + + nsRect mBorderRect; +}; + +class nsDisplayItemBoundsGeometry : public nsDisplayItemGeometry +{ +public: + nsDisplayItemBoundsGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder); + + virtual void MoveBy(const nsPoint& aOffset) MOZ_OVERRIDE; + + bool mHasRoundedCorners; +}; + +class nsDisplayBorderGeometry : public nsDisplayItemGeometry +{ +public: + nsDisplayBorderGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder); + + virtual void MoveBy(const nsPoint& aOffset) MOZ_OVERRIDE; + + nsRect mContentRect; +}; + +class nsDisplayBackgroundGeometry : public nsDisplayItemGeometry +{ +public: + nsDisplayBackgroundGeometry(nsDisplayBackgroundImage* aItem, nsDisplayListBuilder* aBuilder); + + virtual void MoveBy(const nsPoint& aOffset) MOZ_OVERRIDE; + + nsRect mPositioningArea; +}; + +class nsDisplayThemedBackgroundGeometry : public nsDisplayItemGeometry +{ +public: + nsDisplayThemedBackgroundGeometry(nsDisplayThemedBackground* aItem, nsDisplayListBuilder* aBuilder); + + virtual void MoveBy(const nsPoint& aOffset) MOZ_OVERRIDE; + + nsRect mPositioningArea; + bool mWindowIsActive; +}; + +class nsDisplayBoxShadowInnerGeometry : public nsDisplayItemGeometry +{ +public: + nsDisplayBoxShadowInnerGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder); + + virtual void MoveBy(const nsPoint& aOffset) MOZ_OVERRIDE; + + nsRect mPaddingRect; +}; + +class nsDisplaySolidColorGeometry : public nsDisplayItemBoundsGeometry +{ +public: + nsDisplaySolidColorGeometry(nsDisplayItem* aItem, + nsDisplayListBuilder* aBuilder, + nscolor aColor) + : nsDisplayItemBoundsGeometry(aItem, aBuilder) + , mColor(aColor) + { } + + nscolor mColor; +}; + +#endif /*NSDISPLAYLISTINVALIDATION_H_*/