Branch data Line data Source code
1 : : /* ************************************************************************** 2 : : qgsrastertransparency.cpp - description 3 : : ------------------- 4 : : begin : Mon Nov 30 2007 5 : : copyright : (C) 2007 by Peter J. Ersts 6 : : email : ersts@amnh.org 7 : : 8 : : ****************************************************************************/ 9 : : 10 : : /* ************************************************************************** 11 : : * * 12 : : * This program is free software; you can redistribute it and/or modify * 13 : : * it under the terms of the GNU General Public License as published by * 14 : : * the Free Software Foundation; either version 2 of the License, or * 15 : : * (at your option) any later version. * 16 : : * * 17 : : ***************************************************************************/ 18 : : 19 : : #include "qgsrasterinterface.h" 20 : : #include "qgsrastertransparency.h" 21 : : #include "qgis.h" 22 : : #include "qgslogger.h" 23 : : 24 : : #include <QDomDocument> 25 : : #include <QDomElement> 26 : : 27 : 0 : QList<QgsRasterTransparency::TransparentSingleValuePixel> QgsRasterTransparency::transparentSingleValuePixelList() const 28 : : { 29 : 0 : return mTransparentSingleValuePixelList; 30 : : } 31 : : 32 : 0 : QList<QgsRasterTransparency::TransparentThreeValuePixel> QgsRasterTransparency::transparentThreeValuePixelList() const 33 : : { 34 : 0 : return mTransparentThreeValuePixelList; 35 : : } 36 : : 37 : 0 : void QgsRasterTransparency::initializeTransparentPixelList( double value ) 38 : : { 39 : : //clear the existing list 40 : 0 : mTransparentSingleValuePixelList.clear(); 41 : : 42 : : //add the initial value 43 : : TransparentSingleValuePixel myTransparentSingleValuePixel; 44 : 0 : myTransparentSingleValuePixel.min = value; 45 : 0 : myTransparentSingleValuePixel.max = value; 46 : 0 : myTransparentSingleValuePixel.percentTransparent = 100.0; 47 : 0 : mTransparentSingleValuePixelList.append( myTransparentSingleValuePixel ); 48 : 0 : } 49 : : 50 : 0 : void QgsRasterTransparency::initializeTransparentPixelList( double redValue, double greenValue, double blueValue ) 51 : : { 52 : : //clearn the existing list 53 : 0 : mTransparentThreeValuePixelList.clear(); 54 : : 55 : : //add the initial values 56 : : TransparentThreeValuePixel myTransparentThreeValuePixel; 57 : 0 : myTransparentThreeValuePixel.red = redValue; 58 : 0 : myTransparentThreeValuePixel.green = greenValue; 59 : 0 : myTransparentThreeValuePixel.blue = blueValue; 60 : 0 : myTransparentThreeValuePixel.percentTransparent = 100.0; 61 : 0 : mTransparentThreeValuePixelList.append( myTransparentThreeValuePixel ); 62 : 0 : } 63 : : 64 : 0 : void QgsRasterTransparency::setTransparentSingleValuePixelList( const QList<QgsRasterTransparency::TransparentSingleValuePixel> &newList ) 65 : : { 66 : 0 : mTransparentSingleValuePixelList = newList; 67 : 0 : } 68 : : 69 : 0 : void QgsRasterTransparency::setTransparentThreeValuePixelList( const QList<QgsRasterTransparency::TransparentThreeValuePixel> &newList ) 70 : : { 71 : 0 : mTransparentThreeValuePixelList = newList; 72 : 0 : } 73 : : 74 : 0 : int QgsRasterTransparency::alphaValue( double value, int globalTransparency ) const 75 : : { 76 : : //if NaN return 0, transparent 77 : 0 : if ( std::isnan( value ) ) 78 : : { 79 : 0 : return 0; 80 : : } 81 : : 82 : : //Search through the transparency list looking for a match 83 : 0 : bool myTransparentPixelFound = false; 84 : 0 : TransparentSingleValuePixel myTransparentPixel = {0, 0, 100}; 85 : 0 : for ( int myListRunner = 0; myListRunner < mTransparentSingleValuePixelList.count(); myListRunner++ ) 86 : : { 87 : 0 : myTransparentPixel = mTransparentSingleValuePixelList[myListRunner]; 88 : 0 : if ( ( value >= myTransparentPixel.min && value <= myTransparentPixel.max ) || 89 : 0 : qgsDoubleNear( value, myTransparentPixel.min ) || 90 : 0 : qgsDoubleNear( value, myTransparentPixel.max ) ) 91 : : { 92 : 0 : myTransparentPixelFound = true; 93 : 0 : break; 94 : : } 95 : 0 : } 96 : : 97 : : //if a match was found use the stored transparency percentage 98 : 0 : if ( myTransparentPixelFound ) 99 : : { 100 : 0 : return static_cast< int >( static_cast< float >( globalTransparency ) * ( 1.0 - ( myTransparentPixel.percentTransparent / 100.0 ) ) ); 101 : : } 102 : : 103 : 0 : return globalTransparency; 104 : 0 : } 105 : : 106 : 0 : int QgsRasterTransparency::alphaValue( double redValue, double greenValue, double blueValue, int globalTransparency ) const 107 : : { 108 : : //if NaN return 0, transparent 109 : 0 : if ( std::isnan( redValue ) || std::isnan( greenValue ) || std::isnan( blueValue ) ) 110 : : { 111 : 0 : return 0; 112 : : } 113 : : 114 : : //Search through the transparency list looking for a match 115 : 0 : bool myTransparentPixelFound = false; 116 : 0 : TransparentThreeValuePixel myTransparentPixel = {0, 0, 0, 100}; 117 : 0 : for ( int myListRunner = 0; myListRunner < mTransparentThreeValuePixelList.count(); myListRunner++ ) 118 : : { 119 : 0 : myTransparentPixel = mTransparentThreeValuePixelList[myListRunner]; 120 : 0 : if ( qgsDoubleNear( myTransparentPixel.red, redValue ) ) 121 : : { 122 : 0 : if ( qgsDoubleNear( myTransparentPixel.green, greenValue ) ) 123 : : { 124 : 0 : if ( qgsDoubleNear( myTransparentPixel.blue, blueValue ) ) 125 : : { 126 : 0 : myTransparentPixelFound = true; 127 : 0 : break; 128 : : } 129 : 0 : } 130 : 0 : } 131 : 0 : } 132 : : 133 : : //if a match was found use the stored transparency percentage 134 : 0 : if ( myTransparentPixelFound ) 135 : : { 136 : 0 : return static_cast< int >( static_cast< float >( globalTransparency ) * ( 1.0 - ( myTransparentPixel.percentTransparent / 100.0 ) ) ); 137 : : } 138 : : 139 : 0 : return globalTransparency; 140 : 0 : } 141 : : 142 : 0 : bool QgsRasterTransparency::isEmpty() const 143 : : { 144 : 0 : return mTransparentSingleValuePixelList.isEmpty() && mTransparentThreeValuePixelList.isEmpty(); 145 : : } 146 : : 147 : 0 : void QgsRasterTransparency::writeXml( QDomDocument &doc, QDomElement &parentElem ) const 148 : : { 149 : 0 : QDomElement rasterTransparencyElem = doc.createElement( QStringLiteral( "rasterTransparency" ) ); 150 : 0 : if ( !mTransparentSingleValuePixelList.isEmpty() ) 151 : : { 152 : 0 : QDomElement singleValuePixelListElement = doc.createElement( QStringLiteral( "singleValuePixelList" ) ); 153 : 0 : QList<QgsRasterTransparency::TransparentSingleValuePixel>::const_iterator it = mTransparentSingleValuePixelList.constBegin(); 154 : 0 : for ( ; it != mTransparentSingleValuePixelList.constEnd(); ++it ) 155 : : { 156 : 0 : QDomElement pixelListElement = doc.createElement( QStringLiteral( "pixelListEntry" ) ); 157 : 0 : pixelListElement.setAttribute( QStringLiteral( "min" ), QgsRasterBlock::printValue( it->min ) ); 158 : 0 : pixelListElement.setAttribute( QStringLiteral( "max" ), QgsRasterBlock::printValue( it->max ) ); 159 : 0 : pixelListElement.setAttribute( QStringLiteral( "percentTransparent" ), QString::number( it->percentTransparent ) ); 160 : 0 : singleValuePixelListElement.appendChild( pixelListElement ); 161 : 0 : } 162 : 0 : rasterTransparencyElem.appendChild( singleValuePixelListElement ); 163 : : 164 : 0 : } 165 : 0 : if ( !mTransparentThreeValuePixelList.isEmpty() ) 166 : : { 167 : 0 : QDomElement threeValuePixelListElement = doc.createElement( QStringLiteral( "threeValuePixelList" ) ); 168 : 0 : QList<QgsRasterTransparency::TransparentThreeValuePixel>::const_iterator it = mTransparentThreeValuePixelList.constBegin(); 169 : 0 : for ( ; it != mTransparentThreeValuePixelList.constEnd(); ++it ) 170 : : { 171 : 0 : QDomElement pixelListElement = doc.createElement( QStringLiteral( "pixelListEntry" ) ); 172 : 0 : pixelListElement.setAttribute( QStringLiteral( "red" ), QgsRasterBlock::printValue( it->red ) ); 173 : 0 : pixelListElement.setAttribute( QStringLiteral( "green" ), QgsRasterBlock::printValue( it->green ) ); 174 : 0 : pixelListElement.setAttribute( QStringLiteral( "blue" ), QgsRasterBlock::printValue( it->blue ) ); 175 : 0 : pixelListElement.setAttribute( QStringLiteral( "percentTransparent" ), QString::number( it->percentTransparent ) ); 176 : 0 : threeValuePixelListElement.appendChild( pixelListElement ); 177 : 0 : } 178 : 0 : rasterTransparencyElem.appendChild( threeValuePixelListElement ); 179 : 0 : } 180 : 0 : parentElem.appendChild( rasterTransparencyElem ); 181 : 0 : } 182 : : 183 : 0 : void QgsRasterTransparency::readXml( const QDomElement &elem ) 184 : : { 185 : 0 : if ( elem.isNull() ) 186 : : { 187 : 0 : return; 188 : : } 189 : : 190 : 0 : mTransparentSingleValuePixelList.clear(); 191 : 0 : mTransparentThreeValuePixelList.clear(); 192 : 0 : QDomElement currentEntryElem; 193 : : 194 : 0 : QDomElement singlePixelListElem = elem.firstChildElement( QStringLiteral( "singleValuePixelList" ) ); 195 : 0 : if ( !singlePixelListElem.isNull() ) 196 : : { 197 : 0 : QDomNodeList entryList = singlePixelListElem.elementsByTagName( QStringLiteral( "pixelListEntry" ) ); 198 : : TransparentSingleValuePixel sp; 199 : 0 : for ( int i = 0; i < entryList.size(); ++i ) 200 : : { 201 : 0 : currentEntryElem = entryList.at( i ).toElement(); 202 : 0 : sp.percentTransparent = currentEntryElem.attribute( QStringLiteral( "percentTransparent" ) ).toDouble(); 203 : : // Backward compoatibility < 1.9 : pixelValue (before ranges) 204 : 0 : if ( currentEntryElem.hasAttribute( QStringLiteral( "pixelValue" ) ) ) 205 : : { 206 : 0 : sp.min = sp.max = currentEntryElem.attribute( QStringLiteral( "pixelValue" ) ).toDouble(); 207 : 0 : } 208 : : else 209 : : { 210 : 0 : sp.min = currentEntryElem.attribute( QStringLiteral( "min" ) ).toDouble(); 211 : 0 : sp.max = currentEntryElem.attribute( QStringLiteral( "max" ) ).toDouble(); 212 : : } 213 : 0 : mTransparentSingleValuePixelList.append( sp ); 214 : 0 : } 215 : 0 : } 216 : 0 : QDomElement threeValuePixelListElem = elem.firstChildElement( QStringLiteral( "threeValuePixelList" ) ); 217 : 0 : if ( !threeValuePixelListElem.isNull() ) 218 : : { 219 : 0 : QDomNodeList entryList = threeValuePixelListElem.elementsByTagName( QStringLiteral( "pixelListEntry" ) ); 220 : : TransparentThreeValuePixel tp; 221 : 0 : for ( int i = 0; i < entryList.size(); ++i ) 222 : : { 223 : 0 : currentEntryElem = entryList.at( i ).toElement(); 224 : 0 : tp.red = currentEntryElem.attribute( QStringLiteral( "red" ) ).toDouble(); 225 : 0 : tp.green = currentEntryElem.attribute( QStringLiteral( "green" ) ).toDouble(); 226 : 0 : tp.blue = currentEntryElem.attribute( QStringLiteral( "blue" ) ).toDouble(); 227 : 0 : tp.percentTransparent = currentEntryElem.attribute( QStringLiteral( "percentTransparent" ) ).toDouble(); 228 : 0 : mTransparentThreeValuePixelList.append( tp ); 229 : 0 : } 230 : 0 : } 231 : 0 : }