summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/text/qcssparser.cpp39
-rw-r--r--src/gui/text/qcssparser_p.h2
-rw-r--r--src/gui/text/qtextdocument.cpp18
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