QGIS API Documentation 3.99.0-Master (26c88405ac0)
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:
44
51 static Qgis::TextHorizontalAlignment convertQtHAlignment( Qt::Alignment alignment );
52
59 static Qgis::TextVerticalAlignment convertQtVAlignment( Qt::Alignment alignment );
60
69 static int sizeToPixel( double size, const QgsRenderContext &c, Qgis::RenderUnit unit, const QgsMapUnitScale &mapUnitScale = QgsMapUnitScale() );
70
71 // TODO QGIS 4.0 -- remove drawAsOutlines from below methods!
72
91 static void drawText( const QRectF &rect, double rotation, Qgis::TextHorizontalAlignment alignment, const QStringList &textLines,
92 QgsRenderContext &context, const QgsTextFormat &format,
93 bool drawAsOutlines = true, Qgis::TextVerticalAlignment vAlignment = Qgis::TextVerticalAlignment::Top,
96
119 static void drawDocument( const QRectF &rect,
120 const QgsTextFormat &format,
121 const QgsTextDocument &document,
122 const QgsTextDocumentMetrics &metrics,
123 QgsRenderContext &context,
126 double rotation = 0,
129
143 static void drawText( QPointF point, double rotation, Qgis::TextHorizontalAlignment alignment, const QStringList &textLines,
144 QgsRenderContext &context, const QgsTextFormat &format,
145 bool drawAsOutlines = true );
146
167 static void drawDocument( QPointF point,
168 const QgsTextFormat &format,
169 const QgsTextDocument &document,
170 const QgsTextDocumentMetrics &metrics,
171 QgsRenderContext &context,
173 double rotation,
175
189 static void drawTextOnLine( const QPolygonF &line, const QString &text,
190 QgsRenderContext &context, const QgsTextFormat &format,
191 double offsetAlongLine = 0, double offsetFromLine = 0,
193
207 static void drawDocumentOnLine( const QPolygonF &line,
208 const QgsTextFormat &format,
209 const QgsTextDocument &document,
210 QgsRenderContext &context,
211 double offsetAlongLine = 0,
212 double offsetFromLine = 0,
214
233 Q_DECL_DEPRECATED static void drawPart( const QRectF &rect, double rotation, Qgis::TextHorizontalAlignment alignment, const QStringList &textLines,
234 QgsRenderContext &context, const QgsTextFormat &format,
235 Qgis::TextComponent part, bool drawAsOutlines = true ) SIP_DEPRECATED;
236
255 Q_DECL_DEPRECATED static void drawPart( QPointF origin, double rotation, Qgis::TextHorizontalAlignment alignment, const QStringList &textLines,
256 QgsRenderContext &context, const QgsTextFormat &format,
257 Qgis::TextComponent part, bool drawAsOutlines = true ) SIP_DEPRECATED;
258
271 static QFontMetricsF fontMetrics( QgsRenderContext &context, const QgsTextFormat &format, double scaleFactor = 1.0 );
272
280 static double textWidth( const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines,
281 QFontMetricsF *fontMetrics = nullptr );
282
293 static double textHeight( const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, Qgis::TextLayoutMode mode = Qgis::TextLayoutMode::Point,
294 QFontMetricsF *fontMetrics = nullptr, Qgis::TextRendererFlags flags = Qgis::TextRendererFlags(), double maxLineWidth = 0 );
295
307 static double textHeight( const QgsRenderContext &context, const QgsTextFormat &format, QChar character, bool includeEffects = false );
308
315 static bool textRequiresWrapping( const QgsRenderContext &context, const QString &text, double width, const QgsTextFormat &format );
316
323 static QStringList wrappedText( const QgsRenderContext &context, const QString &text, double width, const QgsTextFormat &format );
324
335 static constexpr double FONT_WORKAROUND_SCALE = 10;
336
345 static double calculateScaleFactorForFormat( const QgsRenderContext &context, const QgsTextFormat &format );
346
347 // to match QTextEngine handling of superscript/subscript font sizes
348
354 static constexpr double SUPERSCRIPT_SUBSCRIPT_FONT_SIZE_SCALING_FACTOR = 2.0 / 3.0;
355
356 private:
357
358 struct Component
359 {
361 QgsTextBlock block;
362
364 int blockIndex = 0;
365
367 int firstFragmentIndex = 0;
368
370 QPointF origin;
372 bool useOrigin = false;
374 double rotation = 0.0;
376 double rotationOffset = 0.0;
378 QPointF center;
380 QSizeF size;
382 QPointF offset;
384 QPicture picture;
385
390 double pictureBuffer = 0.0;
392 double dpiRatio = 1.0;
395
397 double extraWordSpacing = 0;
399 double extraLetterSpacing = 0;
400 };
401
402 static double textWidth( const QgsRenderContext &context, const QgsTextFormat &format, const QgsTextDocument &document );
403 static double textHeight( const QgsRenderContext &context, const QgsTextFormat &format, const QgsTextDocument &document, Qgis::TextLayoutMode mode = Qgis::TextLayoutMode::Point );
404
422 static void drawParts( const QRectF &rect, double rotation, Qgis::TextHorizontalAlignment alignment, Qgis::TextVerticalAlignment vAlignment, const QgsTextDocument &document, const QgsTextDocumentMetrics &metrics,
423 QgsRenderContext &context, const QgsTextFormat &format,
425
442 static void drawParts( QPointF origin, double rotation, Qgis::TextHorizontalAlignment alignment, const QgsTextDocument &document,
443 const QgsTextDocumentMetrics &metrics,
444 QgsRenderContext &context, const QgsTextFormat &format,
447
448 static double drawBuffer( QgsRenderContext &context,
449 const Component &component,
450 const QgsTextFormat &format,
451 const QgsTextDocumentMetrics &metrics,
453
454 static void drawBackground( QgsRenderContext &context,
455 const Component &component,
456 const QgsTextFormat &format,
457 const QgsTextDocumentMetrics &metrics,
459
460 static void drawShadow( QgsRenderContext &context,
461 const Component &component,
462 const QgsTextFormat &format );
463
464 static void drawMask( QgsRenderContext &context,
465 const Component &component,
466 const QgsTextFormat &format,
467 const QgsTextDocumentMetrics &metrics,
469
470 static void drawText( QgsRenderContext &context,
471 const Component &component,
472 const QgsTextFormat &format );
473
474 static void drawTextInternal( Qgis::TextComponents components,
475 QgsRenderContext &context,
476 const QgsTextFormat &format,
477 const Component &component,
478 const QgsTextDocument &document,
479 const QgsTextDocumentMetrics &metrics,
483
484 static Qgis::TextOrientation calculateRotationAndOrientationForComponent( const QgsTextFormat &format, const Component &component, double &rotation );
485
486 static void calculateExtraSpacingForLineJustification( double spaceToDistribute, const QgsTextBlock &block, double &extraWordSpace, double &extraLetterSpace );
487 static void applyExtraSpacingForLineJustification( QFont &font, double extraWordSpace, double extraLetterSpace );
488
489 static void drawTextInternalHorizontal( QgsRenderContext &context,
490 const QgsTextFormat &format,
491 Qgis::TextComponents components,
493 const Component &component,
494 const QgsTextDocument &document,
495 const QgsTextDocumentMetrics &metrics,
496 double fontScale,
499 double rotation );
500
501 static void drawTextInternalVertical( QgsRenderContext &context,
502 const QgsTextFormat &format,
503 Qgis::TextComponents components,
505 const Component &component,
506 const QgsTextDocument &document,
507 const QgsTextDocumentMetrics &metrics,
508 double fontScale,
511 double rotation );
512
513 struct DeferredRenderFragment
514 {
515 // mandatory
516 QColor color;
517 QPointF point;
518 // optional
519 QPainterPath path;
520 // optional
521 QFont font;
522 QString text;
523 };
524
525 struct BlockMetrics
526 {
527 double xOffset = 0;
528 double backgroundXOffset = 0;
529 double width = 0;
530 double backgroundWidth = 0;
531 double extraWordSpace = 0;
532 double extraLetterSpace = 0;
533 };
534
535 static QVector< QgsTextRenderer::BlockMetrics > calculateBlockMetrics( const QgsTextDocument &document, const QgsTextDocumentMetrics &metrics, Qgis::TextLayoutMode mode, double targetWidth, const Qgis::TextHorizontalAlignment hAlignment );
536
537 struct DeferredRenderBlock
538 {
539 QPointF origin;
540 Component component;
541 QVector< DeferredRenderFragment > fragments;
542 };
543
544 static QBrush createBrushForPath( QgsRenderContext &context, const QString &path );
545
546 static void renderBlockHorizontal( const QgsTextBlock &block, int blockIndex,
547 const QgsTextDocumentMetrics &metrics, QgsRenderContext &context,
548 const QgsTextFormat &format,
549 QPainter *painter, bool forceRenderAsPaths,
550 double fontScale, double extraWordSpace, double extraLetterSpace,
552 DeferredRenderBlock *deferredRenderBlock );
553 static void renderDocumentBackgrounds( QgsRenderContext &context, const QgsTextDocument &document, const QgsTextDocumentMetrics &metrics, const Component &component, const QVector< QgsTextRenderer::BlockMetrics > &blockMetrics, Qgis::TextLayoutMode mode, double verticalAlignOffset, double rotation );
554 static void renderDeferredBlocks( QgsRenderContext &context, const QgsTextFormat &format, Qgis::TextComponents components, const std::vector<DeferredRenderBlock> &deferredBlocks, bool usePathsForText, double fontScale, const Component &component, double rotation );
555 static void renderDeferredBuffer( QgsRenderContext &context, const QgsTextFormat &format, Qgis::TextComponents components, const std::vector<DeferredRenderBlock> &deferredBlocks, double fontScale, const Component &component, double rotation );
556 static void renderDeferredShadowForText( QgsRenderContext &context, const QgsTextFormat &format, const std::vector<DeferredRenderBlock> &deferredBlocks, double fontScale, const Component &component, double rotation );
557 static void renderDeferredText( QgsRenderContext &context, const std::vector<DeferredRenderBlock> &deferredBlocks, bool usePathsForText, double fontScale, const Component &component, double rotation );
558
560 friend class QgsLabelPreview;
561
562 static QgsTextFormat updateShadowPosition( const QgsTextFormat &format );
563
567 static bool usePathsToRender( const QgsRenderContext &context, const QgsTextFormat &format, const QgsTextDocument &document );
568
572 static bool usePictureToRender( const QgsRenderContext &context, const QgsTextFormat &format, const QgsTextDocument &document );
573
574};
575
576#endif // QGSTEXTRENDERER_H
TextLayoutMode
Text layout modes.
Definition qgis.h:2901
@ Point
Text at point of origin layout mode.
Definition qgis.h:2903
@ Rectangle
Text within rectangle layout mode.
Definition qgis.h:2902
QFlags< TextRendererFlag > TextRendererFlags
Definition qgis.h:3411
TextOrientation
Text orientations.
Definition qgis.h:2886
RenderUnit
Rendering size units.
Definition qgis.h:5183
TextVerticalAlignment
Text vertical alignment.
Definition qgis.h:2961
@ Top
Align to top.
Definition qgis.h:2962
@ TruncateStringWhenLineIsTooShort
When a string is too long for the line, truncate characters instead of aborting the placement.
Definition qgis.h:2991
@ UseBaselinePlacement
Generate placement based on the character baselines instead of centers.
Definition qgis.h:2992
QFlags< TextComponent > TextComponents
Text components.
Definition qgis.h:2931
TextHorizontalAlignment
Text horizontal alignment.
Definition qgis.h:2942
QFlags< CurvedTextFlag > CurvedTextFlags
Flags controlling behavior of curved text generation.
Definition qgis.h:3003
TextComponent
Text components.
Definition qgis.h:2918
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:114