|
|
@@ -27,6 +27,7 @@
|
|
|
*/
|
|
|
|
|
|
#include "ElementStyle.h"
|
|
|
+#include "../../Include/RmlUi/Core/Context.h"
|
|
|
#include "../../Include/RmlUi/Core/Core.h"
|
|
|
#include "../../Include/RmlUi/Core/ElementDocument.h"
|
|
|
#include "../../Include/RmlUi/Core/ElementUtilities.h"
|
|
|
@@ -358,12 +359,14 @@ float ElementStyle::ResolveNumericProperty(const Property* property, float base_
|
|
|
return ComputeAngle(*property);
|
|
|
|
|
|
const float dp_ratio = ElementUtilities::GetDensityIndependentPixelRatio(element);
|
|
|
+ Vector2i dimensions = (element->GetContext() ? element->GetContext()->GetDimensions() : Vector2i(1));
|
|
|
+ Vector2f vp_dimensions((float)dimensions.x, (float)dimensions.y);
|
|
|
const float font_size = element->GetComputedValues().font_size;
|
|
|
|
|
|
auto doc = element->GetOwnerDocument();
|
|
|
const float doc_font_size = (doc ? doc->GetComputedValues().font_size : DefaultComputedValues.font_size);
|
|
|
|
|
|
- float result = ComputeLength(property, font_size, doc_font_size, dp_ratio);
|
|
|
+ float result = ComputeLength(property, font_size, doc_font_size, dp_ratio, vp_dimensions);
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
@@ -377,8 +380,9 @@ float ElementStyle::ResolveLength(const Property* property, RelativeTarget relat
|
|
|
{
|
|
|
auto doc = element->GetOwnerDocument();
|
|
|
const float doc_font_size = (doc ? doc->GetComputedValues().font_size : DefaultComputedValues.font_size);
|
|
|
-
|
|
|
- float result = ComputeLength(property, element->GetComputedValues().font_size, doc_font_size, ElementUtilities::GetDensityIndependentPixelRatio(element));
|
|
|
+ Vector2i dimensions = (element->GetContext() ? element->GetContext()->GetDimensions() : Vector2i(1));
|
|
|
+ Vector2f vp_dimensions((float)dimensions.x, (float)dimensions.y);
|
|
|
+ float result = ComputeLength(property, element->GetComputedValues().font_size, doc_font_size, ElementUtilities::GetDensityIndependentPixelRatio(element), vp_dimensions);
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
@@ -504,7 +508,7 @@ void ElementStyle::DirtyProperties(const PropertyIdSet& properties)
|
|
|
dirty_properties |= properties;
|
|
|
}
|
|
|
|
|
|
-PropertyIdSet ElementStyle::ComputeValues(Style::ComputedValues& values, const Style::ComputedValues* parent_values, const Style::ComputedValues* document_values, bool values_are_default_initialized, float dp_ratio)
|
|
|
+PropertyIdSet ElementStyle::ComputeValues(Style::ComputedValues& values, const Style::ComputedValues* parent_values, const Style::ComputedValues* document_values, bool values_are_default_initialized, float dp_ratio, Vector2f vp_dimensions)
|
|
|
{
|
|
|
if (dirty_properties.Empty())
|
|
|
return PropertyIdSet();
|
|
|
@@ -536,7 +540,7 @@ PropertyIdSet ElementStyle::ComputeValues(Style::ComputedValues& values, const S
|
|
|
if(dirty_properties.Contains(PropertyId::FontSize))
|
|
|
{
|
|
|
if (auto p = GetLocalProperty(PropertyId::FontSize))
|
|
|
- values.font_size = ComputeFontsize(*p, values, parent_values, document_values, dp_ratio);
|
|
|
+ values.font_size = ComputeFontsize(*p, values, parent_values, document_values, dp_ratio, vp_dimensions);
|
|
|
else if (parent_values)
|
|
|
values.font_size = parent_values->font_size;
|
|
|
|
|
|
@@ -560,7 +564,7 @@ PropertyIdSet ElementStyle::ComputeValues(Style::ComputedValues& values, const S
|
|
|
{
|
|
|
if (auto p = GetLocalProperty(PropertyId::LineHeight))
|
|
|
{
|
|
|
- values.line_height = ComputeLineHeight(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.line_height = ComputeLineHeight(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
}
|
|
|
else if (parent_values)
|
|
|
{
|
|
|
@@ -624,42 +628,42 @@ PropertyIdSet ElementStyle::ComputeValues(Style::ComputedValues& values, const S
|
|
|
switch (id)
|
|
|
{
|
|
|
case PropertyId::MarginTop:
|
|
|
- values.margin_top = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.margin_top = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::MarginRight:
|
|
|
- values.margin_right = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.margin_right = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::MarginBottom:
|
|
|
- values.margin_bottom = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.margin_bottom = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::MarginLeft:
|
|
|
- values.margin_left = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.margin_left = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
|
|
|
case PropertyId::PaddingTop:
|
|
|
- values.padding_top = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.padding_top = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::PaddingRight:
|
|
|
- values.padding_right = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.padding_right = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::PaddingBottom:
|
|
|
- values.padding_bottom = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.padding_bottom = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::PaddingLeft:
|
|
|
- values.padding_left = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.padding_left = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
|
|
|
case PropertyId::BorderTopWidth:
|
|
|
- values.border_top_width = ComputeLength(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.border_top_width = ComputeLength(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::BorderRightWidth:
|
|
|
- values.border_right_width = ComputeLength(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.border_right_width = ComputeLength(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::BorderBottomWidth:
|
|
|
- values.border_bottom_width = ComputeLength(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.border_bottom_width = ComputeLength(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::BorderLeftWidth:
|
|
|
- values.border_left_width = ComputeLength(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.border_left_width = ComputeLength(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
|
|
|
case PropertyId::BorderTopColor:
|
|
|
@@ -676,16 +680,16 @@ PropertyIdSet ElementStyle::ComputeValues(Style::ComputedValues& values, const S
|
|
|
break;
|
|
|
|
|
|
case PropertyId::BorderTopLeftRadius:
|
|
|
- values.border_top_left_radius = ComputeLength(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.border_top_left_radius = ComputeLength(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::BorderTopRightRadius:
|
|
|
- values.border_top_right_radius = ComputeLength(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.border_top_right_radius = ComputeLength(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::BorderBottomRightRadius:
|
|
|
- values.border_bottom_right_radius = ComputeLength(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.border_bottom_right_radius = ComputeLength(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::BorderBottomLeftRadius:
|
|
|
- values.border_bottom_left_radius = ComputeLength(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.border_bottom_left_radius = ComputeLength(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
|
|
|
case PropertyId::Display:
|
|
|
@@ -696,16 +700,16 @@ PropertyIdSet ElementStyle::ComputeValues(Style::ComputedValues& values, const S
|
|
|
break;
|
|
|
|
|
|
case PropertyId::Top:
|
|
|
- values.top = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.top = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::Right:
|
|
|
- values.right = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.right = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::Bottom:
|
|
|
- values.bottom = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.bottom = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::Left:
|
|
|
- values.left = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.left = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
|
|
|
case PropertyId::Float:
|
|
|
@@ -723,30 +727,30 @@ PropertyIdSet ElementStyle::ComputeValues(Style::ComputedValues& values, const S
|
|
|
break;
|
|
|
|
|
|
case PropertyId::Width:
|
|
|
- values.width = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.width = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::MinWidth:
|
|
|
- values.min_width = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.min_width = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::MaxWidth:
|
|
|
- values.max_width = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.max_width = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
|
|
|
case PropertyId::Height:
|
|
|
- values.height = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.height = ComputeLengthPercentageAuto(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::MinHeight:
|
|
|
- values.min_height = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.min_height = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::MaxHeight:
|
|
|
- values.max_height = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.max_height = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
|
|
|
case PropertyId::LineHeight:
|
|
|
// (Line-height computed above)
|
|
|
break;
|
|
|
case PropertyId::VerticalAlign:
|
|
|
- values.vertical_align = ComputeVerticalAlign(p, values.line_height.value, font_size, document_font_size, dp_ratio);
|
|
|
+ values.vertical_align = ComputeVerticalAlign(p, values.line_height.value, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
|
|
|
case PropertyId::OverflowX:
|
|
|
@@ -809,10 +813,10 @@ PropertyIdSet ElementStyle::ComputeValues(Style::ComputedValues& values, const S
|
|
|
break;
|
|
|
|
|
|
case PropertyId::RowGap:
|
|
|
- values.row_gap = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.row_gap = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::ColumnGap:
|
|
|
- values.column_gap = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.column_gap = ComputeLengthPercentage(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
|
|
|
case PropertyId::Cursor:
|
|
|
@@ -829,33 +833,33 @@ PropertyIdSet ElementStyle::ComputeValues(Style::ComputedValues& values, const S
|
|
|
values.focus = (Focus)p->Get<int>();
|
|
|
break;
|
|
|
case PropertyId::ScrollbarMargin:
|
|
|
- values.scrollbar_margin = ComputeLength(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.scrollbar_margin = ComputeLength(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::PointerEvents:
|
|
|
values.pointer_events = (PointerEvents)p->Get<int>();
|
|
|
break;
|
|
|
|
|
|
case PropertyId::Perspective:
|
|
|
- values.perspective = ComputeLength(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.perspective = ComputeLength(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::PerspectiveOriginX:
|
|
|
- values.perspective_origin_x = ComputeOrigin(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.perspective_origin_x = ComputeOrigin(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::PerspectiveOriginY:
|
|
|
- values.perspective_origin_y = ComputeOrigin(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.perspective_origin_y = ComputeOrigin(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
|
|
|
case PropertyId::Transform:
|
|
|
values.transform = p->Get<TransformPtr>();
|
|
|
break;
|
|
|
case PropertyId::TransformOriginX:
|
|
|
- values.transform_origin_x = ComputeOrigin(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.transform_origin_x = ComputeOrigin(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::TransformOriginY:
|
|
|
- values.transform_origin_y = ComputeOrigin(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.transform_origin_y = ComputeOrigin(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
case PropertyId::TransformOriginZ:
|
|
|
- values.transform_origin_z = ComputeLength(p, font_size, document_font_size, dp_ratio);
|
|
|
+ values.transform_origin_z = ComputeLength(p, font_size, document_font_size, dp_ratio, vp_dimensions);
|
|
|
break;
|
|
|
|
|
|
case PropertyId::Transition:
|