QGIS API Documentation 4.1.0-Master (60fea48833c)
Loading...
Searching...
No Matches
qgstextrenderer.h
Go to the documentation of this file.
1/***************************************************************************
2 qgstextrenderer.h
3 -----------------
4 begin : September 2015
5 copyright : (C) Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#ifndef QGSTEXTRENDERER_H
17#define QGSTEXTRENDERER_H
18
19#include "qgis.h"
20#include "qgis_core.h"
21#include "qgis_sip.h"
22#include "qgsmapunitscale.h"
23#include "qgstextblock.h"
24
25#include <QPainterPath>
26#include <QPicture>
27
28class QgsTextDocument;
30class QgsTextFormat;
32
33class QFontMetricsF;
34
41class CORE_EXPORT QgsTextRenderer
42{
43 public:
50 static Qgis::TextHorizontalAlignment convertQtHAlignment( Qt::Alignment alignment );
51
58 static Qgis::TextVerticalAlignment convertQtVAlignment( Qt::Alignment alignment );
59
68 static int sizeToPixel( double size, const QgsRenderContext &c, Qgis::RenderUnit unit, const QgsMapUnitScale &mapUnitScale = QgsMapUnitScale() );
69
70 // TODO QGIS 5.0 -- remove drawAsOutlines from below methods!
71
90 static void drawText(
91 const QRectF &rect,
92 double rotation,
94 const QStringList &textLines,
95 QgsRenderContext &context,
96 const QgsTextFormat &format,
97 bool drawAsOutlines = true,
101 );
102
125 static void drawDocument(
126 const QRectF &rect,
127 const QgsTextFormat &format,
128 const QgsTextDocument &document,
129 const QgsTextDocumentMetrics &metrics,
130 QgsRenderContext &context,
133 double rotation = 0,
136 );
137
151 static void drawText(
152 QPointF point, double rotation, Qgis::TextHorizontalAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, bool drawAsOutlines = true
153 );
154
175 static void drawDocument(
176 QPointF point,
177 const QgsTextFormat &format,
178 const QgsTextDocument &document,
179 const QgsTextDocumentMetrics &metrics,
180 QgsRenderContext &context,
182 double rotation,
184 );
185
199 static void drawTextOnLine(
200 const QPolygonF &line,
201 const QString &text,
202 QgsRenderContext &context,
203 const QgsTextFormat &format,
204 double offsetAlongLine = 0,
205 double offsetFromLine = 0,
207 );
208
222 static void drawDocumentOnLine(
223 const QPolygonF &line,
224 const QgsTextFormat &format,
225 const QgsTextDocument &document,
226 QgsRenderContext &context,
227 double offsetAlongLine = 0,
228 double offsetFromLine = 0,
230 );
231
250 Q_DECL_DEPRECATED static void drawPart(
251 const QRectF &rect,
252 double rotation,
254 const QStringList &textLines,
255 QgsRenderContext &context,
256 const QgsTextFormat &format,
258 bool drawAsOutlines = true
260
279 Q_DECL_DEPRECATED static void drawPart(
280 QPointF origin,
281 double rotation,
283 const QStringList &textLines,
284 QgsRenderContext &context,
285 const QgsTextFormat &format,
287 bool drawAsOutlines = true
289
302 static QFontMetricsF fontMetrics( QgsRenderContext &context, const QgsTextFormat &format, double scaleFactor = 1.0 );
303
311 static double textWidth( const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, QFontMetricsF *fontMetrics = nullptr );
312
323 static double textHeight(
324 const QgsRenderContext &context,
325 const QgsTextFormat &format,
326 const QStringList &textLines,
328 QFontMetricsF *fontMetrics = nullptr,
330 double maxLineWidth = 0
331 );
332
344 static double textHeight( const QgsRenderContext &context, const QgsTextFormat &format, QChar character, bool includeEffects = false );
345
352 static bool textRequiresWrapping( const QgsRenderContext &context, const QString &text, double width, const QgsTextFormat &format );
353
360 static QStringList wrappedText( const QgsRenderContext &context, const QString &text, double width, const QgsTextFormat &format );
361
372 static constexpr double FONT_WORKAROUND_SCALE = 10;
373
382 static double calculateScaleFactorForFormat( const QgsRenderContext &context, const QgsTextFormat &format );
383
384 // to match QTextEngine handling of superscript/subscript font sizes
385
391 static constexpr double SUPERSCRIPT_SUBSCRIPT_FONT_SIZE_SCALING_FACTOR = 2.0 / 3.0;
392
393 private:
394 struct Component
395 {
397 QgsTextBlock block;
398
400 int blockIndex = 0;
401
403 int firstFragmentIndex = 0;
404
406 QPointF origin;
408 bool useOrigin = false;
410 double rotation = 0.0;
412 double rotationOffset = 0.0;
414 QPointF center;
416 QSizeF size;
418 QPointF offset;
420 QPicture picture;
421
426 double pictureBuffer = 0.0;
428 double dpiRatio = 1.0;
431
433 double extraWordSpacing = 0;
435 double extraLetterSpacing = 0;
436 };
437
438 static double textWidth( const QgsRenderContext &context, const QgsTextFormat &format, const QgsTextDocument &document );
439 static double textHeight( const QgsRenderContext &context, const QgsTextFormat &format, const QgsTextDocument &document, Qgis::TextLayoutMode mode = Qgis::TextLayoutMode::Point );
440
458 static void drawParts(
459 const QRectF &rect,
460 double rotation,
463 const QgsTextDocument &document,
464 const QgsTextDocumentMetrics &metrics,
465 QgsRenderContext &context,
466 const QgsTextFormat &format,
469 );
470
487 static void drawParts(
488 QPointF origin,
489 double rotation,
491 const QgsTextDocument &document,
492 const QgsTextDocumentMetrics &metrics,
493 QgsRenderContext &context,
494 const QgsTextFormat &format,
497 );
498
499 static double drawBuffer( QgsRenderContext &context, const Component &component, const QgsTextFormat &format, const QgsTextDocumentMetrics &metrics, Qgis::TextLayoutMode mode );
500
501 static void drawBackground(
502 QgsRenderContext &context, const Component &component, const QgsTextFormat &format, const QgsTextDocumentMetrics &metrics, Qgis::TextLayoutMode mode = Qgis::TextLayoutMode::Rectangle
503 );
504
505 static void drawShadow( QgsRenderContext &context, const Component &component, const QgsTextFormat &format );
506
507 static void drawMask( QgsRenderContext &context, const Component &component, const QgsTextFormat &format, const QgsTextDocumentMetrics &metrics, Qgis::TextLayoutMode mode );
508
509 static void drawText( QgsRenderContext &context, const Component &component, const QgsTextFormat &format );
510
511 static void drawTextInternal(
512 Qgis::TextComponents components,
513 QgsRenderContext &context,
514 const QgsTextFormat &format,
515 const Component &component,
516 const QgsTextDocument &document,
517 const QgsTextDocumentMetrics &metrics,
521 );
522
523 static Qgis::TextOrientation calculateRotationAndOrientationForComponent( const QgsTextFormat &format, const Component &component, double &rotation );
524
525 static void calculateExtraSpacingForLineJustification( double spaceToDistribute, const QgsTextBlock &block, double &extraWordSpace, double &extraLetterSpace );
526 static void applyExtraSpacingForLineJustification( QFont &font, double extraWordSpace, double extraLetterSpace );
527
528 static void drawTextInternalHorizontal(
529 QgsRenderContext &context,
530 const QgsTextFormat &format,
531 Qgis::TextComponents components,
533 const Component &component,
534 const QgsTextDocument &document,
535 const QgsTextDocumentMetrics &metrics,
536 double fontScale,
539 double rotation
540 );
541
542 static void drawTextInternalVertical(
543 QgsRenderContext &context,
544 const QgsTextFormat &format,
545 Qgis::TextComponents components,
547 const Component &component,
548 const QgsTextDocument &document,
549 const QgsTextDocumentMetrics &metrics,
550 double fontScale,
553 double rotation
554 );
555
556 struct DeferredRenderFragment
557 {
558 // mandatory
559 QColor color;
560 QPointF point;
561 // optional
562 QPainterPath path;
563 // optional
564 QFont font;
565 QString text;
566 };
567
568 struct BlockMetrics
569 {
570 double xOffset = 0;
571 double backgroundXOffset = 0;
572 double width = 0;
573 double backgroundWidth = 0;
574 double extraWordSpace = 0;
575 double extraLetterSpace = 0;
576 };
577
578 static QVector< QgsTextRenderer::BlockMetrics > calculateBlockMetrics(
579 const QgsTextDocument &document, const QgsTextDocumentMetrics &metrics, Qgis::TextLayoutMode mode, double targetWidth, const Qgis::TextHorizontalAlignment hAlignment
580 );
581
582 struct DeferredRenderBlock
583 {
584 QPointF origin;
585 Component component;
586 QVector< DeferredRenderFragment > fragments;
587 };
588
589 static QBrush createBrushForPath( QgsRenderContext &context, const QString &path );
590
591 static void renderBlockHorizontal(
592 const QgsTextBlock &block,
593 int blockIndex,
594 const QgsTextDocumentMetrics &metrics,
595 QgsRenderContext &context,
596 const QgsTextFormat &format,
597 QPainter *painter,
598 bool forceRenderAsPaths,
599 double fontScale,
600 double extraWordSpace,
601 double extraLetterSpace,
603 DeferredRenderBlock *deferredRenderBlock
604 );
605 static void renderDocumentBackgrounds(
606 QgsRenderContext &context,
607 const QgsTextDocument &document,
608 const QgsTextDocumentMetrics &metrics,
609 const Component &component,
610 const QVector< QgsTextRenderer::BlockMetrics > &blockMetrics,
612 double verticalAlignOffset,
613 double rotation
614 );
615 static void renderDeferredBlocks(
616 QgsRenderContext &context,
617 const QgsTextFormat &format,
618 Qgis::TextComponents components,
619 const std::vector<DeferredRenderBlock> &deferredBlocks,
620 bool usePathsForText,
621 double fontScale,
622 const Component &component,
623 double rotation
624 );
625 static void renderDeferredBuffer(
626 QgsRenderContext &context, const QgsTextFormat &format, Qgis::TextComponents components, const std::vector<DeferredRenderBlock> &deferredBlocks, double fontScale, const Component &component, double rotation
627 );
628 static void renderDeferredShadowForText(
629 QgsRenderContext &context, const QgsTextFormat &format, const std::vector<DeferredRenderBlock> &deferredBlocks, double fontScale, const Component &component, double rotation
630 );
631 static void renderDeferredText( QgsRenderContext &context, const std::vector<DeferredRenderBlock> &deferredBlocks, bool usePathsForText, double fontScale, const Component &component, double rotation );
632
634 friend class QgsLabelPreview;
635
636 static QgsTextFormat updateShadowPosition( const QgsTextFormat &format );
637
641 static bool usePathsToRender( const QgsRenderContext &context, const QgsTextFormat &format, const QgsTextDocument &document );
642
646 static bool usePictureToRender( const QgsRenderContext &context, const QgsTextFormat &format, const QgsTextDocument &document );
647};
648
649#endif // QGSTEXTRENDERER_H
TextLayoutMode
Text layout modes.
Definition qgis.h:3002
@ Point
Text at point of origin layout mode.
Definition qgis.h:3004
@ Rectangle
Text within rectangle layout mode.
Definition qgis.h:3003
QFlags< TextRendererFlag > TextRendererFlags
Definition qgis.h:3525
TextOrientation
Text orientations.
Definition qgis.h:2987
RenderUnit
Rendering size units.
Definition qgis.h:5340
TextVerticalAlignment
Text vertical alignment.
Definition qgis.h:3062
@ Top
Align to top.
Definition qgis.h:3063
@ TruncateStringWhenLineIsTooShort
When a string is too long for the line, truncate characters instead of aborting the placement.
Definition qgis.h:3092
@ UseBaselinePlacement
Generate placement based on the character baselines instead of centers.
Definition qgis.h:3093
QFlags< TextComponent > TextComponents
Text components.
Definition qgis.h:3032
TextHorizontalAlignment
Text horizontal alignment.
Definition qgis.h:3043
QFlags< CurvedTextFlag > CurvedTextFlags
Flags controlling behavior of curved text generation.
Definition qgis.h:3104
TextComponent
Text components.
Definition qgis.h:3019
Struct for storing maximum and minimum scales for measurements in map units.
Contains information about the context of a rendering operation.
Represents a block of text consisting of one or more QgsTextFragment objects.
Contains pre-calculated metrics of a QgsTextDocument.
Represents a document consisting of one or more QgsTextBlock objects.
Container for all settings relating to text rendering.
Handles rendering text using rich formatting options, including drop shadows, buffers and background ...
static Qgis::TextVerticalAlignment convertQtVAlignment(Qt::Alignment alignment)
Converts a Qt vertical alignment flag to a Qgis::TextVerticalAlignment value.
static double textWidth(const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, QFontMetricsF *fontMetrics=nullptr)
Returns the width of a text based on a given format.
static void drawDocument(const QRectF &rect, const QgsTextFormat &format, const QgsTextDocument &document, const QgsTextDocumentMetrics &metrics, QgsRenderContext &context, Qgis::TextHorizontalAlignment horizontalAlignment=Qgis::TextHorizontalAlignment::Left, Qgis::TextVerticalAlignment verticalAlignment=Qgis::TextVerticalAlignment::Top, double rotation=0, Qgis::TextLayoutMode mode=Qgis::TextLayoutMode::Rectangle, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags())
Draws a text document within a rectangle using the specified settings.
static int sizeToPixel(double size, const QgsRenderContext &c, Qgis::RenderUnit unit, const QgsMapUnitScale &mapUnitScale=QgsMapUnitScale())
Calculates pixel size (considering output size should be in pixel or map units, scale factors and opt...
static Q_DECL_DEPRECATED void drawPart(const QRectF &rect, double rotation, Qgis::TextHorizontalAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, Qgis::TextComponent part, bool drawAsOutlines=true)
Draws a single component of rendered text using the specified settings.
static void drawText(const QRectF &rect, double rotation, Qgis::TextHorizontalAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, bool drawAsOutlines=true, Qgis::TextVerticalAlignment vAlignment=Qgis::TextVerticalAlignment::Top, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags(), Qgis::TextLayoutMode mode=Qgis::TextLayoutMode::Rectangle)
Draws text within a rectangle using the specified settings.
static bool textRequiresWrapping(const QgsRenderContext &context, const QString &text, double width, const QgsTextFormat &format)
Returns true if the specified text requires line wrapping in order to fit within the specified width ...
static QFontMetricsF fontMetrics(QgsRenderContext &context, const QgsTextFormat &format, double scaleFactor=1.0)
Returns the font metrics for the given text format, when rendered in the specified render context.
static double calculateScaleFactorForFormat(const QgsRenderContext &context, const QgsTextFormat &format)
Returns the scale factor used for upscaling font sizes and downscaling destination painter devices.
static QStringList wrappedText(const QgsRenderContext &context, const QString &text, double width, const QgsTextFormat &format)
Wraps a text string to multiple lines, such that each individual line will fit within the specified w...
friend class QgsLabelPreview
friend class QgsVectorLayerLabelProvider
static double textHeight(const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, Qgis::TextLayoutMode mode=Qgis::TextLayoutMode::Point, QFontMetricsF *fontMetrics=nullptr, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags(), double maxLineWidth=0)
Returns the height of a text based on a given format.
static constexpr double SUPERSCRIPT_SUBSCRIPT_FONT_SIZE_SCALING_FACTOR
Scale factor to use for super or subscript text which doesn't have an explicit font size set.
static void drawDocumentOnLine(const QPolygonF &line, const QgsTextFormat &format, const QgsTextDocument &document, QgsRenderContext &context, double offsetAlongLine=0, double offsetFromLine=0, Qgis::CurvedTextFlags flags=Qgis::CurvedTextFlag::UseBaselinePlacement|Qgis::CurvedTextFlag::TruncateStringWhenLineIsTooShort)
Draws a text document along a line using the specified settings.
static void drawTextOnLine(const QPolygonF &line, const QString &text, QgsRenderContext &context, const QgsTextFormat &format, double offsetAlongLine=0, double offsetFromLine=0, Qgis::CurvedTextFlags flags=Qgis::CurvedTextFlag::UseBaselinePlacement|Qgis::CurvedTextFlag::TruncateStringWhenLineIsTooShort)
Draws text along a line using the specified settings.
static constexpr double FONT_WORKAROUND_SCALE
Scale factor for upscaling font sizes and downscaling destination painter devices.
static Qgis::TextHorizontalAlignment convertQtHAlignment(Qt::Alignment alignment)
Converts a Qt horizontal alignment flag to a Qgis::TextHorizontalAlignment value.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
#define SIP_DEPRECATED
Definition qgis_sip.h:113