1
0
mirror of https://github.com/roytam1/UXP.git synced 2026-05-26 13:58:49 +00:00

Issue #2522 - Part 2: Implement support for logical viewport units

This commit is contained in:
FranklinDM
2024-06-09 19:12:43 +08:00
committed by roytam1
parent 5c06335c5b
commit 2ba31f4e97
4 changed files with 78 additions and 1 deletions
+17 -1
View File
@@ -7770,6 +7770,14 @@ const UnitInfo UnitData[] = {
{ STR_WITH_LEN("dvh"), eCSSUnit_DynamicViewportHeight, VARIANT_LENGTH },
{ STR_WITH_LEN("dvmin"), eCSSUnit_DynamicViewportMin, VARIANT_LENGTH },
{ STR_WITH_LEN("dvmax"), eCSSUnit_DynamicViewportMax, VARIANT_LENGTH },
{ STR_WITH_LEN("vb"), eCSSUnit_ViewportBlock, VARIANT_LENGTH },
{ STR_WITH_LEN("vi"), eCSSUnit_ViewportInline, VARIANT_LENGTH },
{ STR_WITH_LEN("svb"), eCSSUnit_SmallViewportBlock, VARIANT_LENGTH },
{ STR_WITH_LEN("svi"), eCSSUnit_SmallViewportInline, VARIANT_LENGTH },
{ STR_WITH_LEN("lvb"), eCSSUnit_LargeViewportBlock, VARIANT_LENGTH },
{ STR_WITH_LEN("lvi"), eCSSUnit_LargeViewportInline, VARIANT_LENGTH },
{ STR_WITH_LEN("dvb"), eCSSUnit_DynamicViewportBlock, VARIANT_LENGTH },
{ STR_WITH_LEN("dvi"), eCSSUnit_DynamicViewportInline, VARIANT_LENGTH },
{ STR_WITH_LEN("pc"), eCSSUnit_Pica, VARIANT_LENGTH },
{ STR_WITH_LEN("q"), eCSSUnit_Quarter, VARIANT_LENGTH },
{ STR_WITH_LEN("deg"), eCSSUnit_Degree, VARIANT_ANGLE },
@@ -7824,7 +7832,15 @@ CSSParserImpl::TranslateDimension(nsCSSValue& aValue,
eCSSUnit_DynamicViewportWidth == units ||
eCSSUnit_DynamicViewportHeight == units ||
eCSSUnit_DynamicViewportMin == units ||
eCSSUnit_DynamicViewportMax == units)) {
eCSSUnit_DynamicViewportMax == units ||
eCSSUnit_ViewportBlock == units ||
eCSSUnit_ViewportInline == units ||
eCSSUnit_SmallViewportInline == units ||
eCSSUnit_SmallViewportBlock == units ||
eCSSUnit_LargeViewportBlock == units ||
eCSSUnit_LargeViewportInline == units ||
eCSSUnit_DynamicViewportBlock == units ||
eCSSUnit_DynamicViewportInline == units )) {
// Viewport units aren't allowed right now, probably because we're
// inside an @page declaration. Fail.
return false;
+17
View File
@@ -2015,6 +2015,15 @@ nsCSSValue::AppendToString(nsCSSPropertyID aProperty, nsAString& aResult,
case eCSSUnit_DynamicViewportMin: aResult.AppendLiteral("dvmin"); break;
case eCSSUnit_DynamicViewportMax: aResult.AppendLiteral("dvmax"); break;
case eCSSUnit_ViewportBlock: aResult.AppendLiteral("vb"); break;
case eCSSUnit_ViewportInline: aResult.AppendLiteral("vi"); break;
case eCSSUnit_SmallViewportBlock: aResult.AppendLiteral("svb"); break;
case eCSSUnit_SmallViewportInline: aResult.AppendLiteral("svi"); break;
case eCSSUnit_LargeViewportBlock: aResult.AppendLiteral("lvb"); break;
case eCSSUnit_LargeViewportInline: aResult.AppendLiteral("lvi"); break;
case eCSSUnit_DynamicViewportBlock: aResult.AppendLiteral("dvb"); break;
case eCSSUnit_DynamicViewportInline: aResult.AppendLiteral("dvi"); break;
case eCSSUnit_EM: aResult.AppendLiteral("em"); break;
case eCSSUnit_XHeight: aResult.AppendLiteral("ex"); break;
case eCSSUnit_Char: aResult.AppendLiteral("ch"); break;
@@ -2200,6 +2209,14 @@ nsCSSValue::SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
case eCSSUnit_DynamicViewportHeight:
case eCSSUnit_DynamicViewportMin:
case eCSSUnit_DynamicViewportMax:
case eCSSUnit_ViewportBlock:
case eCSSUnit_ViewportInline:
case eCSSUnit_SmallViewportBlock:
case eCSSUnit_SmallViewportInline:
case eCSSUnit_LargeViewportBlock:
case eCSSUnit_LargeViewportInline:
case eCSSUnit_DynamicViewportBlock:
case eCSSUnit_DynamicViewportInline:
case eCSSUnit_EM:
case eCSSUnit_XHeight:
case eCSSUnit_Char:
+10
View File
@@ -547,6 +547,16 @@ enum nsCSSUnit {
eCSSUnit_DynamicViewportMin = 714, // (float) smaller of DynamicViewportWidth and DynamicViewportHeight
eCSSUnit_DynamicViewportMax = 715, // (float) larger of DynamicViewportWidth and DynamicViewportHeight
// Logical viewport units
eCSSUnit_ViewportBlock = 716, // (float) 1% of the size of the initial containing block in the box's block axis
eCSSUnit_ViewportInline = 717, // (float) 1% of the size of the initial containing block in the box's inline axis
eCSSUnit_SmallViewportBlock = 718, // (float) 1% of the size of the small viewport in the box's block axis
eCSSUnit_SmallViewportInline = 719, // (float) 1% of the size of the small viewport in the box's inline axis
eCSSUnit_LargeViewportBlock = 720, // (float) 1% of the size of the large viewport in the box's block axis
eCSSUnit_LargeViewportInline = 721, // (float) 1% of the size of the small viewport in the box's inline axis
eCSSUnit_DynamicViewportBlock = 722, // (float) 1% of the size of the dynamic viewport in the box's block axis
eCSSUnit_DynamicViewportInline = 723, // (float) 1% of the size of the small viewport in the box's inline axis
// Font relative measure
eCSSUnit_EM = 800, // (float) == current font size
eCSSUnit_XHeight = 801, // (float) distance from top of lower case x to baseline
+34
View File
@@ -541,6 +541,40 @@ static nscoord CalcLengthWith(const nsCSSValue& aValue,
nscoord viewportMax = max(vuScale.width, vuScale.height);
return ScaleViewportCoordTrunc(aValue, viewportMax);
}
case eCSSUnit_ViewportBlock:
case eCSSUnit_SmallViewportBlock:
case eCSSUnit_LargeViewportBlock:
case eCSSUnit_DynamicViewportBlock: {
// Assume non-vertical writing mode if the style context is unavailable.
if (aStyleContext) {
WritingMode wm(aStyleContext);
bool vertical = wm.IsVertical();
aConditions.SetWritingModeDependency(wm.GetBits());
if (vertical) {
nscoord viewportWidth = CalcViewportUnitsScale(aPresContext).width;
return ScaleViewportCoordTrunc(aValue, viewportWidth);
}
}
nscoord viewportHeight = CalcViewportUnitsScale(aPresContext).height;
return ScaleViewportCoordTrunc(aValue, viewportHeight);
}
case eCSSUnit_ViewportInline:
case eCSSUnit_SmallViewportInline:
case eCSSUnit_LargeViewportInline:
case eCSSUnit_DynamicViewportInline: {
// Assume non-vertical writing mode if the style context is unavailable.
if (aStyleContext) {
WritingMode wm(aStyleContext);
bool vertical = wm.IsVertical();
aConditions.SetWritingModeDependency(wm.GetBits());
if (vertical) {
nscoord viewportHeight = CalcViewportUnitsScale(aPresContext).height;
return ScaleViewportCoordTrunc(aValue, viewportHeight);
}
}
nscoord viewportWidth = CalcViewportUnitsScale(aPresContext).width;
return ScaleViewportCoordTrunc(aValue, viewportWidth);
}
// While we could deal with 'rem' units correctly by simply not
// caching any data that uses them in the rule tree, it's valuable
// to store them in the rule tree (for faster dynamic changes of