BlockFormattingContext.h [plain text]
#pragma once
#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
#include "FormattingContext.h"
#include <wtf/IsoMalloc.h>
namespace WebCore {
class LayoutUnit;
namespace Layout {
class BlockFormattingState;
class Box;
class BlockFormattingContext : public FormattingContext {
WTF_MAKE_ISO_ALLOCATED(BlockFormattingContext);
public:
BlockFormattingContext(const Box& formattingContextRoot);
void layout(LayoutContext&, FormattingState&) const override;
std::unique_ptr<FormattingState> createFormattingState(Ref<FloatingState>&&, const LayoutContext&) const override;
Ref<FloatingState> createOrFindFloatingState(LayoutContext&) const override;
private:
void layoutFormattingContextRoot(LayoutContext&, FormattingState&, const Box&, Display::Box&) const;
void computeWidthAndMargin(LayoutContext&, const Box&, Display::Box&) const;
void computeHeightAndMargin(LayoutContext&, const Box&, Display::Box&) const;
void computeStaticPosition(LayoutContext&, const Box&, Display::Box&) const override;
void computeInFlowPositionedPosition(LayoutContext&, const Box&, Display::Box&) const override;
void computeInFlowWidthAndMargin(LayoutContext&, const Box&, Display::Box&) const;
void computeInFlowHeightAndMargin(LayoutContext&, const Box&, Display::Box&) const;
FormattingContext::InstrinsicWidthConstraints instrinsicWidthConstraints(LayoutContext&, const Box&) const override;
class Geometry {
public:
static FormattingContext::Geometry::HeightAndMargin inFlowHeightAndMargin(LayoutContext&, const Box&);
static FormattingContext::Geometry::WidthAndMargin inFlowWidthAndMargin(LayoutContext&, const Box&);
static FormattingContext::Geometry::Position staticPosition(LayoutContext&, const Box&);
static FormattingContext::Geometry::Position inFlowPositionedPosition(LayoutContext&, const Box&);
static bool instrinsicWidthConstraintsNeedChildrenWidth(const Box&);
static FormattingContext::InstrinsicWidthConstraints instrinsicWidthConstraints(LayoutContext&, const Box&);
private:
static FormattingContext::Geometry::HeightAndMargin inFlowNonReplacedHeightAndMargin(LayoutContext&, const Box&);
static FormattingContext::Geometry::WidthAndMargin inFlowNonReplacedWidthAndMargin(LayoutContext&, const Box&, std::optional<LayoutUnit> precomputedWidth = std::nullopt);
static FormattingContext::Geometry::WidthAndMargin inFlowReplacedWidthAndMargin(LayoutContext&, const Box&);
static FormattingContext::Geometry::Position staticPositionForOutOfFlowPositioned(const LayoutContext&, const Box&);
};
class MarginCollapse {
public:
static LayoutUnit marginTop(const LayoutContext&, const Box&);
static LayoutUnit marginBottom(const LayoutContext&, const Box&);
static bool isMarginBottomCollapsedWithParent(const LayoutContext&, const Box&);
static bool isMarginTopCollapsedWithParentMarginBottom(const Box&);
private:
static LayoutUnit collapsedMarginBottomFromLastChild(const LayoutContext&, const Box&);
static LayoutUnit nonCollapsedMarginBottom(const LayoutContext&, const Box&);
static LayoutUnit computedNonCollapsedMarginTop(const LayoutContext&, const Box&);
static LayoutUnit computedNonCollapsedMarginBottom(const LayoutContext&, const Box&);
static LayoutUnit collapsedMarginTopFromFirstChild(const LayoutContext&, const Box&);
static LayoutUnit nonCollapsedMarginTop(const LayoutContext&, const Box&);
};
};
}
}
#endif