#pragma once
#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
#include "LayoutBox.h"
#include "LayoutBoxGeometry.h"
#include "LayoutPoint.h"
#include "LayoutUnits.h"
#include <wtf/IsoMalloc.h>
#include <wtf/WeakPtr.h>
namespace WebCore {
namespace Layout {
class FloatAvoider {
WTF_MAKE_ISO_ALLOCATED(FloatAvoider);
public:
FloatAvoider(LayoutPoint absoluteTopLeft, LayoutUnit borderBoxWidth, const Edges& margin, HorizontalEdges containingBlockAbsoluteContentBox, bool isFloatingPositioned, bool isLeftAligned);
virtual ~FloatAvoider() = default;
void setHorizontalPosition(LayoutUnit);
void setVerticalPosition(LayoutUnit);
void resetHorizontalPosition() { m_absoluteTopLeft.setX(initialHorizontalPosition()); }
bool overflowsContainingBlock() const;
LayoutUnit top() const;
LayoutUnit left() const;
LayoutUnit right() const;
bool isLeftAligned() const { return m_isLeftAligned; }
private:
LayoutUnit borderBoxWidth() const { return m_borderBoxWidth; }
LayoutUnit initialHorizontalPosition() const;
LayoutUnit marginBefore() const { return m_margin.vertical.top; }
LayoutUnit marginAfter() const { return m_margin.vertical.bottom; }
LayoutUnit marginStart() const { return m_margin.horizontal.left; }
LayoutUnit marginEnd() const { return m_margin.horizontal.right; }
LayoutUnit marginBoxWidth() const { return marginStart() + borderBoxWidth() + marginEnd(); }
bool isFloatingBox() const { return m_isFloatingPositioned; }
private:
LayoutPoint m_absoluteTopLeft;
LayoutUnit m_borderBoxWidth;
Edges m_margin;
HorizontalEdges m_containingBlockAbsoluteContentBox;
bool m_isFloatingPositioned { true };
bool m_isLeftAligned { true };
};
inline LayoutUnit FloatAvoider::top() const
{
auto top = m_absoluteTopLeft.y();
if (isFloatingBox())
top -= marginBefore();
return top;
}
inline LayoutUnit FloatAvoider::left() const
{
auto left = m_absoluteTopLeft.x();
if (isFloatingBox())
left -= marginStart();
return left;
}
inline LayoutUnit FloatAvoider::right() const
{
auto right = left() + borderBoxWidth();
if (isFloatingBox())
right += marginAfter();
return right;
}
}
}
#endif