FT_GetFile_From_Mac_Name( const char* fontName, FSSpec* pathSpec, FT_Long* face_index ) { OptionBits options = kFMUseGlobalScopeOption; FMFontFamilyIterator famIter; OSStatus status = FMCreateFontFamilyIterator( NULL, NULL, options, &famIter ); FMFont the_font = 0; FMFontFamily family = 0; if ( !fontName || !face_index ) return FT_THROW( Invalid_Argument ); *face_index = 0; while ( status == 0 && !the_font ) { status = FMGetNextFontFamily( &famIter, &family ); if ( status == 0 ) { int stat2; FMFontFamilyInstanceIterator instIter; Str255 famNameStr; char famName[256]; /* get the family name */ FMGetFontFamilyName( family, famNameStr ); CopyPascalStringToC( famNameStr, famName ); /* iterate through the styles */ FMCreateFontFamilyInstanceIterator( family, &instIter ); *face_index = 0; stat2 = 0; while ( stat2 == 0 && !the_font ) { FMFontStyle style; FMFontSize size; FMFont font; stat2 = FMGetNextFontFamilyInstance( &instIter, &font, &style, &size ); if ( stat2 == 0 && size == 0 ) { char fullName[256]; /* build up a complete face name */ ft_strcpy( fullName, famName ); if ( style & bold ) ft_strcat( fullName, " Bold" ); if ( style & italic ) ft_strcat( fullName, " Italic" ); /* compare with the name we are looking for */ if ( ft_strcmp( fullName, fontName ) == 0 ) { /* found it! */ the_font = font; } else ++(*face_index); } } FMDisposeFontFamilyInstanceIterator( &instIter ); } } FMDisposeFontFamilyIterator( &famIter ); if ( the_font ) { FMGetFontContainer( the_font, pathSpec ); return FT_Err_Ok; } else return FT_THROW( Unknown_File_Format ); }
void QFontDatabase::createDatabase() { if(db) return; db = new QFontDatabasePrivate; qfontdatabase_cleanup.set(&db); FMFontFamilyIterator it; QString foundry_name = "Mac"; if(!FMCreateFontFamilyIterator(NULL, NULL, kFMUseGlobalScopeOption, &it)) { FMFontFamily fam; QString fam_name; while(!FMGetNextFontFamily(&it, &fam)) { static Str255 n; if(FMGetFontFamilyName(fam, n) != noErr) qDebug("Qt: internal: WH0A, %s %d", __FILE__, __LINE__); if(!n[0] || n[1] == '.') //throw out ones starting with a . continue; { short fnum; ATSUFontID fond; GetFNum(n, &fnum); if(ATSUFONDtoFontID(fnum, 0, &fond) != noErr) continue; } TextEncoding encoding; FMGetFontFamilyTextEncoding(fam, &encoding); TextToUnicodeInfo uni_info; CreateTextToUnicodeInfoByEncoding(encoding, &uni_info); unsigned long len = n[0] * 2; unsigned char *buff = (unsigned char *)malloc(len); ConvertFromPStringToUnicode(uni_info, n, len, &len, (UniCharArrayPtr)buff); fam_name = ""; for(unsigned long x = 0; x < len; x+=2) { #if defined(__i386__) fam_name += QChar(buff[x], buff[x+1]); #else fam_name += QChar(buff[x+1], buff[x]); #endif } free(buff); DisposeTextToUnicodeInfo(&uni_info); QtFontFamily *family = db->family( fam_name, TRUE ); family->macFamily = fam; for(int script = 0; script < QFont::LastPrivateScript; ++script) family->scripts[script] = QtFontFamily::Supported; QtFontFoundry *foundry = family->foundry( foundry_name, TRUE ); FMFontFamilyInstanceIterator fit; if(!FMCreateFontFamilyInstanceIterator(fam, &fit)) { FMFont font; FMFontStyle font_style; FMFontSize font_size; while(!FMGetNextFontFamilyInstance(&fit, &font, &font_style, &font_size)) { bool italic = (bool)(font_style & ::italic); int weight = ((font_style & ::bold) ? QFont::Bold : QFont::Normal); QtFontStyle::Key styleKey; styleKey.italic = italic; styleKey.oblique = false; styleKey.weight = weight; QtFontStyle *style = foundry->style( styleKey, TRUE ); style->smoothScalable = TRUE; if( !italic ) { styleKey.oblique = TRUE; style = foundry->style( styleKey, TRUE ); style->smoothScalable = TRUE; styleKey.oblique = FALSE; } if(weight < QFont::DemiBold) { // Can make bolder styleKey.weight = QFont::Bold; if(italic) { style = foundry->style( styleKey, TRUE ); style->smoothScalable = TRUE; } else { styleKey.oblique = TRUE; style = foundry->style( styleKey, TRUE ); style->smoothScalable = TRUE; } } } FMDisposeFontFamilyInstanceIterator(&fit); } } FMDisposeFontFamilyIterator(&it); } }