Skip to content

Commit 496da0b

Browse files
committed
Merge branch 'devel' of github.com:AngleSharp/AngleSharp.Css into devel
2 parents 6b7015e + cab00d8 commit 496da0b

34 files changed

+366
-70
lines changed

src/AngleSharp.Css.Tests/Values/UnitConversion.cs

Lines changed: 164 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ namespace AngleSharp.Css.Tests.Values
22
{
33
using AngleSharp.Css.Values;
44
using NUnit.Framework;
5+
using System;
56

67
[TestFixture]
78
public class UnitConversionTests
@@ -37,6 +38,168 @@ public void LengthParseCorrectVwValue()
3738
Assert.AreEqual(Length.Unit.Vw, v.Type);
3839
}
3940

41+
[Test]
42+
public void LengthToPixelsPercentThrowsOnInvalidRenderDimensions()
43+
{
44+
var l = new Length(50, Length.Unit.Percent);
45+
var renderDevice = new DefaultRenderDevice();
46+
Assert.Throws<ArgumentException>(() => l.ToPixel(renderDevice, RenderMode.Undefined));
47+
Assert.Throws<ArgumentException>(() => l.ToPixel(null, RenderMode.Undefined));
48+
}
49+
50+
[Test]
51+
public void LengthToPixelsEmThrowsOnInvalidRenderDimensions()
52+
{
53+
var l = new Length(50, Length.Unit.Em);
54+
var renderDevice = new DefaultRenderDevice { FontSize = 0 };
55+
Assert.Throws<ArgumentException>(() => l.ToPixel(renderDevice, RenderMode.Undefined));
56+
Assert.Throws<ArgumentException>(() => l.ToPixel(null, RenderMode.Undefined));
57+
}
58+
59+
[Test]
60+
public void LengthToPixelsCorrectPercentWidth()
61+
{
62+
var l = new Length(50, Length.Unit.Percent);
63+
var renderDevice = new DefaultRenderDevice {ViewPortWidth = 500};
64+
Assert.AreEqual(250, l.ToPixel(renderDevice, RenderMode.Horizontal));
65+
}
66+
67+
[Test]
68+
public void LengthToPixelsCorrectPercentHeight()
69+
{
70+
var l = new Length(25, Length.Unit.Percent);
71+
var renderDevice = new DefaultRenderDevice {ViewPortHeight = 600};
72+
Assert.AreEqual(150, l.ToPixel(renderDevice, RenderMode.Vertical));
73+
}
74+
75+
[Test]
76+
public void LengthToPixelsCorrectRem()
77+
{
78+
var l = new Length(25, Length.Unit.Rem);
79+
var renderDevice = new DefaultRenderDevice {FontSize = 10};
80+
Assert.AreEqual(250, l.ToPixel(renderDevice, RenderMode.Undefined));
81+
}
82+
83+
[Test]
84+
public void LengthToPixelsCorrectEm()
85+
{
86+
var l = new Length(10, Length.Unit.Em);
87+
var renderDevice = new DefaultRenderDevice {FontSize = 10};
88+
Assert.AreEqual(100, l.ToPixel(renderDevice, RenderMode.Undefined));
89+
}
90+
91+
[Test]
92+
public void LengthToPixelsCorrectVh()
93+
{
94+
var l = new Length(10, Length.Unit.Vh);
95+
var renderDevice = new DefaultRenderDevice {ViewPortHeight = 1000};
96+
Assert.AreEqual(100, l.ToPixel(renderDevice, RenderMode.Undefined));
97+
}
98+
99+
[Test]
100+
public void LengthToPixelsCorrectVw()
101+
{
102+
var l = new Length(20, Length.Unit.Vw);
103+
var renderDevice = new DefaultRenderDevice {ViewPortWidth = 1000};
104+
Assert.AreEqual(200, l.ToPixel(renderDevice, RenderMode.Undefined));
105+
}
106+
107+
[Test]
108+
public void LengthToPixelsCorrectVmax()
109+
{
110+
var l = new Length(20, Length.Unit.Vmax);
111+
var renderDevice = new DefaultRenderDevice
112+
{
113+
ViewPortHeight = 1000,
114+
ViewPortWidth = 500
115+
};
116+
Assert.AreEqual(200, l.ToPixel(renderDevice, RenderMode.Undefined));
117+
}
118+
119+
[Test]
120+
public void LengthToPixelsCorrectVmin()
121+
{
122+
var l = new Length(20, Length.Unit.Vmin);
123+
var renderDevice = new DefaultRenderDevice
124+
{
125+
ViewPortHeight = 1000,
126+
ViewPortWidth = 500
127+
};
128+
Assert.AreEqual(100, l.ToPixel(renderDevice, RenderMode.Undefined));
129+
}
130+
131+
[Test]
132+
public void LengthToPercentCorrectWidth()
133+
{
134+
var l = new Length(100, Length.Unit.Px);
135+
var renderDevice = new DefaultRenderDevice {ViewPortWidth = 500};
136+
Assert.AreEqual(20, l.To(Length.Unit.Percent, renderDevice, RenderMode.Horizontal));
137+
}
138+
139+
[Test]
140+
public void LengthToPercentCorrectHeight()
141+
{
142+
var l = new Length(100, Length.Unit.Px);
143+
var renderDevice = new DefaultRenderDevice {ViewPortHeight = 1000};
144+
Assert.AreEqual(10, l.To(Length.Unit.Percent, renderDevice, RenderMode.Vertical));
145+
}
146+
147+
[Test]
148+
public void LengthToRemCorrectValue()
149+
{
150+
var l = new Length(100, Length.Unit.Px);
151+
var renderDevice = new DefaultRenderDevice {FontSize = 16};
152+
Assert.AreEqual(6.25d, l.To(Length.Unit.Rem, renderDevice, RenderMode.Undefined));
153+
}
154+
155+
[Test]
156+
public void LengthToEmCorrectValue()
157+
{
158+
var l = new Length(1600, Length.Unit.Px);
159+
var renderDevice = new DefaultRenderDevice {FontSize = 16};
160+
Assert.AreEqual(100, l.To(Length.Unit.Em, renderDevice, RenderMode.Undefined));
161+
}
162+
163+
[Test]
164+
public void LengthToVhCorrectValue()
165+
{
166+
var l = new Length(100, Length.Unit.Px);
167+
var renderDevice = new DefaultRenderDevice {ViewPortHeight = 1000};
168+
Assert.AreEqual(10, l.To(Length.Unit.Vh, renderDevice, RenderMode.Undefined));
169+
}
170+
171+
[Test]
172+
public void LengthToVwCorrectValue()
173+
{
174+
var l = new Length(50, Length.Unit.Px);
175+
var renderDevice = new DefaultRenderDevice {ViewPortWidth = 1000};
176+
Assert.AreEqual(5, l.To(Length.Unit.Vw, renderDevice, RenderMode.Undefined));
177+
}
178+
179+
[Test]
180+
public void LengthToVmaxCorrectValue()
181+
{
182+
var l = new Length(50, Length.Unit.Px);
183+
var renderDevice = new DefaultRenderDevice
184+
{
185+
ViewPortWidth = 1000,
186+
ViewPortHeight = 500
187+
};
188+
Assert.AreEqual(5, l.To(Length.Unit.Vmax, renderDevice, RenderMode.Undefined));
189+
}
190+
191+
[Test]
192+
public void LengthToVminCorrectValue()
193+
{
194+
var l = new Length(50, Length.Unit.Px);
195+
var renderDevice = new DefaultRenderDevice
196+
{
197+
ViewPortWidth = 1000,
198+
ViewPortHeight = 500
199+
};
200+
Assert.AreEqual(10, l.To(Length.Unit.Vmin, renderDevice, RenderMode.Undefined));
201+
}
202+
40203
[Test]
41204
public void AngleParseCorrectDegValue()
42205
{
@@ -90,4 +253,4 @@ public void AngleParseIncorrectValue()
90253
Assert.IsFalse(r);
91254
}
92255
}
93-
}
256+
}

src/AngleSharp.Css/DefaultRenderDevice.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,5 +90,18 @@ public Int32 ViewPortWidth
9090
get;
9191
set;
9292
} = 0;
93+
94+
/// <inheritdoc />
95+
public Double RenderWidth => ViewPortWidth;
96+
97+
/// <inheritdoc />
98+
public Double RenderHeight => ViewPortHeight;
99+
100+
/// <inheritdoc />
101+
public double FontSize
102+
{
103+
get;
104+
set;
105+
} = 16;
93106
}
94-
}
107+
}

src/AngleSharp.Css/Extensions/CssValueExtensions.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,20 +40,22 @@ public static Double AsDouble(this ICssValue value)
4040
/// Tries to convert the value to a number of pixels.
4141
/// </summary>
4242
/// <param name="value">The value to convert.</param>
43+
/// <param name="renderDimensions">the render device used to calculate relative units, can be null if units are absolute.</param>
44+
/// <param name="mode">Signifies the axis the unit represents, use to calculate relative units where the axis matters.</param>
4345
/// <returns>The resulting number.</returns>
44-
public static Double AsPx(this ICssValue value)
46+
public static Double AsPx(this ICssValue value, IRenderDimensions renderDimensions, RenderMode mode)
4547
{
4648
if (value is Length length && length.Type != Length.Unit.None)
4749
{
48-
return length.ToPixel();
50+
return length.ToPixel(renderDimensions, mode);
4951
}
5052
else if (value is ICssMultipleValue multiple && multiple.Count == 1)
5153
{
52-
return multiple[0].AsPx();
54+
return multiple[0].AsPx(renderDimensions, mode);
5355
}
5456
else if (value is ICssSpecialValue special && special.Value != null)
5557
{
56-
return special.Value.AsPx();
58+
return special.Value.AsPx(renderDimensions, mode);
5759
}
5860

5961
return 0.0;
@@ -201,20 +203,21 @@ public static String AsUrl(this ICssValue value)
201203
/// Tries to convert the value to a transformation matrix.
202204
/// </summary>
203205
/// <param name="value">The value to convert.</param>
206+
/// <param name="renderDimensions">the render device used to calculate relative units, can be null if units are absolute.</param>
204207
/// <returns>The resulting matrix.</returns>
205-
public static TransformMatrix AsMatrix(this ICssValue value)
208+
public static TransformMatrix AsMatrix(this ICssValue value, IRenderDimensions renderDimensions)
206209
{
207210
if (value is ICssTransformFunctionValue res)
208211
{
209-
return res.ComputeMatrix();
212+
return res.ComputeMatrix(renderDimensions);
210213
}
211214
else if (value is ICssMultipleValue multiple && multiple.Count == 1)
212215
{
213-
return multiple[0].AsMatrix();
216+
return multiple[0].AsMatrix(renderDimensions);
214217
}
215218
else if (value is ICssSpecialValue special && special.Value != null)
216219
{
217-
return special.Value.AsMatrix();
220+
return special.Value.AsMatrix(renderDimensions);
218221
}
219222

220223
return null;

src/AngleSharp.Css/FeatureValidators/AspectRatioFeatureValidator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ namespace AngleSharp.Css.FeatureValidators
77

88
sealed class AspectRatioFeatureValidator : IFeatureValidator
99
{
10-
public Boolean Validate(IMediaFeature feature, IRenderDevice device)
10+
public Boolean Validate(IMediaFeature feature, IRenderDevice renderDevice)
1111
{
1212
var ratio = RatioConverter.Convert(feature.Value);
1313

1414
if (ratio != null)
1515
{
1616
var desired = ratio.AsDouble();
17-
var available = device.ViewPortWidth / (Double)device.ViewPortHeight;
17+
var available = renderDevice.ViewPortWidth / (Double)renderDevice.ViewPortHeight;
1818

1919
if (feature.IsMaximum)
2020
{

src/AngleSharp.Css/FeatureValidators/ColorFeatureValidator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace AngleSharp.Css.FeatureValidators
88

99
sealed class ColorFeatureValidator : IFeatureValidator
1010
{
11-
public Boolean Validate(IMediaFeature feature, IRenderDevice device)
11+
public Boolean Validate(IMediaFeature feature, IRenderDevice renderDevice)
1212
{
1313
var defaultValue = new Length(1.0, Length.Unit.None);
1414
var converter = feature.IsMinimum || feature.IsMaximum ? PositiveIntegerConverter : PositiveIntegerConverter.Option(defaultValue);
@@ -17,7 +17,7 @@ public Boolean Validate(IMediaFeature feature, IRenderDevice device)
1717
if (color != null)
1818
{
1919
var desired = color.AsInt32();
20-
var available = Math.Pow(device.ColorBits, 2);
20+
var available = Math.Pow(renderDevice.ColorBits, 2);
2121

2222
if (feature.IsMaximum)
2323
{

src/AngleSharp.Css/FeatureValidators/ColorIndexFeatureValidator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace AngleSharp.Css.FeatureValidators
88

99
sealed class ColorIndexFeatureValidator : IFeatureValidator
1010
{
11-
public Boolean Validate(IMediaFeature feature, IRenderDevice device)
11+
public Boolean Validate(IMediaFeature feature, IRenderDevice renderDevice)
1212
{
1313
var defaultValue = new Length(1.0, Length.Unit.None);
1414
var converter = feature.IsMinimum || feature.IsMaximum ? NaturalIntegerConverter : NaturalIntegerConverter.Option(defaultValue);
@@ -17,7 +17,7 @@ public Boolean Validate(IMediaFeature feature, IRenderDevice device)
1717
if (index != null)
1818
{
1919
var desired = index.AsInt32();
20-
var available = device.ColorBits;
20+
var available = renderDevice.ColorBits;
2121

2222
if (feature.IsMaximum)
2323
{

src/AngleSharp.Css/FeatureValidators/DeviceAspectRatioFeatureValidator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ namespace AngleSharp.Css.FeatureValidators
77

88
sealed class DeviceAspectRatioFeatureValidator : IFeatureValidator
99
{
10-
public Boolean Validate(IMediaFeature feature, IRenderDevice device)
10+
public Boolean Validate(IMediaFeature feature, IRenderDevice renderDevice)
1111
{
1212
var ratio = RatioConverter.Convert(feature.Value);
1313

1414
if (ratio != null)
1515
{
1616
var desired = ratio.AsDouble();
17-
var available = device.DeviceWidth / (Double)device.DeviceHeight;
17+
var available = renderDevice.DeviceWidth / (Double)renderDevice.DeviceHeight;
1818

1919
if (feature.IsMaximum)
2020
{

src/AngleSharp.Css/FeatureValidators/DeviceHeightFeatureValidator.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ namespace AngleSharp.Css.FeatureValidators
77

88
sealed class DeviceHeightFeatureValidator : IFeatureValidator
99
{
10-
public Boolean Validate(IMediaFeature feature, IRenderDevice device)
10+
public Boolean Validate(IMediaFeature feature, IRenderDevice renderDevice)
1111
{
1212
var length = LengthConverter.Convert(feature.Value);
1313

1414
if (length != null)
1515
{
16-
var desired = length.AsPx();
17-
var available = (Double)device.DeviceHeight;
16+
var desired = length.AsPx(renderDevice, RenderMode.Vertical);
17+
var available = (Double)renderDevice.DeviceHeight;
1818

1919
if (feature.IsMaximum)
2020
{

src/AngleSharp.Css/FeatureValidators/DevicePixelRatioFeatureValidator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ namespace AngleSharp.Css.FeatureValidators
77

88
sealed class DevicePixelRatioFeatureValidator : IFeatureValidator
99
{
10-
public Boolean Validate(IMediaFeature feature, IRenderDevice device)
10+
public Boolean Validate(IMediaFeature feature, IRenderDevice renderDevice)
1111
{
1212
var value = NaturalNumberConverter.Convert(feature.Value);
1313

1414
if (value != null)
1515
{
1616
var desired = value.AsDouble();
17-
var available = device.Resolution / 96f;
17+
var available = renderDevice.Resolution / 96f;
1818

1919
if (feature.IsMaximum)
2020
{

src/AngleSharp.Css/FeatureValidators/DeviceWidthFeatureValidator.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ namespace AngleSharp.Css.FeatureValidators
77

88
sealed class DeviceWidthFeatureValidator : IFeatureValidator
99
{
10-
public Boolean Validate(IMediaFeature feature, IRenderDevice device)
10+
public Boolean Validate(IMediaFeature feature, IRenderDevice renderDevice)
1111
{
1212
var length = LengthConverter.Convert(feature.Value);
1313

1414
if (length != null)
1515
{
16-
var desired = length.AsPx();
17-
var available = (Double)device.DeviceWidth;
16+
var desired = length.AsPx(renderDevice, RenderMode.Horizontal);
17+
var available = (Double)renderDevice.DeviceWidth;
1818

1919
if (feature.IsMaximum)
2020
{

0 commit comments

Comments
 (0)