mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-17 00:09:36 -04:00
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:
parent
b2a8801d76
commit
f30ca52532
@ -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++;
|
||||
}
|
||||
|
||||
|
@ -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: 6.9 KiB |
BIN
tests/testdata/control_images/text_renderer/text_html_formatting_mask/text_html_formatting_mask.png
vendored
Normal file
BIN
tests/testdata/control_images/text_renderer/text_html_formatting_mask/text_html_formatting_mask.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.9 KiB |
Binary file not shown.
After Width: | Height: | Size: 6.8 KiB |
Loading…
x
Reference in New Issue
Block a user