use crate::values::animated::ToAnimatedValue;
use crate::values::generics::NonNegative;
use crate::values::specified::percentage::ToPercentage;
use crate::values::{serialize_normalized_percentage, CSSFloat};
use crate::Zero;
use std::fmt;
use style_traits::{CssWriter, ToCss};
#[derive(
Animate,
Clone,
ComputeSquaredDistance,
Copy,
Debug,
Default,
Deserialize,
MallocSizeOf,
PartialEq,
PartialOrd,
Serialize,
SpecifiedValueInfo,
ToAnimatedValue,
ToAnimatedZero,
ToComputedValue,
ToResolvedValue,
ToShmem,
)]
#[repr(C)]
pub struct Percentage(pub CSSFloat);
impl Percentage {
#[inline]
pub fn hundred() -> Self {
Percentage(1.)
}
#[inline]
pub fn abs(&self) -> Self {
Percentage(self.0.abs())
}
#[inline]
pub fn clamp_to_non_negative(self) -> Self {
Percentage(self.0.max(0.))
}
}
impl Zero for Percentage {
fn zero() -> Self {
Percentage(0.)
}
fn is_zero(&self) -> bool {
self.0 == 0.
}
}
impl ToPercentage for Percentage {
fn to_percentage(&self) -> CSSFloat {
self.0
}
}
impl std::ops::AddAssign for Percentage {
fn add_assign(&mut self, other: Self) {
self.0 += other.0
}
}
impl std::ops::Add for Percentage {
type Output = Self;
fn add(self, other: Self) -> Self {
Percentage(self.0 + other.0)
}
}
impl std::ops::Sub for Percentage {
type Output = Self;
fn sub(self, other: Self) -> Self {
Percentage(self.0 - other.0)
}
}
impl std::ops::Rem for Percentage {
type Output = Self;
fn rem(self, other: Self) -> Self {
Percentage(self.0 % other.0)
}
}
impl ToCss for Percentage {
fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
W: fmt::Write,
{
serialize_normalized_percentage(self.0, dest)
}
}
pub type NonNegativePercentage = NonNegative<Percentage>;
impl NonNegativePercentage {
#[inline]
pub fn hundred() -> Self {
NonNegative(Percentage::hundred())
}
}
impl ToAnimatedValue for NonNegativePercentage {
type AnimatedValue = Percentage;
#[inline]
fn to_animated_value(self, _: &crate::values::animated::Context) -> Self::AnimatedValue {
self.0
}
#[inline]
fn from_animated_value(animated: Self::AnimatedValue) -> Self {
NonNegative(animated.clamp_to_non_negative())
}
}