36 for (
int i = 0; i < pipe.
size(); i++ )
45 clone->setInput( mInterfaces.at( i - 1 ) );
47 mInterfaces.append( clone );
48 if ( role != Qgis::RasterPipeInterfaceRole::Unknown )
50 mRoleMap.insert( role, i );
54 mDataDefinedProperties = pipe.mDataDefinedProperties;
59 const auto constMInterfaces = mInterfaces;
66bool QgsRasterPipe::connect( QVector<QgsRasterInterface *> interfaces )
69 for (
int i = 1; i < interfaces.size(); i++ )
71 if ( ! interfaces[i]->setInput( interfaces[i - 1] ) )
76 QgsDebugMsg( QStringLiteral(
"cannot connect %1 to %2" ).arg(
typeid( a ).name(),
typeid( b ).name() ) );
86 QgsDebugMsgLevel( QStringLiteral(
"insert %1 at %2" ).arg(
typeid( *interface ).name() ).arg( idx ), 4 );
87 if ( idx > mInterfaces.size() )
89 idx = mInterfaces.size();
93 QVector<QgsRasterInterface *> interfaces = mInterfaces;
95 interfaces.insert( idx, interface );
97 if ( connect( interfaces ) )
100 mInterfaces.insert( idx, interface );
101 setRole( interface, idx );
106 QgsDebugMsgLevel( QStringLiteral(
"Error inserting pipe %1" ).arg( idx ), 4 );
110 connect( mInterfaces );
116 if ( !interface )
return false;
118 QgsDebugMsgLevel( QStringLiteral(
"replace by %1 at %2" ).arg(
typeid( *interface ).name() ).arg( idx ), 4 );
119 if ( !checkBounds( idx ) )
return false;
123 QVector<QgsRasterInterface *> interfaces = mInterfaces;
125 interfaces[idx] = interface;
126 bool success =
false;
127 if ( connect( interfaces ) )
130 delete mInterfaces.at( idx );
131 mInterfaces[idx] = interface;
132 setRole( interface, idx );
137 connect( mInterfaces );
145 role = Qgis::RasterPipeInterfaceRole::Provider;
147 role = Qgis::RasterPipeInterfaceRole::Renderer;
149 role = Qgis::RasterPipeInterfaceRole::Resampler;
151 role = Qgis::RasterPipeInterfaceRole::Brightness;
153 role = Qgis::RasterPipeInterfaceRole::HueSaturation;
155 role = Qgis::RasterPipeInterfaceRole::Projector;
157 role = Qgis::RasterPipeInterfaceRole::Nuller;
166 if ( role == Qgis::RasterPipeInterfaceRole::Unknown )
169 mRoleMap.insert( role, idx );
175 if ( role == Qgis::RasterPipeInterfaceRole::Unknown )
178 const int roleIdx{ mRoleMap[role] };
179 mRoleMap.remove( role );
182 const auto roleMapValues {mRoleMap.values()};
183 if ( roleIdx < *std::max_element( roleMapValues.begin(), roleMapValues.end() ) )
185 for (
auto it = mRoleMap.cbegin(); it != mRoleMap.cend(); ++it )
187 if ( it.value() > roleIdx )
189 mRoleMap[it.key()] = it.value() - 1;
204 if ( role == Qgis::RasterPipeInterfaceRole::Unknown )
208 if ( mRoleMap.contains( role ) )
212 return replace( mRoleMap.value( role ), interface );
223 int providerIdx = mRoleMap.value( Qgis::RasterPipeInterfaceRole::Provider, -1 );
224 int rendererIdx = mRoleMap.value( Qgis::RasterPipeInterfaceRole::Renderer, -1 );
225 int resamplerIdx = mRoleMap.value( Qgis::RasterPipeInterfaceRole::Resampler, -1 );
226 int brightnessIdx = mRoleMap.value( Qgis::RasterPipeInterfaceRole::Brightness, -1 );
227 int hueSaturationIdx = mRoleMap.value( Qgis::RasterPipeInterfaceRole::HueSaturation, -1 );
229 if ( role == Qgis::RasterPipeInterfaceRole::Provider )
233 else if ( role == Qgis::RasterPipeInterfaceRole::Renderer )
235 idx = providerIdx + 1;
237 else if ( role == Qgis::RasterPipeInterfaceRole::Brightness )
239 idx = std::max( providerIdx, rendererIdx ) + 1;
241 else if ( role == Qgis::RasterPipeInterfaceRole::HueSaturation )
243 idx = std::max( std::max( providerIdx, rendererIdx ), brightnessIdx ) + 1;
245 else if ( role == Qgis::RasterPipeInterfaceRole::Resampler )
247 idx = std::max( std::max( std::max( providerIdx, rendererIdx ), brightnessIdx ), hueSaturationIdx ) + 1;
249 else if ( role == Qgis::RasterPipeInterfaceRole::Projector )
251 idx = std::max( std::max( std::max( std::max( providerIdx, rendererIdx ), brightnessIdx ), hueSaturationIdx ), resamplerIdx ) + 1;
254 return insert( idx, interface );
260 if ( mRoleMap.contains( role ) )
262 return mInterfaces.value( mRoleMap.value( role ) );
269 return dynamic_cast<QgsRasterDataProvider *
>( interface( Qgis::RasterPipeInterfaceRole::Provider ) );
274 return dynamic_cast<QgsRasterRenderer *
>( interface( Qgis::RasterPipeInterfaceRole::Renderer ) );
289 return dynamic_cast<QgsHueSaturationFilter *
>( interface( Qgis::RasterPipeInterfaceRole::HueSaturation ) );
294 return dynamic_cast<QgsRasterProjector *
>( interface( Qgis::RasterPipeInterfaceRole::Projector ) );
299 return dynamic_cast<QgsRasterNuller *
>( interface( Qgis::RasterPipeInterfaceRole::Nuller ) );
306 if ( !checkBounds( idx ) )
311 QVector<QgsRasterInterface *> interfaces = mInterfaces;
313 interfaces.remove( idx );
314 bool success =
false;
315 if ( connect( interfaces ) )
318 unsetRole( mInterfaces.at( idx ) );
319 delete mInterfaces.at( idx );
320 mInterfaces.remove( idx );
325 QgsDebugMsgLevel( QStringLiteral(
"Error removing pipe %1" ).arg( idx ), 4 );
329 connect( mInterfaces );
336 if ( !interface )
return false;
338 return remove( mInterfaces.indexOf( interface ) );
343 QgsDebugMsgLevel( QStringLiteral(
"idx = %1 on = %2" ).arg( idx ).arg( on ), 4 );
344 if ( !checkBounds( idx ) )
349 bool onOrig = mInterfaces.at( idx )->on();
354 mInterfaces.at( idx )->setOn( on );
356 bool success = connect( mInterfaces );
358 mInterfaces.at( idx )->setOn( onOrig );
359 connect( mInterfaces );
365 QgsDebugMsgLevel( QStringLiteral(
"idx = %1 on = %2" ).arg( idx ).arg( on ), 4 );
366 if ( !checkBounds( idx ) )
369 bool onOrig = mInterfaces.at( idx )->on();
374 mInterfaces.at( idx )->setOn( on );
376 if ( connect( mInterfaces ) )
379 mInterfaces.at( idx )->setOn( onOrig );
380 connect( mInterfaces );
385bool QgsRasterPipe::checkBounds(
int idx )
const
387 return !( idx < 0 || idx >= mInterfaces.size() );
392 mResamplingStage = stage;
394 int resamplerIndex = 0;
397 if ( interfaceRole( interface ) == Qgis::RasterPipeInterfaceRole::Resampler )
420 const double prevOpacity = r->opacity();
426 r->setOpacity( opacity );
434void QgsRasterPipe::initPropertyDefinitions()
436 const QString origin = QStringLiteral(
"raster" );
446 static std::once_flag initialized;
447 std::call_once( initialized, [ = ]( )
449 initPropertyDefinitions();
451 return sPropertyDefinitions;
RasterResamplingStage
Stage at which raster resampling occurs.
@ Provider
Resampling occurs in Provider.
@ ResampleFilter
Resampling occurs in ResamplingFilter.
RasterPipeInterfaceRole
Sublayer flags.
double valueAsDouble(int key, const QgsExpressionContext &context, double defaultValue=0.0, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a double.
Brightness/contrast and gamma correction filter pipe for rasters.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for the context.
Color and saturation filter pipe for rasters.
bool isActive(int key) const override
Returns true if the collection contains an active property with the specified key.
bool hasActiveProperties() const override
Returns true if the collection has any active properties, or false if all properties within the colle...
Definition for a property.
Base class for raster data providers.
Base class for processing filters like renderers, reprojector, resampler etc.
virtual QgsRasterInterface * clone() const =0
Clone itself, create deep copy.
Raster pipe that deals with null values.
Contains a pipeline of raster interfaces for sequential raster processing.
bool set(QgsRasterInterface *interface)
Inserts a new known interface in default place or replace interface of the same role if it already ex...
int size() const
Returns the size of the pipe (the number of interfaces contained in the pipe).
QgsRasterPipe()=default
Constructor for an empty QgsRasterPipe.
QgsRasterResampleFilter * resampleFilter() const
Returns the resample filter interface, or nullptr if no resample filter is present in the pipe.
bool replace(int idx, QgsRasterInterface *interface)
Attempts to replace the interface at specified index and reconnect the pipe.
QgsRasterDataProvider * provider() const
Returns the data provider interface, or nullptr if no data provider is present in the pipe.
bool canSetOn(int idx, bool on)
Returns true if the interface at the specified index may be switched on or off.
bool insert(int idx, QgsRasterInterface *interface)
Attempts to insert interface at specified index and connect if connection would fail,...
void setResamplingStage(Qgis::RasterResamplingStage stage)
Sets which stage of the pipe should apply resampling.
void evaluateDataDefinedProperties(QgsExpressionContext &context)
Evaluates any data defined properties set on the pipe, applying their results to the corresponding in...
QgsRasterProjector * projector() const
Returns the projector interface, or nullptr if no projector is present in the pipe.
bool remove(int idx)
Removes and deletes the interface at given index (if possible).
static QgsPropertiesDefinition propertyDefinitions()
Returns the definitions for data defined properties available for use in raster pipes.
QgsRasterRenderer * renderer() const
Returns the raster renderer interface, or nullptr if no raster renderer is present in the pipe.
@ RendererOpacity
Raster renderer global opacity.
Qgis::RasterResamplingStage resamplingStage() const
Returns which stage of the pipe should apply resampling.
QgsBrightnessContrastFilter * brightnessFilter() const
Returns the brightness filter interface, or nullptr if no brightness filter is present in the pipe.
QgsHueSaturationFilter * hueSaturationFilter() const
Returns the hue/saturation interface, or nullptr if no hue/saturation filter is present in the pipe.
QgsRasterNuller * nuller() const
Returns the raster nuller interface, or nullptr if no raster nuller is present in the pipe.
bool setOn(int idx, bool on)
Set whether the interface at the specified index is enabled.
QgsRasterProjector implements approximate projection support for it calculates grid of points in sour...
Raster renderer pipe that applies colors to a raster.
Resample filter pipe for rasters.
QString qgsEnumValueToKey(const T &value, bool *returnOk=nullptr)
Returns the value for the given key of an enum.
#define QgsDebugMsgLevel(str, level)
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.