#pragma once
#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
#include "DisplayStyle.h"
#include "FloatRect.h"
#include <wtf/IsoMalloc.h>
#include <wtf/OptionSet.h>
namespace WebCore {
namespace Display {
class ContainerBox;
class Tree;
using AbsoluteFloatRect = FloatRect;
class Box {
WTF_MAKE_FAST_ALLOCATED_WITH_HEAP_IDENTIFIER(Box);
public:
enum class TypeFlags : uint8_t {
BoxModelBox = 1 << 0,
ContainerBox = 1 << 1,
ImageBox = 1 << 2,
TextBox = 1 << 3,
LineBreakBox = 1 << 4, };
Box(Tree&, AbsoluteFloatRect, Style&&, OptionSet<TypeFlags> = { });
virtual ~Box();
const Style& style() const { return m_style; }
AbsoluteFloatRect absoluteBoxRect() const { return m_absoluteBoxRect; }
virtual AbsoluteFloatRect absolutePaintingExtent() const { return m_absoluteBoxRect; }
bool isBoxModelBox() const { return m_typeFlags.contains(TypeFlags::BoxModelBox); }
bool isContainerBox() const { return m_typeFlags.contains(TypeFlags::ContainerBox); }
bool isImageBox() const { return m_typeFlags.contains(TypeFlags::ImageBox); }
bool isReplacedBox() const { return m_typeFlags.contains(TypeFlags::ImageBox); }
bool isTextBox() const { return m_typeFlags.contains(TypeFlags::TextBox); }
bool isLineBreakBox() const { return m_typeFlags.contains(TypeFlags::LineBreakBox); }
bool participatesInZOrderSorting() const;
ContainerBox* parent() const { return m_parent; }
void setParent(ContainerBox* parent) { m_parent = parent; }
const Box* nextSibling() const { return m_nextSibling.get(); }
void setNextSibling(std::unique_ptr<Box>&&);
void setNeedsDisplay(Optional<AbsoluteFloatRect> subrect = WTF::nullopt);
virtual String debugDescription() const;
private:
virtual const char* boxName() const;
const Tree& m_tree;
AbsoluteFloatRect m_absoluteBoxRect;
Style m_style;
ContainerBox* m_parent { nullptr };
std::unique_ptr<Box> m_nextSibling;
OptionSet<TypeFlags> m_typeFlags;
};
} }
#define SPECIALIZE_TYPE_TRAITS_DISPLAY_BOX(ToValueTypeName, predicate) \
SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::Display::ToValueTypeName) \
static bool isType(const WebCore::Display::Box& box) { return box.predicate; } \
SPECIALIZE_TYPE_TRAITS_END()
#endif // ENABLE(LAYOUT_FORMATTING_CONTEXT)