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