style/values/computed/
angle.rs1use crate::derives::*;
8use crate::values::distance::{ComputeSquaredDistance, SquaredDistance};
9use crate::values::CSSFloat;
10use crate::Zero;
11use std::f64::consts::PI;
12use std::fmt::{self, Write};
13use std::ops::Neg;
14use std::{f32, f64};
15use style_traits::{CssWriter, ToCss};
16
17#[derive(
19 Add,
20 Animate,
21 Clone,
22 Copy,
23 Debug,
24 Deserialize,
25 MallocSizeOf,
26 PartialEq,
27 PartialOrd,
28 Serialize,
29 ToAnimatedZero,
30 ToResolvedValue,
31)]
32#[repr(C)]
33pub struct Angle(CSSFloat);
34
35impl ToCss for Angle {
36 fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
37 where
38 W: Write,
39 {
40 self.degrees().to_css(dest)?;
41 dest.write_str("deg")
42 }
43}
44
45const RAD_PER_DEG: f64 = PI / 180.0;
46
47impl Angle {
48 pub fn from_radians(radians: CSSFloat) -> Self {
50 Angle(radians / RAD_PER_DEG as f32)
51 }
52
53 #[inline]
55 pub fn from_degrees(degrees: CSSFloat) -> Self {
56 Angle(degrees)
57 }
58
59 #[inline]
61 pub fn radians(&self) -> CSSFloat {
62 self.radians64().min(f32::MAX as f64).max(f32::MIN as f64) as f32
63 }
64
65 #[inline]
72 pub fn radians64(&self) -> f64 {
73 self.0 as f64 * RAD_PER_DEG
74 }
75
76 #[inline]
78 pub fn degrees(&self) -> CSSFloat {
79 self.0
80 }
81}
82
83impl Zero for Angle {
84 #[inline]
85 fn zero() -> Self {
86 Angle(0.0)
87 }
88
89 #[inline]
90 fn is_zero(&self) -> bool {
91 self.0 == 0.
92 }
93}
94
95impl ComputeSquaredDistance for Angle {
96 #[inline]
97 fn compute_squared_distance(&self, other: &Self) -> Result<SquaredDistance, ()> {
98 self.radians64()
101 .compute_squared_distance(&other.radians64())
102 }
103}
104
105impl Neg for Angle {
106 type Output = Angle;
107
108 #[inline]
109 fn neg(self) -> Angle {
110 Angle(-self.0)
111 }
112}