blob: 4bba48189ddb06d600ae8cbf25a79bf3877a3735 [file] [log] [blame]
// Copyright 2016 Joe Wilm, The Alacritty Project Contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::ptr::NonNull;
use foreign_types::{foreign_type, ForeignType, ForeignTypeRef};
use super::ffi::FcCharSetCreate;
use super::ffi::{
FcBool, FcCharSet, FcCharSetAddChar, FcCharSetCopy, FcCharSetCount, FcCharSetDestroy,
FcCharSetHasChar, FcCharSetMerge, FcCharSetSubtract, FcCharSetUnion,
};
foreign_type! {
pub unsafe type CharSet {
type CType = FcCharSet;
fn drop = FcCharSetDestroy;
fn clone = FcCharSetCopy;
}
}
impl CharSet {
pub fn new() -> Self {
Self::default()
}
}
impl Default for CharSet {
fn default() -> Self {
CharSet(unsafe { NonNull::new(FcCharSetCreate()).unwrap() })
}
}
impl CharSetRef {
pub fn add(&mut self, glyph: char) -> bool {
unsafe { FcCharSetAddChar(self.as_ptr(), glyph as _) == 1 }
}
pub fn has_char(&self, glyph: char) -> bool {
unsafe { FcCharSetHasChar(self.as_ptr(), glyph as _) == 1 }
}
pub fn count(&self) -> u32 {
unsafe { FcCharSetCount(self.as_ptr()) as u32 }
}
pub fn union(&self, other: &CharSetRef) -> CharSet {
unsafe {
let ptr = FcCharSetUnion(self.as_ptr() as _, other.as_ptr() as _);
CharSet::from_ptr(ptr)
}
}
pub fn subtract(&self, other: &CharSetRef) -> CharSet {
unsafe {
let ptr = FcCharSetSubtract(self.as_ptr() as _, other.as_ptr() as _);
CharSet::from_ptr(ptr)
}
}
pub fn merge(&self, other: &CharSetRef) -> Result<bool, ()> {
unsafe {
// Value is just an indicator whether something was added or not
let mut value: FcBool = 0;
let res = FcCharSetMerge(self.as_ptr() as _, other.as_ptr() as _, &mut value);
if res == 0 {
Err(())
} else {
Ok(value != 0)
}
}
}
}