bool QSymbianTypeFaceExtras::symbianFontTableApiAvailable() { enum FontTableApiAvailability { Unknown, Available, Unavailable }; static FontTableApiAvailability availability = QSysInfo::symbianVersion() < QSysInfo::SV_SF_3 ? Unavailable : Unknown; if (availability == Unknown) { // Actually, we should ask CFeatureDiscovery::IsFeatureSupportedL() // with FfFontTable here. But since at the time of writing, the // FfFontTable flag check either gave false positives or false // negatives. Here comes an implicit check via CFont::ExtendedFunction. QSymbianTGetFontTableParam fontTableParams = { MAKE_TAG('O', 'S', '/', '2'), 0, 0 }; QSymbianFbsHeapLock lock(QSymbianFbsHeapLock::Unlock); CFont *font; const TInt getFontErr = S60->screenDevice()->GetNearestFontInTwips(font, TFontSpec()); Q_ASSERT(getFontErr == KErrNone); if (font->ExtendedFunction(QSymbianKFontGetFontTable, &fontTableParams) == KErrNone) { font->ExtendedFunction(QSymbianKFontReleaseFontTable, &fontTableParams); availability = Available; } else { availability = Unavailable; } S60->screenDevice()->ReleaseFont(font); lock.relock(); } return availability == Available; }