diff options
Diffstat (limited to 'src/gui/text/qdistancefield.cpp')
-rw-r--r-- | src/gui/text/qdistancefield.cpp | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/src/gui/text/qdistancefield.cpp b/src/gui/text/qdistancefield.cpp index adbde11237..66cb26c2ec 100644 --- a/src/gui/text/qdistancefield.cpp +++ b/src/gui/text/qdistancefield.cpp @@ -11,7 +11,7 @@ QT_BEGIN_NAMESPACE using namespace Qt::StringLiterals; -Q_LOGGING_CATEGORY(lcDistanceField, "qt.distanceField"); +Q_STATIC_LOGGING_CATEGORY(lcDistanceField, "qt.distanceField"); namespace { @@ -474,6 +474,11 @@ static void makeDistanceField(QDistanceFieldData *data, const QPainterPath &path QDataBuffer<quint32> pathIndices(0); QDataBuffer<QPoint> pathVertices(0); qSimplifyPath(path, pathVertices, pathIndices, transform); + if (pathVertices.isEmpty()) { + qCWarning(lcDistanceField) << "Unexpected glyph path structure, bailing out"; + memset(data->data, 0, data->nbytes); + return; + } const qint32 interiorColor = -0x7f80; // 8:8 signed format, -127.5 const qint32 exteriorColor = 0x7f80; // 8:8 signed format, 127.5 @@ -839,14 +844,9 @@ QDistanceFieldData *QDistanceFieldData::create(const QSize &size) return data; } -QDistanceFieldData *QDistanceFieldData::create(const QPainterPath &path, bool doubleResolution) +QDistanceFieldData *QDistanceFieldData::create(QSize size, const QPainterPath &path, bool doubleResolution) { - int dfMargin = QT_DISTANCEFIELD_RADIUS(doubleResolution) / QT_DISTANCEFIELD_SCALE(doubleResolution); - int glyphWidth = qCeil(path.boundingRect().width() / QT_DISTANCEFIELD_SCALE(doubleResolution)) + dfMargin * 2; - int glyphHeight = qCeil(path.boundingRect().height() / QT_DISTANCEFIELD_SCALE(doubleResolution)) + dfMargin * 2; - - QDistanceFieldData *data = create(QSize(glyphWidth, glyphHeight)); - + QDistanceFieldData *data = create(size); makeDistanceField(data, path, QT_DISTANCEFIELD_SCALE(doubleResolution), @@ -855,6 +855,16 @@ QDistanceFieldData *QDistanceFieldData::create(const QPainterPath &path, bool do } +QDistanceFieldData *QDistanceFieldData::create(const QPainterPath &path, bool doubleResolution) +{ + int dfMargin = QT_DISTANCEFIELD_RADIUS(doubleResolution) / QT_DISTANCEFIELD_SCALE(doubleResolution); + int glyphWidth = qCeil(path.boundingRect().width() / QT_DISTANCEFIELD_SCALE(doubleResolution)) + dfMargin * 2; + int glyphHeight = qCeil(path.boundingRect().height() / QT_DISTANCEFIELD_SCALE(doubleResolution)) + dfMargin * 2; + + return create(QSize(glyphWidth, glyphHeight), path, doubleResolution); +} + + QDistanceField::QDistanceField() : d(new QDistanceFieldData) { @@ -875,6 +885,16 @@ QDistanceField::QDistanceField(QFontEngine *fontEngine, glyph_t glyph, bool doub setGlyph(fontEngine, glyph, doubleResolution); } +QDistanceField::QDistanceField(QSize size, const QPainterPath &path, glyph_t glyph, bool doubleResolution) +{ + QPainterPath dfPath = path; + dfPath.translate(-dfPath.boundingRect().topLeft()); + dfPath.setFillRule(Qt::WindingFill); + + d = QDistanceFieldData::create(size, dfPath, doubleResolution); + d->glyph = glyph; +} + QDistanceField::QDistanceField(const QPainterPath &path, glyph_t glyph, bool doubleResolution) { QPainterPath dfPath = path; @@ -1058,7 +1078,7 @@ QImage QDistanceField::toImage(QImage::Format format) const } if (image.format() != format) - image = image.convertToFormat(format); + image = std::move(image).convertToFormat(format); } return image; |