use std;
use sys;
use {Direction, Language};
pub struct Buffer {
raw: *mut sys::hb_buffer_t,
}
impl Buffer {
pub fn new() -> Self {
Buffer::default()
}
pub unsafe fn from_raw(raw: *mut sys::hb_buffer_t) -> Self {
Buffer { raw }
}
pub fn as_ptr(&self) -> *mut sys::hb_buffer_t {
self.raw
}
pub fn into_raw(self) -> *mut sys::hb_buffer_t {
let raw = self.raw;
std::mem::forget(self);
raw
}
pub fn with(text: &str) -> Self {
let mut b = Buffer::new();
b.add_str(text);
b
}
pub fn with_capacity(capacity: usize) -> Self {
let mut b = Buffer::default();
b.reserve(capacity);
b
}
pub fn add_str(&mut self, text: &str) {
unsafe {
sys::hb_buffer_add_utf8(
self.raw,
text.as_ptr() as *const std::os::raw::c_char,
text.len() as std::os::raw::c_int,
0,
text.len() as std::os::raw::c_int,
)
};
}
pub fn append(&mut self, other: &Buffer, start: usize, end: usize) {
unsafe {
sys::hb_buffer_append(
self.raw,
other.raw,
start as std::os::raw::c_uint,
end as std::os::raw::c_uint,
)
};
}
pub fn clear_contents(&mut self) {
unsafe { sys::hb_buffer_clear_contents(self.raw) };
}
pub fn reset(&mut self) {
unsafe { sys::hb_buffer_reset(self.raw) };
}
pub fn reserve(&mut self, size: usize) {
unsafe { sys::hb_buffer_pre_allocate(self.raw, size as u32) };
}
pub fn len(&self) -> usize {
unsafe { sys::hb_buffer_get_length(self.raw) as usize }
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn guess_segment_properties(&mut self) {
unsafe { sys::hb_buffer_guess_segment_properties(self.raw) };
}
pub fn set_direction(&mut self, direction: Direction) {
unsafe { sys::hb_buffer_set_direction(self.raw, direction.into()) };
}
pub fn get_direction(&self) -> Direction {
(unsafe { sys::hb_buffer_get_direction(self.raw) }).into()
}
pub fn set_script(&mut self, script: sys::hb_script_t) {
unsafe { sys::hb_buffer_set_script(self.raw, script) };
}
pub fn get_script(&self) -> sys::hb_script_t {
unsafe { sys::hb_buffer_get_script(self.raw) }
}
pub fn set_language(&mut self, language: Language) {
unsafe { sys::hb_buffer_set_language(self.raw, language.as_raw()) };
}
pub fn get_language(&self) -> Language {
unsafe { Language::from_raw(sys::hb_buffer_get_language(self.raw)) }
}
}
impl std::fmt::Debug for Buffer {
fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
fmt.debug_struct("Buffer")
.field("direction", &self.get_direction())
.field("script", &self.get_script())
.field("language", &self.get_language())
.finish()
}
}
impl Default for Buffer {
fn default() -> Self {
Buffer {
raw: unsafe { sys::hb_buffer_create() },
}
}
}
impl Drop for Buffer {
fn drop(&mut self) {
unsafe { sys::hb_buffer_destroy(self.raw) }
}
}