mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1166301 - Store a flag on Layer to tell fixed background layers apart from fixed position layers. r=mattwoodrow
This commit is contained in:
parent
088b8a66ec
commit
a5a6088b91
@ -1737,9 +1737,10 @@ Layer::PrintInfo(std::stringstream& aStream, const char* aPrefix)
|
||||
}
|
||||
if (GetIsFixedPosition()) {
|
||||
LayerPoint anchor = GetFixedPositionAnchor();
|
||||
aStream << nsPrintfCString(" [isFixedPosition scrollId=%lld anchor=%s]",
|
||||
aStream << nsPrintfCString(" [isFixedPosition scrollId=%lld anchor=%s%s]",
|
||||
GetFixedPositionScrollContainerId(),
|
||||
ToString(anchor).c_str()).get();
|
||||
ToString(anchor).c_str(),
|
||||
IsClipFixed() ? "" : " scrollingClip").get();
|
||||
}
|
||||
if (GetIsStickyPosition()) {
|
||||
aStream << nsPrintfCString(" [isStickyPosition scrollId=%d outer=%f,%f %fx%f "
|
||||
|
@ -1161,19 +1161,27 @@ public:
|
||||
* point, that is, the point which remains in the same position when
|
||||
* compositing the layer tree with a transformation (such as when
|
||||
* asynchronously scrolling and zooming).
|
||||
*
|
||||
* - |aIsClipFixed| is true if this layer's clip rect and mask layer
|
||||
* should also remain fixed during async scrolling/animations.
|
||||
* This is the case for fixed position layers, but not for
|
||||
* fixed background layers.
|
||||
*/
|
||||
void SetFixedPositionData(FrameMetrics::ViewID aScrollId,
|
||||
const LayerPoint& aAnchor)
|
||||
const LayerPoint& aAnchor,
|
||||
bool aIsClipFixed)
|
||||
{
|
||||
if (!mFixedPositionData ||
|
||||
mFixedPositionData->mScrollId != aScrollId ||
|
||||
mFixedPositionData->mAnchor != aAnchor) {
|
||||
mFixedPositionData->mAnchor != aAnchor ||
|
||||
mFixedPositionData->mIsClipFixed != aIsClipFixed) {
|
||||
MOZ_LAYERS_LOG_IF_SHADOWABLE(this, ("Layer::Mutated(%p) FixedPositionData", this));
|
||||
if (!mFixedPositionData) {
|
||||
mFixedPositionData = MakeUnique<FixedPositionData>();
|
||||
}
|
||||
mFixedPositionData->mScrollId = aScrollId;
|
||||
mFixedPositionData->mAnchor = aAnchor;
|
||||
mFixedPositionData->mIsClipFixed = aIsClipFixed;
|
||||
Mutated();
|
||||
}
|
||||
}
|
||||
@ -1267,6 +1275,7 @@ public:
|
||||
bool GetIsStickyPosition() { return mStickyPositionData; }
|
||||
FrameMetrics::ViewID GetFixedPositionScrollContainerId() { return mFixedPositionData ? mFixedPositionData->mScrollId : FrameMetrics::NULL_SCROLL_ID; }
|
||||
LayerPoint GetFixedPositionAnchor() { return mFixedPositionData ? mFixedPositionData->mAnchor : LayerPoint(); }
|
||||
bool IsClipFixed() { return mFixedPositionData ? mFixedPositionData->mIsClipFixed : false; }
|
||||
FrameMetrics::ViewID GetStickyScrollContainerId() { return mStickyPositionData->mScrollId; }
|
||||
const LayerRect& GetStickyScrollRangeOuter() { return mStickyPositionData->mOuter; }
|
||||
const LayerRect& GetStickyScrollRangeInner() { return mStickyPositionData->mInner; }
|
||||
@ -1770,6 +1779,7 @@ protected:
|
||||
struct FixedPositionData {
|
||||
FrameMetrics::ViewID mScrollId;
|
||||
LayerPoint mAnchor;
|
||||
bool mIsClipFixed;
|
||||
};
|
||||
UniquePtr<FixedPositionData> mFixedPositionData;
|
||||
struct StickyPositionData {
|
||||
|
@ -331,7 +331,8 @@ LayerTransactionParent::RecvUpdate(InfallibleTArray<Edit>&& cset,
|
||||
layer->SetIsFixedPosition(common.isFixedPosition());
|
||||
if (common.isFixedPosition()) {
|
||||
layer->SetFixedPositionData(common.fixedPositionScrollContainerId(),
|
||||
common.fixedPositionAnchor());
|
||||
common.fixedPositionAnchor(),
|
||||
common.isClipFixed());
|
||||
}
|
||||
if (common.isStickyPosition()) {
|
||||
layer->SetStickyPositionData(common.stickyScrollContainerId(),
|
||||
|
@ -216,6 +216,7 @@ struct CommonLayerAttributes {
|
||||
bool isFixedPosition;
|
||||
uint64_t fixedPositionScrollContainerId;
|
||||
LayerPoint fixedPositionAnchor;
|
||||
bool isClipFixed;
|
||||
bool isStickyPosition;
|
||||
uint64_t stickyScrollContainerId;
|
||||
LayerRect stickyScrollRangeOuter;
|
||||
|
@ -583,6 +583,7 @@ ShadowLayerForwarder::EndTransaction(InfallibleTArray<EditReply>* aReplies,
|
||||
if (mutant->GetIsFixedPosition()) {
|
||||
common.fixedPositionScrollContainerId() = mutant->GetFixedPositionScrollContainerId();
|
||||
common.fixedPositionAnchor() = mutant->GetFixedPositionAnchor();
|
||||
common.isClipFixed() = mutant->IsClipFixed();
|
||||
}
|
||||
common.isStickyPosition() = mutant->GetIsStickyPosition();
|
||||
if (mutant->GetIsStickyPosition()) {
|
||||
|
@ -1228,7 +1228,8 @@ protected:
|
||||
* Set fixed-pos layer metadata on aLayer according to the data for aFixedPosFrame.
|
||||
*/
|
||||
void SetFixedPositionLayerData(Layer* aLayer,
|
||||
const nsIFrame* aFixedPosFrame);
|
||||
const nsIFrame* aFixedPosFrame,
|
||||
bool aIsClipFixed);
|
||||
|
||||
/**
|
||||
* Returns true if aItem's opaque area (in aOpaque) covers the entire
|
||||
@ -2929,7 +2930,8 @@ ContainerState::FindFixedPosFrameForLayerData(const nsIFrame* aAnimatedGeometryR
|
||||
|
||||
void
|
||||
ContainerState::SetFixedPositionLayerData(Layer* aLayer,
|
||||
const nsIFrame* aFixedPosFrame)
|
||||
const nsIFrame* aFixedPosFrame,
|
||||
bool aIsClipFixed)
|
||||
{
|
||||
aLayer->SetIsFixedPosition(aFixedPosFrame != nullptr);
|
||||
if (!aFixedPosFrame) {
|
||||
@ -2960,7 +2962,8 @@ ContainerState::SetFixedPositionLayerData(Layer* aLayer,
|
||||
anchorRect.MoveTo(viewportFrame->GetOffsetToCrossDoc(mContainerReferenceFrame));
|
||||
|
||||
nsLayoutUtils::SetFixedPositionLayerData(aLayer,
|
||||
viewportFrame, anchorRect, aFixedPosFrame, presContext, mParameters);
|
||||
viewportFrame, anchorRect, aFixedPosFrame, presContext, mParameters,
|
||||
aIsClipFixed);
|
||||
}
|
||||
|
||||
static bool
|
||||
@ -3229,7 +3232,8 @@ void ContainerState::FinishPaintedLayerData(PaintedLayerData& aData, FindOpaqueB
|
||||
}
|
||||
layer->SetContentFlags(flags);
|
||||
|
||||
SetFixedPositionLayerData(layer, data->mFixedPosFrameForLayerData);
|
||||
SetFixedPositionLayerData(layer, data->mFixedPosFrameForLayerData,
|
||||
!data->mSingleItemFixedToViewport);
|
||||
|
||||
PaintedLayerData* containingPaintedLayerData =
|
||||
mLayerBuilder->GetContainingPaintedLayerData();
|
||||
@ -3981,7 +3985,7 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
|
||||
|
||||
const nsIFrame* fixedPosFrame =
|
||||
FindFixedPosFrameForLayerData(animatedGeometryRoot, shouldFixToViewport);
|
||||
SetFixedPositionLayerData(ownLayer, fixedPosFrame);
|
||||
SetFixedPositionLayerData(ownLayer, fixedPosFrame, !shouldFixToViewport);
|
||||
|
||||
nsRect invalid;
|
||||
if (item->IsInvalid(invalid)) {
|
||||
|
@ -4404,7 +4404,7 @@ nsDisplayStickyPosition::BuildLayer(nsDisplayListBuilder* aBuilder,
|
||||
|
||||
nsLayoutUtils::SetFixedPositionLayerData(layer, scrollFrame,
|
||||
nsRect(scrollFrame->GetOffsetToCrossDoc(ReferenceFrame()), scrollFrameSize),
|
||||
mFrame, presContext, aContainerParameters);
|
||||
mFrame, presContext, aContainerParameters, /* clip is fixed = */ true);
|
||||
|
||||
ViewID scrollId = nsLayoutUtils::FindOrCreateIDFor(
|
||||
stickyScrollContainer->ScrollFrame()->GetScrolledFrame()->GetContent());
|
||||
|
@ -1737,7 +1737,8 @@ nsLayoutUtils::SetFixedPositionLayerData(Layer* aLayer,
|
||||
const nsRect& aAnchorRect,
|
||||
const nsIFrame* aFixedPosFrame,
|
||||
nsPresContext* aPresContext,
|
||||
const ContainerLayerParameters& aContainerParameters) {
|
||||
const ContainerLayerParameters& aContainerParameters,
|
||||
bool aIsClipFixed) {
|
||||
// Find out the rect of the viewport frame relative to the reference frame.
|
||||
// This, in conjunction with the container scale, will correspond to the
|
||||
// coordinate-space of the built layer.
|
||||
@ -1791,7 +1792,7 @@ nsLayoutUtils::SetFixedPositionLayerData(Layer* aLayer,
|
||||
id = FindOrCreateIDFor(content);
|
||||
}
|
||||
}
|
||||
aLayer->SetFixedPositionData(id, anchor);
|
||||
aLayer->SetFixedPositionData(id, anchor, aIsClipFixed);
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -496,12 +496,16 @@ public:
|
||||
* properties (top, left, right, bottom) are auto. aAnchorRect is in the
|
||||
* coordinate space of aLayer's container layer (i.e. relative to the reference
|
||||
* frame of the display item which is building aLayer's container layer).
|
||||
* aIsClipFixed is true if the layer's clip rect should also remain fixed
|
||||
* during async-scrolling (true for fixed position elements, false for
|
||||
* fixed backgrounds).
|
||||
*/
|
||||
static void SetFixedPositionLayerData(Layer* aLayer, const nsIFrame* aViewportFrame,
|
||||
const nsRect& aAnchorRect,
|
||||
const nsIFrame* aFixedPosFrame,
|
||||
nsPresContext* aPresContext,
|
||||
const ContainerLayerParameters& aContainerParameters);
|
||||
const ContainerLayerParameters& aContainerParameters,
|
||||
bool aIsClipFixed);
|
||||
|
||||
/**
|
||||
* Return true if aPresContext's viewport has a displayport.
|
||||
|
Loading…
Reference in New Issue
Block a user