void reflection_animationApp::keyUp( KeyEvent event )
{
    if (event.getCode() == KeyEvent::KEY_TAB) {
        m_showInterface = !m_showInterface;
    }
    
    if (event.getCode() == KeyEvent::KEY_SPACE) {
        Surface frame = copyWindowSurface();
        stringstream filename;
        filename << "geometry_screenshot_" << (getElapsedFrames()) << ".png";
        writeImage( m_path / filename.str(), frame);
    }
    
    if (event.getCode() == KeyEvent::KEY_r) {
        if (m_recording) {
            m_movieWriter.finish();
        }
        if (!m_recording) {
            stringstream filename;
            filename << "geometry_animation_" << (getElapsedFrames()) << ".mov";
            m_movieWriter = qtime::MovieWriter( m_path / filename.str(), getWindowWidth(), getWindowHeight() );
        }
        m_recording = !m_recording;
    }
}
    void handleQuit() {
#ifdef MOVIESAVE
        movie.finish();
#endif
        setFullScreen(0);
        showCursor();
        quit();
    }
void TransportApp::draw() {
	
    gl::enableAlphaBlending();
    
    gl::clear( Color( 0, 0, 0 ) );
    
    if ( DRAW_BACKGROUND ) {
        gl::draw( background, getWindowBounds() );
    }
    
    bool airports_drawn = true;
//    if ( this->gonna_draw_airports ) {
        for ( list<Airport>::iterator a = active_airports.begin(); a != active_airports.end(); ++a ) {
            a->step();
            a->draw();
            airports_drawn = airports_drawn && a->isComplete();
        }
        
        if ( airports_drawn ) {
            airports_drawn = airports_drawn && !( pushAirports() );
            if ( airports_drawn && this->gonna_draw_airports ) {
//                writeImage( "/tmp/airports.png", copyWindowSurface() );
                this->gonna_draw_airports = false;
            }
        }
//    }
    
    if ( airports_drawn ) {
//        bool routes_drawn = true;
        for ( list<Route>::iterator ari = routes.begin(); ari != routes.end(); ++ari ) {
            ari->step();
            ari->draw();
//            routes_drawn = routes_drawn && ari->isComplete();
        }

//        if ( routes_drawn ) {
//            routes_drawn = routes_drawn && !( pushRoutes() );
//        }
        
//        if ( getElapsedSeconds() > 1000 ) {
            if ( WRITE_MOVIE ) {
                if ( getElapsedSeconds() > 600 ) {
                    movie.finish();
                    quit();
                }
            }
//            writeImage( "/tmp/routes.png", copyWindowSurface() );
//            quit();
//        }
    }

    gl::color( Color( 1.0f, 1.0f, 1.0f ) );
    
    if ( WRITE_MOVIE ) {
        movie.addFrame( copyWindowSurface() );
    }
}
void AnimatedRevealApp::update()
{
    if( ( ! mDoc ) || mDone )
        return;

    // we'll stop drawing filled after we've drawn new pixels that are 1% of the size of the image
    size_t imageSize, minArea;
    if( mDoc->getWidth() && mDoc->getHeight() )
        imageSize = mDoc->getWidth() * mDoc->getHeight();
    else
        imageSize = 640 * 480;
    minArea = 1 + imageSize * 0.01f;

    Surface frame = renderCairo( mDoc, SlowFillVisitor( mMinRenderElement, minArea, &mMinRenderElement, &mDone ) );
#if defined( RECORD_MOVIE )
    mMovie.addFrame( frame );
    if( mDone ) {
        mMovie.addFrame( frame ); // otherwise we seem to lose the last frame
        mMovie.finish();
    }
#endif
    mTex = gl::Texture::create( frame );
}