Replace MAKE_TAG macro with QFont::Tag

Task-number: QTBUG-117046
Change-Id: I26e0af634fed87199bb49d57e3aa3f4e3fea0e39
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
This commit is contained in:
Volker Hilsheimer 2023-10-10 17:07:30 +02:00
parent eb02561f58
commit 61ceff89f7
12 changed files with 42 additions and 49 deletions

View File

@ -361,7 +361,7 @@ static void getFontDescription(CTFontDescriptorRef font, FontDescription *fd)
fd->fixedPitch = false; fd->fixedPitch = false;
if (QCFType<CTFontRef> tempFont = CTFontCreateWithFontDescriptor(font, 0.0, 0)) { if (QCFType<CTFontRef> tempFont = CTFontCreateWithFontDescriptor(font, 0.0, 0)) {
uint tag = MAKE_TAG('O', 'S', '/', '2'); uint tag = QFont::Tag("OS/2").value();
CTFontRef tempFontRef = tempFont; CTFontRef tempFontRef = tempFont;
void *userData = reinterpret_cast<void *>(&tempFontRef); void *userData = reinterpret_cast<void *>(&tempFontRef);
uint length = 128; uint length = 128;

View File

@ -232,7 +232,7 @@ void QCoreTextFontEngine::init()
synthesisFlags |= SynthesizedItalic; synthesisFlags |= SynthesizedItalic;
avgCharWidth = 0; avgCharWidth = 0;
QByteArray os2Table = getSfntTable(MAKE_TAG('O', 'S', '/', '2')); QByteArray os2Table = getSfntTable(QFont::Tag("OS/2").value());
unsigned emSize = CTFontGetUnitsPerEm(ctfont); unsigned emSize = CTFontGetUnitsPerEm(ctfont);
if (os2Table.size() >= 10) { if (os2Table.size() >= 10) {
fsType = qFromBigEndian<quint16>(os2Table.constData() + 8); fsType = qFromBigEndian<quint16>(os2Table.constData() + 8);

View File

@ -767,7 +767,7 @@ static FT_UShort calculateActualWeight(FT_Face face, QFontEngine::FaceId faceId)
FT_Get_MM_Var(face, &var); FT_Get_MM_Var(face, &var);
if (var != nullptr && FT_UInt(faceId.instanceIndex) < var->num_namedstyles) { if (var != nullptr && FT_UInt(faceId.instanceIndex) < var->num_namedstyles) {
for (FT_UInt axis = 0; axis < var->num_axis; ++axis) { for (FT_UInt axis = 0; axis < var->num_axis; ++axis) {
if (var->axis[axis].tag == MAKE_TAG('w', 'g', 'h', 't')) { if (var->axis[axis].tag == QFont::Tag("wght").value()) {
return var->namedstyle[faceId.instanceIndex].coords[axis] >> 16; return var->namedstyle[faceId.instanceIndex].coords[axis] >> 16;
} }
} }
@ -787,7 +787,7 @@ static bool calculateActualItalic(FT_Face face, QFontEngine::FaceId faceId)
FT_Get_MM_Var(face, &var); FT_Get_MM_Var(face, &var);
if (var != nullptr && FT_UInt(faceId.instanceIndex) < var->num_namedstyles) { if (var != nullptr && FT_UInt(faceId.instanceIndex) < var->num_namedstyles) {
for (FT_UInt axis = 0; axis < var->num_axis; ++axis) { for (FT_UInt axis = 0; axis < var->num_axis; ++axis) {
if (var->axis[axis].tag == MAKE_TAG('i', 't', 'a', 'l')) { if (var->axis[axis].tag == QFont::Tag("ital").value()) {
return (var->namedstyle[faceId.instanceIndex].coords[axis] >> 16) == 1; return (var->namedstyle[faceId.instanceIndex].coords[axis] >> 16) == 1;
} }
} }

View File

@ -114,11 +114,11 @@ void QFreeTypeFontDatabase::addNamedInstancesForFace(void *face_,
QFont::Stretch instanceStretch = stretch; QFont::Stretch instanceStretch = stretch;
QFont::Style instanceStyle = style; QFont::Style instanceStyle = style;
for (FT_UInt axis = 0; axis < var->num_axis; ++axis) { for (FT_UInt axis = 0; axis < var->num_axis; ++axis) {
if (var->axis[axis].tag == MAKE_TAG('w', 'g', 'h', 't')) { if (var->axis[axis].tag == QFont::Tag("wght").value()) {
instanceWeight = QFont::Weight(var->namedstyle[i].coords[axis] >> 16); instanceWeight = QFont::Weight(var->namedstyle[i].coords[axis] >> 16);
} else if (var->axis[axis].tag == MAKE_TAG('w', 'd', 't', 'h')) { } else if (var->axis[axis].tag == QFont::Tag("wdth").value()) {
instanceStretch = QFont::Stretch(var->namedstyle[i].coords[axis] >> 16); instanceStretch = QFont::Stretch(var->namedstyle[i].coords[axis] >> 16);
} else if (var->axis[axis].tag == MAKE_TAG('i', 't', 'a', 'l')) { } else if (var->axis[axis].tag == QFont::Tag("ital").value()) {
FT_UInt ital = var->namedstyle[i].coords[axis] >> 16; FT_UInt ital = var->namedstyle[i].coords[axis] >> 16;
if (ital == 1) if (ital == 1)
instanceStyle = QFont::StyleItalic; instanceStyle = QFont::StyleItalic;

View File

@ -2508,12 +2508,9 @@ void QFont::clearFeatures()
*/ */
QByteArray QFont::tagToString(quint32 tag) QByteArray QFont::tagToString(quint32 tag)
{ {
char str[4] = if (auto maybeTag = QFont::Tag::fromValue(tag))
{ char((tag & 0xff000000) >> 24), return maybeTag->toString();
char((tag & 0x00ff0000) >> 16), return {};
char((tag & 0x0000ff00) >> 8),
char((tag & 0x000000ff)) };
return QByteArray(str, 4);
} }
/*! /*!
@ -2531,10 +2528,9 @@ QByteArray QFont::tagToString(quint32 tag)
*/ */
quint32 QFont::stringToTag(const char *name) quint32 QFont::stringToTag(const char *name)
{ {
if (qstrlen(name) != 4) if (auto maybeTag = QFont::Tag::fromString(name))
return 0; return maybeTag->value();
return 0;
return MAKE_TAG(name[0], name[1], name[2], name[3]);
} }
extern QStringList qt_fallbacksForFamily(const QString &family, QFont::Style style, extern QStringList qt_fallbacksForFamily(const QString &family, QFont::Style style,

View File

@ -182,8 +182,10 @@ bool QFontEngine::supportsScript(QChar::Script script) const
#if QT_CONFIG(harfbuzz) #if QT_CONFIG(harfbuzz)
// in AAT fonts, 'gsub' table is effectively replaced by 'mort'/'morx' table // in AAT fonts, 'gsub' table is effectively replaced by 'mort'/'morx' table
uint lenMort = 0, lenMorx = 0; uint lenMort = 0, lenMorx = 0;
if (getSfntTableData(MAKE_TAG('m','o','r','t'), nullptr, &lenMort) || getSfntTableData(MAKE_TAG('m','o','r','x'), nullptr, &lenMorx)) if (getSfntTableData(QFont::Tag("mort").value(), nullptr, &lenMort)
|| getSfntTableData(QFont::Tag("morx").value(), nullptr, &lenMorx)) {
return true; return true;
}
if (hb_face_t *face = hb_qt_face_get_for_engine(const_cast<QFontEngine *>(this))) { if (hb_face_t *face = hb_qt_face_get_for_engine(const_cast<QFontEngine *>(this))) {
unsigned int script_count = HB_OT_MAX_TAGS_PER_SCRIPT; unsigned int script_count = HB_OT_MAX_TAGS_PER_SCRIPT;
@ -381,7 +383,7 @@ void QFontEngine::getGlyphBearings(glyph_t glyph, qreal *leftBearing, qreal *rig
bool QFontEngine::processHheaTable() const bool QFontEngine::processHheaTable() const
{ {
QByteArray hhea = getSfntTable(MAKE_TAG('h', 'h', 'e', 'a')); QByteArray hhea = getSfntTable(QFont::Tag("hhea").value());
if (hhea.size() >= 10) { if (hhea.size() >= 10) {
auto ptr = hhea.constData(); auto ptr = hhea.constData();
qint16 ascent = qFromBigEndian<qint16>(ptr + 4); qint16 ascent = qFromBigEndian<qint16>(ptr + 4);
@ -407,9 +409,9 @@ bool QFontEngine::processHheaTable() const
void QFontEngine::initializeHeightMetrics() const void QFontEngine::initializeHeightMetrics() const
{ {
bool hasEmbeddedBitmaps = bool hasEmbeddedBitmaps =
!getSfntTable(MAKE_TAG('E', 'B', 'L', 'C')).isEmpty() !getSfntTable(QFont::Tag("EBLC").value()).isEmpty()
|| !getSfntTable(MAKE_TAG('C', 'B', 'L', 'C')).isEmpty() || !getSfntTable(QFont::Tag("CBLC").value()).isEmpty()
|| !getSfntTable(MAKE_TAG('b', 'd', 'a', 't')).isEmpty(); || !getSfntTable(QFont::Tag("bdat").value()).isEmpty();
if (!hasEmbeddedBitmaps) { if (!hasEmbeddedBitmaps) {
// Get HHEA table values if available // Get HHEA table values if available
processHheaTable(); processHheaTable();
@ -429,7 +431,7 @@ void QFontEngine::initializeHeightMetrics() const
bool QFontEngine::processOS2Table() const bool QFontEngine::processOS2Table() const
{ {
QByteArray os2 = getSfntTable(MAKE_TAG('O', 'S', '/', '2')); QByteArray os2 = getSfntTable(QFont::Tag("OS/2").value());
if (os2.size() >= 78) { if (os2.size() >= 78) {
auto ptr = os2.constData(); auto ptr = os2.constData();
quint16 fsSelection = qFromBigEndian<quint16>(ptr + 62); quint16 fsSelection = qFromBigEndian<quint16>(ptr + 62);
@ -505,7 +507,7 @@ qreal QFontEngine::minRightBearing() const
if (m_minRightBearing == kBearingNotInitialized) { if (m_minRightBearing == kBearingNotInitialized) {
// Try the 'hhea' font table first, which covers the entire font // Try the 'hhea' font table first, which covers the entire font
QByteArray hheaTable = getSfntTable(MAKE_TAG('h', 'h', 'e', 'a')); QByteArray hheaTable = getSfntTable(QFont::Tag("hhea").value());
if (hheaTable.size() >= int(kMinRightSideBearingOffset + sizeof(qint16))) { if (hheaTable.size() >= int(kMinRightSideBearingOffset + sizeof(qint16))) {
const uchar *tableData = reinterpret_cast<const uchar *>(hheaTable.constData()); const uchar *tableData = reinterpret_cast<const uchar *>(hheaTable.constData());
Q_ASSERT(q16Dot16ToFloat(qFromBigEndian<quint32>(tableData)) == 1.0); Q_ASSERT(q16Dot16ToFloat(qFromBigEndian<quint32>(tableData)) == 1.0);
@ -1045,7 +1047,7 @@ void QFontEngine::loadKerningPairs(QFixed scalingFactor)
{ {
kerning_pairs.clear(); kerning_pairs.clear();
QByteArray tab = getSfntTable(MAKE_TAG('k', 'e', 'r', 'n')); QByteArray tab = getSfntTable(QFont::Tag("kern").value());
if (tab.isEmpty()) if (tab.isEmpty())
return; return;
@ -1134,7 +1136,7 @@ end:
int QFontEngine::glyphCount() const int QFontEngine::glyphCount() const
{ {
QByteArray maxpTable = getSfntTable(MAKE_TAG('m', 'a', 'x', 'p')); QByteArray maxpTable = getSfntTable(QFont::Tag("maxp").value());
if (maxpTable.size() < 6) if (maxpTable.size() < 6)
return 0; return 0;

View File

@ -29,13 +29,6 @@ class QFontEngineGlyphCache;
struct QGlyphLayout; struct QGlyphLayout;
#define MAKE_TAG(ch1, ch2, ch3, ch4) (\
(((quint32)(ch1)) << 24) | \
(((quint32)(ch2)) << 16) | \
(((quint32)(ch3)) << 8) | \
((quint32)(ch4)) \
)
// ### this only used in getPointInOutline(), refactor it and then remove these magic numbers // ### this only used in getPointInOutline(), refactor it and then remove these magic numbers
enum HB_Compat_Error { enum HB_Compat_Error {
Err_Ok = 0x0000, Err_Ok = 0x0000,

View File

@ -401,7 +401,7 @@ static QTtfTable generateHead(const qttf_head_table &head)
{ {
const int head_size = 54; const int head_size = 54;
QTtfTable t; QTtfTable t;
t.tag = MAKE_TAG('h', 'e', 'a', 'd'); t.tag = QFont::Tag("head").value();
t.data.resize(head_size); t.data.resize(head_size);
QTtfStream s(t.data); QTtfStream s(t.data);
@ -472,7 +472,7 @@ static QTtfTable generateHhea(const qttf_hhea_table &hhea)
{ {
const int hhea_size = 36; const int hhea_size = 36;
QTtfTable t; QTtfTable t;
t.tag = MAKE_TAG('h', 'h', 'e', 'a'); t.tag = QFont::Tag("hhea").value();
t.data.resize(hhea_size); t.data.resize(hhea_size);
QTtfStream s(t.data); QTtfStream s(t.data);
@ -523,7 +523,7 @@ static QTtfTable generateMaxp(const qttf_maxp_table &maxp)
{ {
const int maxp_size = 32; const int maxp_size = 32;
QTtfTable t; QTtfTable t;
t.tag = MAKE_TAG('m', 'a', 'x', 'p'); t.tag = QFont::Tag("maxp").value();
t.data.resize(maxp_size); t.data.resize(maxp_size);
QTtfStream s(t.data); QTtfStream s(t.data);
@ -603,7 +603,7 @@ static QTtfTable generateName(const QList<QTtfNameRecord> &name)
const int char_size = 2; const int char_size = 2;
QTtfTable t; QTtfTable t;
t.tag = MAKE_TAG('n', 'a', 'm', 'e'); t.tag = QFont::Tag("name").value();
const int name_size = 6 + 12*name.size(); const int name_size = 6 + 12*name.size();
int string_size = 0; int string_size = 0;
@ -958,15 +958,15 @@ static QList<QTtfTable> generateGlyphTables(qttf_font_tables &tables, const QLis
tables.hhea.numberOfHMetrics = nGlyphs; tables.hhea.numberOfHMetrics = nGlyphs;
QTtfTable glyf; QTtfTable glyf;
glyf.tag = MAKE_TAG('g', 'l', 'y', 'f'); glyf.tag = QFont::Tag("glyf").value();
QTtfTable loca; QTtfTable loca;
loca.tag = MAKE_TAG('l', 'o', 'c', 'a'); loca.tag = QFont::Tag("loca").value();
loca.data.resize(glyf_size < max_size_small ? (nGlyphs+1)*sizeof(quint16) : (nGlyphs+1)*sizeof(quint32)); loca.data.resize(glyf_size < max_size_small ? (nGlyphs+1)*sizeof(quint16) : (nGlyphs+1)*sizeof(quint32));
QTtfStream ls(loca.data); QTtfStream ls(loca.data);
QTtfTable hmtx; QTtfTable hmtx;
hmtx.tag = MAKE_TAG('h', 'm', 't', 'x'); hmtx.tag = QFont::Tag("hmtx").value();
hmtx.data.resize(nGlyphs*4); hmtx.data.resize(nGlyphs*4);
QTtfStream hs(hmtx.data); QTtfStream hs(hmtx.data);
@ -1066,7 +1066,7 @@ static QByteArray bindFont(const QList<QTtfTable>& _tables)
for (int i = 0; i < tables.size(); ++i) { for (int i = 0; i < tables.size(); ++i) {
const QTtfTable &t = tables.at(i); const QTtfTable &t = tables.at(i);
const quint32 size = (t.data.size() + 3) & ~3; const quint32 size = (t.data.size() + 3) & ~3;
if (t.tag == MAKE_TAG('h', 'e', 'a', 'd')) if (t.tag == QFont::Tag("head").value())
head_offset = table_offset; head_offset = table_offset;
f << t.tag f << t.tag
<< checksum(t.data) << checksum(t.data)
@ -1186,7 +1186,7 @@ QByteArray QFontSubset::toTruetype() const
tables.append(generateMaxp(font.maxp)); tables.append(generateMaxp(font.maxp));
// name // name
QTtfTable name_table; QTtfTable name_table;
name_table.tag = MAKE_TAG('n', 'a', 'm', 'e'); name_table.tag = QFont::Tag("name").value();
if (!noEmbed) if (!noEmbed)
name_table.data = fontEngine->getSfntTable(name_table.tag); name_table.data = fontEngine->getSfntTable(name_table.tag);
if (name_table.data.isEmpty()) { if (name_table.data.isEmpty()) {
@ -1204,7 +1204,7 @@ QByteArray QFontSubset::toTruetype() const
if (!noEmbed) { if (!noEmbed) {
QTtfTable os2; QTtfTable os2;
os2.tag = MAKE_TAG('O', 'S', '/', '2'); os2.tag = QFont::Tag("OS/2").value();
os2.data = fontEngine->getSfntTable(os2.tag); os2.data = fontEngine->getSfntTable(os2.tag);
if (!os2.data.isEmpty()) if (!os2.data.isEmpty())
tables.append(os2); tables.append(os2);

View File

@ -642,7 +642,9 @@ QByteArray QRawFont::fontTable(const char *tagName) const
if (!d->isValid()) if (!d->isValid())
return QByteArray(); return QByteArray();
return d->fontEngine->getSfntTable(MAKE_TAG(tagName[0], tagName[1], tagName[2], tagName[3])); if (auto maybeTag = QFont::Tag::fromString(tagName))
return d->fontEngine->getSfntTable(maybeTag->value());
return {};
} }
/*! /*!

View File

@ -104,7 +104,7 @@ void QWindowsFontEngine::getCMap()
SelectObject(hdc, hfont); SelectObject(hdc, hfont);
bool symb = false; bool symb = false;
if (ttf) { if (ttf) {
cmapTable = getSfntTable(MAKE_TAG('c', 'm', 'a', 'p')); cmapTable = getSfntTable(QFont::Tag("cmap").value());
cmap = QFontEngine::getCMap(reinterpret_cast<const uchar *>(cmapTable.constData()), cmap = QFontEngine::getCMap(reinterpret_cast<const uchar *>(cmapTable.constData()),
cmapTable.size(), &symb, &cmapSize); cmapTable.size(), &symb, &cmapSize);
} }
@ -471,7 +471,7 @@ namespace {
QFixed QWindowsFontEngine::capHeight() const QFixed QWindowsFontEngine::capHeight() const
{ {
const QByteArray tableData = getSfntTable(MAKE_TAG('O', 'S', '/', '2')); const QByteArray tableData = getSfntTable(QFont::Tag("OS/2").value());
if (size_t(tableData.size()) >= sizeof(OS2Table)) { if (size_t(tableData.size()) >= sizeof(OS2Table)) {
const OS2Table *table = reinterpret_cast<const OS2Table *>(tableData.constData()); const OS2Table *table = reinterpret_cast<const OS2Table *>(tableData.constData());
if (qFromBigEndian<quint16>(table->version) >= 2) { if (qFromBigEndian<quint16>(table->version) >= 2) {

View File

@ -359,7 +359,7 @@ void QWindowsFontEngineDirectWrite::collectMetrics()
fontFile->Release(); fontFile->Release();
} }
QByteArray table = getSfntTable(MAKE_TAG('h', 'h', 'e', 'a')); QByteArray table = getSfntTable(QFont::Tag("hhea").value());
const int advanceWidthMaxLocation = 10; const int advanceWidthMaxLocation = 10;
if (table.size() >= advanceWidthMaxLocation + int(sizeof(quint16))) { if (table.size() >= advanceWidthMaxLocation + int(sizeof(quint16))) {
quint16 advanceWidthMax = qFromBigEndian<quint16>(table.constData() + advanceWidthMaxLocation); quint16 advanceWidthMax = qFromBigEndian<quint16>(table.constData() + advanceWidthMaxLocation);

View File

@ -27,8 +27,8 @@ void MainWindow::updateSampleText()
for (int i = 0; i < ui->lwFeatures->count(); ++i) { for (int i = 0; i < ui->lwFeatures->count(); ++i) {
QListWidgetItem *it = ui->lwFeatures->item(i); QListWidgetItem *it = ui->lwFeatures->item(i);
if (it->checkState() != Qt::PartiallyChecked) { if (it->checkState() != Qt::PartiallyChecked) {
QByteArray ba = it->text().toLatin1(); if (const auto maybeTag = QFont::Tag::fromString(it->text().toLatin1()))
font.setFeature(ba, !!it->checkState()); font.setFeature(*maybeTag, !!it->checkState());
} }
} }