blob: e9fd95b4609d0999039fee0c855a431ecdea6b31 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef StickyPositionScrollingConstraints_h
#define StickyPositionScrollingConstraints_h
#include "platform/geometry/FloatRect.h"
namespace blink {
class StickyPositionScrollingConstraints final {
public:
enum AnchorEdgeFlags {
AnchorEdgeLeft = 1 << 0,
AnchorEdgeRight = 1 << 1,
AnchorEdgeTop = 1 << 2,
AnchorEdgeBottom = 1 << 3
};
typedef unsigned AnchorEdges;
StickyPositionScrollingConstraints()
: m_anchorEdges(0)
, m_leftOffset(0)
, m_rightOffset(0)
, m_topOffset(0)
, m_bottomOffset(0)
{ }
StickyPositionScrollingConstraints(const StickyPositionScrollingConstraints& other)
: m_anchorEdges(other.m_anchorEdges)
, m_leftOffset(other.m_leftOffset)
, m_rightOffset(other.m_rightOffset)
, m_topOffset(other.m_topOffset)
, m_bottomOffset(other.m_bottomOffset)
, m_scrollContainerRelativeContainingBlockRect(other.m_scrollContainerRelativeContainingBlockRect)
, m_scrollContainerRelativeStickyBoxRect(other.m_scrollContainerRelativeStickyBoxRect)
{ }
FloatSize computeStickyOffset(const FloatRect& viewportRect) const;
AnchorEdges anchorEdges() const { return m_anchorEdges; }
bool hasAnchorEdge(AnchorEdgeFlags flag) const { return m_anchorEdges & flag; }
void addAnchorEdge(AnchorEdgeFlags edgeFlag) { m_anchorEdges |= edgeFlag; }
void setAnchorEdges(AnchorEdges edges) { m_anchorEdges = edges; }
float leftOffset() const { return m_leftOffset; }
float rightOffset() const { return m_rightOffset; }
float topOffset() const { return m_topOffset; }
float bottomOffset() const { return m_bottomOffset; }
void setLeftOffset(float offset) { m_leftOffset = offset; }
void setRightOffset(float offset) { m_rightOffset = offset; }
void setTopOffset(float offset) { m_topOffset = offset; }
void setBottomOffset(float offset) { m_bottomOffset = offset; }
void setScrollContainerRelativeContainingBlockRect(const FloatRect& rect) { m_scrollContainerRelativeContainingBlockRect = rect; }
void setScrollContainerRelativeStickyBoxRect(const FloatRect& rect) { m_scrollContainerRelativeStickyBoxRect = rect; }
bool operator==(const StickyPositionScrollingConstraints& other) const
{
return m_leftOffset == other.m_leftOffset
&& m_rightOffset == other.m_rightOffset
&& m_topOffset == other.m_topOffset
&& m_bottomOffset == other.m_bottomOffset
&& m_scrollContainerRelativeContainingBlockRect == other.m_scrollContainerRelativeContainingBlockRect
&& m_scrollContainerRelativeStickyBoxRect == other.m_scrollContainerRelativeStickyBoxRect;
}
bool operator!=(const StickyPositionScrollingConstraints& other) const { return !(*this == other); }
private:
AnchorEdges m_anchorEdges;
float m_leftOffset;
float m_rightOffset;
float m_topOffset;
float m_bottomOffset;
FloatRect m_scrollContainerRelativeContainingBlockRect;
FloatRect m_scrollContainerRelativeStickyBoxRect;
};
} // namespace blink
#endif // StickyPositionScrollingConstraints_h