Skip to content

Commit

Permalink
Add unit tests for text renderer word wrap
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Nov 29, 2021
1 parent fadfb47 commit 09b4fb4
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 2 deletions.
83 changes: 81 additions & 2 deletions tests/src/python/test_qgstextrenderer.py
Expand Up @@ -1437,7 +1437,8 @@ def imageCheck(self, name, reference_image, image):
def checkRender(self, format, name, part=None, angle=0, alignment=QgsTextRenderer.AlignLeft,
text=['test'],
rect=QRectF(100, 100, 50, 250),
vAlignment=QgsTextRenderer.AlignTop):
vAlignment=QgsTextRenderer.AlignTop,
flags=Qgis.TextRendererFlags()):

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

Expand Down Expand Up @@ -1473,7 +1474,7 @@ def checkRender(self, format, name, part=None, angle=0, alignment=QgsTextRendere
alignment,
text,
context,
format, vAlignment=vAlignment)
format, vAlignment=vAlignment, flags=flags)

painter.setFont(format.scaledFont(context))
painter.setPen(QPen(QColor(255, 0, 255, 200)))
Expand Down Expand Up @@ -2741,6 +2742,84 @@ def testDrawTextRectJustifyAlign(self):
assert self.checkRender(format, 'text_rect_justify_aligned', text=['test'],
alignment=QgsTextRenderer.AlignJustify, rect=QRectF(100, 100, 200, 100))

def testDrawTextRectMultilineJustifyAlign(self):
format = QgsTextFormat()
format.setFont(getTestFont('bold'))
format.setSize(30)
format.setSizeUnit(QgsUnitTypes.RenderPoints)
format.buffer().setEnabled(True)
format.buffer().setSize(4)
format.buffer().setSizeUnit(QgsUnitTypes.RenderMillimeters)
assert self.checkRender(format, 'text_rect_multiline_justify_aligned',
text=['a t est', 'off', 'justification', 'align'],
alignment=QgsTextRenderer.AlignJustify, rect=QRectF(100, 100, 200, 100))

def testDrawTextRectWordWrapSingleLine(self):
format = QgsTextFormat()
format.setFont(getTestFont('bold'))
format.setSize(30)
format.setSizeUnit(QgsUnitTypes.RenderPoints)
painter = QPainter()
ms = QgsMapSettings()
ms.setExtent(QgsRectangle(0, 0, 50, 50))
context = QgsRenderContext.fromMapSettings(ms)
context.setPainter(painter)
context.setScaleFactor(96 / 25.4) # 96 DPI
context.setFlag(QgsRenderContext.ApplyScalingWorkaroundForTextRendering, True)

self.assertTrue(QgsTextRenderer.textRequiresWrapping(context, 'a test of word wrap', 100, format))
self.assertTrue(QgsTextRenderer.textRequiresWrapping(context, 'a test of word wrap', 200, format))
self.assertTrue(QgsTextRenderer.textRequiresWrapping(context, 'a test of word wrap', 400, format))
self.assertFalse(QgsTextRenderer.textRequiresWrapping(context, 'a test of word wrap', 500, format))

self.assertEqual(QgsTextRenderer.wrappedText(context, 'a test of word wrap', 50, format), ['a', 'test', 'of', 'word', 'wrap'])
self.assertEqual(QgsTextRenderer.wrappedText(context, 'a test of word wrap', 200, format), ['a test of', 'word', 'wrap'])
self.assertEqual(QgsTextRenderer.wrappedText(context, 'a test of word wrap', 400, format), ['a test of word', 'wrap'])
self.assertEqual(QgsTextRenderer.wrappedText(context, 'a test of word wrap', 500, format),
['a test of word wrap'])

# text height should account for wrapping
self.assertGreater(QgsTextRenderer.textHeight(
context, format, ['a test of word wrap'],
mode=QgsTextRenderer.Rect, flags=Qgis.TextRendererFlag.WrapLines, maxLineWidth=200),
QgsTextRenderer.textHeight(context, format, ['a test of word wrap'], mode=QgsTextRenderer.Rect) * 2.75)

assert self.checkRender(format, 'text_rect_word_wrap_single_line', text=['a test of word wrap'],
alignment=QgsTextRenderer.AlignLeft, rect=QRectF(100, 100, 200, 100),
flags=Qgis.TextRendererFlag.WrapLines)

def testDrawTextRectWordWrapMultiLine(self):
format = QgsTextFormat()
format.setFont(getTestFont('bold'))
format.setSize(30)
format.setSizeUnit(QgsUnitTypes.RenderPoints)
painter = QPainter()
ms = QgsMapSettings()
ms.setExtent(QgsRectangle(0, 0, 50, 50))
context = QgsRenderContext.fromMapSettings(ms)
context.setPainter(painter)
context.setScaleFactor(96 / 25.4) # 96 DPI
context.setFlag(QgsRenderContext.ApplyScalingWorkaroundForTextRendering, True)

# text height should account for wrapping
self.assertGreater(QgsTextRenderer.textHeight(
context, format, ['a test of word wrap', 'with bit more'],
mode=QgsTextRenderer.Rect, flags=Qgis.TextRendererFlag.WrapLines, maxLineWidth=200),
QgsTextRenderer.textHeight(context, format, ['a test of word wrap with with bit more'], mode=QgsTextRenderer.Rect) * 4.75)

assert self.checkRender(format, 'text_rect_word_wrap_multi_line', text=['a test of word wrap', 'with bit more'],
alignment=QgsTextRenderer.AlignLeft, rect=QRectF(100, 100, 200, 100),
flags=Qgis.TextRendererFlag.WrapLines)

def testDrawTextRectWordWrapWithJustify(self):
format = QgsTextFormat()
format.setFont(getTestFont('bold'))
format.setSize(30)
format.setSizeUnit(QgsUnitTypes.RenderPoints)
assert self.checkRender(format, 'text_rect_word_wrap_justify', text=['a test of word wrap'],
alignment=QgsTextRenderer.AlignJustify, rect=QRectF(100, 100, 200, 100),
flags=Qgis.TextRendererFlag.WrapLines)

def testDrawTextRectMultilineBottomAlign(self):
format = QgsTextFormat()
format.setFont(getTestFont('bold'))
Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
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 09b4fb4

Please sign in to comment.