Avoid leaking FcPattern pointers.

This commit is contained in:
Josh Matthews 2013-05-22 13:59:35 -04:00
parent a43f92a300
commit c8b10ec6b8

View file

@ -6,7 +6,7 @@ extern mod freetype;
extern mod fontconfig;
use fontconfig::fontconfig::{
FcChar8, FcResultMatch, FcSetSystem,
FcChar8, FcResultMatch, FcSetSystem, FcPattern,
FcResultNoMatch, FcMatchPattern, FC_SLANT_ITALIC, FC_WEIGHT_BOLD
};
use fontconfig::fontconfig::bindgen::{
@ -127,10 +127,21 @@ pub impl FontListHandle {
}
}
struct AutoPattern {
pattern: *FcPattern
}
impl Drop for AutoPattern {
fn finalize(&self) {
FcPatternDestroy(self.pattern);
}
}
pub fn path_from_identifier(name: ~str, style: &UsedFontStyle) -> Result<~str, ()> {
unsafe {
let config = FcConfigGetCurrent();
let pattern = FcPatternCreate();
let wrapper = AutoPattern { pattern: FcPatternCreate() };
let pattern = wrapper.pattern;
let res = do str::as_c_str("family") |FC_FAMILY| {
do str::as_c_str(name) |family| {
FcPatternAddString(pattern, FC_FAMILY, family as *FcChar8)
@ -166,7 +177,8 @@ pub fn path_from_identifier(name: ~str, style: &UsedFontStyle) -> Result<~str, (
}
FcDefaultSubstitute(pattern);
let result = FcResultNoMatch;
let result_pattern = FcFontMatch(config, pattern, &result);
let result_wrapper = AutoPattern { pattern: FcFontMatch(config, pattern, &result) };
let result_pattern = result_wrapper.pattern;
if result != FcResultMatch && result_pattern.is_null() {
debug!("obtaining match to pattern failed");
return Err(());