TuttleOFX  1
RGBOverlay.cpp
Go to the documentation of this file.
00001 #include "RGBOverlay.hpp"
00002 
00003 namespace tuttle {
00004 namespace plugin {
00005 namespace histogram {
00006         
00007 
00008 /*Contructor (when Nuke works)
00009 RGBOverlay::RGBOverlay(OfxInteractHandle handle, OFX::ImageEffect* effect):OFX::OverlayInteract( handle ),_infos( effect )
00010 {
00011         _plugin = static_cast<HistogramPlugin*>(_effect);
00012         _plugin->addRefOverlayData();
00013 }*/
00014 
00015 //tomporary constructor
00016 RGBOverlay::RGBOverlay(HistogramPlugin* plugin)
00017 {
00018         _plugin = plugin;
00019         _plugin->addRefOverlayData();
00020 }
00021 
00022 /*Destructor*/
00023 RGBOverlay::~RGBOverlay()
00024 {
00025         _plugin->releaseOverlayData();
00026 }
00027 
00028 /**
00029  * Display of the RGB histograms data
00030  */
00031 bool RGBOverlay::draw(const OFX::DrawArgs& args)
00032 {       
00033         _isGriddisplay = false;
00034         //height of the window (image for test)
00035         //width of the window (image for test)
00036         const OfxPointI size = _plugin->_clipSrc->getPixelRodSize(args.time);
00037         const double step = size.x / (double)(getOverlayData()._data._step -1);
00038         double heightR, heightG, heightB;
00039         heightR = heightG = heightB = size.y;
00040         
00041         if(!(_plugin->_paramDisplayTypeSelection->getValue() == 1))
00042         {
00043                 //get max of the three channels
00044                 Number maxR = *(std::max_element(getOverlayData()._data._bufferRed.begin(),getOverlayData()._data._bufferRed.end()));
00045         Number maxG = *(std::max_element(getOverlayData()._data._bufferGreen.begin(),getOverlayData()._data._bufferGreen.end()));
00046         Number maxB = *(std::max_element(getOverlayData()._data._bufferBlue.begin(),getOverlayData()._data._bufferBlue.end()));
00047                 
00048         if(maxR > maxG && maxR > maxB)                          //R is the max
00049         {
00050                         heightG = maxG*heightR/maxR;
00051             heightB = maxB*heightR/maxR;
00052         }
00053         else if(maxG > maxR && maxG > maxB)                     //G is the max
00054         {
00055             heightR = maxR*heightG/maxG;
00056             heightB = maxB*heightG/maxG;
00057         }
00058         else                                                                            //B is the max
00059         {       
00060             heightR = maxR*heightB/maxB;
00061             heightG = maxG*heightB/maxB;
00062         }
00063     }
00064         float selectionMultiplier = (float)_plugin->_paramSelectionMultiplierSelection->getValue(); //get selection multiplier from plugin
00065         //display on screen if specified (RGB)
00066         
00067         if(_plugin->_paramOverlayRSelection->getValue())                //RED CHANNEL
00068         {
00069                 if(!_isGriddisplay)             //if grid has not been already displayed
00070                 {       
00071                         displayGrid(size.y,size.x);     //display grid
00072                         _isGriddisplay = true;          //set display grid to true
00073                 }
00074                 
00075                 displayASpecificHistogram(getOverlayData()._data._bufferRed,getOverlayData()._selectionData._bufferRed,step,heightR,size.x,redHisto,selectionMultiplier);
00076                 if(getOnlyChannelSelectedRGB()==eSelectedChannelR)
00077                 {
00078                         displaySelectionPoints(getOverlayData()._selectionData._bufferRed,step,size.x,redHisto);                                        //selection points
00079                         displayAverageBar(getOverlayData()._averageData._averageRed,averageHisto,size.x,size.y,step);           //average bar
00080                         displayRedIndicator(size);//indicator
00081                 }
00082         }
00083         if(_plugin->_paramOverlayGSelection->getValue())                //GREEN CHANNEL
00084         {
00085                 if(!_isGriddisplay)             //if grid has not been already displayed
00086                 {       
00087                         displayGrid(size.y,size.x);     //display grid
00088                         _isGriddisplay = true;          //set display grid to true
00089                 }
00090                 
00091                 displayASpecificHistogram(getOverlayData()._data._bufferGreen,getOverlayData()._selectionData._bufferGreen,step,heightG,size.x,greenHisto,selectionMultiplier);
00092                 if(getOnlyChannelSelectedRGB()==eSelectedChannelG)
00093                 {
00094                         displaySelectionPoints(getOverlayData()._selectionData._bufferGreen,step,size.x,greenHisto);                            //selection points
00095                         displayAverageBar(getOverlayData()._averageData._averageGreen,averageHisto,size.x,size.y,step); //average bar
00096                         displayGreenIndicator(size);                                                                                                                            //indicator
00097                 }
00098         }
00099         if(_plugin->_paramOverlayBSelection->getValue())                //BLUE CHANNEL
00100         {
00101                 if(!_isGriddisplay)             //if grid has not been already displayed
00102                 {       
00103                         displayGrid(size.y,size.x);     //display grid
00104                         _isGriddisplay = true;          //set display grid to true
00105                 }
00106                 
00107                 displayASpecificHistogram(getOverlayData()._data._bufferBlue,getOverlayData()._selectionData._bufferBlue,step,heightB,size.x,blueHisto,selectionMultiplier);
00108                 if(getOnlyChannelSelectedRGB()==eSelectedChannelB)
00109                 {
00110                         displaySelectionPoints(getOverlayData()._selectionData._bufferBlue,step,size.x,blueHisto);                      //selection points
00111                         displayAverageBar(getOverlayData()._averageData._averageBlue,averageHisto,size.x,size.y,step);                          //average bar
00112                         displayBlueIndicator(size);                                                                                                                                     //indicator
00113                 }
00114         }
00115         //Display border (separate from histograms to eliminate blending)
00116         if(_plugin->_paramOverlayRSelection->getValue())
00117                 displayASpecificHistogramBorder(getOverlayData()._data._bufferRed,step,heightR,size.x,redHisto);                //R
00118         if(_plugin->_paramOverlayGSelection->getValue())
00119                 displayASpecificHistogramBorder(getOverlayData()._data._bufferGreen,step,heightG,size.x,greenHisto);    //G
00120         if(_plugin->_paramOverlayBSelection->getValue())
00121                 displayASpecificHistogramBorder(getOverlayData()._data._bufferBlue,step,heightB,size.x,blueHisto);              //B
00122         return true;
00123 }
00124 
00125 /**
00126  * Permits to know if there is only one RGB channel selected
00127  * @return "R", "G", "B" if there is only one channel selected,  "none" or "more" else
00128  */
00129 ESelectedChannelRGB RGBOverlay::getOnlyChannelSelectedRGB() const
00130 {
00131         //get all of the checkbox states RGB
00132         bool R = _plugin->_paramOverlayRSelection->getValue();  //check box R value
00133         bool G = _plugin->_paramOverlayGSelection->getValue();  //check box G value
00134         bool B = _plugin->_paramOverlayBSelection->getValue();  //check box B value
00135         
00136         if(R||G||B)
00137         {
00138                 if(R && !G && !B)
00139                         return eSelectedChannelR;                       //Only red is selected
00140                 if(!R && G && !B)
00141                         return eSelectedChannelG;                       //Only green is selected
00142                 if(!R && !G && B)
00143                         return eSelectedChannelB;                       //Only blue is selected
00144                 return eSelectedChannelMoreRGB;                 //More than one RGB channel are selected
00145         }
00146         return eSelectedChannelNoneRGB;                         //None channel is selected
00147 }
00148 
00149 /**
00150  * Get overlay data from plugin
00151  * @return 
00152  */
00153 OverlayData& RGBOverlay::getOverlayData()
00154 {
00155         return _plugin->getOverlayData();
00156 }
00157 
00158 /**
00159  *Display grid on screen
00160  */
00161 void RGBOverlay::displayGrid(float height, float width)
00162 {
00163         glBegin(GL_LINES);
00164         //draw standard reference
00165         glColor3f(.9f,.9f,.9f);                                                         //white color
00166         glVertex2f(-0.1f,0); glVertex2f(-0.1f,height);          //Y axis
00167         glVertex2f(0,-0.1f); glVertex2f(width,-0.1f);           //X axis
00168         
00169         //compute step X and Y
00170         float stepY = (float)(height/10.0f);
00171         float stepX = (float)(width/10.0f);
00172         float stepYm = (float)(height/20.0f);
00173         float stepXm = (float)(width/20.0f);
00174         
00175         //drawing minor grid
00176         glColor3f(.2f,.2f,.2f);         //gray color
00177         float baseY = 0;                        //initialize y to O
00178         float baseX = 0;                        //initialize x to 0
00179         for(unsigned int i=0; i< 20; ++i)
00180         {
00181                 baseY += stepYm;        //update Y position
00182                 baseX += stepXm; //update X position
00183                 glVertex2f(-0.1f,baseY);        glVertex2f(width,baseY); //draw Y axis
00184                 glVertex2f(baseX, -0.1f);       glVertex2f(baseX,height);//draw X axis
00185         }
00186         
00187         //drawing major grid
00188         glColor3f(.5f,.5f,.5f);         //gray color
00189         baseY = 0;                      //initialize y to O
00190         baseX = 0;                      //initialize x to 0
00191         for(unsigned int i=0; i< 10; ++i)
00192         {
00193                 baseY += stepY; //update Y position
00194                 baseX += stepX; //update X position
00195                 glVertex2f(-0.1f,baseY);        glVertex2f(width,baseY); //draw Y axis
00196                 glVertex2f(baseX, -0.1f);       glVertex2f(baseX,height);//draw X axis
00197         }
00198 
00199         //draw grid
00200         glEnd();
00201 }
00202 
00203 
00204 }
00205 }
00206 }