diff --git a/src/gui/qgsrasterlayerproperties.cpp b/src/gui/qgsrasterlayerproperties.cpp index b81b52fd06b7..d97aee43d275 100644 --- a/src/gui/qgsrasterlayerproperties.cpp +++ b/src/gui/qgsrasterlayerproperties.cpp @@ -203,10 +203,12 @@ QgsRasterLayerProperties::QgsRasterLayerProperties(QgsMapLayer *lyr, QWidget *pa cboRed->insertItem(myQString); cboGreen->insertItem(myQString); cboBlue->insertItem(myQString); + cboTransparent->insertItem(myQString); } cboRed->insertItem(tr("Not Set")); cboGreen->insertItem(tr("Not Set")); cboBlue->insertItem(tr("Not Set")); + cboTransparent->insertItem(tr("Not Set")); if (cboGray->count() != 1) cboGray->insertItem(tr("Not Set")); } @@ -291,6 +293,7 @@ void QgsRasterLayerProperties::apply() rasterLayer->setGreenBandName(cboGreen->currentText()); rasterLayer->setBlueBandName(cboBlue->currentText()); rasterLayer->setGrayBandName(cboGray->currentText()); + rasterLayer->setTransparentBandName(cboTransparent->currentText()); //set the appropriate color ramping type if (cboColorMap->currentText() == tr("Pseudocolor")) { @@ -682,6 +685,7 @@ void QgsRasterLayerProperties::sync() cboGreen->setCurrentText(rasterLayer->getGreenBandName()); cboBlue->setCurrentText(rasterLayer->getBlueBandName()); cboGray->setCurrentText(rasterLayer->getGrayBandName()); + cboTransparent->setCurrentText(rasterLayer->getTransparentBandName()); } // QgsRasterLayerProperties::sync() diff --git a/src/raster/qgsrasterlayer.cpp b/src/raster/qgsrasterlayer.cpp index 91615618ba6d..c9e5d227cde5 100644 --- a/src/raster/qgsrasterlayer.cpp +++ b/src/raster/qgsrasterlayer.cpp @@ -653,6 +653,7 @@ QgsRasterLayer::readFile( QString const & fileName ) redBandNameQString = "Red"; // sensible default greenBandNameQString = "Green"; // sensible default blueBandNameQString = "Blue";// sensible default + transparentBandNameQString = tr("Not Set"); // sensible default grayBandNameQString = tr("Not Set"); //sensible default drawingStyle = PALETTED_MULTI_BAND_COLOR; //sensible default } @@ -670,6 +671,11 @@ QgsRasterLayer::readFile( QString const & fileName ) { blueBandNameQString = tr("Not Set"); // sensible default } + if (gdalDataset->GetRasterCount() > 3) + transparentBandNameQString = getRasterBandName(4); + else + transparentBandNameQString = tr("Not Set"); + grayBandNameQString = tr("Not Set"); //sensible default drawingStyle = MULTI_BAND_COLOR; //sensible default } @@ -679,6 +685,7 @@ QgsRasterLayer::readFile( QString const & fileName ) redBandNameQString = tr("Not Set"); //sensible default greenBandNameQString = tr("Not Set"); //sensible default blueBandNameQString = tr("Not Set"); //sensible default + transparentBandNameQString = tr("Not Set"); //sensible default drawingStyle = SINGLE_BAND_GRAY; //sensible default grayBandNameQString = getRasterBandName(1); // usually gdal will return gray or undefined } @@ -2333,6 +2340,20 @@ void QgsRasterLayer::drawMultiBandColor(QPainter * theQPainter, QgsRasterViewPor void *myGdalGreenData = readData ( myGdalGreenBand, theRasterViewPort ); void *myGdalBlueData = readData ( myGdalBlueBand, theRasterViewPort ); + bool haveTransparencyBand(false); + GDALRasterBand *myGdalTransparentBand; + GDALDataType myTransparentType; + void *myGdalTransparentData; + + if (transparentBandNameQString != tr("Not Set")) + { + haveTransparencyBand = true; + int myTransparentBandNoInt = getRasterBandNumber(transparentBandNameQString); + myGdalTransparentBand = gdalDataset->GetRasterBand(myTransparentBandNoInt); + myTransparentType = myGdalTransparentBand->GetRasterDataType(); + myGdalTransparentData = readData ( myGdalTransparentBand, theRasterViewPort ); + } + QImage myQImage = QImage(theRasterViewPort->drawableAreaXDimInt, theRasterViewPort->drawableAreaYDimInt, 32); //myQImage.fill(0); myQImage.setAlphaBuffer(true); @@ -2347,9 +2368,16 @@ void QgsRasterLayer::drawMultiBandColor(QPainter * theQPainter, QgsRasterViewPor myColumnInt * theRasterViewPort->drawableAreaXDimInt + myRowInt ); double myBlueValueDouble = readValue ( myGdalBlueData, myBlueType, myColumnInt * theRasterViewPort->drawableAreaXDimInt + myRowInt ); + if (haveTransparencyBand) + { + double myTransparentValueDouble = readValue ( myGdalTransparentData, myTransparentType, + myColumnInt * theRasterViewPort->drawableAreaXDimInt + myRowInt ); + if (myTransparentValueDouble == 0.0) + continue; + } // TODO: check all channels ? - if ( myRedValueDouble == noDataValueDouble || myRedValueDouble != myRedValueDouble ) + if ( myRedValueDouble == noDataValueDouble || myRedValueDouble != myRedValueDouble) { #ifdef QGISDEBUG QgsLogger::debug("myRedValueDouble", myRedValueDouble, __FILE__, __FUNCTION__, __LINE__, 1); @@ -2439,6 +2467,8 @@ QgsDebugMsg("QgsRasterLayer::drawSingleBandGray: painting image to canvas from s CPLFree(myGdalRedData); CPLFree(myGdalGreenData); CPLFree(myGdalBlueData); + if (haveTransparencyBand) + CPLFree(myGdalTransparentData); } @@ -3007,6 +3037,38 @@ void QgsRasterLayer::setBlueBandName(QString const & theBandNameQString) return; } +//mutator for transparent band name +void QgsRasterLayer::setTransparentBandName(QString const & theBandNameQString) +{ + //check if the band is unset + if (theBandNameQString == tr("Not Set")) + { + transparentBandNameQString = theBandNameQString; + return; + } + //check if the image is paletted + if (rasterLayerType == PALETTE && (theBandNameQString == "Red" || theBandNameQString == "Green" || theBandNameQString == "Blue")) + { + transparentBandNameQString = theBandNameQString; + return; + } + //check that a valid band name was passed + + for (int myIteratorInt = 0; myIteratorInt < rasterStatsVector.size(); ++myIteratorInt) + { + //find out the name of this band + QgsRasterBandStats myRasterBandStats = rasterStatsVector[myIteratorInt]; + if (myRasterBandStats.bandName == theBandNameQString) + { + transparentBandNameQString = theBandNameQString; + return; + } + } + + //if no matches were found default to not set + transparentBandNameQString = tr("Not Set"); + return; +} //mutator for gray band name diff --git a/src/raster/qgsrasterlayer.h b/src/raster/qgsrasterlayer.h index a8a827bb7aab..0813776eb397 100644 --- a/src/raster/qgsrasterlayer.h +++ b/src/raster/qgsrasterlayer.h @@ -415,6 +415,16 @@ class QgsRasterLayer : public QgsMapLayer /** \brief Mutator for blue band name mapping. */ void setBlueBandName(QString const & theBandNameQString); // + // Accessor and mutator for transparent band name + // + /** \brief Accessor for transparent band name mapping. */ + QString getTransparentBandName() + { + return transparentBandNameQString; + }; + /** \brief Mutator for transparent band name mapping. */ + void setTransparentBandName(QString const & theBandNameQString); + // // Accessor and mutator for gray band name // /** \brief Accessor for gray band name mapping. */ @@ -1007,6 +1017,8 @@ public slots: QString greenBandNameQString; /** \brief The band to be associated with the color blue - usually 3. */ QString blueBandNameQString; + /** \brief The band to be associated with transparency. */ + QString transparentBandNameQString; /** \brief The band to be associated with the grayscale only ouput - usually 1. */ QString grayBandNameQString; /** \brief Minimum red value - used in scaling procedure. */ diff --git a/src/ui/qgsrasterlayerpropertiesbase.ui b/src/ui/qgsrasterlayerpropertiesbase.ui index ff0e72fcec02..2709416ee34d 100644 --- a/src/ui/qgsrasterlayerpropertiesbase.ui +++ b/src/ui/qgsrasterlayerpropertiesbase.ui @@ -191,20 +191,27 @@ 6 - - - - Qt::Vertical + + + + + + + + + + Color - - - 20 - 40 - + + + + + + Band - + - + Qt::Vertical @@ -217,18 +224,8 @@ - - - - - - - <b><font color="#0000ff">Blue</font></b> - - - cboBlue - - + + @@ -240,12 +237,6 @@ - - - - - - @@ -256,20 +247,39 @@ - - + + + + Qt::Vertical + + + + 20 + 40 + + + + + + - Band + <b><font color="#0000ff">Blue</font></b> + + + cboBlue - - + + - Color + Transparent + + + @@ -1068,9 +1078,14 @@ - Q3TextBrowser - Q3TextEdit -
Qt3Support/Q3TextBrowser
+ Q3TextEdit + Q3Frame +
q3textedit.h
+
+ + Q3ListBox + Q3Frame +
q3listbox.h
Q3GroupBox @@ -1079,14 +1094,9 @@ 1 - Q3ListBox - Q3Frame -
q3listbox.h
-
- - Q3TextEdit - Q3Frame -
q3textedit.h
+ Q3TextBrowser + Q3TextEdit +
Qt3Support/Q3TextBrowser