Fix incorrect buffers drawn for html label items

When a layout item uses a html enabled text format and has buffers
enabled, the buffers would be incorrectly horizontally placed
This commit is contained in:
Nyall Dawson 2024-05-23 16:26:48 +10:00
parent b2a8801d76
commit f30ca52532
5 changed files with 63 additions and 3 deletions

View File

@ -616,7 +616,7 @@ double QgsTextRenderer::drawBuffer( QgsRenderContext &context, const QgsTextRend
const double yOffset = metrics.fragmentVerticalOffset( component.blockIndex, fragmentIndex, mode );
path.addText( xOffset, yOffset, fragmentFont, fragment.text() );
xOffset += metrics.fragmentHorizontalAdvance( component.blockIndex, fragmentIndex, mode );
xOffset += metrics.fragmentHorizontalAdvance( component.blockIndex, fragmentIndex, mode ) * scaleFactor;
fragmentIndex++;
}
@ -780,7 +780,7 @@ void QgsTextRenderer::drawMask( QgsRenderContext &context, const QgsTextRenderer
const double fragmentYOffset = metrics.fragmentVerticalOffset( component.blockIndex, fragmentIndex, mode );
path.addText( xOffset, fragmentYOffset, fragmentFont, fragment.text() );
xOffset += metrics.fragmentHorizontalAdvance( component.blockIndex, fragmentIndex, mode );
xOffset += metrics.fragmentHorizontalAdvance( component.blockIndex, fragmentIndex, mode ) * scaleFactor;
fragmentIndex++;
}

View File

@ -1563,7 +1563,9 @@ class PyQgsTextRenderer(QgisTestCase):
def checkRenderPoint(self, format, name, part=None, angle=0, alignment=QgsTextRenderer.HAlignment.AlignLeft,
text=['test'],
point=QPointF(100, 200),
image_size=400):
image_size=400,
enable_scale_workaround=False,
render_mask=False):
image = QImage(image_size, image_size, QImage.Format.Format_RGB32)
painter = QPainter()
@ -1573,6 +1575,10 @@ class PyQgsTextRenderer(QgisTestCase):
context = QgsRenderContext.fromMapSettings(ms)
context.setPainter(painter)
context.setScaleFactor(96 / 25.4) # 96 DPI
if render_mask:
context.setIsGuiPreview(True)
context.setFlag(QgsRenderContext.Flag.ApplyScalingWorkaroundForTextRendering, enable_scale_workaround)
painter.begin(image)
painter.setRenderHint(QPainter.RenderHint.Antialiasing)
@ -3372,6 +3378,9 @@ class PyQgsTextRenderer(QgisTestCase):
point=QPointF(50, 200))
def testHtmlFormattingBuffer(self):
"""
Test drawing HTML with buffer
"""
format = QgsTextFormat()
format.setFont(getTestFont('bold'))
format.setSize(60)
@ -3385,6 +3394,57 @@ class PyQgsTextRenderer(QgisTestCase):
'<s>t</s><span style="text-decoration: overline">e</span><span style="color: red">s<span style="text-decoration: underline">t</span></span>'],
point=QPointF(50, 200))
def testHtmlFormattingBufferScaleFactor(self):
"""
Test drawing HTML with scale factor workaround
"""
format = QgsTextFormat()
format.setFont(getTestFont('bold'))
# font sizes < 50 pixel trigger the scale factor workaround
format.setSize(49)
format.setSizeUnit(QgsUnitTypes.RenderUnit.RenderPixels)
format.setColor(QColor(0, 255, 0))
format.setAllowHtmlFormatting(True)
format.buffer().setEnabled(True)
format.buffer().setSize(5)
format.buffer().setColor(QColor(50, 150, 200))
assert self.checkRenderPoint(format, 'text_html_formatting_buffer_scale_workaround', None, text=[
't <span style="font-size:60pt">e</span> <span style="color: red">s</span>'],
point=QPointF(50, 200), enable_scale_workaround=True)
def testHtmlFormattingMask(self):
"""
Test drawing HTML with mask
"""
format = QgsTextFormat()
format.setFont(getTestFont('bold'))
format.setSize(60)
format.setSizeUnit(QgsUnitTypes.RenderUnit.RenderPoints)
format.setColor(QColor(0, 255, 0))
format.setAllowHtmlFormatting(True)
format.mask().setEnabled(True)
format.mask().setSize(5)
assert self.checkRenderPoint(format, 'text_html_formatting_mask', None, text=[
't <span style="font-size:60pt">e</span> <span style="color: red">s</span>'],
point=QPointF(50, 200), render_mask=True)
def testHtmlFormattingMaskScaleFactor(self):
"""
Test drawing HTML with mask with scale factor workaround
"""
format = QgsTextFormat()
format.setFont(getTestFont('bold'))
# font sizes < 50 pixel trigger the scale factor workaround
format.setSize(49)
format.setSizeUnit(QgsUnitTypes.RenderUnit.RenderPixels)
format.setColor(QColor(0, 255, 0))
format.setAllowHtmlFormatting(True)
format.mask().setEnabled(True)
format.mask().setSize(5)
assert self.checkRenderPoint(format, 'text_html_formatting_mask_scale_workaround', None, text=[
't <span style="font-size:60pt">e</span> <span style="color: red">s</span>'],
point=QPointF(50, 200), render_mask=True, enable_scale_workaround=True)
def testHtmlFormattingShadow(self):
format = QgsTextFormat()
format.setFont(getTestFont('bold'))

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB