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;
 
   69  auto it = mRoleMap.find( Qgis::RasterPipeInterfaceRole::Provider );
 
   70  if ( it != mRoleMap.end() )
 
   74      dp->moveToThread( thread );
 
   79bool QgsRasterPipe::connect( QVector<QgsRasterInterface *> interfaces )
 
   82  for ( 
int i = 1; i < interfaces.size(); i++ )
 
   84    if ( ! interfaces[i]->setInput( interfaces[i - 1] ) )
 
   89      QgsDebugError( QStringLiteral( 
"cannot connect %1 to %2" ).arg( 
typeid( a ).name(), 
typeid( b ).name() ) );
 
   99  QgsDebugMsgLevel( QStringLiteral( 
"insert %1 at %2" ).arg( 
typeid( *interface ).name() ).arg( idx ), 4 );
 
  100  if ( idx > mInterfaces.size() )
 
  102    idx = mInterfaces.size();
 
  106  QVector<QgsRasterInterface *> interfaces = mInterfaces;
 
  108  interfaces.insert( idx, interface );
 
  109  bool success = 
false;
 
  110  if ( connect( interfaces ) )
 
  113    mInterfaces.insert( idx, interface );
 
  114    setRole( interface, idx );
 
  119    QgsDebugMsgLevel( QStringLiteral( 
"Error inserting pipe %1" ).arg( idx ), 4 );
 
  123  connect( mInterfaces );
 
  129  if ( !interface ) 
return false;
 
  131  QgsDebugMsgLevel( QStringLiteral( 
"replace by %1 at %2" ).arg( 
typeid( *interface ).name() ).arg( idx ), 4 );
 
  132  if ( !checkBounds( idx ) ) 
return false;
 
  136  QVector<QgsRasterInterface *> interfaces = mInterfaces;
 
  138  interfaces[idx] = interface;
 
  139  bool success = 
false;
 
  140  if ( connect( interfaces ) )
 
  143    delete mInterfaces.at( idx );
 
  144    mInterfaces[idx] = interface;
 
  145    setRole( interface, idx );
 
  150  connect( mInterfaces );
 
  158    role = Qgis::RasterPipeInterfaceRole::Provider;
 
  160    role = Qgis::RasterPipeInterfaceRole::Renderer;
 
  162    role = Qgis::RasterPipeInterfaceRole::Resampler;
 
  164    role = Qgis::RasterPipeInterfaceRole::Brightness;
 
  166    role = Qgis::RasterPipeInterfaceRole::HueSaturation;
 
  168    role = Qgis::RasterPipeInterfaceRole::Projector;
 
  170    role = Qgis::RasterPipeInterfaceRole::Nuller;
 
  179  if ( role == Qgis::RasterPipeInterfaceRole::Unknown )
 
  182  mRoleMap.insert( role, idx );
 
  188  if ( role == Qgis::RasterPipeInterfaceRole::Unknown )
 
  191  const int roleIdx{ mRoleMap[role] };
 
  192  mRoleMap.remove( role );
 
  195  const auto roleMapValues {mRoleMap.values()};
 
  196  if ( roleIdx < *std::max_element( roleMapValues.begin(), roleMapValues.end() ) )
 
  198    for ( 
auto it = mRoleMap.cbegin(); it != mRoleMap.cend(); ++it )
 
  200      if ( it.value() > roleIdx )
 
  202        mRoleMap[it.key()] = it.value() - 1;
 
  217  if ( role == Qgis::RasterPipeInterfaceRole::Unknown )
 
  221  if ( mRoleMap.contains( role ) )
 
  225    return replace( mRoleMap.value( role ), interface );
 
  236  int providerIdx = mRoleMap.value( Qgis::RasterPipeInterfaceRole::Provider, -1 );
 
  237  int rendererIdx = mRoleMap.value( Qgis::RasterPipeInterfaceRole::Renderer, -1 );
 
  238  int resamplerIdx = mRoleMap.value( Qgis::RasterPipeInterfaceRole::Resampler, -1 );
 
  239  int brightnessIdx = mRoleMap.value( Qgis::RasterPipeInterfaceRole::Brightness, -1 );
 
  240  int hueSaturationIdx = mRoleMap.value( Qgis::RasterPipeInterfaceRole::HueSaturation, -1 );
 
  242  if ( role == Qgis::RasterPipeInterfaceRole::Provider )
 
  246  else if ( role == Qgis::RasterPipeInterfaceRole::Renderer )
 
  248    idx = providerIdx + 1;
 
  250  else if ( role == Qgis::RasterPipeInterfaceRole::Brightness )
 
  252    idx = std::max( providerIdx, rendererIdx ) + 1;
 
  254  else if ( role == Qgis::RasterPipeInterfaceRole::HueSaturation )
 
  256    idx = std::max( std::max( providerIdx, rendererIdx ), brightnessIdx ) + 1;
 
  258  else if ( role == Qgis::RasterPipeInterfaceRole::Resampler )
 
  260    idx = std::max( std::max( std::max( providerIdx, rendererIdx ), brightnessIdx ), hueSaturationIdx ) + 1;
 
  262  else if ( role == Qgis::RasterPipeInterfaceRole::Projector )
 
  264    idx = std::max( std::max( std::max( std::max( providerIdx, rendererIdx ), brightnessIdx ), hueSaturationIdx ), resamplerIdx )  + 1;
 
  267  return insert( idx, interface );  
 
  273  if ( mRoleMap.contains( role ) )
 
  275    return mInterfaces.value( mRoleMap.value( role ) );
 
  282  return dynamic_cast<QgsRasterDataProvider *
>( interface( Qgis::RasterPipeInterfaceRole::Provider ) );
 
  287  return dynamic_cast<QgsRasterRenderer *
>( interface( Qgis::RasterPipeInterfaceRole::Renderer ) );
 
  302  return dynamic_cast<QgsHueSaturationFilter *
>( interface( Qgis::RasterPipeInterfaceRole::HueSaturation ) );
 
  307  return dynamic_cast<QgsRasterProjector *
>( interface( Qgis::RasterPipeInterfaceRole::Projector ) );
 
  312  return dynamic_cast<QgsRasterNuller *
>( interface( Qgis::RasterPipeInterfaceRole::Nuller ) );
 
  319  if ( !checkBounds( idx ) )
 
  324  QVector<QgsRasterInterface *> interfaces = mInterfaces;
 
  326  interfaces.remove( idx );
 
  327  bool success = 
false;
 
  328  if ( connect( interfaces ) )
 
  331    unsetRole( mInterfaces.at( idx ) );
 
  332    delete mInterfaces.at( idx );
 
  333    mInterfaces.remove( idx );
 
  338    QgsDebugMsgLevel( QStringLiteral( 
"Error removing pipe %1" ).arg( idx ), 4 );
 
  342  connect( mInterfaces );
 
  349  if ( !interface ) 
return false;
 
  351  return remove( mInterfaces.indexOf( interface ) );
 
  356  QgsDebugMsgLevel( QStringLiteral( 
"idx = %1 on = %2" ).arg( idx ).arg( on ), 4 );
 
  357  if ( !checkBounds( idx ) )
 
  362  bool onOrig = mInterfaces.at( idx )->on();
 
  367  mInterfaces.at( idx )->setOn( on );
 
  369  bool success = connect( mInterfaces );
 
  371  mInterfaces.at( idx )->setOn( onOrig );
 
  372  connect( mInterfaces );
 
  378  QgsDebugMsgLevel( QStringLiteral( 
"idx = %1 on = %2" ).arg( idx ).arg( on ), 4 );
 
  379  if ( !checkBounds( idx ) )
 
  382  bool onOrig = mInterfaces.at( idx )->on();
 
  387  mInterfaces.at( idx )->setOn( on );
 
  389  if ( connect( mInterfaces ) )
 
  392  mInterfaces.at( idx )->setOn( onOrig );
 
  393  connect( mInterfaces );
 
  398bool QgsRasterPipe::checkBounds( 
int idx )
 const 
  400  return !( idx < 0 || idx >= mInterfaces.size() );
 
  405  mResamplingStage = stage;
 
  407  int resamplerIndex = 0;
 
  410    if ( interfaceRole( interface ) == Qgis::RasterPipeInterfaceRole::Resampler )
 
  433      const double prevOpacity = r->opacity();
 
  439        r->setOpacity( opacity );
 
  447void QgsRasterPipe::initPropertyDefinitions()
 
  449  const QString origin = QStringLiteral( 
"raster" );
 
  459  static std::once_flag initialized;
 
  460  std::call_once( initialized, [ = ]( )
 
  462    initPropertyDefinitions();
 
  464  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.
 
void moveToThread(QThread *thread)
Moves the pipe to another thread.
 
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)
 
#define QgsDebugError(str)
 
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.