diff --git a/src/components/servo-gfx/platform/linux/font_list.rs b/src/components/servo-gfx/platform/linux/font_list.rs index 20cfbe21d48..2c92880c040 100644 --- a/src/components/servo-gfx/platform/linux/font_list.rs +++ b/src/components/servo-gfx/platform/linux/font_list.rs @@ -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(());