From 3558704ed5c3d2c6dc6d024dfa454997469ca75f Mon Sep 17 00:00:00 2001 From: Jonas Karlsson Date: Wed, 5 Aug 2020 10:47:33 +0200 Subject: Use OpenType font weights Task-number: QTBUG-42248 Change-Id: Icdb301b27d6699c2b842c4563fbef9df73c23cbc Reviewed-by: Qt CI Bot Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/tools/uic/cpp/cppwriteinitialization.cpp | 53 ++++++++++++++++++++++++++-- src/tools/uic/ui4.cpp | 13 +++++++ src/tools/uic/ui4.h | 13 +++++++ 3 files changed, 77 insertions(+), 2 deletions(-) (limited to 'src/tools') diff --git a/src/tools/uic/cpp/cppwriteinitialization.cpp b/src/tools/uic/cpp/cppwriteinitialization.cpp index 29c054bc22..2a3c9bdd70 100644 --- a/src/tools/uic/cpp/cppwriteinitialization.cpp +++ b/src/tools/uic/cpp/cppwriteinitialization.cpp @@ -1623,8 +1623,57 @@ QString WriteInitialization::writeFontProperties(const DomFont *f) << language::boolValue(f->elementUnderline()) << ')' << language::eol; } if (f->hasElementWeight() && f->elementWeight() > 0) { - m_output << m_indent << fontName << ".setWeight(" - << f->elementWeight() << ")" << language::eol; + int weight = f->elementWeight(); + if (!f->hasAttributeScale()) { + // Convert from old Qt scale to OpenType scale. + // (not a linear conversion, so we adapt the known values and approximate the others). + // Note that we cannot use qt_legacyToOpenTypeWeight from qfont_p.h here due to + // dependency issues. + + switch (f->elementWeight()) { + case 0: + weight = 100; + break; + case 12: + weight = 200; + break; + case 25: + weight = 300; + break; + case 50: + weight = 400; + break; + case 57: + weight = 500; + break; + case 63: + weight = 600; + break; + case 75: + weight = 700; + break; + case 81: + weight = 800; + break; + case 87: + weight = 900; + break; + default: + weight *= 8; + weight += 100; + break; + } + } + + switch (language::language()) { + case Language::Cpp: + m_output << m_indent << fontName << ".setWeight(QFont::Weight(" << weight << "))" + << language::eol; + break; + case Language::Python: + m_output << m_indent << fontName << ".setWeight(" << weight << ")" << language::eol; + break; + } } if (f->hasElementStrikeOut()) { m_output << m_indent << fontName << ".setStrikeOut(" diff --git a/src/tools/uic/ui4.cpp b/src/tools/uic/ui4.cpp index a155df9b6c..8a535582b9 100644 --- a/src/tools/uic/ui4.cpp +++ b/src/tools/uic/ui4.cpp @@ -3099,6 +3099,16 @@ DomFont::~DomFont() = default; void DomFont::read(QXmlStreamReader &reader) { + const QXmlStreamAttributes &attributes = reader.attributes(); + for (const QXmlStreamAttribute &attribute : attributes) { + const auto name = attribute.name(); + if (name == QLatin1String("scale")) { + setAttributeScale(attribute.value().toString()); + continue; + } + reader.raiseError(QLatin1String("Unexpected attribute ") + name); + } + while (!reader.hasError()) { switch (reader.readNext()) { case QXmlStreamReader::StartElement : { @@ -3158,6 +3168,9 @@ void DomFont::write(QXmlStreamWriter &writer, const QString &tagName) const { writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("font") : tagName.toLower()); + if (hasAttributeScale()) + writer.writeAttribute(QStringLiteral("scale"), attributeScale()); + if (m_children & Family) writer.writeTextElement(QStringLiteral("family"), m_family); diff --git a/src/tools/uic/ui4.h b/src/tools/uic/ui4.h index a5ac51f521..41f11644bd 100644 --- a/src/tools/uic/ui4.h +++ b/src/tools/uic/ui4.h @@ -1619,6 +1619,16 @@ public: void read(QXmlStreamReader &reader); void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const; + // attribute accessors + inline bool hasAttributeScale() const { return m_has_attr_scale; } + inline QString attributeScale() const { return m_attr_scale; } + inline void setAttributeScale(const QString &a) + { + m_attr_scale = a; + m_has_attr_scale = true; + } + inline void clearAttributeScale() { m_has_attr_scale = false; } + // child element accessors inline QString elementFamily() const { return m_family; } void setElementFamily(const QString &a); @@ -1671,6 +1681,9 @@ public: void clearElementKerning(); private: + // attribute data + QString m_attr_scale; + bool m_has_attr_scale = false; // child element data uint m_children = 0; -- cgit v1.2.3