diff options
Diffstat (limited to 'layout/generic/nsGridContainerFrame.h')
-rw-r--r-- | layout/generic/nsGridContainerFrame.h | 59 |
1 files changed, 27 insertions, 32 deletions
diff --git a/layout/generic/nsGridContainerFrame.h b/layout/generic/nsGridContainerFrame.h index cb3eef68c3..1fa7bbe487 100644 --- a/layout/generic/nsGridContainerFrame.h +++ b/layout/generic/nsGridContainerFrame.h @@ -566,12 +566,8 @@ class nsGridContainerFrame final : public nsContainerFrame, if (aFrame->IsSubtreeDirty()) { return false; } - - if (!CanCacheMeasurement(aFrame, aCBSize)) { - return false; - } - - return mKey == Key(aFrame, aCBSize); + const mozilla::Maybe<Key> maybeKey = Key::TryHash(aFrame, aCBSize); + return maybeKey.isSome() && mKey == *maybeKey; } static bool CanCacheMeasurement(const nsIFrame* aFrame, @@ -583,55 +579,54 @@ class nsGridContainerFrame final : public nsContainerFrame, void Update(const nsIFrame* aFrame, const LogicalSize& aCBSize, const nscoord aBSize) { - MOZ_ASSERT(CanCacheMeasurement(aFrame, aCBSize)); - mKey.mHashKey = Key::GenerateHash(aFrame, aCBSize); + mKey.UpdateHash(aFrame, aCBSize); mBSize = aBSize; } private: - struct Key { + class Key { // mHashKey is generated by combining these 2 variables together // 1. The containing block size in the item's inline axis used // for measuring reflow // 2. The item's baseline padding property uint32_t mHashKey; + explicit Key(uint32_t aHashKey) : mHashKey(aHashKey) {} + + public: Key() = default; Key(const nsIFrame* aFrame, const LogicalSize& aCBSize) { - MOZ_ASSERT(CanHash(aFrame, aCBSize)); - mHashKey = GenerateHash(aFrame, aCBSize); + UpdateHash(aFrame, aCBSize); } void UpdateHash(const nsIFrame* aFrame, const LogicalSize& aCBSize) { - MOZ_ASSERT(CanHash(aFrame, aCBSize)); - mHashKey = GenerateHash(aFrame, aCBSize); + const mozilla::Maybe<Key> maybeKey = TryHash(aFrame, aCBSize); + MOZ_ASSERT(maybeKey.isSome()); + mHashKey = maybeKey->mHashKey; } - static uint32_t GenerateHash(const nsIFrame* aFrame, - const LogicalSize& aCBSize) { - MOZ_ASSERT(CanHash(aFrame, aCBSize)); - - nscoord gridAreaISize = aCBSize.ISize(aFrame->GetWritingMode()); - nscoord bBaselinePaddingProperty = + static mozilla::Maybe<Key> TryHash(const nsIFrame* aFrame, + const LogicalSize& aCBSize) { + const nscoord gridAreaISize = aCBSize.ISize(aFrame->GetWritingMode()); + const nscoord bBaselinePaddingProperty = abs(aFrame->GetProperty(nsIFrame::BBaselinePadProperty())); - uint_fast8_t bitsNeededForISize = mozilla::FloorLog2(gridAreaISize) + 1; - - return (gridAreaISize << (32 - bitsNeededForISize)) | - bBaselinePaddingProperty; + const uint_fast8_t bitsNeededForISize = + mozilla::FloorLog2(gridAreaISize) + 1; + + const uint_fast8_t bitsNeededForBBaselinePadding = + mozilla::FloorLog2(bBaselinePaddingProperty) + 1; + if (bitsNeededForISize + bitsNeededForBBaselinePadding > 32) { + return mozilla::Nothing(); + } + const uint32_t hashKey = (gridAreaISize << (32 - bitsNeededForISize)) | + bBaselinePaddingProperty; + return mozilla::Some(Key(hashKey)); } static bool CanHash(const nsIFrame* aFrame, const LogicalSize& aCBSize) { - uint_fast8_t bitsNeededForISize = - mozilla::FloorLog2(aCBSize.ISize(aFrame->GetWritingMode())) + 1; - - uint_fast8_t bitsNeededForBBaselinePadding = - mozilla::FloorLog2( - abs(aFrame->GetProperty(nsIFrame::BBaselinePadProperty()))) + - 1; - - return bitsNeededForISize + bitsNeededForBBaselinePadding <= 32; + return TryHash(aFrame, aCBSize).isSome(); } bool operator==(const Key& aOther) const { |