use crate::{sys, SubsetInput};
use std::ops::{Deref, DerefMut};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Flags(pub sys::hb_subset_flags_t);
impl Flags {
fn add_flag(&mut self, flag: sys::hb_subset_flags_t) -> &mut Self {
self.0 |= flag;
self
}
fn remove_flag(&mut self, flag: sys::hb_subset_flags_t) -> &mut Self {
self.0 .0 &= !flag.0;
self
}
pub fn remove_hinting(&mut self) -> &mut Self {
self.add_flag(sys::hb_subset_flags_t::NO_HINTING)
}
pub fn retain_hinting(&mut self) -> &mut Self {
self.remove_flag(sys::hb_subset_flags_t::NO_HINTING)
}
pub fn retain_glyph_indices(&mut self) -> &mut Self {
self.add_flag(sys::hb_subset_flags_t::RETAIN_GIDS)
}
pub fn remap_glyph_indices(&mut self) -> &mut Self {
self.remove_flag(sys::hb_subset_flags_t::RETAIN_GIDS)
}
pub fn remove_subroutines(&mut self) -> &mut Self {
self.add_flag(sys::hb_subset_flags_t::DESUBROUTINIZE)
}
pub fn retain_subroutines(&mut self) -> &mut Self {
self.remove_flag(sys::hb_subset_flags_t::DESUBROUTINIZE)
}
pub fn retain_legacy_names(&mut self) -> &mut Self {
self.add_flag(sys::hb_subset_flags_t::NAME_LEGACY)
}
pub fn remove_legacy_names(&mut self) -> &mut Self {
self.remove_flag(sys::hb_subset_flags_t::NAME_LEGACY)
}
pub fn set_overlap_simple_flag(&mut self) -> &mut Self {
self.add_flag(sys::hb_subset_flags_t::SET_OVERLAPS_FLAG)
}
pub fn remove_overlap_simple_flag(&mut self) -> &mut Self {
self.remove_flag(sys::hb_subset_flags_t::SET_OVERLAPS_FLAG)
}
pub fn retain_unrecognized_tables(&mut self) -> &mut Self {
self.add_flag(sys::hb_subset_flags_t::PASSTHROUGH_UNRECOGNIZED)
}
pub fn remove_unrecognized_tables(&mut self) -> &mut Self {
self.remove_flag(sys::hb_subset_flags_t::PASSTHROUGH_UNRECOGNIZED)
}
pub fn retain_notdef_outline(&mut self) -> &mut Self {
self.add_flag(sys::hb_subset_flags_t::NOTDEF_OUTLINE)
}
pub fn remove_notdef_outline(&mut self) -> &mut Self {
self.remove_flag(sys::hb_subset_flags_t::NOTDEF_OUTLINE)
}
pub fn retain_glyph_names(&mut self) -> &mut Self {
self.add_flag(sys::hb_subset_flags_t::GLYPH_NAMES)
}
pub fn remove_glyph_names(&mut self) -> &mut Self {
self.remove_flag(sys::hb_subset_flags_t::GLYPH_NAMES)
}
pub fn recompute_unicode_ranges(&mut self) -> &mut Self {
self.remove_flag(sys::hb_subset_flags_t::NO_PRUNE_UNICODE_RANGES)
}
pub fn retain_unicode_ranges(&mut self) -> &mut Self {
self.add_flag(sys::hb_subset_flags_t::NO_PRUNE_UNICODE_RANGES)
}
pub fn retain_layout_closure(&mut self) -> &mut Self {
self.remove_flag(sys::hb_subset_flags_t::NO_LAYOUT_CLOSURE)
}
pub fn no_layout_closure(&mut self) -> &mut Self {
self.add_flag(sys::hb_subset_flags_t::NO_LAYOUT_CLOSURE)
}
}
impl Default for Flags {
fn default() -> Self {
Self(sys::hb_subset_flags_t::DEFAULT)
}
}
pub struct FlagRef<'s>(pub(crate) &'s mut SubsetInput, pub(crate) Flags);
impl<'s> Deref for FlagRef<'s> {
type Target = Flags;
fn deref(&self) -> &Self::Target {
&self.1
}
}
impl<'s> DerefMut for FlagRef<'s> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.1
}
}
impl<'s> Drop for FlagRef<'s> {
fn drop(&mut self) {
unsafe { sys::hb_subset_input_set_flags(self.0.as_raw(), self.1 .0 .0) }
}
}