Skip to content

Commit

Permalink
Fix missing shadows in legend text
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Nov 29, 2022
1 parent f1447be commit 3877db4
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 6 deletions.
13 changes: 7 additions & 6 deletions src/core/textrenderer/qgstextrenderer.cpp
Expand Up @@ -84,7 +84,6 @@ void QgsTextRenderer::drawText( const QRectF &rect, double rotation, Qgis::TextH
QgsTextFormat tmpFormat = format;
if ( format.dataDefinedProperties().hasActiveProperties() ) // note, we use format instead of tmpFormat here, it's const and potentially avoids a detach
tmpFormat.updateDataDefinedProperties( context );
tmpFormat = updateShadowPosition( tmpFormat );

QStringList textLines;
for ( const QString &line : text )
Expand All @@ -110,17 +109,19 @@ void QgsTextRenderer::drawText( const QRectF &rect, double rotation, Qgis::TextH

void QgsTextRenderer::drawDocument( const QRectF &rect, const QgsTextFormat &format, const QgsTextDocument &document, const QgsTextDocumentMetrics &metrics, QgsRenderContext &context, Qgis::TextHorizontalAlignment horizontalAlignment, Qgis::TextVerticalAlignment verticalAlignment, double rotation, Qgis::TextLayoutMode mode, Qgis::TextRendererFlags )
{
if ( format.background().enabled() )
const QgsTextFormat tmpFormat = updateShadowPosition( format );

if ( tmpFormat.background().enabled() )
{
drawPart( rect, rotation, horizontalAlignment, verticalAlignment, document, metrics, context, format, Qgis::TextComponent::Background, mode );
drawPart( rect, rotation, horizontalAlignment, verticalAlignment, document, metrics, context, tmpFormat, Qgis::TextComponent::Background, mode );
}

if ( format.buffer().enabled() )
if ( tmpFormat.buffer().enabled() )
{
drawPart( rect, rotation, horizontalAlignment, verticalAlignment, document, metrics, context, format, Qgis::TextComponent::Buffer, mode );
drawPart( rect, rotation, horizontalAlignment, verticalAlignment, document, metrics, context, tmpFormat, Qgis::TextComponent::Buffer, mode );
}

drawPart( rect, rotation, horizontalAlignment, verticalAlignment, document, metrics, context, format, Qgis::TextComponent::Text, mode );
drawPart( rect, rotation, horizontalAlignment, verticalAlignment, document, metrics, context, tmpFormat, Qgis::TextComponent::Text, mode );
}

void QgsTextRenderer::drawText( QPointF point, double rotation, Qgis::TextHorizontalAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, bool )
Expand Down
50 changes: 50 additions & 0 deletions tests/src/python/test_qgstextrenderer.py
Expand Up @@ -1771,6 +1771,56 @@ def testDrawDocumentRectAscentMode(self):

self.assertTrue(self.imageCheck('draw_document_rect_ascent', 'draw_document_rect_ascent', image))

def testDrawDocumentShadowPlacement(self):
"""
Test drawing text document with shadow placement lowest
"""
format = QgsTextFormat()
format.setFont(getTestFont('bold'))
format.setAllowHtmlFormatting(True)
format.setSize(30)
format.setColor(QColor(255, 255, 255))

format.shadow().setEnabled(True)
format.shadow().setShadowPlacement(QgsTextShadowSettings.ShadowLowest)
format.shadow().setOpacity(1.0)
format.shadow().setBlurRadius(0)
format.shadow().setOffsetDistance(5)
format.shadow().setOffsetUnit(QgsUnitTypes.RenderMillimeters)

image = QImage(400, 400, QImage.Format_RGB32)

painter = QPainter()
ms = QgsMapSettings()
ms.setExtent(QgsRectangle(0, 0, 50, 50))
ms.setOutputSize(image.size())
context = QgsRenderContext.fromMapSettings(ms)
context.setPainter(painter)
context.setScaleFactor(96 / 25.4) # 96 DPI
context.setFlag(QgsRenderContext.ApplyScalingWorkaroundForTextRendering, True)

painter.begin(image)
painter.setRenderHint(QPainter.Antialiasing)
image.fill(QColor(152, 219, 249))

painter.setBrush(QBrush(QColor(182, 239, 255)))
painter.setPen(Qt.NoPen)

doc = QgsTextDocument.fromHtml(['first <span style="font-size:50pt">line</span>', 'second <span style="font-size:50pt">line</span>', 'third line'])

metrics = QgsTextDocumentMetrics.calculateMetrics(doc, format, context, QgsTextRenderer.FONT_WORKAROUND_SCALE)

QgsTextRenderer.drawDocument(QRectF(100, 100, 100, 100),
format,
doc,
metrics,
context,
mode=Qgis.TextLayoutMode.RectangleAscentBased)

painter.end()

self.assertTrue(self.imageCheck('draw_document_shadow_lowest', 'draw_document_shadow_lowest', image))

def testDrawForcedItalic(self):
"""
Test drawing with forced italic
Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 3877db4

Please sign in to comment.