QStringList QBasicUnixFontDatabase::addTTFile(const QByteArray &fontData, const QByteArray &file) { extern FT_Library qt_getFreetype(); FT_Library library = qt_getFreetype(); int index = 0; int numFaces = 0; QStringList families; do { FT_Face face; FT_Error error; if (!fontData.isEmpty()) { error = FT_New_Memory_Face(library, (const FT_Byte *)fontData.constData(), fontData.size(), index, &face); } else { error = FT_New_Face(library, file.constData(), index, &face); } if (error != FT_Err_Ok) { qDebug() << "FT_New_Face failed with index" << index << ":" << hex << error; break; } numFaces = face->num_faces; QFont::Weight weight = QFont::Normal; QFont::Style style = QFont::StyleNormal; if (face->style_flags & FT_STYLE_FLAG_ITALIC) style = QFont::StyleItalic; if (face->style_flags & FT_STYLE_FLAG_BOLD) weight = QFont::Bold; QSupportedWritingSystems writingSystems; // detect symbol fonts for (int i = 0; i < face->num_charmaps; ++i) { FT_CharMap cm = face->charmaps[i]; if (cm->encoding == ft_encoding_adobe_custom || cm->encoding == ft_encoding_symbol) { writingSystems.setSupported(QFontDatabase::Symbol); break; } } TT_OS2 *os2 = (TT_OS2 *)FT_Get_Sfnt_Table(face, ft_sfnt_os2); if (os2) { quint32 unicodeRange[4] = { os2->ulUnicodeRange1, os2->ulUnicodeRange2, os2->ulUnicodeRange3, os2->ulUnicodeRange4 }; quint32 codePageRange[2] = { os2->ulCodePageRange1, os2->ulCodePageRange2 }; writingSystems = determineWritingSystemsFromTrueTypeBits(unicodeRange, codePageRange); } QString family = QString::fromAscii(face->family_name); if(family.isEmpty()) family = QString::fromLocal8Bit(file); FontFile *fontFile = new FontFile; fontFile->fileName = file; fontFile->indexValue = index; QFont::Stretch stretch = QFont::Unstretched; registerFont(family,"",weight,style,stretch,true,true,0,writingSystems,fontFile); families.append(family); FT_Done_Face(face); ++index; } while (index < numFaces); return families; }
QStringList QBasicFontDatabase::addTTFile(const QByteArray &fontData, const QByteArray &file) { FT_Library library = qt_getFreetype(); int index = 0; int numFaces = 0; QStringList families; do { FT_Face face; FT_Error error; if (!fontData.isEmpty()) { error = FT_New_Memory_Face(library, (const FT_Byte *)fontData.constData(), fontData.size(), index, &face); } else { error = FT_New_Face(library, file.constData(), index, &face); } if (error != FT_Err_Ok) { qDebug() << "FT_New_Face failed with index" << index << ':' << hex << error; break; } numFaces = face->num_faces; QFont::Weight weight = QFont::Normal; QFont::Style style = QFont::StyleNormal; if (face->style_flags & FT_STYLE_FLAG_ITALIC) style = QFont::StyleItalic; if (face->style_flags & FT_STYLE_FLAG_BOLD) weight = QFont::Bold; bool fixedPitch = (face->face_flags & FT_FACE_FLAG_FIXED_WIDTH); QSupportedWritingSystems writingSystems; // detect symbol fonts for (int i = 0; i < face->num_charmaps; ++i) { FT_CharMap cm = face->charmaps[i]; if (cm->encoding == FT_ENCODING_ADOBE_CUSTOM || cm->encoding == FT_ENCODING_MS_SYMBOL) { writingSystems.setSupported(QFontDatabase::Symbol); break; } } TT_OS2 *os2 = (TT_OS2 *)FT_Get_Sfnt_Table(face, ft_sfnt_os2); if (os2) { quint32 unicodeRange[4] = { quint32(os2->ulUnicodeRange1), quint32(os2->ulUnicodeRange2), quint32(os2->ulUnicodeRange3), quint32(os2->ulUnicodeRange4) }; quint32 codePageRange[2] = { quint32(os2->ulCodePageRange1), quint32(os2->ulCodePageRange2) }; writingSystems = QPlatformFontDatabase::writingSystemsFromTrueTypeBits(unicodeRange, codePageRange); if (os2->usWeightClass) { weight = QPlatformFontDatabase::weightFromInteger(os2->usWeightClass); } else if (os2->panose[2]) { int w = os2->panose[2]; if (w <= 1) weight = QFont::Thin; else if (w <= 2) weight = QFont::ExtraLight; else if (w <= 3) weight = QFont::Light; else if (w <= 5) weight = QFont::Normal; else if (w <= 6) weight = QFont::Medium; else if (w <= 7) weight = QFont::DemiBold; else if (w <= 8) weight = QFont::Bold; else if (w <= 9) weight = QFont::ExtraBold; else if (w <= 10) weight = QFont::Black; } } QString family = QString::fromLatin1(face->family_name); FontFile *fontFile = new FontFile; fontFile->fileName = QFile::decodeName(file); fontFile->indexValue = index; QFont::Stretch stretch = QFont::Unstretched; registerFont(family,QString::fromLatin1(face->style_name),QString(),weight,style,stretch,true,true,0,fixedPitch,writingSystems,fontFile); families.append(family); FT_Done_Face(face); ++index; } while (index < numFaces); return families; }
QStringList QBasicFontDatabase::addMMFile(const QByteArray &fontData, const QByteArray &file) { //! [1] FT_Library library = qt_getFreetype(); int index = 0; int numFaces = 0; QStringList families; do { FT_Face face; FT_Error error; if (!fontData.isEmpty()) { error = FT_New_Memory_Face(library, (const FT_Byte *)fontData.constData(), fontData.size(), index, &face); } else { error = FT_New_Face(library, file.constData(), index, &face); } if (error != FT_Err_Ok) { qDebug() << "FT_New_Face failed with index:MMF:" << index << ":" << hex << error; break; } /* #ifndef NO_FREETYPE_ARPHIC_MMF ////////////////////////// index = 0; char aaa[6]; int len=fontData.length(); memcpy(aaa, (const char *)(fontData.length()+len-9), 5); aaa[5]=0; fontData = atoi((const char *)aaa); qDebug()<<"LOG_qfontconfigdatabase_Ln765:addAppliction font id:"<<fontData; ///////////////////////// #endif */ numFaces = face->num_faces; QFont::Weight weight = QFont::Normal; QFont::Style style = QFont::StyleNormal; if (face->style_flags & FT_STYLE_FLAG_ITALIC) style = QFont::StyleItalic; if (face->style_flags & FT_STYLE_FLAG_BOLD) weight = QFont::Bold; bool fixedPitch = (face->face_flags & FT_FACE_FLAG_FIXED_WIDTH); QSupportedWritingSystems writingSystems; for (int i = 0; i < face->num_charmaps; ++i) { FT_CharMap cm = face->charmaps[i]; if (cm->encoding == FT_ENCODING_ADOBE_CUSTOM || cm->encoding == FT_ENCODING_MS_SYMBOL) { writingSystems.setSupported(QFontDatabase::Symbol); break; } } /* //! [1] //! [2] TT_OS2 *os2 = (TT_OS2 *)FT_Get_Sfnt_Table(face, ft_sfnt_os2); if (os2) { quint32 unicodeRange[4] = { quint32(os2->ulUnicodeRange1), quint32(os2->ulUnicodeRange2), quint32(os2->ulUnicodeRange3), quint32(os2->ulUnicodeRange4) }; quint32 codePageRange[2] = { quint32(os2->ulCodePageRange1), quint32(os2->ulCodePageRange2) }; writingSystems = QPlatformFontDatabase::writingSystemsFromTrueTypeBits(unicodeRange, codePageRange); if (os2->usWeightClass == 0) ; else if (os2->usWeightClass < 350) weight = QFont::Light; else if (os2->usWeightClass < 450) weight = QFont::Normal; else if (os2->usWeightClass < 650) weight = QFont::DemiBold; else if (os2->usWeightClass < 750) weight = QFont::Bold; #ifndef NO_ARPHIC_MULTI_WEIGHT else if (os2->usWeightClass < 810) weight = QFont::ExtraBold; #endif else if (os2->usWeightClass < 1000) weight = QFont::Black; if (os2->panose[2] >= 2) { int w = os2->panose[2]; if (w <= 3) weight = QFont::Light; else if (w <= 5) weight = QFont::Normal; else if (w <= 7) weight = QFont::DemiBold; else if (w <= 8) weight = QFont::Bold; #ifndef NO_ARPHIC_MULTI_WEIGHT else if (w <= 9) weight = QFont::ExtraBold; #endif else if (w <= 10) weight = QFont::Black; } } #ifndef NO_ARPHIC_MULTI_WEIGHT if (os2->usWeightClass == 0) ; else if (os2->usWeightClass < 350) weight = QFont::Light; else if (os2->usWeightClass < 450) weight = QFont::Normal; else if (os2->usWeightClass < 650) weight = QFont::DemiBold; else if (os2->usWeightClass < 750) weight = QFont::Bold; else if (os2->usWeightClass < 810) weight = QFont::ExtraBold; else if (os2->usWeightClass < 1000) weight = QFont::Black; #endif //! [2] */ //! [3] QString family = QString::fromLatin1(face->family_name); FontFile *fontFile = new FontFile; fontFile->fileName = QFile::decodeName(file); fontFile->indexValue = index; QFont::Stretch stretch = QFont::Unstretched; registerFont(family,QString::fromLatin1(face->style_name),QString(),weight,style,stretch,true,true,0,fixedPitch,writingSystems,fontFile); families.append(family); FT_Done_Face(face); ++index; } while (index < numFaces); return families; //! [3] }
QStringList QWebOSFontDatabase::addTTFile(QWebOSFontDatabase* qwfdb, const QByteArray &fontData, const QByteArray &file, const QStringList &additionalFamilies) { if (qwfdb && qwfdb->m_debug) qDebug("addTTFile(fontData.size() = %d, file = '%s', additionalFamilies = '%s')", fontData.size(), qPrintable(file), qPrintable(additionalFamilies.join(","))); extern FT_Library qt_getFreetype(); FT_Library library = qt_getFreetype(); int numFaces = 0; int index = 0; QStringList families; FT_Face face; FT_Error error; if (!fontData.isEmpty()) { error = FT_New_Memory_Face(library, (const FT_Byte *)fontData.constData(), fontData.size(), index, &face); } else { error = FT_New_Face(library, file.constData(), index, &face); } if (error != FT_Err_Ok) { qDebug() << "FT_New_Face for " << qPrintable(file) << " failed with index" << index << ":" << hex << error; return families; } numFaces = face->num_faces; if (numFaces > 1) { qWarning() << "numFaces for " << qPrintable(file) << " is " << numFaces << ", expected just 1"; } QFont::Weight weight = QFont::Normal; QFont::Stretch stretch = QFont::Unstretched; QFont::Style style = QFont::StyleNormal; if (face->style_flags & FT_STYLE_FLAG_ITALIC) style = QFont::StyleItalic; if (face->style_flags & FT_STYLE_FLAG_BOLD) weight = QFont::Bold; QSupportedWritingSystems writingSystems; // detect symbol fonts for (int i = 0; i < face->num_charmaps; ++i) { FT_CharMap cm = face->charmaps[i]; if (cm->encoding == ft_encoding_adobe_custom || cm->encoding == ft_encoding_symbol) { writingSystems.setSupported(QFontDatabase::Symbol); break; } } TT_OS2 *os2 = (TT_OS2 *)FT_Get_Sfnt_Table(face, ft_sfnt_os2); if (os2) { quint32 unicodeRange[4] = { os2->ulUnicodeRange1, os2->ulUnicodeRange2, os2->ulUnicodeRange3, os2->ulUnicodeRange4 }; quint32 codePageRange[2] = { os2->ulCodePageRange1, os2->ulCodePageRange2 }; writingSystems = determineWritingSystemsFromTrueTypeBits(unicodeRange, codePageRange); // If the OS2 struct is availabel read the weight from there and convert it // to a QFont::Weight. This fixes OWEBOS-1866 weight = weightFromInteger(os2->usWeightClass); stretch = determineStretchFromTrueTypeWidthClass(os2->usWidthClass); style = determineStyleFromTrueTypeSelection(os2->fsSelection); } QString family = QString::fromAscii(face->family_name); QStringList allFamilies(family); allFamilies << additionalFamilies; for (int i = 0; i < allFamilies.size(); ++i) { FontFile *fontFile = new FontFile; fontFile->fileName = file; fontFile->indexValue = index; fontFile->familyName = allFamilies.at(i); qDebug("registerFont(\"%s\",\"\",%s,%s,%s,true,true,0,\"%s\",fontFile = {fileName = \"%s\", indexValue = %d, familyName = %s})", qPrintable(allFamilies.at(i)), qPrintable(qWeightToQString(weight)), qPrintable(qStyleToQString(style)), qPrintable(qStretchToQString(stretch)), qPrintable(qSupportedWritingSystemsToQString(writingSystems)), qPrintable(fontFile->fileName), fontFile->indexValue, qPrintable(fontFile->familyName)); registerFont(allFamilies.at(i), "", weight, style, stretch, true, true, 0, writingSystems, fontFile); families.append(family); } FT_Done_Face(face); return families; }