void ImageRetargetingApp::drawSeamCarvingWindow()
{
    gl::clear( Color( 0.f, 0.f, 0.f ) );
    switch(seamCarvingState)
    {
        case SeamCarvingState::ShowImage:
            if( seamCarvedTexture ) {
                gl::draw(seamCarvedTexture);
            }
            break;
            
        case SeamCarvingState::ShowGradient:
            if( gradientTexture ) {
                gl::draw(gradientTexture);
            }
            break;
            
        case SeamCarvingState::SeamCarving:
            if(seamCarvedTexture){
                int dw = seamCarver->newWidth - seamCarvedImage.getWidth();
                int dh = seamCarver->newHeight - seamCarvedImage.getHeight();
                
                if (dw<0 && dh<0){
                    seamCarvingWindow->setSize(seamCarvedTexture.getWidth()-1, seamCarvedTexture.getHeight());
                    seamCarvedImage = seamCarver->deleteVerticalSeam(seamCarvedImage);
                }
                else if (dw<0){
                    seamCarvingWindow->setSize(seamCarvedTexture.getWidth()-1, seamCarvedTexture.getHeight());
                    seamCarvedImage = seamCarver->deleteVerticalSeam(seamCarvedImage);
                }
                else if (dh<0){
                    seamCarvingWindow->setSize(seamCarvedTexture.getWidth(), seamCarvedTexture.getHeight()-1);
                    seamCarvedImage = seamCarver->deleteHorizontalSeam(seamCarvedImage);
                }
                //TODO:: Add Seam
                else if (dw>=0 && dh>=0) {
                    seamCarvingState = SeamCarvingState::ShowImage;
                    seamCarver->stopCarveTimer();
                }
                seamCarvedTexture = gl::Texture(seamCarvedImage);
                gl::draw(seamCarvedTexture);
            }
            
            break;
        case SeamCarvingState::Undefined:
            break;
    }
    seamCarvingParams->draw();
}
void ImageRetargetingApp::resizeMeshRect()
{
    meshWarpRetargetter->startTimer();
    meshWarpRetargetter->resizeMeshRect(meshWarpRetargetter->resizeWidth , meshWarpRetargetter->resizeHeight);
    meshWarpRetargetter->stopTimer();
    meshWarpingState = MeshWarpingState::ShowMeshWarping;
    meshWarpingWindow->setSize(meshWarpRetargetter->resizeWidth , meshWarpRetargetter->resizeHeight);
}
void ImageRetargetingApp::meshWarperResetButtonClick()
{
    meshWarpingState = MeshWarpingState::ShowImage;
    saliencyImage = saliencySegmentor->getSaliencyMap(originalImage.clone(), SaliencySegmentor::SaliencyMethod::Sobel);
    saliencyImage = saliencySegmentor->getSegmentedSalientImage(saliencyImage);
    saliencyTexture = gl::Texture(saliencyImage);
    
    meshWarpRetargetter->initMesh(originalImage.getWidth(), originalImage.getHeight(), saliencySegmentor);
    meshWarpingWindow->setSize(originalImage.getWidth(), originalImage.getHeight());
}
	bool initialize( const WindowRef& window ) override
	{
		// Make sure our window is positioned and sized correctly.
		window->setBorderless( true );
		window->setPos( mRift->getNativeWindowPos() );
		window->setSize( mRift->getNativeWindowResolution() );
		// Create or resize the frame buffer.
		mRift->initializeFrameBuffer();
		initializeDistortion();
		return true;
	}
void ImageRetargetingApp::linearResizeButtonClick()
{
    linearScaleRec->set(0,0,linearScaleWidth,linearScaleHeight);
    linearScaleWindow->setSize(linearScaleWidth,linearScaleHeight);
}
void ImageRetargetingApp::linearResizeResetButtonClick()
{
    linearScaleRec->set(0,0,originalImage.getWidth(),originalImage.getHeight());
    linearScaleWindow->setSize(originalImage.getWidth(),originalImage.getHeight());
}
void ImageRetargetingApp::resizeMeshEllipse()
{
    meshWarpRetargetter->resizeMeshEllipse(meshWarpRetargetter->resizeWidth , meshWarpRetargetter->resizeHeight);
    meshWarpingState = MeshWarpingState::ShowMeshWarping;
    meshWarpingWindow->setSize(meshWarpRetargetter->resizeWidth , meshWarpRetargetter->resizeHeight);
}
void ImageRetargetingApp::resetWindowOriginalSize(WindowRef window)
{
    window->setSize(originalTexture.getWidth(), originalTexture.getHeight());
}