|
QGIS API Documentation
master-6227475
|
00001 /* ************************************************************************** 00002 qgsrastertransparency.cpp - description 00003 ------------------- 00004 begin : Mon Nov 30 2007 00005 copyright : (C) 2007 by Peter J. Ersts 00006 email : ersts@amnh.org 00007 00008 ****************************************************************************/ 00009 00010 /* ************************************************************************** 00011 * * 00012 * This program is free software; you can redistribute it and/or modify * 00013 * it under the terms of the GNU General Public License as published by * 00014 * the Free Software Foundation; either version 2 of the License, or * 00015 * (at your option) any later version. * 00016 * * 00017 ***************************************************************************/ 00018 00019 #include "qgsrasterinterface.h" 00020 #include "qgsrastertransparency.h" 00021 #include "qgis.h" 00022 #include "qgslogger.h" 00023 00024 #include <QDomDocument> 00025 #include <QDomElement> 00026 00027 QgsRasterTransparency::QgsRasterTransparency() 00028 { 00029 00030 } 00031 00035 QList<QgsRasterTransparency::TransparentSingleValuePixel> QgsRasterTransparency::transparentSingleValuePixelList() const 00036 { 00037 return mTransparentSingleValuePixelList; 00038 } 00039 00043 QList<QgsRasterTransparency::TransparentThreeValuePixel> QgsRasterTransparency::transparentThreeValuePixelList() const 00044 { 00045 return mTransparentThreeValuePixelList; 00046 } 00047 00051 void QgsRasterTransparency::initializeTransparentPixelList( double theValue ) 00052 { 00053 //clear the existing list 00054 mTransparentSingleValuePixelList.clear(); 00055 00056 //add the initial value 00057 TransparentSingleValuePixel myTransparentSingleValuePixel; 00058 myTransparentSingleValuePixel.min = theValue; 00059 myTransparentSingleValuePixel.max = theValue; 00060 myTransparentSingleValuePixel.percentTransparent = 100.0; 00061 mTransparentSingleValuePixelList.append( myTransparentSingleValuePixel ); 00062 } 00063 00067 void QgsRasterTransparency::initializeTransparentPixelList( double theRedValue, double theGreenValue, double theBlueValue ) 00068 { 00069 //clearn the existing list 00070 mTransparentThreeValuePixelList.clear(); 00071 00072 //add the initial values 00073 TransparentThreeValuePixel myTransparentThreeValuePixel; 00074 myTransparentThreeValuePixel.red = theRedValue; 00075 myTransparentThreeValuePixel.green = theGreenValue; 00076 myTransparentThreeValuePixel.blue = theBlueValue; 00077 myTransparentThreeValuePixel.percentTransparent = 100.0; 00078 mTransparentThreeValuePixelList.append( myTransparentThreeValuePixel ); 00079 } 00080 00081 00085 void QgsRasterTransparency::setTransparentSingleValuePixelList( QList<QgsRasterTransparency::TransparentSingleValuePixel> theNewList ) 00086 { 00087 mTransparentSingleValuePixelList = theNewList; 00088 } 00089 00093 void QgsRasterTransparency::setTransparentThreeValuePixelList( QList<QgsRasterTransparency::TransparentThreeValuePixel> theNewList ) 00094 { 00095 mTransparentThreeValuePixelList = theNewList; 00096 } 00097 00104 int QgsRasterTransparency::alphaValue( double theValue, int theGlobalTransparency ) const 00105 { 00106 //if NaN return 0, transparent 00107 if ( theValue != theValue ) 00108 { 00109 return 0; 00110 } 00111 00112 //Search through the transparency list looking for a match 00113 bool myTransparentPixelFound = false; 00114 TransparentSingleValuePixel myTransparentPixel = {0, 0, 100}; 00115 for ( int myListRunner = 0; myListRunner < mTransparentSingleValuePixelList.count(); myListRunner++ ) 00116 { 00117 myTransparentPixel = mTransparentSingleValuePixelList[myListRunner]; 00118 if (( theValue >= myTransparentPixel.min && theValue <= myTransparentPixel.max ) || 00119 qgsDoubleNear( theValue, myTransparentPixel.min ) || 00120 qgsDoubleNear( theValue, myTransparentPixel.max ) ) 00121 { 00122 myTransparentPixelFound = true; 00123 break; 00124 } 00125 } 00126 00127 //if a match was found use the stored transparency percentage 00128 if ( myTransparentPixelFound ) 00129 { 00130 return ( int )(( float )theGlobalTransparency *( 1.0 - ( myTransparentPixel.percentTransparent / 100.0 ) ) ); 00131 } 00132 00133 return theGlobalTransparency; 00134 } 00135 00144 int QgsRasterTransparency::alphaValue( double theRedValue, double theGreenValue, double theBlueValue, int theGlobalTransparency ) const 00145 { 00146 //if NaN return 0, transparent 00147 if ( theRedValue != theRedValue || theGreenValue != theGreenValue || theBlueValue != theBlueValue ) 00148 { 00149 return 0; 00150 } 00151 00152 //Search through the transparency list looking for a match 00153 bool myTransparentPixelFound = false; 00154 TransparentThreeValuePixel myTransparentPixel = {0, 0, 0, 100}; 00155 for ( int myListRunner = 0; myListRunner < mTransparentThreeValuePixelList.count(); myListRunner++ ) 00156 { 00157 myTransparentPixel = mTransparentThreeValuePixelList[myListRunner]; 00158 if ( myTransparentPixel.red == theRedValue ) 00159 { 00160 if ( myTransparentPixel.green == theGreenValue ) 00161 { 00162 if ( myTransparentPixel.blue == theBlueValue ) 00163 { 00164 myTransparentPixelFound = true; 00165 break; 00166 } 00167 } 00168 } 00169 } 00170 00171 //if a match was found use the stored transparency percentage 00172 if ( myTransparentPixelFound ) 00173 { 00174 return ( int )(( float )theGlobalTransparency *( 1.0 - ( myTransparentPixel.percentTransparent / 100.0 ) ) ); 00175 } 00176 00177 return theGlobalTransparency; 00178 } 00179 00180 bool QgsRasterTransparency::isEmpty( ) const 00181 { 00182 return mTransparentSingleValuePixelList.isEmpty() && mTransparentThreeValuePixelList.isEmpty(); 00183 } 00184 00185 void QgsRasterTransparency::writeXML( QDomDocument& doc, QDomElement& parentElem ) const 00186 { 00187 QDomElement rasterTransparencyElem = doc.createElement( "rasterTransparency" ); 00188 if ( mTransparentSingleValuePixelList.count() > 0 ) 00189 { 00190 QDomElement singleValuePixelListElement = doc.createElement( "singleValuePixelList" ); 00191 QList<QgsRasterTransparency::TransparentSingleValuePixel>::const_iterator it = mTransparentSingleValuePixelList.constBegin(); 00192 for ( ; it != mTransparentSingleValuePixelList.constEnd(); ++it ) 00193 { 00194 QDomElement pixelListElement = doc.createElement( "pixelListEntry" ); 00195 pixelListElement.setAttribute( "min", QgsRasterBlock::printValue( it->min ) ); 00196 pixelListElement.setAttribute( "max", QgsRasterBlock::printValue( it->max ) ); 00197 pixelListElement.setAttribute( "percentTransparent", QString::number( it->percentTransparent ) ); 00198 singleValuePixelListElement.appendChild( pixelListElement ); 00199 } 00200 rasterTransparencyElem.appendChild( singleValuePixelListElement ); 00201 00202 } 00203 if ( mTransparentThreeValuePixelList.count() > 0 ) 00204 { 00205 QDomElement threeValuePixelListElement = doc.createElement( "threeValuePixelList" ); 00206 QList<QgsRasterTransparency::TransparentThreeValuePixel>::const_iterator it = mTransparentThreeValuePixelList.constBegin(); 00207 for ( ; it != mTransparentThreeValuePixelList.constEnd(); ++it ) 00208 { 00209 QDomElement pixelListElement = doc.createElement( "pixelListEntry" ); 00210 pixelListElement.setAttribute( "red", QgsRasterBlock::printValue( it->red ) ); 00211 pixelListElement.setAttribute( "green", QgsRasterBlock::printValue( it->green ) ); 00212 pixelListElement.setAttribute( "blue", QgsRasterBlock::printValue( it->blue ) ); 00213 pixelListElement.setAttribute( "percentTransparent", QString::number( it->percentTransparent ) ); 00214 threeValuePixelListElement.appendChild( pixelListElement ); 00215 } 00216 rasterTransparencyElem.appendChild( threeValuePixelListElement ); 00217 } 00218 parentElem.appendChild( rasterTransparencyElem ); 00219 } 00220 00221 void QgsRasterTransparency::readXML( const QDomElement& elem ) 00222 { 00223 if ( elem.isNull() ) 00224 { 00225 return; 00226 } 00227 00228 mTransparentSingleValuePixelList.clear(); 00229 mTransparentThreeValuePixelList.clear(); 00230 QDomElement currentEntryElem; 00231 00232 QDomElement singlePixelListElem = elem.firstChildElement( "singleValuePixelList" ); 00233 if ( !singlePixelListElem.isNull() ) 00234 { 00235 QDomNodeList entryList = singlePixelListElem.elementsByTagName( "pixelListEntry" ); 00236 TransparentSingleValuePixel sp; 00237 for ( int i = 0; i < entryList.size(); ++i ) 00238 { 00239 currentEntryElem = entryList.at( i ).toElement(); 00240 sp.percentTransparent = currentEntryElem.attribute( "percentTransparent" ).toDouble(); 00241 // Backward compoatibility < 1.9 : pixelValue (before ranges) 00242 if ( currentEntryElem.hasAttribute( "pixelValue" ) ) 00243 { 00244 sp.min = sp.max = currentEntryElem.attribute( "pixelValue" ).toDouble(); 00245 } 00246 else 00247 { 00248 sp.min = currentEntryElem.attribute( "min" ).toDouble(); 00249 sp.max = currentEntryElem.attribute( "max" ).toDouble(); 00250 } 00251 mTransparentSingleValuePixelList.append( sp ); 00252 } 00253 } 00254 QDomElement threeValuePixelListElem = elem.firstChildElement( "threeValuePixelList" ); 00255 if ( !threeValuePixelListElem.isNull() ) 00256 { 00257 QDomNodeList entryList = threeValuePixelListElem.elementsByTagName( "pixelListEntry" ); 00258 TransparentThreeValuePixel tp; 00259 for ( int i = 0; i < entryList.size(); ++i ) 00260 { 00261 currentEntryElem = entryList.at( i ).toElement(); 00262 tp.red = currentEntryElem.attribute( "red" ).toDouble(); 00263 tp.green = currentEntryElem.attribute( "green" ).toDouble(); 00264 tp.blue = currentEntryElem.attribute( "blue" ).toDouble(); 00265 tp.percentTransparent = currentEntryElem.attribute( "percentTransparent" ).toDouble(); 00266 mTransparentThreeValuePixelList.append( tp ); 00267 } 00268 } 00269 }