summaryrefslogtreecommitdiffstats
path: root/servo/components/style/values/computed/color.rs
diff options
context:
space:
mode:
Diffstat (limited to 'servo/components/style/values/computed/color.rs')
-rw-r--r--servo/components/style/values/computed/color.rs95
1 files changed, 95 insertions, 0 deletions
diff --git a/servo/components/style/values/computed/color.rs b/servo/components/style/values/computed/color.rs
new file mode 100644
index 0000000000..9b5185d923
--- /dev/null
+++ b/servo/components/style/values/computed/color.rs
@@ -0,0 +1,95 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+//! Computed color values.
+
+use crate::color::parsing::Color as CSSParserColor;
+use crate::color::AbsoluteColor;
+use crate::values::animated::ToAnimatedZero;
+use crate::values::computed::percentage::Percentage;
+use crate::values::generics::color::{
+ GenericCaretColor, GenericColor, GenericColorMix, GenericColorOrAuto,
+};
+use std::fmt;
+use style_traits::{CssWriter, ToCss};
+
+pub use crate::values::specified::color::{ColorScheme, ForcedColorAdjust, PrintColorAdjust};
+
+/// The computed value of the `color` property.
+pub type ColorPropertyValue = AbsoluteColor;
+
+/// A computed value for `<color>`.
+pub type Color = GenericColor<Percentage>;
+
+/// A computed color-mix().
+pub type ColorMix = GenericColorMix<Color, Percentage>;
+
+impl ToCss for Color {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: fmt::Write,
+ {
+ match *self {
+ Self::Absolute(ref c) => c.to_css(dest),
+ Self::CurrentColor => cssparser::ToCss::to_css(&CSSParserColor::CurrentColor, dest),
+ Self::ColorMix(ref m) => m.to_css(dest),
+ }
+ }
+}
+
+impl Color {
+ /// A fully transparent color.
+ pub const TRANSPARENT_BLACK: Self = Self::Absolute(AbsoluteColor::TRANSPARENT_BLACK);
+
+ /// An opaque black color.
+ pub const BLACK: Self = Self::Absolute(AbsoluteColor::BLACK);
+
+ /// An opaque white color.
+ pub const WHITE: Self = Self::Absolute(AbsoluteColor::WHITE);
+
+ /// Create a new computed [`Color`] from a given color-mix, simplifying it to an absolute color
+ /// if possible.
+ pub fn from_color_mix(color_mix: ColorMix) -> Self {
+ if let Some(absolute) = color_mix.mix_to_absolute() {
+ Self::Absolute(absolute)
+ } else {
+ Self::ColorMix(Box::new(color_mix))
+ }
+ }
+
+ /// Combine this complex color with the given foreground color into an
+ /// absolute color.
+ pub fn resolve_to_absolute(&self, current_color: &AbsoluteColor) -> AbsoluteColor {
+ use crate::values::specified::percentage::ToPercentage;
+
+ match *self {
+ Self::Absolute(c) => c,
+ Self::CurrentColor => *current_color,
+ Self::ColorMix(ref mix) => {
+ let left = mix.left.resolve_to_absolute(current_color);
+ let right = mix.right.resolve_to_absolute(current_color);
+ crate::color::mix::mix(
+ mix.interpolation,
+ &left,
+ mix.left_percentage.to_percentage(),
+ &right,
+ mix.right_percentage.to_percentage(),
+ mix.flags,
+ )
+ },
+ }
+ }
+}
+
+impl ToAnimatedZero for AbsoluteColor {
+ fn to_animated_zero(&self) -> Result<Self, ()> {
+ Ok(Self::TRANSPARENT_BLACK)
+ }
+}
+
+/// auto | <color>
+pub type ColorOrAuto = GenericColorOrAuto<Color>;
+
+/// caret-color
+pub type CaretColor = GenericCaretColor<Color>;