QGIS/src/core/qgstextrenderer.h
2017-12-12 21:14:58 +11:00

1460 lines
44 KiB
C++

/***************************************************************************
qgstextrenderer.h
-----------------
begin : September 2015
copyright : (C) Nyall Dawson
email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSTEXTRENDERER_H
#define QGSTEXTRENDERER_H
#include "qgis.h"
#include "qgis_core.h"
#include "qgsmapunitscale.h"
#include "qgsunittypes.h"
#include <QSharedData>
#include <QPainter>
#include <QPicture>
#include <QDomElement>
class QgsReadWriteContext;
class QgsTextBufferSettingsPrivate;
class QgsTextBackgroundSettingsPrivate;
class QgsTextShadowSettingsPrivate;
class QgsTextSettingsPrivate;
class QgsVectorLayer;
class QgsPaintEffect;
/**
* \class QgsTextBufferSettings
* \ingroup core
* Container for settings relating to a text buffer.
* \note QgsTextBufferSettings objects are implicitly shared.
* \since QGIS 3.0
*/
class CORE_EXPORT QgsTextBufferSettings
{
public:
QgsTextBufferSettings();
/**
* Copy constructor.
* \param other source settings
*/
QgsTextBufferSettings( const QgsTextBufferSettings &other );
/**
* Copy constructor.
* \param other source QgsTextBufferSettings
*/
QgsTextBufferSettings &operator=( const QgsTextBufferSettings &other );
~QgsTextBufferSettings();
/**
* Returns whether the buffer is enabled.
* \see setEnabled()
*/
bool enabled() const;
/**
* Sets whether the text buffer will be drawn.
* \param enabled set to true to draw buffer
* \see enabled()
*/
void setEnabled( bool enabled );
/**
* Returns the size of the buffer.
* \see sizeUnit()
* \see setSize()
*/
double size() const;
/**
* Sets the size of the buffer. The size units are specified using setSizeUnit().
* \param size buffer size
* \see size()
* \see setSizeUnit()
*/
void setSize( double size );
/**
* Returns the units for the buffer size.
* \see size()
* \see setSizeUnit()
*/
QgsUnitTypes::RenderUnit sizeUnit() const;
/**
* Sets the units used for the buffer size.
* \param unit size unit
* \see setSize()
* \see sizeUnit()
*/
void setSizeUnit( QgsUnitTypes::RenderUnit unit );
/**
* Returns the map unit scale object for the buffer size. This is only used if the
* buffer size is set to QgsUnitTypes::RenderMapUnit.
* \see setSizeMapUnitScale()
* \see sizeUnit()
*/
QgsMapUnitScale sizeMapUnitScale() const;
/**
* Sets the map unit scale object for the buffer size. This is only used if the
* buffer size is set to QgsUnitTypes::RenderMapUnit.
* \param scale scale for buffer size
* \see sizeMapUnitScale()
* \see setSizeUnit()
*/
void setSizeMapUnitScale( const QgsMapUnitScale &scale );
/**
* Returns the color of the buffer.
* \see setColor()
*/
QColor color() const;
/**
* Sets the color for the buffer.
* \param color buffer color
* \see color()
*/
void setColor( const QColor &color );
/**
* Returns whether the interior of the buffer will be filled in. If false, only the stroke
* of the text will be drawn as the buffer. The effect of this setting is only visible for
* semi-transparent text.
* \see setFillBufferInterior()
*/
bool fillBufferInterior() const;
/**
* Sets whether the interior of the buffer will be filled in.
* \param fill set to false to drawn only the stroke of the text as the buffer, or true to also
* shade the area inside the text. The effect of this setting is only visible for semi-transparent text.
* \see fillBufferInterior()
*/
void setFillBufferInterior( bool fill );
/**
* Returns the buffer opacity. The opacity is a double value between 0 (fully transparent) and 1 (totally
* opaque).
* \see setOpacity()
*/
double opacity() const;
/**
* Sets the buffer opacity.
* \param opacity opacity as a double value between 0 (fully transparent) and 1 (totally
* opaque)
* \see opacity()
*/
void setOpacity( double opacity );
/**
* Returns the buffer join style.
* \see setJoinStyle
*/
Qt::PenJoinStyle joinStyle() const;
/**
* Sets the join style used for drawing the buffer.
* \param style join style
* \see joinStyle()
*/
void setJoinStyle( Qt::PenJoinStyle style );
/**
* Returns the blending mode used for drawing the buffer.
* \see setBlendMode()
*/
QPainter::CompositionMode blendMode() const;
/**
* Sets the blending mode used for drawing the buffer.
* \param mode blending mode
* \see blendMode()
*/
void setBlendMode( QPainter::CompositionMode mode );
/**
* Reads settings from a layer's custom properties (for QGIS 2.x projects).
* \param layer source vector layer
*/
void readFromLayer( QgsVectorLayer *layer );
/**
* Read settings from a DOM element.
* \see writeXml()
*/
void readXml( const QDomElement &elem );
/**
* Write settings into a DOM element.
* \see readXml()
*/
QDomElement writeXml( QDomDocument &doc ) const;
/**
* Returns the current paint effect for the buffer.
* \returns paint effect
* \see setPaintEffect()
*/
QgsPaintEffect *paintEffect() const;
/**
* Sets the current paint \a effect for the buffer.
* \param effect paint effect. Ownership is transferred to the buffer settings.
* \see paintEffect()
*/
void setPaintEffect( QgsPaintEffect *effect SIP_TRANSFER );
private:
QSharedDataPointer<QgsTextBufferSettingsPrivate> d;
};
/**
* \class QgsTextBackgroundSettings
* \ingroup core
* Container for settings relating to a text background object.
* \note QgsTextBackgroundSettings objects are implicitly shared.
* \since QGIS 3.0
*/
class CORE_EXPORT QgsTextBackgroundSettings
{
public:
/**
* Background shape types.
*/
enum ShapeType
{
ShapeRectangle = 0, //!< Rectangle
ShapeSquare, //!< Square - buffered sizes only
ShapeEllipse, //!< Ellipse
ShapeCircle, //!< Circle
ShapeSVG //!< SVG file
};
/**
* Methods for determining the background shape size.
*/
enum SizeType
{
SizeBuffer = 0, //!< Shape size is determined by adding a buffer margin around text
SizeFixed, //!< Fixed size
SizePercent //!< Shape size is determined by percent of text size
};
/**
* Methods for determining the rotation of the background shape.
*/
enum RotationType
{
RotationSync = 0, //!< Shape rotation is synced with text rotation
RotationOffset, //!< Shape rotation is offset from text rotation
RotationFixed //!< Shape rotation is a fixed angle
};
QgsTextBackgroundSettings();
/**
* Copy constructor.
* \param other source QgsTextBackgroundSettings
*/
QgsTextBackgroundSettings( const QgsTextBackgroundSettings &other );
QgsTextBackgroundSettings &operator=( const QgsTextBackgroundSettings &other );
~QgsTextBackgroundSettings();
/**
* Returns whether the background is enabled.
* \see setEnabled()
*/
bool enabled() const;
/**
* Sets whether the text background will be drawn.
* \param enabled set to true to draw background
* \see enabled()
*/
void setEnabled( bool enabled );
/**
* Returns the type of background shape (e.g., square, ellipse, SVG).
* \see setType()
*/
ShapeType type() const;
/**
* Sets the type of background shape to draw (e.g., square, ellipse, SVG).
* \param type shape type
* \see type()
*/
void setType( ShapeType type );
/**
* Returns the absolute path to the background SVG file, if set.
* \see setSvgFile()
*/
QString svgFile() const;
/**
* Sets the path to the background SVG file. This is only used if type() is set to
* QgsTextBackgroundSettings::ShapeSVG. The path must be absolute.
* \param file Absolute SVG file path
* \see svgFile()
*/
void setSvgFile( const QString &file );
/**
* Returns the method used to determine the size of the background shape (e.g., fixed size or buffer
* around text).
* \see setSizeType()
* \see size()
*/
SizeType sizeType() const;
/**
* Sets the method used to determine the size of the background shape (e.g., fixed size or buffer
* around text).
* \param type size method
* \see sizeType()
* \see setSize()
*/
void setSizeType( SizeType type );
/**
* Returns the size of the background shape. The meaning of the size depends on the current sizeType(),
* e.g., for size types of QgsTextBackgroundSettings::SizeFixed the size will represent the actual width and
* height of the shape, for QgsTextBackgroundSettings::SizeBuffer the size will represent the horizontal
* and vertical margins to add to the text when calculating the size of the shape.
* \see setSize()
* \see sizeType()
*/
QSizeF size() const;
/**
* Sets the size of the background shape. The meaning of the size depends on the current sizeType(),
* e.g., for size types of QgsTextBackgroundSettings::SizeFixed the size will represent the actual width and
* height of the shape, for QgsTextBackgroundSettings::SizeBuffer the size will represent the horizontal
* and vertical margins to add to the text when calculating the size of the shape.
* \param size QSizeF representing horizontal and vertical size components for shape
* \see size()
* \see setSizeType()
*/
void setSize( const QSizeF &size );
/**
* Returns the units used for the shape's size. This value has no meaning if the sizeType() is set to
* QgsTextBackgroundSettings::SizePercent.
* \see setSizeUnit()
* \see sizeType()
* \see size()
*/
QgsUnitTypes::RenderUnit sizeUnit() const;
/**
* Sets the units used for the shape's size. This value has no meaning if the sizeType() is set to
* QgsTextBackgroundSettings::SizePercent.
* \param unit size units
* \see sizeUnit()
* \see setSizeType()
* \see setSize()
*/
void setSizeUnit( QgsUnitTypes::RenderUnit unit );
/**
* Returns the map unit scale object for the shape size. This is only used if the
* sizeUnit() is set to QgsUnitTypes::RenderMapUnit.
* \see setSizeMapUnitScale()
* \see sizeUnit()
*/
QgsMapUnitScale sizeMapUnitScale() const;
/**
* Sets the map unit scale object for the shape size. This is only used if the
* sizeUnit() is set to QgsUnitTypes::RenderMapUnit.
* \param scale scale for shape size
* \see sizeMapUnitScale()
* \see setSizeUnit()
*/
void setSizeMapUnitScale( const QgsMapUnitScale &scale );
/**
* Returns the method used for rotating the background shape.
* \see setRotationType()
* \see rotation()
*/
RotationType rotationType() const;
/**
* Sets the method used for rotating the background shape.
* \param type rotation method
* \see rotationType()
* \see setRotation()
*/
void setRotationType( RotationType type );
/**
* Returns the rotation for the background shape, in degrees clockwise.
* \see rotationType()
* \see setRotation()
*/
double rotation() const;
/**
* Sets the \a rotation for the background shape, in degrees clockwise.
* \see rotation()
* \see setRotationType()
*/
void setRotation( double rotation );
/**
* Returns the offset used for drawing the background shape. Units are determined
* via offsetUnit().
* \see setOffset()
* \see offsetUnit()
*/
QPointF offset() const;
/**
* Sets the offset used for drawing the background shape. Units are specified using
* setOffsetUnit().
* \param offset offset for shape
* \see offset()
* \see setOffsetUnit()
*/
void setOffset( const QPointF &offset );
/**
* Returns the units used for the shape's offset.
* \see setOffsetUnit()
* \see offset()
*/
QgsUnitTypes::RenderUnit offsetUnit() const;
/**
* Sets the units used for the shape's offset.
* \param units offset units
* \see offsetUnit()
* \see setOffset()
*/
void setOffsetUnit( QgsUnitTypes::RenderUnit units );
/**
* Returns the map unit scale object for the shape offset. This is only used if the
* offsetUnit() is set to QgsUnitTypes::RenderMapUnit.
* \see setOffsetMapUnitScale()
* \see offsetUnit()
*/
QgsMapUnitScale offsetMapUnitScale() const;
/**
* Sets the map unit scale object for the shape offset. This is only used if the
* offsetUnit() is set to QgsUnitTypes::RenderMapUnit.
* \param scale scale for shape offset
* \see offsetMapUnitScale()
* \see setOffsetUnit()
*/
void setOffsetMapUnitScale( const QgsMapUnitScale &scale );
/**
* Returns the radii used for rounding the corners of shapes. Units are retrieved
* through radiiUnit().
* \see setRadii()
* \see radiiUnit()
*/
QSizeF radii() const;
/**
* Sets the radii used for rounding the corners of shapes. This is only used if
* type() is set to QgsTextBackgroundSettings::ShapeRectangle or QgsTextBackgroundSettings::ShapeSquare.
* \param radii QSizeF representing horizontal and vertical radii for rounded corners. Units are
* specified through setRadiiUnit()
* \see radii()
* \see setRadiiUnit()
*/
void setRadii( const QSizeF &radii );
/**
* Returns the units used for the shape's radii.
* \see setRadiiUnit()
* \see radii()
*/
QgsUnitTypes::RenderUnit radiiUnit() const;
/**
* Sets the units used for the shape's radii.
* \param units radii units
* \see radiiUnit()
* \see setRadii()
*/
void setRadiiUnit( QgsUnitTypes::RenderUnit units );
/**
* Returns the map unit scale object for the shape radii. This is only used if the
* radiiUnit() is set to QgsUnitTypes::RenderMapUnit.
* \see setRadiiMapUnitScale()
* \see radiiUnit()
*/
QgsMapUnitScale radiiMapUnitScale() const;
/**
* Sets the map unit scale object for the shape radii. This is only used if the
* radiiUnit() is set to QgsUnitTypes::RenderMapUnit.
* \param scale scale for shape radii
* \see radiiMapUnitScale()
* \see setRadiiUnit()
*/
void setRadiiMapUnitScale( const QgsMapUnitScale &scale );
/**
* Returns the background shape's opacity. The opacity is a double value between 0 (fully transparent) and 1 (totally
* opaque).
* \see setOpacity()
*/
double opacity() const;
/**
* Sets the background shape's opacity.
* \param opacity opacity as a double value between 0 (fully transparent) and 1 (totally
* opaque)
* \see opacity()
*/
void setOpacity( double opacity );
/**
* Returns the blending mode used for drawing the background shape.
* \see setBlendMode()
*/
QPainter::CompositionMode blendMode() const;
/**
* Sets the blending mode used for drawing the background shape.
* \param mode blending mode
* \see blendMode()
*/
void setBlendMode( QPainter::CompositionMode mode );
/**
* Returns the color used for filing the background shape.
* \see setFillColor()
* \see strokeColor()
*/
QColor fillColor() const;
/**
* Sets the color used for filing the background shape.
* \param color background color
* \see fillColor()
* \see setStrokeColor()
*/
void setFillColor( const QColor &color );
/**
* Returns the color used for outlining the background shape.
* \see setStrokeColor()
* \see fillColor()
*/
QColor strokeColor() const;
/**
* Sets the color used for outlining the background shape.
* \param color stroke color
* \see strokeColor()
* \see setFillColor()
*/
void setStrokeColor( const QColor &color );
/**
* Returns the width of the shape's stroke (stroke). Units are retrieved through
* strokeWidthUnit().
* \see setStrokeWidth()
* \see strokeWidthUnit()
*/
double strokeWidth() const;
/**
* Sets the width of the shape's stroke (stroke). Units are specified through
* setStrokeWidthUnit().
* \see strokeWidth()
* \see setStrokeWidthUnit()
*/
void setStrokeWidth( double width );
/**
* Returns the units used for the shape's stroke width.
* \see setStrokeWidthUnit()
* \see strokeWidth()
*/
QgsUnitTypes::RenderUnit strokeWidthUnit() const;
/**
* Sets the units used for the shape's stroke width.
* \param units stroke width units
* \see strokeWidthUnit()
* \see setStrokeWidth()
*/
void setStrokeWidthUnit( QgsUnitTypes::RenderUnit units );
/**
* Returns the map unit scale object for the shape stroke width. This is only used if the
* strokeWidthUnit() is set to QgsUnitTypes::RenderMapUnit.
* \see setStrokeWidthMapUnitScale()
* \see strokeWidthUnit()
*/
QgsMapUnitScale strokeWidthMapUnitScale() const;
/**
* Sets the map unit scale object for the shape stroke width. This is only used if the
* strokeWidthUnit() is set to QgsUnitTypes::RenderMapUnit.
* \param scale scale for shape stroke width
* \see strokeWidthMapUnitScale()
* \see setStrokeWidthUnit()
*/
void setStrokeWidthMapUnitScale( const QgsMapUnitScale &scale );
/**
* Returns the join style used for drawing the background shape.
* \see setJoinStyle
*/
Qt::PenJoinStyle joinStyle() const;
/**
* Sets the join style used for drawing the background shape.
* \param style join style
* \see joinStyle()
*/
void setJoinStyle( Qt::PenJoinStyle style );
/**
* Returns the current paint effect for the background shape.
* \returns paint effect
* \see setPaintEffect()
*/
QgsPaintEffect *paintEffect() const;
/**
* Sets the current paint \a effect for the background shape.
* \param effect paint effect. Ownership is transferred to the background settings.
* \see paintEffect()
*/
void setPaintEffect( QgsPaintEffect *effect SIP_TRANSFER );
/**
* Reads settings from a layer's custom properties (for QGIS 2.x projects).
* \param layer source vector layer
*/
void readFromLayer( QgsVectorLayer *layer );
/**
* Read settings from a DOM element.
* \see writeXml()
*/
void readXml( const QDomElement &elem, const QgsReadWriteContext &context );
/**
* Write settings into a DOM element.
* \see readXml()
*/
QDomElement writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const;
private:
QSharedDataPointer<QgsTextBackgroundSettingsPrivate> d;
};
/**
* \class QgsTextShadowSettings
* \ingroup core
* Container for settings relating to a text shadow.
* \note QgsTextShadowSettings objects are implicitly shared.
* \since QGIS 3.0
*/
class CORE_EXPORT QgsTextShadowSettings
{
public:
/**
* Placement positions for text shadow.
*/
enum ShadowPlacement
{
ShadowLowest = 0, //!< Draw shadow below all text components
ShadowText, //!< Draw shadow under text
ShadowBuffer, //!< Draw shadow under buffer
ShadowShape //!< Draw shadow under background shape
};
QgsTextShadowSettings();
/**
* Copy constructor.
* \param other source QgsTextShadowSettings
*/
QgsTextShadowSettings( const QgsTextShadowSettings &other );
QgsTextShadowSettings &operator=( const QgsTextShadowSettings &other );
~QgsTextShadowSettings();
/**
* Returns whether the shadow is enabled.
* \see setEnabled()
*/
bool enabled() const;
/**
* Sets whether the text shadow will be drawn.
* \param enabled set to true to draw shadow
* \see enabled()
*/
void setEnabled( bool enabled );
/**
* Returns the placement for the drop shadow. The placement determines
* both the z-order stacking position for the shadow and the what shape (e.g., text,
* background shape) is used for casting the shadow.
* \see setShadowPlacement()
*/
QgsTextShadowSettings::ShadowPlacement shadowPlacement() const;
/**
* Sets the placement for the drop shadow. The placement determines
* both the z-order stacking position for the shadow and the what shape (e.g., text,
* background shape) is used for casting the shadow.
* \param placement shadow placement
* \see shadowPlacement()
*/
void setShadowPlacement( QgsTextShadowSettings::ShadowPlacement placement );
/**
* Returns the angle for offsetting the position of the shadow from the text.
* \see setOffsetAngle
* \see offsetDistance()
*/
int offsetAngle() const;
/**
* Sets the angle for offsetting the position of the shadow from the text.
* \param angle offset angle in degrees
* \see offsetAngle()
* \see setOffsetDistance()
*/
void setOffsetAngle( int angle );
/**
* Returns the distance for offsetting the position of the shadow from the text. Offset units
* are retrieved via offsetUnit().
* \see setOffsetDistance()
* \see offsetUnit()
*/
double offsetDistance() const;
/**
* Sets the distance for offsetting the position of the shadow from the text. Offset units
* are specified via setOffsetUnit().
* \param distance offset distance
* \see offsetDistance()
* \see setOffsetUnit()
*/
void setOffsetDistance( double distance );
/**
* Returns the units used for the shadow's offset.
* \see setOffsetUnit()
* \see offsetDistance()
*/
QgsUnitTypes::RenderUnit offsetUnit() const;
/**
* Sets the units used for the shadow's offset.
* \param units shadow distance units
* \see offsetUnit()
* \see setOffsetDistance()
*/
void setOffsetUnit( QgsUnitTypes::RenderUnit units );
/**
* Returns the map unit scale object for the shadow offset distance. This is only used if the
* offsetUnit() is set to QgsUnitTypes::RenderMapUnit.
* \see setOffsetMapUnitScale()
* \see offsetUnit()
*/
QgsMapUnitScale offsetMapUnitScale() const;
/**
* Sets the map unit scale object for the shadow offset distance. This is only used if the
* offsetUnit() is set to QgsUnitTypes::RenderMapUnit.
* \param scale scale for shadow offset
* \see offsetMapUnitScale()
* \see setOffsetUnit()
*/
void setOffsetMapUnitScale( const QgsMapUnitScale &scale );
/**
* Returns true if the global shadow offset will be used.
* \see setOffsetGlobal()
*/
bool offsetGlobal() const;
/**
* Sets whether the global shadow offset should be used.
* \param global set to true to use global shadow offset.
*/
void setOffsetGlobal( bool global );
/**
* Returns the blur radius for the shadow. Radius units are retrieved via blurRadiusUnits().
* \see setBlurRadius()
* \see blurRadiusUnit()
*/
double blurRadius() const;
/**
* Sets the blur radius for the shadow. Radius units are specified via setBlurRadiusUnits().
* \param blurRadius blur radius
* \see blurRadius()
* \see setBlurRadiusUnit()
*/
void setBlurRadius( double blurRadius );
/**
* Returns the units used for the shadow's blur radius.
* \see setBlurRadiusUnit()
* \see blurRadius()
*/
QgsUnitTypes::RenderUnit blurRadiusUnit() const;
/**
* Sets the units used for the shadow's blur radius.
* \param units shadow blur radius units
* \see blurRadiusUnit()
* \see setBlurRadius()
*/
void setBlurRadiusUnit( QgsUnitTypes::RenderUnit units );
/**
* Returns the map unit scale object for the shadow blur radius. This is only used if the
* blurRadiusUnit() is set to QgsUnitTypes::RenderMapUnit.
* \see setBlurRadiusMapUnitScale()
* \see blurRadiusUnit()
*/
QgsMapUnitScale blurRadiusMapUnitScale() const;
/**
* Sets the map unit scale object for the shadow blur radius. This is only used if the
* blurRadiusUnit() is set to QgsUnitTypes::RenderMapUnit.
* \param scale scale for shadow blur radius
* \see blurRadiusMapUnitScale()
* \see setBlurRadiusUnit()
*/
void setBlurRadiusMapUnitScale( const QgsMapUnitScale &scale );
/**
* Returns whether only the alpha channel for the shadow will be blurred.
* \see setBlurAlphaOnly()
*/
bool blurAlphaOnly() const;
/**
* Sets whether only the alpha channel for the shadow should be blurred.
* \param alphaOnly set to true to blur only the alpha channel. If false, all channels (including
* red, green and blue channel) will be blurred.
* \see blurAlphaOnly()
*/
void setBlurAlphaOnly( bool alphaOnly );
/**
* Returns the shadow's opacity. The opacity is a double value between 0 (fully transparent) and 1 (totally
* opaque).
* \see setOpacity()
*/
double opacity() const;
/**
* Sets the shadow's opacity.
* \param opacity opacity as a double value between 0 (fully transparent) and 1 (totally
* opaque)
* \see opacity()
*/
void setOpacity( double opacity );
/**
* Returns the scaling used for the drop shadow (in percentage of original size).
* \see setScale()
*/
int scale() const;
/**
* Sets the scaling used for the drop shadow (in percentage of original size).
* \param scale scale percent for drop shadow
* \see scale()
*/
void setScale( int scale );
/**
* Returns the color of the drop shadow.
* \see setColor()
*/
QColor color() const;
/**
* Sets the color for the drop shadow.
* \param color shadow color
* \see color()
*/
void setColor( const QColor &color );
/**
* Returns the blending mode used for drawing the drop shadow.
* \see setBlendMode()
*/
QPainter::CompositionMode blendMode() const;
/**
* Sets the blending mode used for drawing the drop shadow.
* \param mode blending mode
* \see blendMode()
*/
void setBlendMode( QPainter::CompositionMode mode );
/**
* Reads settings from a layer's custom properties (for QGIS 2.x projects).
* \param layer source vector layer
*/
void readFromLayer( QgsVectorLayer *layer );
/**
* Read settings from a DOM element.
* \see writeXml()
*/
void readXml( const QDomElement &elem );
/**
* Write settings into a DOM element.
* \see readXml()
*/
QDomElement writeXml( QDomDocument &doc ) const;
private:
QSharedDataPointer<QgsTextShadowSettingsPrivate> d;
};
/**
* \class QgsTextFormat
* \ingroup core
* Container for all settings relating to text rendering.
* \note QgsTextFormat objects are implicitly shared.
* \since QGIS 3.0
*/
class CORE_EXPORT QgsTextFormat
{
public:
QgsTextFormat();
/**
* Copy constructor.
* \param other source QgsTextFormat
*/
QgsTextFormat( const QgsTextFormat &other );
QgsTextFormat &operator=( const QgsTextFormat &other );
~QgsTextFormat();
/**
* Returns a reference to the text buffer settings.
* \see setBuffer()
*/
QgsTextBufferSettings &buffer() { return mBufferSettings; }
/**
* Returns a reference to the text buffer settings.
* \see setBuffer()
*/
SIP_SKIP QgsTextBufferSettings buffer() const { return mBufferSettings; }
/**
* Sets the text's buffer settings.
* \param bufferSettings buffer settings
* \see buffer()
*/
void setBuffer( const QgsTextBufferSettings &bufferSettings ) { mBufferSettings = bufferSettings; }
/**
* Returns a reference to the text background settings.
* \see setBackground()
*/
QgsTextBackgroundSettings &background() { return mBackgroundSettings; }
/**
* Returns a reference to the text background settings.
* \see setBackground()
*/
SIP_SKIP QgsTextBackgroundSettings background() const { return mBackgroundSettings; }
/**
* Sets the text's background settings.q
* \param backgroundSettings background settings
* \see background()
*/
void setBackground( const QgsTextBackgroundSettings &backgroundSettings ) { mBackgroundSettings = backgroundSettings; }
/**
* Returns a reference to the text drop shadow settings.
* \see setShadow()
*/
QgsTextShadowSettings &shadow() { return mShadowSettings; }
/**
* Returns a reference to the text drop shadow settings.
* \see setShadow()
*/
SIP_SKIP QgsTextShadowSettings shadow() const { return mShadowSettings; }
/**
* Sets the text's drop shadow settings.
* \param shadowSettings shadow settings
* \see shadow()
*/
void setShadow( const QgsTextShadowSettings &shadowSettings ) { mShadowSettings = shadowSettings; }
/**
* Returns the font used for rendering text. Note that the size of the font
* is not used, and size() should be called instead to determine the size
* of rendered text.
* \see scaledFont()
* \see setFont()
* \see namedStyle()
*/
QFont font() const;
/**
* Returns a font with the size scaled to match the format's size settings (including
* units and map unit scale) for a specified render context.
* \param context destination render context
* \returns font with scaled size
* \see font()
* \see size()
*/
QFont scaledFont( const QgsRenderContext &context ) const;
/**
* Sets the font used for rendering text. Note that the size of the font
* is not used, and setSize() should be called instead to explicitly set the size
* of rendered text.
* \param font desired font
* \see font()
* \see setNamedStyle()
*/
void setFont( const QFont &font );
/**
* Returns the named style for the font used for rendering text (e.g., "bold").
* \see setNamedStyle()
* \see font()
*/
QString namedStyle() const;
/**
* Sets the named style for the font used for rendering text.
* \param style named style, e.g., "bold"
* \see namedStyle()
* \see setFont()
*/
void setNamedStyle( const QString &style );
/**
* Returns the size for rendered text. Units are retrieved using sizeUnit().
* \see setSize()
* \see sizeUnit()
*/
double size() const;
/**
* Sets the size for rendered text.
* \param size size of rendered text. Units are set using setSizeUnit()
* \see size()
* \see setSizeUnit()
*/
void setSize( double size );
/**
* Returns the units for the size of rendered text.
* \see size()
* \see setSizeUnit()
* \see sizeMapUnitScale()
*/
QgsUnitTypes::RenderUnit sizeUnit() const;
/**
* Sets the units for the size of rendered text.
* \param unit size units
* \see setSize()
* \see sizeUnit()
* \see setSizeMapUnitScale()
*/
void setSizeUnit( QgsUnitTypes::RenderUnit unit );
/**
* Returns the map unit scale object for the size. This is only used if the
* sizeUnit() is set to QgsUnitTypes::RenderMapUnit.
* \see setSizeMapUnitScale()
* \see sizeUnit()
*/
QgsMapUnitScale sizeMapUnitScale() const;
/**
* Sets the map unit scale object for the size. This is only used if the
* sizeUnit() is set to QgsUnitTypes::RenderMapUnit.
* \see sizeMapUnitScale()
* \see setSizeUnit()
*/
void setSizeMapUnitScale( const QgsMapUnitScale &scale );
/**
* Returns the color that text will be rendered in.
* \see setColor()
*/
QColor color() const;
/**
* Sets the color that text will be rendered in.
* \param color text color
* \see color()
*/
void setColor( const QColor &color );
/**
* Returns the text's opacity. The opacity is a double value between 0 (fully transparent) and 1 (totally
* opaque).
* \see setOpacity()
*/
double opacity() const;
/**
* Sets the text's opacity.
* \param opacity opacity as a double value between 0 (fully transparent) and 1 (totally
* opaque)
* \see opacity()
*/
void setOpacity( double opacity );
/**
* Returns the blending mode used for drawing the text.
* \see setBlendMode()
*/
QPainter::CompositionMode blendMode() const;
/**
* Sets the blending mode used for drawing the text.
* \param mode blending mode
* \see blendMode()
*/
void setBlendMode( QPainter::CompositionMode mode );
/**
* Returns the line height for text. This is a number between
* 0.0 and 10.0 representing the leading between lines as a
* multiplier of line height.
* \see setLineHeight()
*/
double lineHeight() const;
/**
* Sets the line height for text.
* \param height a number between
* 0.0 and 10.0 representing the leading between lines as a
* multiplier of line height.
* \see lineHeight()
*/
void setLineHeight( double height );
/**
* Reads settings from a layer's custom properties (for QGIS 2.x projects).
* \param layer source vector layer
*/
void readFromLayer( QgsVectorLayer *layer );
/**
* Read settings from a DOM element.
* \see writeXml()
*/
void readXml( const QDomElement &elem, const QgsReadWriteContext &context );
/**
* Write settings into a DOM element.
* \see readXml()
*/
QDomElement writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const;
/**
* Returns new mime data representing the text format settings.
* Caller takes responsibility for deleting the returned object.
* \see fromMimeData()
*/
QMimeData *toMimeData() const SIP_FACTORY;
/**
* Attempts to parse the provided mime \a data as a QgsTextFormat.
* If data can be parsed as a text format, \a ok will be set to true.
* \see toMimeData()
*/
static QgsTextFormat fromMimeData( const QMimeData *data, bool *ok SIP_OUT = nullptr );
/**
* Returns true if any component of the font format requires advanced effects
* such as blend modes, which require output in raster formats to be fully respected.
*/
bool containsAdvancedEffects() const;
/**
* Returns true if the specified font was found on the system, or false
* if the font was not found and a replacement was used instead.
* \see resolvedFontFamily()
*/
bool fontFound() const { return mTextFontFound; }
/**
* Returns the family for the resolved font, ie if the specified font
* was not found on the system this will return the name of the replacement
* font.
* \see fontFound()
*/
QString resolvedFontFamily() const { return mTextFontFamily; }
private:
QgsTextBufferSettings mBufferSettings;
QgsTextBackgroundSettings mBackgroundSettings;
QgsTextShadowSettings mShadowSettings;
QString mTextFontFamily;
bool mTextFontFound = true;
QSharedDataPointer<QgsTextSettingsPrivate> d;
};
/**
* \class QgsTextRenderer
* \ingroup core
* Handles rendering text using rich formatting options, including drop shadows, buffers
* and background shapes.
* \since QGIS 3.0
*/
class CORE_EXPORT QgsTextRenderer
{
public:
//! Components of text
enum TextPart
{
Text = 0, //!< Text component
Buffer, //!< Buffer component
Background, //!< Background shape
Shadow, //!< Drop shadow
};
//! Horizontal alignment
enum HAlignment
{
AlignLeft = 0, //!< Left align
AlignCenter, //!< Center align
AlignRight, //!< Right align
};
/**
* Calculates pixel size (considering output size should be in pixel or map units, scale factors and optionally oversampling)
* \param size size to convert
* \param c rendercontext
* \param unit size units
* \param mapUnitScale a mapUnitScale clamper
* \returns font pixel size
*/
static int sizeToPixel( double size, const QgsRenderContext &c, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &mapUnitScale = QgsMapUnitScale() );
/**
* Draws text within a rectangle using the specified settings.
* \param rect destination rectangle for text
* \param rotation text rotation
* \param alignment horizontal alignment
* \param textLines list of lines of text to draw
* \param context render context
* \param format text format
* \param drawAsOutlines set to false to render text as text. This allows outputs to
* formats like SVG to maintain text as text objects, but at the cost of degraded
* rendering and may result in side effects like misaligned text buffers.
*/
static void drawText( const QRectF &rect, double rotation, HAlignment alignment, const QStringList &textLines,
QgsRenderContext &context, const QgsTextFormat &format,
bool drawAsOutlines = true );
/**
* Draws text at a point origin using the specified settings.
* \param point origin of text
* \param rotation text rotation
* \param alignment horizontal alignment
* \param textLines list of lines of text to draw
* \param context render context
* \param format text format
* \param drawAsOutlines set to false to render text as text. This allows outputs to
* formats like SVG to maintain text as text objects, but at the cost of degraded
* rendering and may result in side effects like misaligned text buffers.
*/
static void drawText( const QPointF &point, double rotation, HAlignment alignment, const QStringList &textLines,
QgsRenderContext &context, const QgsTextFormat &format,
bool drawAsOutlines = true );
/**
* Draws a single component of rendered text using the specified settings.
* \param rect destination rectangle for text
* \param rotation text rotation
* \param alignment horizontal alignment
* \param textLines list of lines of text to draw
* \param context render context
* \param format text format
* \param part component of text to draw. Note that Shadow parts cannot be drawn
* individually and instead are drawn with their associated part (e.g., drawn together
* with the text or background parts)
* \param drawAsOutlines set to false to render text as text. This allows outputs to
* formats like SVG to maintain text as text objects, but at the cost of degraded
* rendering and may result in side effects like misaligned text buffers.
*/
static void drawPart( const QRectF &rect, double rotation, HAlignment alignment, const QStringList &textLines,
QgsRenderContext &context, const QgsTextFormat &format,
TextPart part, bool drawAsOutlines = true );
/**
* Draws a single component of rendered text using the specified settings.
* \param origin origin for start of text. Y coordinate will be used as baseline.
* \param rotation text rotation
* \param alignment horizontal alignment
* \param textLines list of lines of text to draw
* \param context render context
* \param format text format
* \param part component of text to draw. Note that Shadow parts cannot be drawn
* individually and instead are drawn with their associated part (e.g., drawn together
* with the text or background parts)
* \param drawAsOutlines set to false to render text as text. This allows outputs to
* formats like SVG to maintain text as text objects, but at the cost of degraded
* rendering and may result in side effects like misaligned text buffers.
*/
static void drawPart( const QPointF &origin, double rotation, HAlignment alignment, const QStringList &textLines,
QgsRenderContext &context, const QgsTextFormat &format,
TextPart part, bool drawAsOutlines = true );
private:
enum DrawMode
{
Rect = 0,
Point,
Label,
};
struct Component
{
//! Component text
QString text;
//! Current origin point for painting (generally current painter rotation point)
QPointF origin;
//! Whether to translate the painter to supplied origin
bool useOrigin = false;
//! Any rotation to be applied to painter (in radians)
double rotation = 0.0;
//! Any rotation to be applied to painter (in radians) after initial rotation
double rotationOffset = 0.0;
//! Current center point of label component, after rotation
QPointF center;
//! Width and height of label component, transformed and ready for painting
QSizeF size;
//! Any translation offsets to be applied before painting, transformed and ready for painting
QPointF offset;
//! A stored QPicture of painting for the component
QPicture picture;
/**
* Buffer for component to accommodate graphic items ignored by QPicture,
* e.g. half-width of an applied QPen, which would extend beyond boundingRect() of QPicture
*/
double pictureBuffer = 0.0;
//! A ratio of native painter dpi and that of rendering context's painter
double dpiRatio = 1.0;
//! Horizontal alignment
HAlignment hAlign = AlignLeft;
};
static void drawBuffer( QgsRenderContext &context,
const Component &component,
const QgsTextFormat &format );
static void drawBackground( QgsRenderContext &context,
Component component,
const QgsTextFormat &format,
const QStringList &textLines,
DrawMode mode = Rect );
static void drawShadow( QgsRenderContext &context,
const Component &component,
const QgsTextFormat &format );
static void drawText( QgsRenderContext &context,
const Component &component,
const QgsTextFormat &format );
static void drawTextInternal( TextPart drawType,
QgsRenderContext &context,
const QgsTextFormat &format,
const Component &component,
const QStringList &textLines,
const QFontMetricsF *fontMetrics,
HAlignment alignment,
bool drawAsOutlines,
DrawMode mode = Rect );
friend class QgsVectorLayerLabelProvider;
friend class QgsLabelPreview;
static QgsTextFormat updateShadowPosition( const QgsTextFormat &format );
static double textWidth( const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines,
QFontMetricsF *fm = nullptr );
static double textHeight( const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, DrawMode mode,
QFontMetricsF *fm = nullptr );
};
#endif // QGSTEXTRENDERER_H