100void QCoreTextFontDatabase::populateFontDatabase()
102 qCDebug(lcQpaFonts) <<
"Populating font database...";
103 QElapsedTimer elapsed;
104 if (lcQpaFonts().isDebugEnabled())
107 QCFType<CFArrayRef> familyNames = CTFontManagerCopyAvailableFontFamilyNames();
108 for (NSString *familyName in familyNames.as<
const NSArray *>())
109 QPlatformFontDatabase::registerFontFamily(QString::fromNSString(familyName));
114 if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSCatalina
115 && !qEnvironmentVariableIsSet(
"QT_NO_HARDCODED_FALLBACK_FONTS")) {
116 m_hardcodedFallbackFonts[QChar::Script_Adlam] = QStringLiteral(
"Noto Sans Adlam");
117 m_hardcodedFallbackFonts[QChar::Script_Ahom] = QStringLiteral(
"Noto Serif Ahom");
118 m_hardcodedFallbackFonts[QChar::Script_Avestan] = QStringLiteral(
"Noto Sans Avestan");
119 m_hardcodedFallbackFonts[QChar::Script_Balinese] = QStringLiteral(
"Noto Serif Balinese");
120 m_hardcodedFallbackFonts[QChar::Script_Bamum] = QStringLiteral(
"Noto Sans Bamum");
121 m_hardcodedFallbackFonts[QChar::Script_BassaVah] = QStringLiteral(
"Noto Sans Bassa Vah");
122 m_hardcodedFallbackFonts[QChar::Script_Batak] = QStringLiteral(
"Noto Sans Batak");
123 m_hardcodedFallbackFonts[QChar::Script_Bhaiksuki] = QStringLiteral(
"Noto Sans Bhaiksuki");
124 m_hardcodedFallbackFonts[QChar::Script_Brahmi] = QStringLiteral(
"Noto Sans Brahmi");
125 m_hardcodedFallbackFonts[QChar::Script_Buginese] = QStringLiteral(
"Noto Sans Buginese");
126 m_hardcodedFallbackFonts[QChar::Script_Buhid] = QStringLiteral(
"Noto Sans Buhid");
127 m_hardcodedFallbackFonts[QChar::Script_Carian] = QStringLiteral(
"Noto Sans Carian");
128 m_hardcodedFallbackFonts[QChar::Script_CaucasianAlbanian] = QStringLiteral(
"Noto Sans Caucasian Albanian");
129 m_hardcodedFallbackFonts[QChar::Script_Chakma] = QStringLiteral(
"Noto Sans Chakma");
130 m_hardcodedFallbackFonts[QChar::Script_Cham] = QStringLiteral(
"Noto Sans Cham");
131 m_hardcodedFallbackFonts[QChar::Script_Coptic] = QStringLiteral(
"Noto Sans Coptic");
132 m_hardcodedFallbackFonts[QChar::Script_Cuneiform] = QStringLiteral(
"Noto Sans Cuneiform");
133 m_hardcodedFallbackFonts[QChar::Script_Cypriot] = QStringLiteral(
"Noto Sans Cypriot");
134 m_hardcodedFallbackFonts[QChar::Script_Duployan] = QStringLiteral(
"Noto Sans Duployan");
135 m_hardcodedFallbackFonts[QChar::Script_EgyptianHieroglyphs] = QStringLiteral(
"Noto Sans Egyptian Hieroglyphs");
136 m_hardcodedFallbackFonts[QChar::Script_Elbasan] = QStringLiteral(
"Noto Sans Elbasan");
137 m_hardcodedFallbackFonts[QChar::Script_Glagolitic] = QStringLiteral(
"Noto Sans Glagolitic");
138 m_hardcodedFallbackFonts[QChar::Script_Gothic] = QStringLiteral(
"Noto Sans Gothic");
139 m_hardcodedFallbackFonts[QChar::Script_HanifiRohingya] = QStringLiteral(
"Noto Sans Hanifi Rohingya");
140 m_hardcodedFallbackFonts[QChar::Script_Hanunoo] = QStringLiteral(
"Noto Sans Hanunoo");
141 m_hardcodedFallbackFonts[QChar::Script_Hatran] = QStringLiteral(
"Noto Sans Hatran");
142 m_hardcodedFallbackFonts[QChar::Script_ImperialAramaic] = QStringLiteral(
"Noto Sans Imperial Aramaic");
143 m_hardcodedFallbackFonts[QChar::Script_InscriptionalPahlavi] = QStringLiteral(
"Noto Sans Inscriptional Pahlavi");
144 m_hardcodedFallbackFonts[QChar::Script_InscriptionalParthian] = QStringLiteral(
"Noto Sans Inscriptional Parthian");
145 m_hardcodedFallbackFonts[QChar::Script_Javanese] = QStringLiteral(
"Noto Sans Javanese");
146 m_hardcodedFallbackFonts[QChar::Script_Kaithi] = QStringLiteral(
"Noto Sans Kaithi");
147 m_hardcodedFallbackFonts[QChar::Script_KayahLi] = QStringLiteral(
"Noto Sans Kayah Li");
148 m_hardcodedFallbackFonts[QChar::Script_Kharoshthi] = QStringLiteral(
"Noto Sans Kharoshthi");
149 m_hardcodedFallbackFonts[QChar::Script_Khojki] = QStringLiteral(
"Noto Sans Khojki");
150 m_hardcodedFallbackFonts[QChar::Script_Khudawadi] = QStringLiteral(
"Noto Sans Khudawadi");
151 m_hardcodedFallbackFonts[QChar::Script_Lepcha] = QStringLiteral(
"Noto Sans Lepcha");
152 m_hardcodedFallbackFonts[QChar::Script_Limbu] = QStringLiteral(
"Noto Sans Limbu");
153 m_hardcodedFallbackFonts[QChar::Script_LinearA] = QStringLiteral(
"Noto Sans Linear A");
154 m_hardcodedFallbackFonts[QChar::Script_LinearB] = QStringLiteral(
"Noto Sans Linear B");
155 m_hardcodedFallbackFonts[QChar::Script_Lisu] = QStringLiteral(
"Noto Sans Lisu");
156 m_hardcodedFallbackFonts[QChar::Script_Lycian] = QStringLiteral(
"Noto Sans Lycian");
157 m_hardcodedFallbackFonts[QChar::Script_Lydian] = QStringLiteral(
"Noto Sans Lydian");
158 m_hardcodedFallbackFonts[QChar::Script_Mahajani] = QStringLiteral(
"Noto Sans Mahajani");
159 m_hardcodedFallbackFonts[QChar::Script_Mandaic] = QStringLiteral(
"Noto Sans Mandaic");
160 m_hardcodedFallbackFonts[QChar::Script_Manichaean] = QStringLiteral(
"Noto Sans Manichaean");
161 m_hardcodedFallbackFonts[QChar::Script_Marchen] = QStringLiteral(
"Noto Sans Marchen");
162 m_hardcodedFallbackFonts[QChar::Script_MendeKikakui] = QStringLiteral(
"Noto Sans Mende Kikakui");
163 m_hardcodedFallbackFonts[QChar::Script_MeroiticCursive] = QStringLiteral(
"Noto Sans Meroitic");
164 m_hardcodedFallbackFonts[QChar::Script_MeroiticHieroglyphs] = QStringLiteral(
"Noto Sans Meroitic");
165 m_hardcodedFallbackFonts[QChar::Script_Miao] = QStringLiteral(
"Noto Sans Miao");
166 m_hardcodedFallbackFonts[QChar::Script_Modi] = QStringLiteral(
"Noto Sans Modi");
167 m_hardcodedFallbackFonts[QChar::Script_Mongolian] = QStringLiteral(
"Noto Sans Mongolian");
168 m_hardcodedFallbackFonts[QChar::Script_Mro] = QStringLiteral(
"Noto Sans Mro");
169 m_hardcodedFallbackFonts[QChar::Script_MeeteiMayek] = QStringLiteral(
"Noto Sans Meetei Mayek");
170 m_hardcodedFallbackFonts[QChar::Script_Multani] = QStringLiteral(
"Noto Sans Multani");
171 m_hardcodedFallbackFonts[QChar::Script_Nabataean] = QStringLiteral(
"Noto Sans Nabataean");
172 m_hardcodedFallbackFonts[QChar::Script_Newa] = QStringLiteral(
"Noto Sans Newa");
173 m_hardcodedFallbackFonts[QChar::Script_NewTaiLue] = QStringLiteral(
"Noto Sans New Tai Lue");
174 m_hardcodedFallbackFonts[QChar::Script_Nko] = QStringLiteral(
"Noto Sans Nko");
175 m_hardcodedFallbackFonts[QChar::Script_OlChiki] = QStringLiteral(
"Noto Sans Ol Chiki");
176 m_hardcodedFallbackFonts[QChar::Script_OldHungarian] = QStringLiteral(
"Noto Sans Old Hungarian");
177 m_hardcodedFallbackFonts[QChar::Script_OldItalic] = QStringLiteral(
"Noto Sans Old Italic");
178 m_hardcodedFallbackFonts[QChar::Script_OldNorthArabian] = QStringLiteral(
"Noto Sans Old North Arabian");
179 m_hardcodedFallbackFonts[QChar::Script_OldPermic] = QStringLiteral(
"Noto Sans Old Permic");
180 m_hardcodedFallbackFonts[QChar::Script_OldPersian] = QStringLiteral(
"Noto Sans Old Persian");
181 m_hardcodedFallbackFonts[QChar::Script_OldSouthArabian] = QStringLiteral(
"Noto Sans Old South Arabian");
182 m_hardcodedFallbackFonts[QChar::Script_OldTurkic] = QStringLiteral(
"Noto Sans Old Turkic");
183 m_hardcodedFallbackFonts[QChar::Script_Osage] = QStringLiteral(
"Noto Sans Osage");
184 m_hardcodedFallbackFonts[QChar::Script_Osmanya] = QStringLiteral(
"Noto Sans Osmanya");
185 m_hardcodedFallbackFonts[QChar::Script_PahawhHmong] = QStringLiteral(
"Noto Sans Pahawh Hmong");
186 m_hardcodedFallbackFonts[QChar::Script_Palmyrene] = QStringLiteral(
"Noto Sans Palmyrene");
187 m_hardcodedFallbackFonts[QChar::Script_PauCinHau] = QStringLiteral(
"Noto Sans Pau Cin Hau");
188 m_hardcodedFallbackFonts[QChar::Script_PhagsPa] = QStringLiteral(
"Noto Sans PhagsPa");
189 m_hardcodedFallbackFonts[QChar::Script_Phoenician] = QStringLiteral(
"Noto Sans Phoenician");
190 m_hardcodedFallbackFonts[QChar::Script_PsalterPahlavi] = QStringLiteral(
"Noto Sans Psalter Pahlavi");
191 m_hardcodedFallbackFonts[QChar::Script_Rejang] = QStringLiteral(
"Noto Sans Rejang");
192 m_hardcodedFallbackFonts[QChar::Script_Samaritan] = QStringLiteral(
"Noto Sans Samaritan");
193 m_hardcodedFallbackFonts[QChar::Script_Saurashtra] = QStringLiteral(
"Noto Sans Saurashtra");
194 m_hardcodedFallbackFonts[QChar::Script_Sharada] = QStringLiteral(
"Noto Sans Sharada");
195 m_hardcodedFallbackFonts[QChar::Script_Siddham] = QStringLiteral(
"Noto Sans Siddham");
196 m_hardcodedFallbackFonts[QChar::Script_SoraSompeng] = QStringLiteral(
"Noto Sans Sora Sompeng");
197 m_hardcodedFallbackFonts[QChar::Script_Sundanese] = QStringLiteral(
"Noto Sans Sundanese");
198 m_hardcodedFallbackFonts[QChar::Script_SylotiNagri] = QStringLiteral(
"Noto Sans Syloti Nagri");
199 m_hardcodedFallbackFonts[QChar::Script_Tagalog] = QStringLiteral(
"Noto Sans Tagalog");
200 m_hardcodedFallbackFonts[QChar::Script_Tagbanwa] = QStringLiteral(
"Noto Sans Tagbanwa");
201 m_hardcodedFallbackFonts[QChar::Script_Takri] = QStringLiteral(
"Noto Sans Takri");
202 m_hardcodedFallbackFonts[QChar::Script_TaiLe] = QStringLiteral(
"Noto Sans Tai Le");
203 m_hardcodedFallbackFonts[QChar::Script_TaiTham] = QStringLiteral(
"Noto Sans Tai Tham");
204 m_hardcodedFallbackFonts[QChar::Script_TaiViet] = QStringLiteral(
"Noto Sans Tai Viet");
205 m_hardcodedFallbackFonts[QChar::Script_Thaana] = QStringLiteral(
"Noto Sans Thaana");
206 m_hardcodedFallbackFonts[QChar::Script_Tifinagh] = QStringLiteral(
"Noto Sans Tifinagh");
207 m_hardcodedFallbackFonts[QChar::Script_Tirhuta] = QStringLiteral(
"Noto Sans Tirhuta");
208 m_hardcodedFallbackFonts[QChar::Script_Ugaritic] = QStringLiteral(
"Noto Sans Ugaritic");
209 m_hardcodedFallbackFonts[QChar::Script_Vai] = QStringLiteral(
"Noto Sans Vai");
210 m_hardcodedFallbackFonts[QChar::Script_WarangCiti] = QStringLiteral(
"Noto Sans Warang Citi");
211 m_hardcodedFallbackFonts[QChar::Script_Wancho] = QStringLiteral(
"Noto Sans Wancho");
212 m_hardcodedFallbackFonts[QChar::Script_Yi] = QStringLiteral(
"Noto Sans Yi");
215 qCDebug(lcQpaFonts) <<
"Populating available families took" << elapsed.restart() <<
"ms";
217 populateThemeFonts();
219 for (
auto familyName : m_systemFontDescriptors.keys()) {
220 for (
auto fontDescriptor : m_systemFontDescriptors.value(familyName))
221 populateFromDescriptor(fontDescriptor, familyName);
225 m_systemFontDescriptors.clear();
227 qCDebug(lcQpaFonts) <<
"Populating system descriptors took" << elapsed.restart() <<
"ms";
229 Q_ASSERT(!m_hasPopulatedAliases);
355 QCFType<CFDictionaryRef> styles = (CFDictionaryRef) CTFontDescriptorCopyAttribute(font, kCTFontTraitsAttribute);
357 fd->foundryName = QStringLiteral(
"CoreText");
358 fd->familyName = (CFStringRef) CTFontDescriptorCopyAttribute(font, kCTFontFamilyNameAttribute);
359 fd->styleName = (CFStringRef)CTFontDescriptorCopyAttribute(font, kCTFontStyleNameAttribute);
360 fd->weight = QFont::Normal;
361 fd->style = QFont::StyleNormal;
362 fd->stretch = QFont::Unstretched;
368 if (QCFType<CTFontRef> tempFont = CTFontCreateWithFontDescriptor(font, 0.0, 0)) {
369 uint tag = QFont::Tag(
"OS/2").value();
370 CTFontRef tempFontRef = tempFont;
371 void *userData =
reinterpret_cast<
void *>(&tempFontRef);
373 QVarLengthArray<uchar, 128> os2Table(length);
374 if (QCoreTextFontEngine::ct_getSfntTable(userData, tag, os2Table.data(), &length) && length >= 86) {
375 if (length > uint(os2Table.length())) {
376 os2Table.resize(length);
377 if (!QCoreTextFontEngine::ct_getSfntTable(userData, tag, os2Table.data(), &length))
379 Q_ASSERT(length >= 86);
381 fd->writingSystems = QPlatformFontDatabase::writingSystemsFromOS2Table(
reinterpret_cast<
const char *>(os2Table.data()), length);
386 if (CFNumberRef weightValue = (CFNumberRef) CFDictionaryGetValue(styles, kCTFontWeightTrait)) {
387 double normalizedWeight;
388 if (CFNumberGetValue(weightValue, kCFNumberFloat64Type, &normalizedWeight))
389 fd->weight = QCoreTextFontEngine::qtWeightFromCFWeight(
float(normalizedWeight));
391 if (CFNumberRef italic = (CFNumberRef) CFDictionaryGetValue(styles, kCTFontSlantTrait)) {
393 if (CFNumberGetValue(italic, kCFNumberDoubleType, &d)) {
395 fd->style = QFont::StyleItalic;
398 if (CFNumberRef symbolic = (CFNumberRef) CFDictionaryGetValue(styles, kCTFontSymbolicTrait)) {
400 if (CFNumberGetValue(symbolic, kCFNumberSInt32Type, &d)) {
401 if (d & kCTFontColorGlyphsTrait)
404 if (d & kCTFontMonoSpaceTrait)
406 if (d & kCTFontExpandedTrait)
407 fd->stretch = QFont::Expanded;
408 else if (d & kCTFontCondensedTrait)
409 fd->stretch = QFont::Condensed;
414 if (QCFType<CFNumberRef> size = (CFNumberRef) CTFontDescriptorCopyAttribute(font, kCTFontSizeAttribute)) {
415 if (CFNumberIsFloatType(size)) {
417 CFNumberGetValue(size, kCFNumberDoubleType, &d);
421 CFNumberGetValue(size, kCFNumberIntType, &i);
426 if (QCFType<CFArrayRef> languages = (CFArrayRef) CTFontDescriptorCopyAttribute(font, kCTFontLanguagesAttribute)) {
427 CFIndex length = CFArrayGetCount(languages);
429 if (!*languageForWritingSystem[i])
431 QCFString lang = CFStringCreateWithCString(NULL, languageForWritingSystem[i], kCFStringEncodingASCII);
432 if (CFArrayContainsValue(languages, CFRangeMake(0, length), lang))
433 fd->writingSystems.setSupported(QFontDatabase::WritingSystem(i));
486QFontEngine *QCoreTextFontDatabaseEngineFactory<QCoreTextFontEngine>::fontEngine(
const QFontDef &fontDef,
void *usrPtr)
488 QCFType<CTFontDescriptorRef> descriptor = QCFType<CTFontDescriptorRef>::constructFromGet(
489 static_cast<CTFontDescriptorRef>(usrPtr));
497 qreal scaledPointSize = fontDef.pixelSize;
499 CGAffineTransform matrix = qt_transform_from_fontdef(fontDef);
501 if (!fontDef.variableAxisValues.isEmpty()) {
502 QCFType<CFMutableDictionaryRef> variations = CFDictionaryCreateMutable(
nullptr,
503 fontDef.variableAxisValues.size(),
504 &kCFTypeDictionaryKeyCallBacks,
505 &kCFTypeDictionaryValueCallBacks);
506 for (
auto it = fontDef.variableAxisValues.constBegin();
507 it != fontDef.variableAxisValues.constEnd();
509 const quint32 tag = it.key().value();
510 const float value = it.value();
511 QCFType<CFNumberRef> tagRef = CFNumberCreate(
nullptr, kCFNumberIntType, &tag);
512 QCFType<CFNumberRef> valueRef = CFNumberCreate(
nullptr, kCFNumberFloatType, &value);
514 CFDictionarySetValue(variations, tagRef, valueRef);
516 QCFType<CFDictionaryRef> attributes = CFDictionaryCreate(
nullptr,
517 (
const void **) &kCTFontVariationAttribute,
518 (
const void **) &variations,
520 &kCFTypeDictionaryKeyCallBacks,
521 &kCFTypeDictionaryValueCallBacks);
522 descriptor = CTFontDescriptorCreateCopyWithAttributes(descriptor, attributes);
525 if (QCFType<CTFontRef> font = CTFontCreateWithFontDescriptor(descriptor, scaledPointSize, &matrix))
526 return new QCoreTextFontEngine(font, fontDef);
648QStringList QCoreTextFontDatabase::fallbacksForFamily(
const QString &family,
650 QFont::StyleHint styleHint,
651 QFontDatabasePrivate::ExtendedScript script)
const
655 qCDebug(lcQpaFonts).nospace() <<
"Resolving fallbacks families for"
656 << (!family.isEmpty() ? qPrintable(
" family '%1' with"_L1.arg(family)) :
"")
657 <<
" style hint " << styleHint;
659 QMacAutoReleasePool pool;
661 QStringList fallbackList = fallbacksForScript(script);
663 QCFType<CFArrayRef> fallbackFonts = fallbacksForFamily(family);
664 if (!fallbackFonts || !CFArrayGetCount(fallbackFonts)) {
667 if (!family.isEmpty())
668 qCDebug(lcQpaFonts) <<
"No fallbacks found. Using style hint instead";
670 if (QCFType<CTFontDescriptorRef> styleDescriptor = descriptorForStyle(styleHint)) {
671 CFMutableArrayRef tmp = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
672 CFArrayAppendValue(tmp, styleDescriptor);
673 QCFType<CFArrayRef> styleFallbacks = fallbacksForDescriptor(styleDescriptor);
674 CFArrayAppendArray(tmp, styleFallbacks, CFRangeMake(0, CFArrayGetCount(styleFallbacks)));
682 const int numberOfFallbacks = CFArrayGetCount(fallbackFonts);
683 for (
int i = 0; i < numberOfFallbacks; ++i) {
684 auto fallbackDescriptor = CTFontDescriptorRef(CFArrayGetValueAtIndex(fallbackFonts, i));
685 auto fallbackFamilyName = QCFString(CTFontDescriptorCopyAttribute(fallbackDescriptor, kCTFontFamilyNameAttribute));
687 if (!isFamilyPopulated(fallbackFamilyName)) {
690 if (isPrivateFontFamily(fallbackFamilyName))
691 const_cast<QCoreTextFontDatabase *>(
this)->populateFromDescriptor(fallbackDescriptor);
693 registerFontFamily(fallbackFamilyName);
696 fallbackList.append(fallbackFamilyName);
704 for (
const char *family : {
".Apple Symbols Fallback",
".Noto Sans Universal" }) {
705 int index = fallbackList.indexOf(QLatin1StringView(family));
707 fallbackList.move(index, fallbackList.size() - 1);
710#if defined(Q_OS_MACOS)
716 if (!fallbackList.contains(QStringLiteral(
"Arial Unicode MS")))
717 fallbackList.append(QStringLiteral(
"Arial Unicode MS"));
720 if (!fallbackList.contains(QStringLiteral(
"Apple Symbols")))
721 fallbackList.append(QStringLiteral(
"Apple Symbols"));
724 if (script <
int(QChar::ScriptCount)) {
725 QString hardcodedFont = m_hardcodedFallbackFonts.value(QChar::Script(script));
726 if (!hardcodedFont.isEmpty() && !fallbackList.contains(hardcodedFont)) {
727 if (!isFamilyPopulated(hardcodedFont)) {
728 if (!m_privateFamilies.contains(hardcodedFont)) {
729 QCFType<CTFontDescriptorRef> familyDescriptor = descriptorForFamily(hardcodedFont);
730 QCFType<CFArrayRef> matchingFonts = CTFontDescriptorCreateMatchingFontDescriptors(familyDescriptor,
nullptr);
732 const int numFonts = CFArrayGetCount(matchingFonts);
733 for (
int i = 0; i < numFonts; ++i)
734 const_cast<QCoreTextFontDatabase *>(
this)->populateFromDescriptor(CTFontDescriptorRef(CFArrayGetValueAtIndex(matchingFonts, i)),
737 fallbackList.append(hardcodedFont);
742 m_privateFamilies.insert(hardcodedFont);
745 fallbackList.append(hardcodedFont);
751 extern QStringList qt_sort_families_by_writing_system(QFontDatabasePrivate::ExtendedScript,
const QStringList &);
752 fallbackList = qt_sort_families_by_writing_system(script, fallbackList);
754 qCDebug(lcQpaFonts).nospace() <<
"Fallback families ordered by script " << script <<
": " << fallbackList;
759QStringList QCoreTextFontDatabase::addApplicationFont(
const QByteArray &fontData,
const QString &fileName, QFontDatabasePrivate::ApplicationFont *applicationFont)
761 QCFType<CFArrayRef> fonts;
763 if (!fontData.isEmpty()) {
764 QCFType<CFDataRef> fontDataReference = fontData.toRawCFData();
765 if (QCFType<CFArrayRef> descriptors = CTFontManagerCreateFontDescriptorsFromData(fontDataReference)) {
766 CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
767 const int count = CFArrayGetCount(descriptors);
769 for (
int i = 0; i < count; ++i) {
770 CTFontDescriptorRef descriptor = CTFontDescriptorRef(CFArrayGetValueAtIndex(descriptors, i));
774 NSDictionary *attributes = @{ kQtFontDataAttribute : [NSValue valueWithPointer:
new QByteArray(fontData)] };
775 QCFType<CTFontDescriptorRef> copiedDescriptor = CTFontDescriptorCreateCopyWithAttributes(descriptor, (CFDictionaryRef)attributes);
776 CFArrayAppendValue(array, copiedDescriptor);
782 QCFType<CFURLRef> fontURL = QUrl::fromLocalFile(fileName).toCFURL();
783 fonts = CTFontManagerCreateFontDescriptorsFromURL(fontURL);
787 return QStringList();
789 QStringList families;
790 const int numFonts = CFArrayGetCount(fonts);
791 for (
int i = 0; i < numFonts; ++i) {
792 CTFontDescriptorRef fontDescriptor = CTFontDescriptorRef(CFArrayGetValueAtIndex(fonts, i));
793 populateFromDescriptor(fontDescriptor, QString(), applicationFont);
794 QCFType<CFStringRef> familyName = CFStringRef(CTFontDescriptorCopyAttribute(fontDescriptor, kCTFontFamilyNameAttribute));
795 families.append(QString::fromCFString(familyName));
815 case QPlatformTheme::SystemFont:
816 return kCTFontUIFontSystem;
818 case QPlatformTheme::MenuFont:
819 case QPlatformTheme::MenuBarFont:
820 case QPlatformTheme::MenuItemFont:
821 return kCTFontUIFontMenuItem;
823 case QPlatformTheme::MessageBoxFont:
824 return kCTFontUIFontEmphasizedSystem;
826 case QPlatformTheme::LabelFont:
827 return kCTFontUIFontSystem;
829 case QPlatformTheme::TipLabelFont:
830 return kCTFontUIFontToolTip;
832 case QPlatformTheme::StatusBarFont:
833 return kCTFontUIFontSystem;
835 case QPlatformTheme::TitleBarFont:
836 return kCTFontUIFontWindowTitle;
838 case QPlatformTheme::MdiSubWindowTitleFont:
839 return kCTFontUIFontSystem;
841 case QPlatformTheme::DockWidgetTitleFont:
842 return kCTFontUIFontSmallSystem;
844 case QPlatformTheme::PushButtonFont:
845 return kCTFontUIFontPushButton;
847 case QPlatformTheme::CheckBoxFont:
848 case QPlatformTheme::RadioButtonFont:
849 return kCTFontUIFontSystem;
851 case QPlatformTheme::ToolButtonFont:
852 return kCTFontUIFontSmallToolbar;
854 case QPlatformTheme::ItemViewFont:
855 return kCTFontUIFontSystem;
857 case QPlatformTheme::ListViewFont:
858 return kCTFontUIFontViews;
860 case QPlatformTheme::HeaderViewFont:
861 return kCTFontUIFontSmallSystem;
863 case QPlatformTheme::ListBoxFont:
864 return kCTFontUIFontViews;
866 case QPlatformTheme::ComboMenuItemFont:
867 return kCTFontUIFontSystem;
869 case QPlatformTheme::ComboLineEditFont:
870 return kCTFontUIFontViews;
872 case QPlatformTheme::SmallFont:
873 return kCTFontUIFontSmallSystem;
875 case QPlatformTheme::MiniFont:
876 return kCTFontUIFontMiniSystem;
878 case QPlatformTheme::FixedFont:
879 return kCTFontUIFontUserFixedPitch;
882 return kCTFontUIFontSystem;