#pragma once
#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
#include "DisplayBox.h"
#include "LayoutBox.h"
#include "LayoutUnit.h"
#include <wtf/IsoMalloc.h>
#include <wtf/WeakPtr.h>
namespace WebCore {
namespace Layout {
class FloatingState;
class LayoutState;
class FloatAvoider {
WTF_MAKE_ISO_ALLOCATED(FloatAvoider);
public:
FloatAvoider(const Box&, const FloatingState&, const LayoutState&);
virtual ~FloatAvoider() = default;
virtual Display::Box::Rect rect() const { return m_absoluteDisplayBox.rect(); }
Display::Box::Rect rectInContainingBlock() const;
struct HorizontalConstraints {
Optional<PositionInContextRoot> left;
Optional<PositionInContextRoot> right;
};
void setHorizontalConstraints(HorizontalConstraints);
void setVerticalConstraint(PositionInContextRoot);
bool overflowsContainingBlock() const;
void resetPosition();
protected:
virtual bool isLeftAligned() const { return layoutBox().style().isLeftToRightDirection(); }
virtual PositionInContextRoot initialHorizontalPosition() const;
virtual PositionInContextRoot initialVerticalPosition() const { return m_initialVerticalPosition; }
void resetHorizontalConstraints();
virtual PositionInContextRoot horizontalPositionCandidate(HorizontalConstraints);
virtual PositionInContextRoot verticalPositionCandidate(PositionInContextRoot);
LayoutUnit marginBefore() const { return displayBox().marginBefore(); }
LayoutUnit marginAfter() const { return displayBox().marginAfter(); }
LayoutUnit marginStart() const { return displayBox().computedMarginStart().valueOr(0); }
LayoutUnit marginEnd() const { return displayBox().computedMarginEnd().valueOr(0); }
LayoutUnit marginBoxWidth() const { return marginStart() + displayBox().width() + marginEnd(); }
const FloatingState& floatingState() const { return m_floatingState; }
const Box& layoutBox() const { return *m_layoutBox; }
const Display::Box& displayBox() const { return m_absoluteDisplayBox; }
private:
WeakPtr<const Box> m_layoutBox;
const FloatingState& m_floatingState;
Display::Box m_absoluteDisplayBox;
Display::Box m_containingBlockAbsoluteDisplayBox;
PositionInContextRoot m_initialVerticalPosition;
};
}
}
#endif