QGIS API Documentation 3.99.0-Master (26c88405ac0)
Loading...
Searching...
No Matches
qgscoloreffect.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgscoloreffect.cpp
3 ------------------
4 begin : March 2015
5 copyright : (C) 2015 Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18#include "qgscoloreffect.h"
19
20#include <algorithm>
21
22#include "qgscolorutils.h"
23#include "qgsimageoperation.h"
24#include "qgsrendercontext.h"
25
26QgsPaintEffect *QgsColorEffect::create( const QVariantMap &map )
27{
28 QgsColorEffect *newEffect = new QgsColorEffect();
29 newEffect->readProperties( map );
30 return newEffect;
31}
32
34 : mColorizeColor( QColor::fromRgb( 255, 128, 128 ) )
35{
36
37}
38
43
45{
46 if ( !enabled() || !context.painter() || source().isNull() )
47 return;
48
50 {
51 //just draw unmodified source, we can't render this effect when forcing vectors
52 drawSource( *context.painter() );
53 return;
54 }
55
56 QPainter *painter = context.painter();
57
58 //rasterize source and apply modifications
59 QImage image = sourceAsImage( context ).copy();
60
61 QgsImageOperation::adjustBrightnessContrast( image, mBrightness, mContrast / 100.0 + 1, context.feedback() );
62
63 if ( context.feedback() && context.feedback()->isCanceled() )
64 return;
65
66 if ( mGrayscaleMode != QgsImageOperation::GrayscaleOff )
67 {
68 QgsImageOperation::convertToGrayscale( image, static_cast< QgsImageOperation::GrayscaleMode >( mGrayscaleMode ), context.feedback() );
69 }
70
71 if ( context.feedback() && context.feedback()->isCanceled() )
72 return;
73
74 QgsImageOperation::adjustHueSaturation( image, mSaturation, mColorizeOn ? mColorizeColor : QColor(), mColorizeStrength / 100.0, context.feedback() );
75
76 if ( context.feedback() && context.feedback()->isCanceled() )
77 return;
78
79 QgsImageOperation::multiplyOpacity( image, mOpacity, context.feedback() );
80
81 if ( context.feedback() && context.feedback()->isCanceled() )
82 return;
83
84 QgsScopedQPainterState painterState( painter );
85 painter->setCompositionMode( mBlendMode );
86 painter->drawImage( imageOffset( context ), image );
87}
88
89
90QVariantMap QgsColorEffect::properties() const
91{
92 QVariantMap props;
93 props.insert( QStringLiteral( "enabled" ), mEnabled ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
94 props.insert( QStringLiteral( "draw_mode" ), QString::number( int( mDrawMode ) ) );
95 props.insert( QStringLiteral( "blend_mode" ), QString::number( int( mBlendMode ) ) );
96 props.insert( QStringLiteral( "opacity" ), QString::number( mOpacity ) );
97 props.insert( QStringLiteral( "brightness" ), QString::number( mBrightness ) );
98 props.insert( QStringLiteral( "contrast" ), QString::number( mContrast ) );
99 props.insert( QStringLiteral( "saturation" ), QString::number( mSaturation ) );
100 props.insert( QStringLiteral( "grayscale_mode" ), QString::number( int( mGrayscaleMode ) ) );
101 props.insert( QStringLiteral( "colorize" ), mColorizeOn ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
102 props.insert( QStringLiteral( "colorize_color" ), QgsColorUtils::colorToString( mColorizeColor ) );
103 props.insert( QStringLiteral( "colorize_strength" ), QString::number( mColorizeStrength ) );
104
105 return props;
106}
107
108void QgsColorEffect::readProperties( const QVariantMap &props )
109{
110 bool ok;
111 QPainter::CompositionMode mode = static_cast< QPainter::CompositionMode >( props.value( QStringLiteral( "blend_mode" ) ).toInt( &ok ) );
112 if ( ok )
113 {
114 mBlendMode = mode;
115 }
116 if ( props.contains( QStringLiteral( "transparency" ) ) )
117 {
118 double transparency = props.value( QStringLiteral( "transparency" ) ).toDouble( &ok );
119 if ( ok )
120 {
121 mOpacity = 1.0 - transparency;
122 }
123 }
124 else
125 {
126 double opacity = props.value( QStringLiteral( "opacity" ) ).toDouble( &ok );
127 if ( ok )
128 {
129 mOpacity = opacity;
130 }
131 }
132 mEnabled = props.value( QStringLiteral( "enabled" ), QStringLiteral( "1" ) ).toInt();
133 mDrawMode = static_cast< QgsPaintEffect::DrawMode >( props.value( QStringLiteral( "draw_mode" ), QStringLiteral( "2" ) ).toInt() );
134
135 mBrightness = props.value( QStringLiteral( "brightness" ), QStringLiteral( "0" ) ).toInt();
136 mContrast = props.value( QStringLiteral( "contrast" ), QStringLiteral( "0" ) ).toInt();
137 mSaturation = props.value( QStringLiteral( "saturation" ), QStringLiteral( "1.0" ) ).toDouble();
138 mGrayscaleMode = static_cast< QgsImageOperation::GrayscaleMode >( props.value( QStringLiteral( "grayscale_mode" ), QStringLiteral( "0" ) ).toInt() );
139 mColorizeOn = props.value( QStringLiteral( "colorize" ), QStringLiteral( "0" ) ).toInt();
140 if ( props.contains( QStringLiteral( "colorize_color" ) ) )
141 {
142 setColorizeColor( QgsColorUtils::colorFromString( props.value( QStringLiteral( "colorize_color" ) ).toString() ) );
143 }
144 mColorizeStrength = props.value( QStringLiteral( "colorize_strength" ), QStringLiteral( "100" ) ).toInt();
145}
146
148{
149 QgsColorEffect *newEffect = new QgsColorEffect( *this );
150 return newEffect;
151}
152
154{
155 mBrightness = std::clamp( brightness, -255, 255 );
156}
157
159{
160 mContrast = std::clamp( contrast, -100, 100 );
161}
162
164{
165 mColorizeColor = colorizeColor;
166}
@ ForceVector
Always force vector-based rendering, even when the result will be visually different to a raster-base...
Definition qgis.h:2706
@ RequiresRasterization
The effect requires raster-based rendering.
Definition qgis.h:2806
QFlags< PaintEffectFlag > PaintEffectFlags
Flags which control how paint effects behave.
Definition qgis.h:2815
void readProperties(const QVariantMap &props) override
Reads a string map of an effect's properties and restores the effect to the state described by the pr...
double opacity() const
Returns the opacity for the effect.
QgsColorEffect * clone() const override
Duplicates an effect by creating a deep copy of the effect.
void setColorizeColor(const QColor &colorizeColor)
Sets the color used for colorizing a picture.
static QgsPaintEffect * create(const QVariantMap &map)
Creates a new QgsColorEffect effect from a properties string map.
Qgis::PaintEffectFlags flags() const override
Returns flags which specify how the paint effect behaves.
int contrast() const
Returns the contrast modification for the effect.
int brightness() const
Returns the brightness modification for the effect.
void setContrast(int contrast)
Sets the contrast modification for the effect.
void draw(QgsRenderContext &context) override
Handles drawing of the effect's result on to the specified render context.
void setBrightness(int brightness)
Sets the brightness modification for the effect.
QVariantMap properties() const override
Returns the properties describing the paint effect encoded in a string format.
QColor colorizeColor() const
Returns the color used for colorizing a picture.
static QColor colorFromString(const QString &string)
Decodes a string into a color value.
static QString colorToString(const QColor &color)
Encodes a color into a string value.
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition qgsfeedback.h:53
static void adjustHueSaturation(QImage &image, double saturation, const QColor &colorizeColor=QColor(), double colorizeStrength=1.0, QgsFeedback *feedback=nullptr)
Alter the hue or saturation of a QImage.
static void multiplyOpacity(QImage &image, double factor, QgsFeedback *feedback=nullptr)
Multiplies opacity of image pixel values by a factor.
static void adjustBrightnessContrast(QImage &image, int brightness, double contrast, QgsFeedback *feedback=nullptr)
Alter the brightness or contrast of a QImage.
static void convertToGrayscale(QImage &image, GrayscaleMode mode=GrayscaleLuminosity, QgsFeedback *feedback=nullptr)
Convert a QImage to a grayscale image.
GrayscaleMode
Modes for converting a QImage to grayscale.
QgsPaintEffect()=default
void drawSource(QPainter &painter)
Draws the source QPicture onto the specified painter.
QImage sourceAsImage(QgsRenderContext &context)
Returns the source QPicture rendered to a new QImage.
const QPicture & source() const
Returns the source QPicture.
QPointF imageOffset(const QgsRenderContext &context) const
Returns the offset which should be used when drawing the source image on to a destination render cont...
bool enabled() const
Returns whether the effect is enabled.
DrawMode
Drawing modes for effects.
Contains information about the context of a rendering operation.
QPainter * painter()
Returns the destination QPainter for the render operation.
QgsFeedback * feedback() const
Returns the feedback object that can be queried regularly during rendering to check if rendering shou...
Qgis::RasterizedRenderingPolicy rasterizedRenderingPolicy() const
Returns the policy controlling when rasterisation of content during renders is permitted.
Scoped object for saving and restoring a QPainter object's state.