QGIS API Documentation  master-6227475
src/core/raster/qgsrastertransparency.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines