#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) struct WidthInfo(u16);
#[path = "gen/width_info.rs"]
mod gen;
const LIGATURE_TRANSPARENT_MASK: u16 = 0b0010_0000_0000_0000;
impl WidthInfo {
pub(crate) fn is_ligature_transparent(self) -> bool {
(self.0 & 0b0000_1000_0000_0000) == 0b0000_1000_0000_0000
}
pub(crate) fn set_zwj_bit(self) -> Self {
Self(self.0 | 0b0000_0100_0000_0000)
}
pub(crate) fn is_emoji_presentation(self) -> bool {
(self.0 & WidthInfo::VARIATION_SELECTOR_16.0) == WidthInfo::VARIATION_SELECTOR_16.0
}
pub(crate) fn is_zwj_emoji_presentation(self) -> bool {
(self.0 & 0b1011_0000_0000_0000) == 0b1001_0000_0000_0000
}
pub(crate) fn set_emoji_presentation(self) -> Self {
if (self.0 & LIGATURE_TRANSPARENT_MASK) == LIGATURE_TRANSPARENT_MASK
|| (self.0 & 0b1001_0000_0000_0000) == 0b0001_0000_0000_0000
{
Self(
self.0
| WidthInfo::VARIATION_SELECTOR_16.0
& !WidthInfo::VARIATION_SELECTOR_15.0
& !WidthInfo::VARIATION_SELECTOR_1_2_OR_3.0,
)
} else {
Self::VARIATION_SELECTOR_16
}
}
pub(crate) fn unset_emoji_presentation(self) -> Self {
if (self.0 & LIGATURE_TRANSPARENT_MASK) == LIGATURE_TRANSPARENT_MASK {
Self(self.0 & !WidthInfo::VARIATION_SELECTOR_16.0)
} else {
Self::DEFAULT
}
}
pub(crate) fn is_text_presentation(self) -> bool {
(self.0 & WidthInfo::VARIATION_SELECTOR_15.0) == WidthInfo::VARIATION_SELECTOR_15.0
}
pub(crate) fn set_text_presentation(self) -> Self {
if (self.0 & LIGATURE_TRANSPARENT_MASK) == LIGATURE_TRANSPARENT_MASK {
Self(
self.0
| WidthInfo::VARIATION_SELECTOR_15.0
& !WidthInfo::VARIATION_SELECTOR_16.0
& !WidthInfo::VARIATION_SELECTOR_1_2_OR_3.0,
)
} else {
Self(WidthInfo::VARIATION_SELECTOR_15.0)
}
}
pub(crate) fn unset_text_presentation(self) -> Self {
Self(self.0 & !WidthInfo::VARIATION_SELECTOR_15.0)
}
pub(crate) fn is_vs1_2_3(self) -> bool {
(self.0 & WidthInfo::VARIATION_SELECTOR_1_2_OR_3.0)
== WidthInfo::VARIATION_SELECTOR_1_2_OR_3.0
}
pub(crate) fn set_vs1_2_3(self) -> Self {
if (self.0 & LIGATURE_TRANSPARENT_MASK) == LIGATURE_TRANSPARENT_MASK {
Self(
self.0
| WidthInfo::VARIATION_SELECTOR_1_2_OR_3.0
& !WidthInfo::VARIATION_SELECTOR_15.0
& !WidthInfo::VARIATION_SELECTOR_16.0,
)
} else {
Self(WidthInfo::VARIATION_SELECTOR_1_2_OR_3.0)
}
}
pub(crate) fn unset_vs1_2_3(self) -> Self {
Self(self.0 & !WidthInfo::VARIATION_SELECTOR_1_2_OR_3.0)
}
}