Browse Source

Refactor formatting context: Get the formatting type separately

Michael Ragazzon 6 months ago
parent
commit
3cecf256a0
2 changed files with 30 additions and 19 deletions
  1. 24 17
      Source/Core/Layout/FormattingContext.cpp
  2. 6 2
      Source/Core/Layout/FormattingContext.h

+ 24 - 17
Source/Core/Layout/FormattingContext.cpp

@@ -38,39 +38,46 @@
 
 namespace Rml {
 
-UniquePtr<LayoutBox> FormattingContext::FormatIndependent(ContainerBox* parent_container, Element* element, const Box* override_initial_box,
-	FormattingContextType backup_context)
+FormattingContextType FormattingContext::GetFormattingContextType(Element* element)
 {
-	RMLUI_ZoneScopedC(0xAFAFAF);
-	using namespace Style;
-
 	if (element->IsReplaced())
-		return ReplacedFormattingContext::Format(parent_container, element, override_initial_box);
-
-	FormattingContextType type = backup_context;
+		return FormattingContextType::Replaced;
 
+	using namespace Style;
 	auto& computed = element->GetComputedValues();
 	const Display display = computed.display();
+
 	if (display == Display::Flex || display == Display::InlineFlex)
-	{
-		type = FormattingContextType::Flex;
-	}
-	else if (display == Display::Table || display == Display::InlineTable)
-	{
-		type = FormattingContextType::Table;
-	}
-	else if (display == Display::InlineBlock || display == Display::FlowRoot || display == Display::TableCell || computed.float_() != Float::None ||
+		return FormattingContextType::Flex;
+
+	if (display == Display::Table || display == Display::InlineTable)
+		return FormattingContextType::Table;
+
+	if (display == Display::InlineBlock || display == Display::FlowRoot || display == Display::TableCell || computed.float_() != Float::None ||
 		computed.position() == Position::Absolute || computed.position() == Position::Fixed || computed.overflow_x() != Overflow::Visible ||
 		computed.overflow_y() != Overflow::Visible || !element->GetParentNode() || element->GetParentNode()->GetDisplay() == Display::Flex)
 	{
-		type = FormattingContextType::Block;
+		return FormattingContextType::Block;
 	}
 
+	return FormattingContextType::None;
+}
+
+UniquePtr<LayoutBox> FormattingContext::FormatIndependent(ContainerBox* parent_container, Element* element, const Box* override_initial_box,
+	FormattingContextType default_context)
+{
+	RMLUI_ZoneScopedC(0xAFAFAF);
+
+	FormattingContextType type = GetFormattingContextType(element);
+	if (type == FormattingContextType::None)
+		type = default_context;
+
 	switch (type)
 	{
 	case FormattingContextType::Block: return BlockFormattingContext::Format(parent_container, element, override_initial_box);
 	case FormattingContextType::Table: return TableFormattingContext::Format(parent_container, element, override_initial_box);
 	case FormattingContextType::Flex: return FlexFormattingContext::Format(parent_container, element, override_initial_box);
+	case FormattingContextType::Replaced: return ReplacedFormattingContext::Format(parent_container, element, override_initial_box);
 	case FormattingContextType::None: break;
 	}
 

+ 6 - 2
Source/Core/Layout/FormattingContext.h

@@ -41,6 +41,7 @@ enum class FormattingContextType {
 	Block,
 	Table,
 	Flex,
+	Replaced,
 	None,
 };
 
@@ -49,14 +50,17 @@ enum class FormattingContextType {
 */
 class FormattingContext {
 public:
+	/// Determines which type of formatting context this element establishes, if any.
+	static FormattingContextType GetFormattingContextType(Element* element);
+
 	/// Format the element in an independent formatting context, generating a new layout box.
 	/// @param[in] parent_container The container box which should act as the new box's parent.
 	/// @param[in] element The element to be formatted.
 	/// @param[in] override_initial_box Optionally set the initial box dimensions, otherwise one will be generated based on the element's properties.
-	/// @param[in] backup_context If a formatting context can not be determined from the element's properties, use this context.
+	/// @param[in] default_context If a formatting context cannot be determined from the element's properties, use this context.
 	/// @return A new, fully formatted layout box, or nullptr if its formatting context could not be determined, or if formatting was unsuccessful.
 	static UniquePtr<LayoutBox> FormatIndependent(ContainerBox* parent_container, Element* element, const Box* override_initial_box,
-		FormattingContextType backup_context);
+		FormattingContextType default_context);
 
 protected:
 	FormattingContext() = default;