static void get_font_details_from_pattern (FontConfigFont * font, FcPattern * pattern) { int index; int slant; int weight; int width; int spacing; FcChar8 * file; FcChar8 * family; FcChar8 * style; g_assert(FcInit()); g_assert(FcPatternGetString(pattern, FC_FILE, 0, &file) == FcResultMatch); font_config_font_set_filepath(font, (const gchar *) file); font_config_font_set_owner(font, get_file_owner((const gchar *) file)); g_assert(FcPatternGetString(pattern, FC_FAMILY, 0, &family) == FcResultMatch); font_config_font_set_family(font, (const gchar *) family); if (FcPatternGetInteger(pattern, FC_INDEX, 0, &index) != FcResultMatch) index = 0; font_config_font_set_index(font, index); if (FcPatternGetInteger(pattern, FC_SPACING, 0, &spacing) != FcResultMatch) spacing = FC_PROPORTIONAL; font_config_font_set_spacing(font, spacing); if (FcPatternGetInteger(pattern, FC_SLANT, 0, &slant) != FcResultMatch) slant = FC_SLANT_ROMAN; font_config_font_set_slant(font, slant); if (FcPatternGetInteger(pattern, FC_WEIGHT, 0, &weight) != FcResultMatch) weight = FC_WEIGHT_MEDIUM; font_config_font_set_weight(font, weight); if (FcPatternGetInteger(pattern, FC_WIDTH, 0, &width) != FcResultMatch) width = FC_WIDTH_NORMAL; font_config_font_set_width(font, width); if (FcPatternGetString (pattern, FC_STYLE, 0, &style) != FcResultMatch) { /* Use the same style Pango would if none is given */ if (weight <= FC_WEIGHT_MEDIUM) { if (slant == FC_SLANT_ROMAN) font_config_font_set_style(font, "Regular"); else font_config_font_set_style(font, "Italic"); } else { if (slant == FC_SLANT_ROMAN) font_config_font_set_style(font, "Bold"); else font_config_font_set_style(font, "Bold Italic"); } } else { font_config_font_set_style(font, (const gchar *) style); } PangoFontDescription * descr = pango_fc_font_description_from_pattern(pattern, FALSE); gchar * desc_string = pango_font_description_to_string(descr); font_config_font_set_description(font, desc_string); pango_font_description_free(descr); g_free0(desc_string); return; }
GeeArrayList * FcListUserDirs(void) { FcChar8 * directory; FcStrList * fdlist; GeeArrayList * dirlist = gee_array_list_new(G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, (GDestroyNotify) g_free0, NULL, NULL, NULL); g_assert(FcInit()); fdlist = FcConfigGetConfigDirs(NULL); while ((directory = FcStrListNext(fdlist))) if (get_file_owner((const gchar *) directory) == 0) gee_abstract_collection_add((GeeAbstractCollection *) dirlist, directory); FcStrListDone(fdlist); return dirlist; }
FT_Error get_file_info(FontManagerFontInfo *fileinfo, const gchar * filepath, gint index) { FT_Face face; FT_Library library; FT_Error error; PS_FontInfoRec ps_info; BDF_PropertyRec prop; gsize filesize = 0; gchar * font = NULL; if (G_UNLIKELY(!g_file_get_contents(filepath, &font, &filesize, NULL))) { g_warning("Failed to load file : %s", filepath); return FT_Err_Cannot_Open_Resource; } error = FT_Init_FreeType(&library); if (G_UNLIKELY(error)) return error; error = FT_New_Memory_Face(library, (const FT_Byte *) font, (FT_Long) filesize, index, &face); if (G_UNLIKELY(error)) { g_warning("Failed to create FT_Face for file : %s", filepath); return error; } font_manager_font_info_set_owner(fileinfo, get_file_owner(filepath)); font_manager_font_info_set_filetype(fileinfo, FT_Get_X11_Font_Format(face)); gchar * _size = g_format_size(filesize); font_manager_font_info_set_filesize(fileinfo, _size); g_free0(_size); gchar * _md5 = g_compute_checksum_for_data(G_CHECKSUM_MD5, (const guchar *) font, filesize); font_manager_font_info_set_checksum(fileinfo, _md5); g_free0(_md5); font_manager_font_info_set_psname(fileinfo, FT_Get_Postscript_Name(face)); TT_OS2 * os2 = (TT_OS2 *) FT_Get_Sfnt_Table(face, ft_sfnt_os2); if (G_LIKELY(os2 && os2->version >= 0x0001 && os2->version != 0xffff)) { gchar * _vendor = get_vendor_from_vendor_id((gchar *) os2->achVendID); font_manager_font_info_set_vendor(fileinfo, _vendor); g_free0(_vendor); gchar * panose = g_strdup_printf("%i:%i:%i:%i:%i:%i:%i:%i:%i:%i", os2->panose[0], os2->panose[1], os2->panose[2], os2->panose[3], os2->panose[4], os2->panose[5], os2->panose[6], os2->panose[7], os2->panose[8], os2->panose[9]); font_manager_font_info_set_panose(fileinfo, panose); g_free0(panose); } if (G_LIKELY(FT_IS_SFNT(face))) get_sfnt_info(fileinfo, face); if (FT_Get_PS_Font_Info(face, &ps_info) == 0) get_ps_info(fileinfo, ps_info, face); gint lic_type = get_license_type(font_manager_font_info_get_license_data(fileinfo), font_manager_font_info_get_copyright(fileinfo), font_manager_font_info_get_license_url(fileinfo)); gchar * _name = get_license_name(lic_type); font_manager_font_info_set_license_type(fileinfo, _name); g_free0(_name); if (!font_manager_font_info_get_license_url(fileinfo)) { gchar * _url = get_license_url(lic_type); if (_url) font_manager_font_info_set_license_url(fileinfo, _url); g_free0(_url); } if (!font_manager_font_info_get_version(fileinfo)) { TT_Header * head = (TT_Header *) FT_Get_Sfnt_Table (face, ft_sfnt_head); if (head) if (head->Font_Revision) { gchar * rev = g_strdup_printf("%f", (float) head->Font_Revision); font_manager_font_info_set_version(fileinfo, rev); g_free0(rev); } } if (!font_manager_font_info_get_vendor(fileinfo)) { int result = FT_Get_BDF_Property(face, "FOUNDRY", &prop); if(result == 0 && prop.type == BDF_PROPERTY_TYPE_ATOM) font_manager_font_info_set_vendor(fileinfo, prop.u.atom); else font_manager_font_info_set_vendor(fileinfo, "Unknown Vendor"); } FT_Done_Face(face); error = FT_Done_FreeType(library); g_free0(font); return error; }
/* * Load calendar data into memory from callog file. */ extern CSA_return_code _DtCmsLoadCalendar(char *target, _DtCmsCalendar **infoptr) { CSA_return_code stat; char *calname; char *log; _DtCmsCalendar *cal = NULL; if (target == NULL || infoptr == NULL) return (CSA_E_FAILURE); *infoptr = NULL; if ((calname = get_calname(target)) == NULL) return(CSA_E_INSUFFICIENT_MEMORY); if ((log = _DtCmsGetLogFN(calname)) == NULL) { free(calname); return(CSA_E_INSUFFICIENT_MEMORY); } if ((cal = (_DtCmsCalendar *)calloc(1, sizeof(_DtCmsCalendar))) == NULL) { stat = CSA_E_INSUFFICIENT_MEMORY; goto ERROR; } if (!(cal->calendar = (char *)strdup(calname))) { stat = CSA_E_INSUFFICIENT_MEMORY; goto ERROR; } /* load data from file */ if ((stat = start_log(cal, log)) != CSA_SUCCESS) { goto ERROR; } /* * get file owner after the file is loaded since file * ownership might be fixed in start_log() */ if (cal->fversion == _DtCMS_VERSION1) { if ((stat = get_file_owner(calname, &cal->owner)) != CSA_SUCCESS) goto ERROR; cal->alist = _DtCmsCalendarAccessList(cal); } else { if (cal->attrs[CSA_CAL_ATTR_CALENDAR_OWNER_I].value) cal->owner = strdup(cal->\ attrs[CSA_CAL_ATTR_CALENDAR_OWNER_I].\ value->item.calendar_user_value); else { stat = CSA_X_DT_E_BACKING_STORE_PROBLEM; fprintf(stderr, "%s: %s\n", pgname, "calendar owner attribute is missing from callog file"); goto ERROR; } if (cal->attrs[CSA_CAL_ATTR_PRODUCT_IDENTIFIER_I].value == NULL) { if ((stat = _DtCm_set_string_attrval( _DtCM_PRODUCT_IDENTIFIER, &cal->\ attrs[CSA_CAL_ATTR_PRODUCT_IDENTIFIER_I].value, CSA_VALUE_STRING)) != CSA_SUCCESS) { goto ERROR; } } if (cal->attrs[CSA_CAL_ATTR_VERSION_I].value == NULL) { if ((stat = _DtCm_set_string_attrval( _DtCM_SPEC_VERSION_SUPPORTED, &cal->attrs[CSA_CAL_ATTR_VERSION_I].value, CSA_VALUE_STRING)) != CSA_SUCCESS) { goto ERROR; } } cal->num_entry_attrs = cal->entry_tbl->size; } cal->getattrfuncs = _GetAttrFuncPtrs; /* link with other calendar structures */ cal->next = calendar_list; calendar_list = cal; free(log); free(calname); *infoptr = cal; return (CSA_SUCCESS); ERROR: free(calname); free(log); _DtCmsFreeCalendar(cal); return (stat); }