TuttleOFX
1
|
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 }