QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgssinglebandcolordatarenderer.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgssinglebandcolordatarenderer.cpp
3 ----------------------------------
4 begin : January 2012
5 copyright : (C) 2012 by Marco Hugentobler
6 email : marco at sourcepole dot ch
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
20#include "qgsrasterviewport.h"
21#include <QDomDocument>
22#include <QDomElement>
23#include <QImage>
24#include <memory>
25
27 : QgsRasterRenderer( input, QStringLiteral( "singlebandcolordata" ) )
28 , mBand( band )
29{
30
31}
32
34{
35 QgsSingleBandColorDataRenderer *renderer = new QgsSingleBandColorDataRenderer( nullptr, mBand );
36 renderer->copyCommonProperties( this );
37 return renderer;
38}
39
41{
43}
44
46{
47 if ( elem.isNull() )
48 {
49 return nullptr;
50 }
51
52 const int band = elem.attribute( QStringLiteral( "band" ), QStringLiteral( "-1" ) ).toInt();
54 r->readXml( elem );
55 return r;
56}
57
58QgsRasterBlock *QgsSingleBandColorDataRenderer::block( int bandNo, QgsRectangle const &extent, int width, int height, QgsRasterBlockFeedback *feedback )
59{
60 Q_UNUSED( bandNo )
61
62 std::unique_ptr< QgsRasterBlock > outputBlock( new QgsRasterBlock() );
63 if ( !mInput )
64 {
65 return outputBlock.release();
66 }
67
68 std::unique_ptr< QgsRasterBlock > inputBlock( mInput->block( mBand, extent, width, height, feedback ) );
69 if ( !inputBlock || inputBlock->isEmpty() )
70 {
71 QgsDebugError( QStringLiteral( "No raster data!" ) );
72 return outputBlock.release();
73 }
74
75 const bool hasTransparency = usesTransparency();
76 if ( !hasTransparency )
77 {
78 // Nothing to do, just retype if necessary
79 inputBlock->convert( Qgis::DataType::ARGB32_Premultiplied );
80 return inputBlock.release();
81 }
82
83 if ( !outputBlock->reset( Qgis::DataType::ARGB32_Premultiplied, width, height ) )
84 {
85 return outputBlock.release();
86 }
87
88 // make sure input is also premultiplied!
89 inputBlock->convert( Qgis::DataType::ARGB32_Premultiplied );
90
91 QRgb *inputBits = ( QRgb * )inputBlock->bits();
92 QRgb *outputBits = ( QRgb * )outputBlock->bits();
93 for ( qgssize i = 0; i < ( qgssize )width * height; i++ )
94 {
95 const QRgb c = inputBits[i];
96 outputBits[i] = qRgba( mOpacity * qRed( c ), mOpacity * qGreen( c ), mOpacity * qBlue( c ), mOpacity * qAlpha( c ) );
97 }
98
99 return outputBlock.release();
100}
101
102void QgsSingleBandColorDataRenderer::writeXml( QDomDocument &doc, QDomElement &parentElem ) const
103{
104 if ( parentElem.isNull() )
105 return;
106
107 QDomElement rasterRendererElem = doc.createElement( QStringLiteral( "rasterrenderer" ) );
108 _writeXml( doc, rasterRendererElem );
109 rasterRendererElem.setAttribute( QStringLiteral( "band" ), mBand );
110 parentElem.appendChild( rasterRendererElem );
111}
112
114{
115 QList<int> bandList;
116 if ( mBand != -1 )
117 {
118 bandList << mBand;
119 }
120 return bandList;
121}
122
124{
125 // Renderer can only work with numerical values in at least 1 band
126 if ( !input ) return false;
127
128 if ( !mOn )
129 {
130 // In off mode we can connect to anything
131 mInput = input;
132 return true;
133 }
134
135 if ( input->dataType( 1 ) == Qgis::DataType::ARGB32 ||
137 {
138 mInput = input;
139 return true;
140 }
141 return false;
142}
143
145{
146 return mBand;
147}
148
150{
151 if ( !mInput )
152 {
153 mBand = band;
154 return true;
155 }
156 else if ( band > 0 && band <= mInput->bandCount() )
157 {
158 mBand = band;
159 return true;
160 }
161 return false;
162}
QFlags< RasterRendererFlag > RasterRendererFlags
Flags which control behavior of raster renderers.
Definition: qgis.h:1161
@ InternalLayerOpacityHandling
The renderer internally handles the raster layer's opacity, so the default layer level opacity handli...
@ ARGB32_Premultiplied
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied.
@ ARGB32
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32.
Feedback object tailored for raster block reading.
Raster data container.
Base class for processing filters like renderers, reprojector, resampler etc.
virtual QgsRasterBlock * block(int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback=nullptr)=0
Read block of data using given extent and size.
virtual Qgis::DataType dataType(int bandNo) const =0
Returns data type for the band specified by number.
QgsRasterInterface * mInput
virtual QgsRectangle extent() const
Gets the extent of the interface.
virtual QgsRasterInterface * input() const
Current input.
Raster renderer pipe that applies colors to a raster.
double mOpacity
Global alpha value (0-1)
void _writeXml(QDomDocument &doc, QDomElement &rasterRendererElem) const
Write upper class info into rasterrenderer element (called by writeXml method of subclasses)
int bandCount() const override
Gets number of bands.
bool usesTransparency() const
void copyCommonProperties(const QgsRasterRenderer *other, bool copyMinMaxOrigin=true)
Copies common properties like opacity / transparency data from other renderer.
void readXml(const QDomElement &rendererElem) override
Sets base class members from xml. Usually called from create() methods of subclasses.
A rectangle specified with double values.
Definition: qgsrectangle.h:42
Raster renderer pipe for single band color.
Qgis::RasterRendererFlags flags() const override
Returns flags which dictate renderer behavior.
QgsSingleBandColorDataRenderer(QgsRasterInterface *input, int band)
void writeXml(QDomDocument &doc, QDomElement &parentElem) const override
Write base class members to xml.
QgsSingleBandColorDataRenderer * clone() const override
Clone itself, create deep copy.
bool setInput(QgsRasterInterface *input) override
Set input.
static QgsRasterRenderer * create(const QDomElement &elem, QgsRasterInterface *input)
QList< int > usesBands() const override
Returns a list of band numbers used by the renderer.
QgsRasterBlock * block(int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback=nullptr) override
Read block of data using given extent and size.
int inputBand() const override
Returns the input band for the renderer, or -1 if no input band is available.
bool setInputBand(int band) override
Attempts to set the input band for the renderer.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
unsigned long long qgssize
Qgssize is used instead of size_t, because size_t is stdlib type, unknown by SIP, and it would be har...
Definition: qgis.h:5747
#define QgsDebugError(str)
Definition: qgslogger.h:38