diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/text/qcssparser.cpp | 39 | ||||
-rw-r--r-- | src/gui/text/qcssparser_p.h | 2 | ||||
-rw-r--r-- | src/gui/text/qtextdocument.cpp | 18 |
3 files changed, 58 insertions, 1 deletions
diff --git a/src/gui/text/qcssparser.cpp b/src/gui/text/qcssparser.cpp index 2f7ccfb07e..e6f58eeb14 100644 --- a/src/gui/text/qcssparser.cpp +++ b/src/gui/text/qcssparser.cpp @@ -127,6 +127,7 @@ static const QCssKnownValue properties[NumProperties - 1] = { { "image", QtImage }, { "image-position", QtImageAlignment }, { "left", Left }, + { "letter-spacing", LetterSpacing }, { "line-height", LineHeight }, { "list-style", ListStyle }, { "list-style-type", ListStyleType }, @@ -171,7 +172,8 @@ static const QCssKnownValue properties[NumProperties - 1] = { { "top", Top }, { "vertical-align", VerticalAlignment }, { "white-space", Whitespace }, - { "width", Width } + { "width", Width }, + { "word-spacing", WordSpacing } }; static const QCssKnownValue values[NumKnownValues - 1] = { @@ -386,6 +388,8 @@ static inline bool isInheritable(Property propertyId) case FontVariant: case TextTransform: case LineHeight: + case LetterSpacing: + case WordSpacing: return true; default: break; @@ -1247,6 +1251,37 @@ static void setTextDecorationFromValues(const QVector<QCss::Value> &values, QFon } } +static void setLetterSpacingFromValue(const QCss::Value &value, QFont *font) +{ + QString s = value.variant.toString(); + qreal val; + bool ok = false; + if (s.endsWith(QLatin1String("em"), Qt::CaseInsensitive)) { + s.chop(2); + val = s.toDouble(&ok); + if (ok) + font->setLetterSpacing(QFont::PercentageSpacing, (val + 1.0) * 100); + } else if (s.endsWith(QLatin1String("px"), Qt::CaseInsensitive)) { + s.chop(2); + val = s.toDouble(&ok); + if (ok) + font->setLetterSpacing(QFont::AbsoluteSpacing, val); + } +} + +static void setWordSpacingFromValue(const QCss::Value &value, QFont *font) +{ + QString s = value.variant.toString(); + if (s.endsWith(QLatin1String("px"), Qt::CaseInsensitive)) { + s.chop(2); + qreal val; + bool ok = false; + val = s.toDouble(&ok); + if (ok) + font->setWordSpacing(val); + } +} + static void parseShorthandFontProperty(const QVector<QCss::Value> &values, QFont *font, int *fontSizeAdjustment) { font->setStyle(QFont::StyleNormal); @@ -1319,6 +1354,8 @@ bool ValueExtractor::extractFont(QFont *font, int *fontSizeAdjustment) case Font: parseShorthandFontProperty(decl.d->values, font, fontSizeAdjustment); break; case FontVariant: setFontVariantFromValue(val, font); break; case TextTransform: setTextTransformFromValue(val, font); break; + case LetterSpacing: setLetterSpacingFromValue(val, font); break; + case WordSpacing: setWordSpacingFromValue(val, font); break; default: continue; } hit = true; diff --git a/src/gui/text/qcssparser_p.h b/src/gui/text/qcssparser_p.h index f340a23cde..1f71a1c4af 100644 --- a/src/gui/text/qcssparser_p.h +++ b/src/gui/text/qcssparser_p.h @@ -199,6 +199,8 @@ enum Property { FontKerning, QtForegroundTextureCacheKey, QtIcon, + LetterSpacing, + WordSpacing, NumProperties }; diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp index 04edf89430..0890614be9 100644 --- a/src/gui/text/qtextdocument.cpp +++ b/src/gui/text/qtextdocument.cpp @@ -2228,6 +2228,24 @@ QString QTextHtmlExporter::toHtml(ExportMode mode) html += (defaultCharFormat.fontItalic() ? QLatin1String("italic") : QLatin1String("normal")); html += QLatin1Char(';'); + const bool percentSpacing = (defaultCharFormat.fontLetterSpacingType() == QFont::PercentageSpacing); + if (defaultCharFormat.hasProperty(QTextFormat::FontLetterSpacing) && + (!percentSpacing || defaultCharFormat.fontLetterSpacing() != 0.0)) { + html += QLatin1String(" letter-spacing:"); + qreal value = defaultCharFormat.fontLetterSpacing(); + if (percentSpacing) // Map to em (100% == 0em) + value = (value / 100) - 1; + html += QString::number(value); + html += percentSpacing ? QLatin1String("em;") : QLatin1String("px;"); + } + + if (defaultCharFormat.hasProperty(QTextFormat::FontWordSpacing) && + defaultCharFormat.fontWordSpacing() != 0.0) { + html += QLatin1String(" word-spacing:"); + html += QString::number(defaultCharFormat.fontWordSpacing()); + html += QLatin1String("px;"); + } + // do not set text-decoration on the default font since those values are /always/ propagated // and cannot be turned off with CSS |