1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
/* 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/. */
//! Generic types for text properties.
use crate::Zero;
use std::fmt::{self, Write};
use style_traits::{CssWriter, ToCss};
/// A generic value for the `initial-letter` property.
#[derive(
Clone,
Copy,
Debug,
MallocSizeOf,
PartialEq,
SpecifiedValueInfo,
ToComputedValue,
ToResolvedValue,
ToShmem,
)]
#[repr(C)]
pub struct GenericInitialLetter<Number, Integer> {
/// The size, >=1, or 0 if `normal`.
pub size: Number,
/// The sink, >=1, if specified, 0 otherwise.
pub sink: Integer,
}
pub use self::GenericInitialLetter as InitialLetter;
impl<N: Zero, I: Zero> InitialLetter<N, I> {
/// Returns `normal`.
#[inline]
pub fn normal() -> Self {
InitialLetter {
size: N::zero(),
sink: I::zero(),
}
}
}
impl<N: ToCss + Zero, I: ToCss + Zero> ToCss for InitialLetter<N, I> {
fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
W: Write,
{
if self.size.is_zero() {
return dest.write_str("normal");
}
self.size.to_css(dest)?;
if !self.sink.is_zero() {
dest.write_char(' ')?;
self.sink.to_css(dest)?;
}
Ok(())
}
}
/// Implements type for text-decoration-thickness
/// which takes the grammar of auto | from-font | <length> | <percentage>
///
/// https://drafts.csswg.org/css-text-decor-4/
#[repr(C, u8)]
#[cfg_attr(feature = "servo", derive(Deserialize, Serialize))]
#[derive(
Animate,
Clone,
Copy,
ComputeSquaredDistance,
Debug,
Eq,
MallocSizeOf,
Parse,
PartialEq,
SpecifiedValueInfo,
ToAnimatedValue,
ToAnimatedZero,
ToComputedValue,
ToCss,
ToResolvedValue,
ToShmem,
)]
#[allow(missing_docs)]
pub enum GenericTextDecorationLength<L> {
LengthPercentage(L),
Auto,
FromFont,
}
/// Implements type for text-indent
/// which takes the grammar of [<length-percentage>] && hanging? && each-line?
///
/// https://drafts.csswg.org/css-text/#propdef-text-indent
#[repr(C)]
#[derive(
Animate,
Clone,
ComputeSquaredDistance,
Debug,
Eq,
MallocSizeOf,
PartialEq,
SpecifiedValueInfo,
ToAnimatedValue,
ToAnimatedZero,
ToComputedValue,
ToCss,
ToResolvedValue,
ToShmem,
)]
pub struct GenericTextIndent<LengthPercentage> {
/// The amount of indent to be applied to the inline-start of the first line.
pub length: LengthPercentage,
/// Apply indent to non-first lines instead of first.
#[animation(constant)]
#[css(represents_keyword)]
pub hanging: bool,
/// Apply to each line after a hard break, not only first in block.
#[animation(constant)]
#[css(represents_keyword)]
pub each_line: bool,
}
impl<LengthPercentage: Zero> GenericTextIndent<LengthPercentage> {
/// Return the initial zero value.
pub fn zero() -> Self {
Self {
length: LengthPercentage::zero(),
hanging: false,
each_line: false,
}
}
}