Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgstextshadowsettings.cpp
3 : : -----------------
4 : : begin : May 2020
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 : : #include "qgstextshadowsettings.h"
17 : : #include "qgstextrenderer_p.h"
18 : : #include "qgsvectorlayer.h"
19 : : #include "qgssymbollayerutils.h"
20 : : #include "qgspainting.h"
21 : : #include "qgspallabeling.h"
22 : : #include "qgstextrendererutils.h"
23 : :
24 : 78 : QgsTextShadowSettings::QgsTextShadowSettings()
25 : : {
26 : 78 : d = new QgsTextShadowSettingsPrivate();
27 : 78 : }
28 : :
29 : 0 : QgsTextShadowSettings::QgsTextShadowSettings( const QgsTextShadowSettings &other ) //NOLINT
30 : 0 : : d( other.d )
31 : : {
32 : :
33 : 0 : }
34 : :
35 : 0 : QgsTextShadowSettings &QgsTextShadowSettings::operator=( const QgsTextShadowSettings &other ) //NOLINT
36 : : {
37 : 0 : d = other.d;
38 : 0 : return *this;
39 : : }
40 : :
41 : 62 : QgsTextShadowSettings::~QgsTextShadowSettings() //NOLINT
42 : : {
43 : :
44 : 62 : }
45 : :
46 : 0 : bool QgsTextShadowSettings::operator==( const QgsTextShadowSettings &other ) const
47 : : {
48 : 0 : if ( d->enabled != other.enabled()
49 : 0 : || d->shadowUnder != other.shadowPlacement()
50 : 0 : || d->offsetAngle != other.offsetAngle()
51 : 0 : || d->offsetDist != other.offsetDistance()
52 : 0 : || d->offsetUnits != other.offsetUnit()
53 : 0 : || d->offsetMapUnitScale != other.offsetMapUnitScale()
54 : 0 : || d->offsetGlobal != other.offsetGlobal()
55 : 0 : || d->radius != other.blurRadius()
56 : 0 : || d->radiusUnits != other.blurRadiusUnit()
57 : 0 : || d->radiusMapUnitScale != other.blurRadiusMapUnitScale()
58 : 0 : || d->radiusAlphaOnly != other.blurAlphaOnly()
59 : 0 : || d->scale != other.scale()
60 : 0 : || d->color != other.color()
61 : 0 : || d->opacity != other.opacity()
62 : 0 : || d->blendMode != other.blendMode() )
63 : 0 : return false;
64 : :
65 : 0 : return true;
66 : 0 : }
67 : :
68 : 0 : bool QgsTextShadowSettings::operator!=( const QgsTextShadowSettings &other ) const
69 : : {
70 : 0 : return !( *this == other );
71 : : }
72 : :
73 : 0 : bool QgsTextShadowSettings::enabled() const
74 : : {
75 : 0 : return d->enabled;
76 : : }
77 : :
78 : 0 : void QgsTextShadowSettings::setEnabled( bool enabled )
79 : : {
80 : 0 : d->enabled = enabled;
81 : 0 : }
82 : :
83 : 0 : QgsTextShadowSettings::ShadowPlacement QgsTextShadowSettings::shadowPlacement() const
84 : : {
85 : 0 : return d->shadowUnder;
86 : : }
87 : :
88 : 0 : void QgsTextShadowSettings::setShadowPlacement( QgsTextShadowSettings::ShadowPlacement placement )
89 : : {
90 : 0 : d->shadowUnder = placement;
91 : 0 : }
92 : :
93 : 0 : int QgsTextShadowSettings::offsetAngle() const
94 : : {
95 : 0 : return d->offsetAngle;
96 : : }
97 : :
98 : 0 : void QgsTextShadowSettings::setOffsetAngle( int angle )
99 : : {
100 : 0 : d->offsetAngle = angle;
101 : 0 : }
102 : :
103 : 0 : double QgsTextShadowSettings::offsetDistance() const
104 : : {
105 : 0 : return d->offsetDist;
106 : : }
107 : :
108 : 0 : void QgsTextShadowSettings::setOffsetDistance( double distance )
109 : : {
110 : 0 : d->offsetDist = distance;
111 : 0 : }
112 : :
113 : 0 : QgsUnitTypes::RenderUnit QgsTextShadowSettings::offsetUnit() const
114 : : {
115 : 0 : return d->offsetUnits;
116 : : }
117 : :
118 : 0 : void QgsTextShadowSettings::setOffsetUnit( QgsUnitTypes::RenderUnit units )
119 : : {
120 : 0 : d->offsetUnits = units;
121 : 0 : }
122 : :
123 : 0 : QgsMapUnitScale QgsTextShadowSettings::offsetMapUnitScale() const
124 : : {
125 : 0 : return d->offsetMapUnitScale;
126 : : }
127 : :
128 : 0 : void QgsTextShadowSettings::setOffsetMapUnitScale( const QgsMapUnitScale &scale )
129 : : {
130 : 0 : d->offsetMapUnitScale = scale;
131 : 0 : }
132 : :
133 : 0 : bool QgsTextShadowSettings::offsetGlobal() const
134 : : {
135 : 0 : return d->offsetGlobal;
136 : : }
137 : :
138 : 0 : void QgsTextShadowSettings::setOffsetGlobal( bool global )
139 : : {
140 : 0 : d->offsetGlobal = global;
141 : 0 : }
142 : :
143 : 0 : double QgsTextShadowSettings::blurRadius() const
144 : : {
145 : 0 : return d->radius;
146 : : }
147 : :
148 : 0 : void QgsTextShadowSettings::setBlurRadius( double radius )
149 : : {
150 : 0 : d->radius = radius;
151 : 0 : }
152 : :
153 : 0 : QgsUnitTypes::RenderUnit QgsTextShadowSettings::blurRadiusUnit() const
154 : : {
155 : 0 : return d->radiusUnits;
156 : : }
157 : :
158 : 0 : void QgsTextShadowSettings::setBlurRadiusUnit( QgsUnitTypes::RenderUnit units )
159 : : {
160 : 0 : d->radiusUnits = units;
161 : 0 : }
162 : :
163 : 0 : QgsMapUnitScale QgsTextShadowSettings::blurRadiusMapUnitScale() const
164 : : {
165 : 0 : return d->radiusMapUnitScale;
166 : : }
167 : :
168 : 0 : void QgsTextShadowSettings::setBlurRadiusMapUnitScale( const QgsMapUnitScale &scale )
169 : : {
170 : 0 : d->radiusMapUnitScale = scale;
171 : 0 : }
172 : :
173 : 0 : bool QgsTextShadowSettings::blurAlphaOnly() const
174 : : {
175 : 0 : return d->radiusAlphaOnly;
176 : : }
177 : :
178 : 0 : void QgsTextShadowSettings::setBlurAlphaOnly( bool alphaOnly )
179 : : {
180 : 0 : d->radiusAlphaOnly = alphaOnly;
181 : 0 : }
182 : :
183 : 0 : double QgsTextShadowSettings::opacity() const
184 : : {
185 : 0 : return d->opacity;
186 : : }
187 : :
188 : 0 : void QgsTextShadowSettings::setOpacity( double opacity )
189 : : {
190 : 0 : d->opacity = opacity;
191 : 0 : }
192 : :
193 : 0 : int QgsTextShadowSettings::scale() const
194 : : {
195 : 0 : return d->scale;
196 : : }
197 : :
198 : 0 : void QgsTextShadowSettings::setScale( int scale )
199 : : {
200 : 0 : d->scale = scale;
201 : 0 : }
202 : :
203 : 0 : QColor QgsTextShadowSettings::color() const
204 : : {
205 : 0 : return d->color;
206 : : }
207 : :
208 : 0 : void QgsTextShadowSettings::setColor( const QColor &color )
209 : : {
210 : 0 : d->color = color;
211 : 0 : }
212 : :
213 : 0 : QPainter::CompositionMode QgsTextShadowSettings::blendMode() const
214 : : {
215 : 0 : return d->blendMode;
216 : : }
217 : :
218 : 0 : void QgsTextShadowSettings::setBlendMode( QPainter::CompositionMode mode )
219 : : {
220 : 0 : d->blendMode = mode;
221 : 0 : }
222 : :
223 : 0 : void QgsTextShadowSettings::readFromLayer( QgsVectorLayer *layer )
224 : : {
225 : 0 : d->enabled = layer->customProperty( QStringLiteral( "labeling/shadowDraw" ), QVariant( false ) ).toBool();
226 : 0 : d->shadowUnder = static_cast< ShadowPlacement >( layer->customProperty( QStringLiteral( "labeling/shadowUnder" ), QVariant( ShadowLowest ) ).toUInt() );//ShadowLowest;
227 : 0 : d->offsetAngle = layer->customProperty( QStringLiteral( "labeling/shadowOffsetAngle" ), QVariant( 135 ) ).toInt();
228 : 0 : d->offsetDist = layer->customProperty( QStringLiteral( "labeling/shadowOffsetDist" ), QVariant( 1.0 ) ).toDouble();
229 : :
230 : 0 : if ( layer->customProperty( QStringLiteral( "labeling/shadowOffsetUnit" ) ).toString().isEmpty() )
231 : : {
232 : 0 : d->offsetUnits = QgsTextRendererUtils::convertFromOldLabelUnit( layer->customProperty( QStringLiteral( "labeling/shadowOffsetUnits" ), 0 ).toUInt() );
233 : 0 : }
234 : : else
235 : : {
236 : 0 : d->offsetUnits = QgsUnitTypes::decodeRenderUnit( layer->customProperty( QStringLiteral( "labeling/shadowOffsetUnit" ) ).toString() );
237 : : }
238 : 0 : if ( layer->customProperty( QStringLiteral( "labeling/shadowOffsetMapUnitScale" ) ).toString().isEmpty() )
239 : : {
240 : : //fallback to older property
241 : 0 : double oldMin = layer->customProperty( QStringLiteral( "labeling/shadowOffsetMapUnitMinScale" ), 0.0 ).toDouble();
242 : 0 : d->offsetMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
243 : 0 : double oldMax = layer->customProperty( QStringLiteral( "labeling/shadowOffsetMapUnitMaxScale" ), 0.0 ).toDouble();
244 : 0 : d->offsetMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
245 : 0 : }
246 : : else
247 : : {
248 : 0 : d->offsetMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( layer->customProperty( QStringLiteral( "labeling/shadowOffsetMapUnitScale" ) ).toString() );
249 : : }
250 : 0 : d->offsetGlobal = layer->customProperty( QStringLiteral( "labeling/shadowOffsetGlobal" ), QVariant( true ) ).toBool();
251 : 0 : d->radius = layer->customProperty( QStringLiteral( "labeling/shadowRadius" ), QVariant( 1.5 ) ).toDouble();
252 : :
253 : 0 : if ( layer->customProperty( QStringLiteral( "labeling/shadowRadiusUnit" ) ).toString().isEmpty() )
254 : : {
255 : 0 : d->radiusUnits = QgsTextRendererUtils::convertFromOldLabelUnit( layer->customProperty( QStringLiteral( "labeling/shadowRadiusUnits" ), 0 ).toUInt() );
256 : 0 : }
257 : : else
258 : : {
259 : 0 : d->radiusUnits = QgsUnitTypes::decodeRenderUnit( layer->customProperty( QStringLiteral( "labeling/shadowRadiusUnit" ) ).toString() );
260 : : }
261 : 0 : if ( layer->customProperty( QStringLiteral( "labeling/shadowRadiusMapUnitScale" ) ).toString().isEmpty() )
262 : : {
263 : : //fallback to older property
264 : 0 : double oldMin = layer->customProperty( QStringLiteral( "labeling/shadowRadiusMapUnitMinScale" ), 0.0 ).toDouble();
265 : 0 : d->radiusMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
266 : 0 : double oldMax = layer->customProperty( QStringLiteral( "labeling/shadowRadiusMapUnitMaxScale" ), 0.0 ).toDouble();
267 : 0 : d->radiusMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
268 : 0 : }
269 : : else
270 : : {
271 : 0 : d->radiusMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( layer->customProperty( QStringLiteral( "labeling/shadowRadiusMapUnitScale" ) ).toString() );
272 : : }
273 : 0 : d->radiusAlphaOnly = layer->customProperty( QStringLiteral( "labeling/shadowRadiusAlphaOnly" ), QVariant( false ) ).toBool();
274 : :
275 : 0 : if ( layer->customProperty( QStringLiteral( "labeling/shadowOpacity" ) ).toString().isEmpty() )
276 : : {
277 : 0 : d->opacity = ( 1 - layer->customProperty( QStringLiteral( "labeling/shadowTransparency" ) ).toInt() / 100.0 ); //0 -100
278 : 0 : }
279 : : else
280 : : {
281 : 0 : d->opacity = ( layer->customProperty( QStringLiteral( "labeling/shadowOpacity" ) ).toDouble() );
282 : : }
283 : 0 : d->scale = layer->customProperty( QStringLiteral( "labeling/shadowScale" ), QVariant( 100 ) ).toInt();
284 : 0 : d->color = QgsTextRendererUtils::readColor( layer, QStringLiteral( "labeling/shadowColor" ), Qt::black, false );
285 : 0 : d->blendMode = QgsPainting::getCompositionMode(
286 : 0 : static_cast< QgsPainting::BlendMode >( layer->customProperty( QStringLiteral( "labeling/shadowBlendMode" ), QVariant( QgsPainting::BlendMultiply ) ).toUInt() ) );
287 : 0 : }
288 : :
289 : 0 : void QgsTextShadowSettings::readXml( const QDomElement &elem )
290 : : {
291 : 0 : QDomElement shadowElem = elem.firstChildElement( QStringLiteral( "shadow" ) );
292 : 0 : d->enabled = shadowElem.attribute( QStringLiteral( "shadowDraw" ), QStringLiteral( "0" ) ).toInt();
293 : 0 : d->shadowUnder = static_cast< ShadowPlacement >( shadowElem.attribute( QStringLiteral( "shadowUnder" ), QString::number( ShadowLowest ) ).toUInt() );//ShadowLowest;
294 : 0 : d->offsetAngle = shadowElem.attribute( QStringLiteral( "shadowOffsetAngle" ), QStringLiteral( "135" ) ).toInt();
295 : 0 : d->offsetDist = shadowElem.attribute( QStringLiteral( "shadowOffsetDist" ), QStringLiteral( "1" ) ).toDouble();
296 : :
297 : 0 : if ( !shadowElem.hasAttribute( QStringLiteral( "shadowOffsetUnit" ) ) )
298 : : {
299 : 0 : d->offsetUnits = QgsTextRendererUtils::convertFromOldLabelUnit( shadowElem.attribute( QStringLiteral( "shadowOffsetUnits" ) ).toUInt() );
300 : 0 : }
301 : : else
302 : : {
303 : 0 : d->offsetUnits = QgsUnitTypes::decodeRenderUnit( shadowElem.attribute( QStringLiteral( "shadowOffsetUnit" ) ) );
304 : : }
305 : :
306 : 0 : if ( !shadowElem.hasAttribute( QStringLiteral( "shadowOffsetMapUnitScale" ) ) )
307 : : {
308 : : //fallback to older property
309 : 0 : double oldMin = shadowElem.attribute( QStringLiteral( "shadowOffsetMapUnitMinScale" ), QStringLiteral( "0" ) ).toDouble();
310 : 0 : d->offsetMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
311 : 0 : double oldMax = shadowElem.attribute( QStringLiteral( "shadowOffsetMapUnitMaxScale" ), QStringLiteral( "0" ) ).toDouble();
312 : 0 : d->offsetMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
313 : 0 : }
314 : : else
315 : : {
316 : 0 : d->offsetMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( shadowElem.attribute( QStringLiteral( "shadowOffsetMapUnitScale" ) ) );
317 : : }
318 : 0 : d->offsetGlobal = shadowElem.attribute( QStringLiteral( "shadowOffsetGlobal" ), QStringLiteral( "1" ) ).toInt();
319 : 0 : d->radius = shadowElem.attribute( QStringLiteral( "shadowRadius" ), QStringLiteral( "1.5" ) ).toDouble();
320 : :
321 : 0 : if ( !shadowElem.hasAttribute( QStringLiteral( "shadowRadiusUnit" ) ) )
322 : : {
323 : 0 : d->radiusUnits = QgsTextRendererUtils::convertFromOldLabelUnit( shadowElem.attribute( QStringLiteral( "shadowRadiusUnits" ) ).toUInt() );
324 : 0 : }
325 : : else
326 : : {
327 : 0 : d->radiusUnits = QgsUnitTypes::decodeRenderUnit( shadowElem.attribute( QStringLiteral( "shadowRadiusUnit" ) ) );
328 : : }
329 : 0 : if ( !shadowElem.hasAttribute( QStringLiteral( "shadowRadiusMapUnitScale" ) ) )
330 : : {
331 : : //fallback to older property
332 : 0 : double oldMin = shadowElem.attribute( QStringLiteral( "shadowRadiusMapUnitMinScale" ), QStringLiteral( "0" ) ).toDouble();
333 : 0 : d->radiusMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
334 : 0 : double oldMax = shadowElem.attribute( QStringLiteral( "shadowRadiusMapUnitMaxScale" ), QStringLiteral( "0" ) ).toDouble();
335 : 0 : d->radiusMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
336 : 0 : }
337 : : else
338 : : {
339 : 0 : d->radiusMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( shadowElem.attribute( QStringLiteral( "shadowRadiusMapUnitScale" ) ) );
340 : : }
341 : 0 : d->radiusAlphaOnly = shadowElem.attribute( QStringLiteral( "shadowRadiusAlphaOnly" ), QStringLiteral( "0" ) ).toInt();
342 : :
343 : 0 : if ( !shadowElem.hasAttribute( QStringLiteral( "shadowOpacity" ) ) )
344 : : {
345 : 0 : d->opacity = ( 1 - shadowElem.attribute( QStringLiteral( "shadowTransparency" ) ).toInt() / 100.0 ); //0 -100
346 : 0 : }
347 : : else
348 : : {
349 : 0 : d->opacity = ( shadowElem.attribute( QStringLiteral( "shadowOpacity" ) ).toDouble() );
350 : : }
351 : 0 : d->scale = shadowElem.attribute( QStringLiteral( "shadowScale" ), QStringLiteral( "100" ) ).toInt();
352 : 0 : d->color = QgsSymbolLayerUtils::decodeColor( shadowElem.attribute( QStringLiteral( "shadowColor" ), QgsSymbolLayerUtils::encodeColor( Qt::black ) ) );
353 : 0 : d->blendMode = QgsPainting::getCompositionMode(
354 : 0 : static_cast< QgsPainting::BlendMode >( shadowElem.attribute( QStringLiteral( "shadowBlendMode" ), QString::number( QgsPainting::BlendMultiply ) ).toUInt() ) );
355 : 0 : }
356 : :
357 : 0 : QDomElement QgsTextShadowSettings::writeXml( QDomDocument &doc ) const
358 : : {
359 : 0 : QDomElement shadowElem = doc.createElement( QStringLiteral( "shadow" ) );
360 : 0 : shadowElem.setAttribute( QStringLiteral( "shadowDraw" ), d->enabled );
361 : 0 : shadowElem.setAttribute( QStringLiteral( "shadowUnder" ), static_cast< unsigned int >( d->shadowUnder ) );
362 : 0 : shadowElem.setAttribute( QStringLiteral( "shadowOffsetAngle" ), d->offsetAngle );
363 : 0 : shadowElem.setAttribute( QStringLiteral( "shadowOffsetDist" ), d->offsetDist );
364 : 0 : shadowElem.setAttribute( QStringLiteral( "shadowOffsetUnit" ), QgsUnitTypes::encodeUnit( d->offsetUnits ) );
365 : 0 : shadowElem.setAttribute( QStringLiteral( "shadowOffsetMapUnitScale" ), QgsSymbolLayerUtils::encodeMapUnitScale( d->offsetMapUnitScale ) );
366 : 0 : shadowElem.setAttribute( QStringLiteral( "shadowOffsetGlobal" ), d->offsetGlobal );
367 : 0 : shadowElem.setAttribute( QStringLiteral( "shadowRadius" ), d->radius );
368 : 0 : shadowElem.setAttribute( QStringLiteral( "shadowRadiusUnit" ), QgsUnitTypes::encodeUnit( d->radiusUnits ) );
369 : 0 : shadowElem.setAttribute( QStringLiteral( "shadowRadiusMapUnitScale" ), QgsSymbolLayerUtils::encodeMapUnitScale( d->radiusMapUnitScale ) );
370 : 0 : shadowElem.setAttribute( QStringLiteral( "shadowRadiusAlphaOnly" ), d->radiusAlphaOnly );
371 : 0 : shadowElem.setAttribute( QStringLiteral( "shadowOpacity" ), d->opacity );
372 : 0 : shadowElem.setAttribute( QStringLiteral( "shadowScale" ), d->scale );
373 : 0 : shadowElem.setAttribute( QStringLiteral( "shadowColor" ), QgsSymbolLayerUtils::encodeColor( d->color ) );
374 : 0 : shadowElem.setAttribute( QStringLiteral( "shadowBlendMode" ), QgsPainting::getBlendModeEnum( d->blendMode ) );
375 : 0 : return shadowElem;
376 : 0 : }
377 : :
378 : 0 : void QgsTextShadowSettings::updateDataDefinedProperties( QgsRenderContext &context, const QgsPropertyCollection &properties )
379 : : {
380 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShadowDraw ) )
381 : : {
382 : 0 : context.expressionContext().setOriginalValueVariable( d->enabled );
383 : 0 : d->enabled = properties.valueAsBool( QgsPalLayerSettings::ShadowDraw, context.expressionContext(), d->enabled );
384 : 0 : }
385 : :
386 : : // data defined shadow under type?
387 : 0 : QVariant exprVal = properties.value( QgsPalLayerSettings::ShadowUnder, context.expressionContext() );
388 : 0 : if ( exprVal.isValid() )
389 : : {
390 : 0 : QString str = exprVal.toString().trimmed();
391 : 0 : if ( !str.isEmpty() )
392 : : {
393 : 0 : d->shadowUnder = QgsTextRendererUtils::decodeShadowPlacementType( str );
394 : 0 : }
395 : 0 : }
396 : :
397 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShadowOffsetAngle ) )
398 : : {
399 : 0 : context.expressionContext().setOriginalValueVariable( d->offsetAngle );
400 : 0 : d->offsetAngle = properties.valueAsInt( QgsPalLayerSettings::ShadowOffsetAngle, context.expressionContext(), d->offsetAngle );
401 : 0 : }
402 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShadowOffsetDist ) )
403 : : {
404 : 0 : context.expressionContext().setOriginalValueVariable( d->offsetDist );
405 : 0 : d->offsetDist = properties.valueAsDouble( QgsPalLayerSettings::ShadowOffsetDist, context.expressionContext(), d->offsetDist );
406 : 0 : }
407 : :
408 : 0 : exprVal = properties.value( QgsPalLayerSettings::ShadowOffsetUnits, context.expressionContext() );
409 : 0 : if ( exprVal.isValid() )
410 : : {
411 : 0 : QString units = exprVal.toString();
412 : 0 : if ( !units.isEmpty() )
413 : : {
414 : : bool ok;
415 : 0 : QgsUnitTypes::RenderUnit res = QgsUnitTypes::decodeRenderUnit( units, &ok );
416 : 0 : if ( ok )
417 : 0 : d->offsetUnits = res;
418 : 0 : }
419 : 0 : }
420 : :
421 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShadowRadius ) )
422 : : {
423 : 0 : context.expressionContext().setOriginalValueVariable( d->radius );
424 : 0 : d->radius = properties.valueAsDouble( QgsPalLayerSettings::ShadowRadius, context.expressionContext(), d->radius );
425 : 0 : }
426 : :
427 : 0 : exprVal = properties.value( QgsPalLayerSettings::ShadowRadiusUnits, context.expressionContext() );
428 : 0 : if ( exprVal.isValid() )
429 : : {
430 : 0 : QString units = exprVal.toString();
431 : 0 : if ( !units.isEmpty() )
432 : : {
433 : : bool ok;
434 : 0 : QgsUnitTypes::RenderUnit res = QgsUnitTypes::decodeRenderUnit( units, &ok );
435 : 0 : if ( ok )
436 : 0 : d->radiusUnits = res;
437 : 0 : }
438 : 0 : }
439 : :
440 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShadowOpacity ) )
441 : : {
442 : 0 : context.expressionContext().setOriginalValueVariable( d->opacity * 100 );
443 : 0 : d->opacity = properties.value( QgsPalLayerSettings::ShadowOpacity, context.expressionContext(), d->opacity * 100 ).toDouble() / 100.0;
444 : 0 : }
445 : :
446 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShadowScale ) )
447 : : {
448 : 0 : context.expressionContext().setOriginalValueVariable( d->scale );
449 : 0 : d->scale = properties.valueAsInt( QgsPalLayerSettings::ShadowScale, context.expressionContext(), d->scale );
450 : 0 : }
451 : :
452 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShadowColor ) )
453 : : {
454 : 0 : context.expressionContext().setOriginalValueVariable( QgsSymbolLayerUtils::encodeColor( d->color ) );
455 : 0 : d->color = properties.valueAsColor( QgsPalLayerSettings::ShadowColor, context.expressionContext(), d->color );
456 : 0 : }
457 : :
458 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShadowBlendMode ) )
459 : : {
460 : 0 : exprVal = properties.value( QgsPalLayerSettings::ShadowBlendMode, context.expressionContext() );
461 : 0 : QString blendstr = exprVal.toString().trimmed();
462 : 0 : if ( !blendstr.isEmpty() )
463 : 0 : d->blendMode = QgsSymbolLayerUtils::decodeBlendMode( blendstr );
464 : 0 : }
465 : 0 : }
466 : :
467 : 0 : QSet<QString> QgsTextShadowSettings::referencedFields( const QgsRenderContext & ) const
468 : : {
469 : 0 : return QSet< QString >(); // nothing for now
470 : : }
|