Kaynağa Gözat

Small optimizations

Michael Ragazzon 6 yıl önce
ebeveyn
işleme
654fa0907c

+ 1 - 0
Include/Rocket/Core/Element.h

@@ -788,6 +788,7 @@ private:
 
 	PropertyNameList dirty_properties;
 	bool all_properties_dirty;
+	bool computed_values_are_default;
 	bool box_dirty;
 
 	// The element's font face; used to render text and resolve em / ex properties.

+ 1 - 0
Samples/basic/benchmark/src/main.cpp

@@ -91,6 +91,7 @@ public:
 		  Computed values, clipping: 77.0
 		  Computed values, background-color, image-color, opacity: 77.0
 		  Computed values, padding, margin border++: 81.0  [bb70d38]
+		  Computing all the values (only using a few of them yet): 83.0  [9fe9bdf]
 		
 		*/
 

+ 1 - 1
Samples/basic/transform/data/transform.rml

@@ -8,7 +8,7 @@
 			width: 350px;
 			height: 300px;
 
-			perspective: 800;
+			perspective: 800px;
 		}
 		
 		/* Hide the window icon. */

+ 2 - 1
Source/Controls/ElementFormControl.cpp

@@ -26,13 +26,14 @@
  */
 
 #include "../../Include/Rocket/Controls/ElementFormControl.h"
+#include "../../Include/Rocket/Core/ComputedValues.h"
 
 namespace Rocket {
 namespace Controls {
 
 ElementFormControl::ElementFormControl(const Rocket::Core::String& tag) : Core::Element(tag)
 {
-	SetProperty("tab-index", "auto");
+	SetProperty("tab-index", Core::Property((int)Core::Style::TabIndex::Auto, Core::Property::KEYWORD));
 }
 
 ElementFormControl::~ElementFormControl()

+ 1 - 1
Source/Controls/WidgetSlider.cpp

@@ -90,7 +90,7 @@ WidgetSlider::~WidgetSlider()
 // Initialises the slider to a given orientation.
 bool WidgetSlider::Initialise()
 {
-	parent->SetProperty("drag", "drag");
+	parent->SetProperty("drag", Core::Property((int)Core::Style::Drag::Drag, Core::Property::KEYWORD));
 
 	// Create all of our child elements as standard elements, and abort if we can't create them.
 	track = Core::Factory::InstanceElement(parent, "*", "slidertrack", Rocket::Core::XMLAttributes());

+ 19 - 6
Source/Core/Element.cpp

@@ -144,6 +144,7 @@ transform_state(), transform_state_perspective_dirty(true), transform_state_tran
 	parent_structure_dirty = false;
 
 	all_properties_dirty = true;
+	computed_values_are_default = true;
 	box_dirty = false;
 
 	font_face_handle = NULL;
@@ -224,7 +225,9 @@ void Element::Update()
 			if (auto context = doc->GetContext())
 				dp_ratio = context->GetDensityIndependentPixelRatio();
 		}
-		style->ComputeValues(element_meta->computed_values, parent_values, document_values, dp_ratio, ppi);
+		style->ComputeValues(element_meta->computed_values, parent_values, document_values, computed_values_are_default, dp_ratio, ppi);
+
+		computed_values_are_default = false;
 	}
 
 	// Right now we are assuming computed values are calculated before OnPropertyChange
@@ -2639,6 +2642,16 @@ void Element::UpdateTransformState()
 
 	const ComputedValues& computed = element_meta->computed_values;
 
+	if (!computed.transform)
+	{
+		transform_state.reset();
+		transform_state_perspective_dirty = false;
+		transform_state_transform_dirty = false;
+		transform_state_parent_transform_dirty = false;
+		return;
+	}
+
+
 	if(transform_state_perspective_dirty || transform_state_transform_dirty)
 	{
 		Context *context = GetContext();
@@ -2681,7 +2694,7 @@ void Element::UpdateTransformState()
 			}
 			else if (transform_state)
 			{
-				transform_state->SetPerspective(0);
+				transform_state->SetPerspective(nullptr);
 			}
 
 			transform_state_perspective_dirty = false;
@@ -2739,7 +2752,7 @@ void Element::UpdateTransformState()
 			}
 			else if(transform_state)
 			{
-				transform_state->SetLocalPerspective(0);
+				transform_state->SetLocalPerspective(nullptr);
 			}
 
 			if (have_transform)
@@ -2780,7 +2793,7 @@ void Element::UpdateTransformState()
 		if (transform_state)
 		{
 			// Store the parent's new full transform as our parent transform
-			Element *node = 0;
+			Element *node = nullptr;
 			Matrix4f parent_transform;
 			for (node = parent; node; node = node->parent)
 			{
@@ -2792,7 +2805,7 @@ void Element::UpdateTransformState()
 			}
 			if (!node)
 			{
-				transform_state->SetParentRecursiveTransform(0);
+				transform_state->SetParentRecursiveTransform(nullptr);
 			}
 		}
 
@@ -2803,7 +2816,7 @@ void Element::UpdateTransformState()
 	// transform, we don't need to keep the large TransformState object
 	// around. GetEffectiveTransformState() will then recursively visit
 	// parents in order to find a non-trivial TransformState.
-	if (transform_state && !transform_state->GetLocalPerspective(0) && !transform_state->GetPerspective(0) && !transform_state->GetTransform(0))
+	if (transform_state && !transform_state->GetLocalPerspective(nullptr) && !transform_state->GetPerspective(nullptr) && !transform_state->GetTransform(nullptr))
 	{
 		transform_state.reset();
 	}

+ 13 - 1
Source/Core/ElementStyle.cpp

@@ -1279,8 +1279,20 @@ static inline LengthPercentage ComputeOrigin(const Property* property, float fon
 
 
 // Must be called in correct order, from document root to children elements.
-void ElementStyle::ComputeValues(Style::ComputedValues& values, const Style::ComputedValues* parent_values, const Style::ComputedValues* document_values, float dp_ratio, float pixels_per_inch)
+void ElementStyle::ComputeValues(Style::ComputedValues& values, const Style::ComputedValues* parent_values, const Style::ComputedValues* document_values, bool values_are_defaulted, float dp_ratio, float pixels_per_inch)
 {
+	// Generally, this is how it works (for now, we can probably be smarter about this):
+	//   1. Assign default values (clears any newly dirtied properties)
+	//   2. Inherit inheritable values from parent
+	//   3. Assign any local properties (from inline style or stylesheet)
+
+
+	// The next flag is just a small optimization, if the element was just created we don't need to copy all the default values.
+	if (!values_are_defaulted)
+	{
+		values = DefaultComputedValues;
+	}
+
 	// Always do font-size first if dirty, because of em-relative values
 	if (auto p = GetLocalProperty(FONT_SIZE))
 		values.font_size = ComputeFontsize(*p, values, parent_values, document_values, dp_ratio, pixels_per_inch);

+ 1 - 1
Source/Core/ElementStyle.h

@@ -216,7 +216,7 @@ public:
 	const Property *GetTransformOriginZ();
 
 
-	void ComputeValues(Style::ComputedValues& values, const Style::ComputedValues* parent_values, const Style::ComputedValues* document_values, float dp_ratio, float pixels_per_inch);
+	void ComputeValues(Style::ComputedValues& values, const Style::ComputedValues* parent_values, const Style::ComputedValues* document_values, bool values_are_defaulted, float dp_ratio, float pixels_per_inch);
 
 private:
 	// Sets a single property as dirty.