use std::cell::Cell;
use std::rc::Rc;
#[allow(unused_imports)]
use std::marker::PhantomData;
#[allow(unused_imports)]
use std::os::raw::c_void;
#[allow(unused_imports)]
use std::mem::transmute;
#[allow(unused_imports)]
use std::ffi::{CStr, CString};
use rute_ffi_base::*;
#[allow(unused_imports)]
use auto::*;
#[derive(Clone)]
pub struct Font<'a> {
#[doc(hidden)]
pub data: Rc<Cell<Option<*const RUBase>>>,
#[doc(hidden)]
pub all_funcs: *const RUFontAllFuncs,
#[doc(hidden)]
pub owned: bool,
#[doc(hidden)]
pub _marker: PhantomData<::std::cell::Cell<&'a ()>>,
}
impl<'a> Font<'a> {
pub fn new() -> Font<'a> {
let data = Rc::new(Cell::new(None));
let ffi_data = unsafe {
((*rute_ffi_get()).create_font)(
::std::ptr::null(),
transmute(rute_object_delete_callback as usize),
Rc::into_raw(data.clone()) as *const c_void,
)
};
data.set(Some(ffi_data.qt_data));
Font {
data,
all_funcs: ffi_data.all_funcs,
owned: true,
_marker: PhantomData,
}
}
#[allow(dead_code)]
pub(crate) fn new_from_rc(ffi_data: RUFont) -> Font<'a> {
Font {
data: unsafe { Rc::from_raw(ffi_data.host_data as *const Cell<Option<*const RUBase>>) },
all_funcs: ffi_data.all_funcs,
owned: false,
_marker: PhantomData,
}
}
#[allow(dead_code)]
pub(crate) fn new_from_owned(ffi_data: RUFont) -> Font<'a> {
Font {
data: Rc::new(Cell::new(Some(ffi_data.qt_data as *const RUBase))),
all_funcs: ffi_data.all_funcs,
owned: true,
_marker: PhantomData,
}
}
#[allow(dead_code)]
pub(crate) fn new_from_temporary(ffi_data: RUFont) -> Font<'a> {
Font {
data: Rc::new(Cell::new(Some(ffi_data.qt_data as *const RUBase))),
all_funcs: ffi_data.all_funcs,
owned: false,
_marker: PhantomData,
}
}
pub fn swap<F: FontTrait<'a>>(&self, other: &F) -> &Self {
let (obj_other_1, _funcs) = other.get_font_obj_funcs();
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).swap)(obj_data, obj_other_1);
}
self
}
pub fn family(&self) -> String {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).family)(obj_data);
let ret_val = CStr::from_ptr(ret_val).to_string_lossy().into_owned();
ret_val
}
}
pub fn set_family(&self, arg0: &str) -> &Self {
let str_in_arg0_1 = CString::new(arg0).unwrap();
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_family)(obj_data, str_in_arg0_1.as_ptr());
}
self
}
pub fn style_name(&self) -> String {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).style_name)(obj_data);
let ret_val = CStr::from_ptr(ret_val).to_string_lossy().into_owned();
ret_val
}
}
pub fn set_style_name(&self, arg0: &str) -> &Self {
let str_in_arg0_1 = CString::new(arg0).unwrap();
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_style_name)(obj_data, str_in_arg0_1.as_ptr());
}
self
}
pub fn point_size(&self) -> i32 {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).point_size)(obj_data);
ret_val
}
}
pub fn set_point_size(&self, arg0: i32) -> &Self {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_point_size)(obj_data, arg0);
}
self
}
pub fn point_size_f(&self) -> f32 {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).point_size_f)(obj_data);
ret_val
}
}
pub fn set_point_size_f(&self, arg0: f32) -> &Self {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_point_size_f)(obj_data, arg0);
}
self
}
pub fn pixel_size(&self) -> i32 {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).pixel_size)(obj_data);
ret_val
}
}
pub fn set_pixel_size(&self, arg0: i32) -> &Self {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_pixel_size)(obj_data, arg0);
}
self
}
pub fn weight(&self) -> i32 {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).weight)(obj_data);
ret_val
}
}
pub fn set_weight(&self, arg0: i32) -> &Self {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_weight)(obj_data, arg0);
}
self
}
pub fn bold(&self) -> bool {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).bold)(obj_data);
ret_val
}
}
pub fn set_bold(&self, arg0: bool) -> &Self {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_bold)(obj_data, arg0);
}
self
}
pub fn italic(&self) -> bool {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).italic)(obj_data);
ret_val
}
}
pub fn set_italic(&self, b: bool) -> &Self {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_italic)(obj_data, b);
}
self
}
pub fn underline(&self) -> bool {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).underline)(obj_data);
ret_val
}
}
pub fn set_underline(&self, arg0: bool) -> &Self {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_underline)(obj_data, arg0);
}
self
}
pub fn overline(&self) -> bool {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).overline)(obj_data);
ret_val
}
}
pub fn set_overline(&self, arg0: bool) -> &Self {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_overline)(obj_data, arg0);
}
self
}
pub fn fixed_pitch(&self) -> bool {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).fixed_pitch)(obj_data);
ret_val
}
}
pub fn set_fixed_pitch(&self, arg0: bool) -> &Self {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_fixed_pitch)(obj_data, arg0);
}
self
}
pub fn kerning(&self) -> bool {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).kerning)(obj_data);
ret_val
}
}
pub fn set_kerning(&self, arg0: bool) -> &Self {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_kerning)(obj_data, arg0);
}
self
}
pub fn style_hint(&self) -> StyleHint {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).style_hint)(obj_data);
let ret_val = StyleHint::from_bits_truncate(ret_val);
ret_val
}
}
pub fn set_style_hint(&self, arg0: StyleHint, arg1: StyleStrategy) -> &Self {
let enum_arg0_1 = arg0.bits();
let enum_arg1_2 = arg1.bits();
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_style_hint)(obj_data, enum_arg0_1, enum_arg1_2);
}
self
}
pub fn letter_spacing(&self) -> f32 {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).letter_spacing)(obj_data);
ret_val
}
}
pub fn letter_spacing_type(&self) -> SpacingType {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).letter_spacing_type)(obj_data);
let ret_val = { transmute::<u32, SpacingType>(ret_val) };
ret_val
}
}
pub fn set_letter_spacing(&self, stype: SpacingType, spacing: f32) -> &Self {
let enum_stype_1 = stype as u32;
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_letter_spacing)(obj_data, enum_stype_1, spacing);
}
self
}
pub fn word_spacing(&self) -> f32 {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).word_spacing)(obj_data);
ret_val
}
}
pub fn set_word_spacing(&self, spacing: f32) -> &Self {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_word_spacing)(obj_data, spacing);
}
self
}
pub fn set_capitalization(&self, arg0: Capitalization) -> &Self {
let enum_arg0_1 = arg0 as u32;
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_capitalization)(obj_data, enum_arg0_1);
}
self
}
pub fn capitalization(&self) -> Capitalization {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).capitalization)(obj_data);
let ret_val = { transmute::<u32, Capitalization>(ret_val) };
ret_val
}
}
pub fn set_hinting_preference(&self, hinting_preference: HintingPreference) -> &Self {
let enum_hinting_preference_1 = hinting_preference as u32;
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_hinting_preference)(obj_data, enum_hinting_preference_1);
}
self
}
pub fn hinting_preference(&self) -> HintingPreference {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).hinting_preference)(obj_data);
let ret_val = { transmute::<u32, HintingPreference>(ret_val) };
ret_val
}
}
pub fn raw_mode(&self) -> bool {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).raw_mode)(obj_data);
ret_val
}
}
pub fn set_raw_mode(&self, arg0: bool) -> &Self {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_raw_mode)(obj_data, arg0);
}
self
}
pub fn exact_match(&self) -> bool {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).exact_match)(obj_data);
ret_val
}
}
pub fn is_copy_of<F: FontTrait<'a>>(&self, arg0: &F) -> bool {
let (obj_arg0_1, _funcs) = arg0.get_font_obj_funcs();
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).is_copy_of)(obj_data, obj_arg0_1);
ret_val
}
}
pub fn set_raw_name(&self, arg0: &str) -> &Self {
let str_in_arg0_1 = CString::new(arg0).unwrap();
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).set_raw_name)(obj_data, str_in_arg0_1.as_ptr());
}
self
}
pub fn raw_name(&self) -> String {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).raw_name)(obj_data);
let ret_val = CStr::from_ptr(ret_val).to_string_lossy().into_owned();
ret_val
}
}
pub fn key(&self) -> String {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).key)(obj_data);
let ret_val = CStr::from_ptr(ret_val).to_string_lossy().into_owned();
ret_val
}
}
pub fn substitute(arg0: &str) -> String {
let str_in_arg0_1 = CString::new(arg0).unwrap();
let (obj_data, funcs) = unsafe {
(
::std::ptr::null(),
(*((*rute_ffi_get()).get_font)(::std::ptr::null()).all_funcs).font_funcs,
)
};
unsafe {
let ret_val = ((*funcs).substitute)(obj_data, str_in_arg0_1.as_ptr());
let ret_val = CStr::from_ptr(ret_val).to_string_lossy().into_owned();
ret_val
}
}
pub fn insert_substitution(arg0: &str, arg1: &str) {
let str_in_arg0_1 = CString::new(arg0).unwrap();
let str_in_arg1_2 = CString::new(arg1).unwrap();
let (obj_data, funcs) = unsafe {
(
::std::ptr::null(),
(*((*rute_ffi_get()).get_font)(::std::ptr::null()).all_funcs).font_funcs,
)
};
unsafe {
((*funcs).insert_substitution)(
obj_data,
str_in_arg0_1.as_ptr(),
str_in_arg1_2.as_ptr(),
);
}
}
pub fn remove_substitutions(arg0: &str) {
let str_in_arg0_1 = CString::new(arg0).unwrap();
let (obj_data, funcs) = unsafe {
(
::std::ptr::null(),
(*((*rute_ffi_get()).get_font)(::std::ptr::null()).all_funcs).font_funcs,
)
};
unsafe {
((*funcs).remove_substitutions)(obj_data, str_in_arg0_1.as_ptr());
}
}
pub fn initialize() {
let (obj_data, funcs) = unsafe {
(
::std::ptr::null(),
(*((*rute_ffi_get()).get_font)(::std::ptr::null()).all_funcs).font_funcs,
)
};
unsafe {
((*funcs).initialize)(obj_data);
}
}
pub fn cleanup() {
let (obj_data, funcs) = unsafe {
(
::std::ptr::null(),
(*((*rute_ffi_get()).get_font)(::std::ptr::null()).all_funcs).font_funcs,
)
};
unsafe {
((*funcs).cleanup)(obj_data);
}
}
pub fn cache_statistics() {
let (obj_data, funcs) = unsafe {
(
::std::ptr::null(),
(*((*rute_ffi_get()).get_font)(::std::ptr::null()).all_funcs).font_funcs,
)
};
unsafe {
((*funcs).cache_statistics)(obj_data);
}
}
pub fn default_family(&self) -> String {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).default_family)(obj_data);
let ret_val = CStr::from_ptr(ret_val).to_string_lossy().into_owned();
ret_val
}
}
pub fn last_resort_family(&self) -> String {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).last_resort_family)(obj_data);
let ret_val = CStr::from_ptr(ret_val).to_string_lossy().into_owned();
ret_val
}
}
pub fn last_resort_font(&self) -> String {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).last_resort_font)(obj_data);
let ret_val = CStr::from_ptr(ret_val).to_string_lossy().into_owned();
ret_val
}
}
pub fn resolve<F: FontTrait<'a>>(&self, arg0: &F) -> Font {
let (obj_arg0_1, _funcs) = arg0.get_font_obj_funcs();
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).resolve)(obj_data, obj_arg0_1);
let t = ret_val;
let ret_val;
if t.host_data != ::std::ptr::null() {
ret_val = Font::new_from_rc(t);
} else {
ret_val = Font::new_from_owned(t);
}
ret_val
}
}
pub fn resolve_2(&self) -> u64 {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
let ret_val = ((*funcs).resolve_2)(obj_data);
ret_val
}
}
pub fn resolve_3(&self, mask: u64) -> &Self {
let (obj_data, funcs) = self.get_font_obj_funcs();
unsafe {
((*funcs).resolve_3)(obj_data, mask);
}
self
}
pub fn build(&self) -> Self {
self.clone()
}
}
pub trait FontTrait<'a> {
#[inline]
#[doc(hidden)]
fn get_font_obj_funcs(&self) -> (*const RUBase, *const RUFontFuncs);
}
impl<'a> FontTrait<'a> for Font<'a> {
#[doc(hidden)]
fn get_font_obj_funcs(&self) -> (*const RUBase, *const RUFontFuncs) {
let obj = self.data.get().unwrap();
unsafe { (obj, (*self.all_funcs).font_funcs) }
}
}
bitflags! {
pub struct StyleHint: u32 {
const Helvetica = 0x0;
const SansSerif = 0x0;
const Times = 0x1;
const Serif = 0x1;
const Courier = 0x2;
const TypeWriter = 0x2;
const OldEnglish = 0x3;
const Decorative = 0x3;
const System = 0x4;
const AnyStyle = 0x5;
const Cursive = 0x6;
const Monospace = 0x7;
const Fantasy = 0x8;
}
}
bitflags! {
pub struct StyleStrategy: u32 {
const PreferDefault = 0x1;
const PreferBitmap = 0x2;
const PreferDevice = 0x4;
const PreferOutline = 0x8;
const ForceOutline = 0x10;
const PreferMatch = 0x20;
const PreferQuality = 0x40;
const PreferAntialias = 0x80;
const NoAntialias = 0x100;
const OpenGlCompatible = 0x200;
const ForceIntegerMetrics = 0x400;
const NoSubpixelAntialias = 0x800;
const PreferNoShaping = 0x1000;
const NoFontMerging = 0x8000;
}
}
#[repr(u32)]
pub enum HintingPreference {
PreferDefaultHinting = 0,
PreferNoHinting = 1,
PreferVerticalHinting = 2,
PreferFullHinting = 3,
}
#[repr(u32)]
pub enum Weight {
Thin = 0,
ExtraLight = 12,
Light = 25,
Normal = 50,
Medium = 57,
DemiBold = 63,
Bold = 75,
ExtraBold = 81,
Black = 87,
}
#[repr(u32)]
pub enum FontStyle {
StyleNormal = 0,
StyleItalic = 1,
StyleOblique = 2,
}
#[repr(u32)]
pub enum Stretch {
AnyStretch = 0,
UltraCondensed = 50,
ExtraCondensed = 62,
Condensed = 75,
SemiCondensed = 87,
Unstretched = 100,
SemiExpanded = 112,
Expanded = 125,
ExtraExpanded = 150,
UltraExpanded = 200,
}
#[repr(u32)]
pub enum Capitalization {
MixedCase = 0,
AllUppercase = 1,
AllLowercase = 2,
SmallCaps = 3,
Capitalize = 4,
}
#[repr(u32)]
pub enum SpacingType {
PercentageSpacing = 0,
AbsoluteSpacing = 1,
}