nsDisplayListInvalidation.h (7280B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef NSDISPLAYLISTINVALIDATION_H_ 8 #define NSDISPLAYLISTINVALIDATION_H_ 9 10 #include "ImgDrawResult.h" 11 #include "gfxRect.h" 12 #include "mozilla/gfx/MatrixFwd.h" 13 #include "mozilla/layers/WebRenderUserData.h" 14 #include "nsColor.h" 15 #include "nsRect.h" 16 17 namespace mozilla { 18 class nsDisplayBackgroundImage; 19 class nsCharClipDisplayItem; 20 class nsDisplayItem; 21 class nsDisplayListBuilder; 22 class nsDisplayTableItem; 23 class nsDisplayThemedBackground; 24 class nsDisplayEffectsBase; 25 class nsDisplayMasksAndClipPaths; 26 class nsDisplayFilters; 27 28 namespace gfx { 29 struct sRGBColor; 30 } 31 32 /** 33 * This stores the geometry of an nsDisplayItem, and the area 34 * that will be affected when painting the item. 35 * 36 * It is used to retain information about display items so they 37 * can be compared against new display items in the next paint. 38 */ 39 class nsDisplayItemGeometry { 40 public: 41 nsDisplayItemGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder); 42 virtual ~nsDisplayItemGeometry(); 43 44 /** 45 * Compute the area required to be invalidated if this 46 * display item is removed. 47 */ 48 const nsRect& ComputeInvalidationRegion() { return mBounds; } 49 50 /** 51 * Shifts all retained areas of the nsDisplayItemGeometry by the given offset. 52 * 53 * This is used to compensate for scrolling, since the destination buffer 54 * can scroll without requiring a full repaint. 55 * 56 * @param aOffset Offset to shift by. 57 */ 58 virtual void MoveBy(const nsPoint& aOffset) { mBounds.MoveBy(aOffset); } 59 60 /** 61 * Bounds of the display item 62 */ 63 nsRect mBounds; 64 }; 65 66 /** 67 * A default geometry implementation, used by nsDisplayItem. Retains 68 * and compares the bounds, and border rect. 69 * 70 * This should be sufficient for the majority of display items. 71 */ 72 class nsDisplayItemGenericGeometry : public nsDisplayItemGeometry { 73 public: 74 nsDisplayItemGenericGeometry(nsDisplayItem* aItem, 75 nsDisplayListBuilder* aBuilder); 76 77 void MoveBy(const nsPoint& aOffset) override; 78 79 nsRect mBorderRect; 80 }; 81 82 bool ShouldSyncDecodeImages(nsDisplayListBuilder* aBuilder); 83 84 nsDisplayItemGeometry* GetPreviousGeometry(nsDisplayItem*); 85 86 class nsDisplayItemBoundsGeometry : public nsDisplayItemGeometry { 87 public: 88 nsDisplayItemBoundsGeometry(nsDisplayItem* aItem, 89 nsDisplayListBuilder* aBuilder); 90 91 bool mHasRoundedCorners; 92 }; 93 94 class nsDisplayBorderGeometry : public nsDisplayItemGeometry { 95 public: 96 nsDisplayBorderGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder); 97 }; 98 99 class nsDisplayBackgroundGeometry : public nsDisplayItemGeometry { 100 public: 101 nsDisplayBackgroundGeometry(nsDisplayBackgroundImage* aItem, 102 nsDisplayListBuilder* aBuilder); 103 104 void MoveBy(const nsPoint& aOffset) override; 105 106 nsRect mPositioningArea; 107 nsRect mDestRect; 108 }; 109 110 class nsDisplayThemedBackgroundGeometry : public nsDisplayItemGeometry { 111 public: 112 nsDisplayThemedBackgroundGeometry(nsDisplayThemedBackground* aItem, 113 nsDisplayListBuilder* aBuilder); 114 115 void MoveBy(const nsPoint& aOffset) override; 116 117 nsRect mPositioningArea; 118 bool mWindowIsActive; 119 }; 120 121 class nsDisplayTreeBodyGeometry : public nsDisplayItemGenericGeometry { 122 public: 123 nsDisplayTreeBodyGeometry(nsDisplayItem* aItem, 124 nsDisplayListBuilder* aBuilder, 125 bool aWindowIsActive) 126 : nsDisplayItemGenericGeometry(aItem, aBuilder), 127 mWindowIsActive(aWindowIsActive) {} 128 129 bool mWindowIsActive = false; 130 }; 131 132 class nsDisplayBoxShadowInnerGeometry : public nsDisplayItemGeometry { 133 public: 134 nsDisplayBoxShadowInnerGeometry(nsDisplayItem* aItem, 135 nsDisplayListBuilder* aBuilder); 136 137 void MoveBy(const nsPoint& aOffset) override; 138 139 nsRect mPaddingRect; 140 }; 141 142 class nsDisplaySolidColorGeometry : public nsDisplayItemBoundsGeometry { 143 public: 144 nsDisplaySolidColorGeometry(nsDisplayItem* aItem, 145 nsDisplayListBuilder* aBuilder, nscolor aColor) 146 : nsDisplayItemBoundsGeometry(aItem, aBuilder), mColor(aColor) {} 147 148 nscolor mColor; 149 }; 150 151 class nsDisplaySolidColorRegionGeometry : public nsDisplayItemBoundsGeometry { 152 public: 153 nsDisplaySolidColorRegionGeometry(nsDisplayItem* aItem, 154 nsDisplayListBuilder* aBuilder, 155 const nsRegion& aRegion, 156 mozilla::gfx::sRGBColor aColor) 157 : nsDisplayItemBoundsGeometry(aItem, aBuilder), 158 mRegion(aRegion), 159 mColor(aColor) {} 160 161 void MoveBy(const nsPoint& aOffset) override; 162 163 nsRegion mRegion; 164 mozilla::gfx::sRGBColor mColor; 165 }; 166 167 class nsDisplaySVGEffectGeometry : public nsDisplayItemGeometry { 168 public: 169 nsDisplaySVGEffectGeometry(nsDisplayEffectsBase* aItem, 170 nsDisplayListBuilder* aBuilder); 171 172 void MoveBy(const nsPoint& aOffset) override; 173 174 gfxRect mBBox; 175 gfxPoint mUserSpaceOffset; 176 nsPoint mFrameOffsetToReferenceFrame; 177 bool mHandleOpacity; 178 }; 179 180 class nsDisplayMasksAndClipPathsGeometry : public nsDisplaySVGEffectGeometry { 181 public: 182 nsDisplayMasksAndClipPathsGeometry(nsDisplayMasksAndClipPaths* aItem, 183 nsDisplayListBuilder* aBuilder); 184 185 nsTArray<nsRect> mDestRects; 186 }; 187 188 class nsDisplayFiltersGeometry : public nsDisplaySVGEffectGeometry { 189 public: 190 nsDisplayFiltersGeometry(nsDisplayFilters* aItem, 191 nsDisplayListBuilder* aBuilder); 192 }; 193 194 class nsDisplayTableItemGeometry : public nsDisplayItemGenericGeometry { 195 public: 196 nsDisplayTableItemGeometry(nsDisplayTableItem* aItem, 197 nsDisplayListBuilder* aBuilder, 198 const nsPoint& aFrameOffsetToViewport); 199 200 nsPoint mFrameOffsetToViewport; 201 }; 202 203 class nsDisplayOpacityGeometry : public nsDisplayItemGenericGeometry { 204 public: 205 nsDisplayOpacityGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder, 206 float aOpacity) 207 : nsDisplayItemGenericGeometry(aItem, aBuilder), mOpacity(aOpacity) {} 208 209 float mOpacity; 210 }; 211 212 class nsDisplayTransformGeometry : public nsDisplayItemGeometry { 213 public: 214 nsDisplayTransformGeometry(nsDisplayItem* aItem, 215 nsDisplayListBuilder* aBuilder, 216 const mozilla::gfx::Matrix4x4Flagged& aTransform, 217 int32_t aAppUnitsPerDevPixel) 218 : nsDisplayItemGeometry(aItem, aBuilder), 219 mTransform(aTransform), 220 mAppUnitsPerDevPixel(aAppUnitsPerDevPixel) {} 221 222 void MoveBy(const nsPoint& aOffset) override { 223 nsDisplayItemGeometry::MoveBy(aOffset); 224 mTransform.PostTranslate( 225 NSAppUnitsToFloatPixels(aOffset.x, mAppUnitsPerDevPixel), 226 NSAppUnitsToFloatPixels(aOffset.y, mAppUnitsPerDevPixel), 0.0f); 227 } 228 229 mozilla::gfx::Matrix4x4Flagged mTransform; 230 int32_t mAppUnitsPerDevPixel; 231 }; 232 233 } // namespace mozilla 234 235 #endif /*NSDISPLAYLISTINVALIDATION_H_*/