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));
494QFontEngine *QCoreTextFontDatabaseEngineFactory<QCoreTextFontEngine>::fontEngine(
const QFontDef &fontDef,
void *usrPtr)
496 QMacAutoReleasePool pool;
498 QCFType<CTFontDescriptorRef> descriptor = QCFType<CTFontDescriptorRef>::constructFromGet(
499 static_cast<CTFontDescriptorRef>(usrPtr));
507 qreal scaledPointSize = fontDef.pixelSize;
509 CGAffineTransform matrix = qt_transform_from_fontdef(fontDef);
511 if (!fontDef.variableAxisValues.isEmpty()) {
512 QCFType<CFMutableDictionaryRef> variations = CFDictionaryCreateMutable(
nullptr,
513 fontDef.variableAxisValues.size(),
514 &kCFTypeDictionaryKeyCallBacks,
515 &kCFTypeDictionaryValueCallBacks);
516 for (
auto it = fontDef.variableAxisValues.constBegin();
517 it != fontDef.variableAxisValues.constEnd();
519 const quint32 tag = it.key().value();
520 const float value = it.value();
521 QCFType<CFNumberRef> tagRef = CFNumberCreate(
nullptr, kCFNumberIntType, &tag);
522 QCFType<CFNumberRef> valueRef = CFNumberCreate(
nullptr, kCFNumberFloatType, &value);
524 CFDictionarySetValue(variations, tagRef, valueRef);
526 QCFType<CFDictionaryRef> attributes = CFDictionaryCreate(
nullptr,
527 (
const void **) &kCTFontVariationAttribute,
528 (
const void **) &variations,
530 &kCFTypeDictionaryKeyCallBacks,
531 &kCFTypeDictionaryValueCallBacks);
532 descriptor = CTFontDescriptorCreateCopyWithAttributes(descriptor, attributes);
535 if (QCFType<CTFontRef> font = CTFontCreateWithFontDescriptor(descriptor, scaledPointSize, &matrix))
536 return new QCoreTextFontEngine(font, fontDef);
585QFontEngine *QCoreTextFontDatabaseEngineFactory<QFontEngineFT>::fontEngine(
const QFontDef &fontDef,
void *usrPtr)
587 QMacAutoReleasePool pool;
589 CTFontDescriptorRef descriptor =
static_cast<CTFontDescriptorRef>(usrPtr);
591 int instanceIndex = 0;
592 if (NSNumber *numberRef = descriptorAttribute<NSNumber>(descriptor, (CFStringRef)kQtFontInstanceIndexAttribute))
593 instanceIndex = numberRef.integerValue;
595 if (NSValue *fontDataValue = descriptorAttribute<NSValue>(descriptor, (CFStringRef)kQtFontDataAttribute)) {
596 QByteArray *fontData =
static_cast<QByteArray *>(fontDataValue.pointerValue);
597 return QFontEngineFT::create(*fontData,
599 static_cast<QFont::HintingPreference>(fontDef.hintingPreference),
600 fontDef.variableAxisValues,
602 }
else if (NSURL *url = descriptorAttribute<NSURL>(descriptor, kCTFontURLAttribute)) {
603 QFontEngine::FaceId faceId;
605 Q_ASSERT(url.fileURL);
606 QString faceFileName{QString::fromNSString(url.path)};
607 faceId.filename = faceFileName.toUtf8();
609 QString styleName = QCFString(CTFontDescriptorCopyAttribute(descriptor, kCTFontStyleNameAttribute));
610 faceId.index = QFreetypeFace::getFaceIndexByStyleName(faceFileName, styleName);
611 faceId.instanceIndex = instanceIndex;
612 faceId.variableAxes = fontDef.variableAxisValues;
614 return QFontEngineFT::create(fontDef, faceId);
716QStringList QCoreTextFontDatabase::fallbacksForFamily(
const QString &family,
718 QFont::StyleHint styleHint,
719 QFontDatabasePrivate::ExtendedScript script)
const
723 qCDebug(lcQpaFonts).nospace() <<
"Resolving fallbacks families for"
724 << (!family.isEmpty() ? qPrintable(
" family '%1' with"_L1.arg(family)) :
"")
725 <<
" style hint " << styleHint;
727 QMacAutoReleasePool pool;
729 QStringList fallbackList = fallbacksForScript(script);
731 QCFType<CFArrayRef> fallbackFonts = fallbacksForFamily(family);
732 if (!fallbackFonts || !CFArrayGetCount(fallbackFonts)) {
735 if (!family.isEmpty())
736 qCDebug(lcQpaFonts) <<
"No fallbacks found. Using style hint instead";
738 if (QCFType<CTFontDescriptorRef> styleDescriptor = descriptorForStyle(styleHint)) {
739 CFMutableArrayRef tmp = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
740 CFArrayAppendValue(tmp, styleDescriptor);
741 QCFType<CFArrayRef> styleFallbacks = fallbacksForDescriptor(styleDescriptor);
742 CFArrayAppendArray(tmp, styleFallbacks, CFRangeMake(0, CFArrayGetCount(styleFallbacks)));
750 const int numberOfFallbacks = CFArrayGetCount(fallbackFonts);
751 for (
int i = 0; i < numberOfFallbacks; ++i) {
752 auto fallbackDescriptor = CTFontDescriptorRef(CFArrayGetValueAtIndex(fallbackFonts, i));
753 auto fallbackFamilyName = QCFString(CTFontDescriptorCopyAttribute(fallbackDescriptor, kCTFontFamilyNameAttribute));
755 if (!isFamilyPopulated(fallbackFamilyName)) {
758 if (isPrivateFontFamily(fallbackFamilyName))
759 const_cast<QCoreTextFontDatabase *>(
this)->populateFromDescriptor(fallbackDescriptor);
761 registerFontFamily(fallbackFamilyName);
764 fallbackList.append(fallbackFamilyName);
772 for (
const char *family : {
".Apple Symbols Fallback",
".Noto Sans Universal" }) {
773 int index = fallbackList.indexOf(QLatin1StringView(family));
775 fallbackList.move(index, fallbackList.size() - 1);
778#if defined(Q_OS_MACOS)
784 if (!fallbackList.contains(QStringLiteral(
"Arial Unicode MS")))
785 fallbackList.append(QStringLiteral(
"Arial Unicode MS"));
788 if (!fallbackList.contains(QStringLiteral(
"Apple Symbols")))
789 fallbackList.append(QStringLiteral(
"Apple Symbols"));
792 if (script <
int(QChar::ScriptCount)) {
793 QString hardcodedFont = m_hardcodedFallbackFonts.value(QChar::Script(script));
794 if (!hardcodedFont.isEmpty() && !fallbackList.contains(hardcodedFont)) {
795 if (!isFamilyPopulated(hardcodedFont)) {
796 if (!m_privateFamilies.contains(hardcodedFont)) {
797 QCFType<CTFontDescriptorRef> familyDescriptor = descriptorForFamily(hardcodedFont);
798 QCFType<CFArrayRef> matchingFonts = CTFontDescriptorCreateMatchingFontDescriptors(familyDescriptor,
nullptr);
800 const int numFonts = CFArrayGetCount(matchingFonts);
801 for (
int i = 0; i < numFonts; ++i)
802 const_cast<QCoreTextFontDatabase *>(
this)->populateFromDescriptor(CTFontDescriptorRef(CFArrayGetValueAtIndex(matchingFonts, i)),
805 fallbackList.append(hardcodedFont);
810 m_privateFamilies.insert(hardcodedFont);
813 fallbackList.append(hardcodedFont);
819 extern QStringList qt_sort_families_by_writing_system(QFontDatabasePrivate::ExtendedScript,
const QStringList &);
820 fallbackList = qt_sort_families_by_writing_system(script, fallbackList);
822 qCDebug(lcQpaFonts).nospace() <<
"Fallback families ordered by script " << script <<
": " << fallbackList;
827QStringList QCoreTextFontDatabase::addApplicationFont(
const QByteArray &fontData,
const QString &fileName, QFontDatabasePrivate::ApplicationFont *applicationFont)
829 QCFType<CFArrayRef> fonts;
831 if (!fontData.isEmpty()) {
832 QCFType<CFDataRef> fontDataReference = fontData.toRawCFData();
833 fonts = CTFontManagerCreateFontDescriptorsFromData(fontDataReference);
835 QCFType<CFURLRef> fontURL = QUrl::fromLocalFile(fileName).toCFURL();
836 fonts = CTFontManagerCreateFontDescriptorsFromURL(fontURL);
840 CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
841 const int count = CFArrayGetCount(fonts);
843 for (
int i = 0; i < count; ++i) {
844 CTFontDescriptorRef descriptor = CTFontDescriptorRef(CFArrayGetValueAtIndex(fonts, i));
846 NSDictionary *attributes = !fontData.isEmpty()
848 kQtFontDataAttribute: [NSValue valueWithPointer:
new QByteArray(fontData)],
849 kQtFontInstanceIndexAttribute: @(i)
852 kQtFontInstanceIndexAttribute: @(i)
855 QCFType<CTFontDescriptorRef> copiedDescriptor = CTFontDescriptorCreateCopyWithAttributes(descriptor, (CFDictionaryRef)attributes);
856 CFArrayAppendValue(array, copiedDescriptor);
861 return QStringList();
864 QStringList families;
865 const int numFonts = CFArrayGetCount(fonts);
866 for (
int i = 0; i < numFonts; ++i) {
867 CTFontDescriptorRef fontDescriptor = CTFontDescriptorRef(CFArrayGetValueAtIndex(fonts, i));
868 populateFromDescriptor(fontDescriptor,
871 shouldForceColorFont(fontDescriptor)
872 ? PopulateDescriptorFlag::ForceColorFont
873 : PopulateDescriptorFlag::None);
874 QCFType<CFStringRef> familyName = CFStringRef(CTFontDescriptorCopyAttribute(fontDescriptor, kCTFontFamilyNameAttribute));
875 families.append(QString::fromCFString(familyName));
895 case QPlatformTheme::SystemFont:
896 return kCTFontUIFontSystem;
898 case QPlatformTheme::MenuFont:
899 case QPlatformTheme::MenuBarFont:
900 case QPlatformTheme::MenuItemFont:
901 return kCTFontUIFontMenuItem;
903 case QPlatformTheme::MessageBoxFont:
904 return kCTFontUIFontEmphasizedSystem;
906 case QPlatformTheme::LabelFont:
907 return kCTFontUIFontSystem;
909 case QPlatformTheme::TipLabelFont:
910 return kCTFontUIFontToolTip;
912 case QPlatformTheme::StatusBarFont:
913 return kCTFontUIFontSystem;
915 case QPlatformTheme::TitleBarFont:
916 return kCTFontUIFontWindowTitle;
918 case QPlatformTheme::MdiSubWindowTitleFont:
919 return kCTFontUIFontSystem;
921 case QPlatformTheme::DockWidgetTitleFont:
922 return kCTFontUIFontSmallSystem;
924 case QPlatformTheme::PushButtonFont:
925 return kCTFontUIFontPushButton;
927 case QPlatformTheme::CheckBoxFont:
928 case QPlatformTheme::RadioButtonFont:
929 return kCTFontUIFontSystem;
931 case QPlatformTheme::ToolButtonFont:
932 return kCTFontUIFontSmallToolbar;
934 case QPlatformTheme::ItemViewFont:
935 return kCTFontUIFontSystem;
937 case QPlatformTheme::ListViewFont:
938 return kCTFontUIFontViews;
940 case QPlatformTheme::HeaderViewFont:
941 return kCTFontUIFontSmallSystem;
943 case QPlatformTheme::ListBoxFont:
944 return kCTFontUIFontViews;
946 case QPlatformTheme::ComboMenuItemFont:
947 return kCTFontUIFontSystem;
949 case QPlatformTheme::ComboLineEditFont:
950 return kCTFontUIFontViews;
952 case QPlatformTheme::SmallFont:
953 return kCTFontUIFontSmallSystem;
955 case QPlatformTheme::MiniFont:
956 return kCTFontUIFontMiniSystem;
958 case QPlatformTheme::FixedFont:
959 return kCTFontUIFontUserFixedPitch;
962 return kCTFontUIFontSystem;