Esempio n. 1
0
gl::Texture renderCairoToTexture( svg::DocRef doc )
{
	cairo::SurfaceImage srf;
	if( doc->getWidth() && doc->getHeight() )
		srf = cairo::SurfaceImage( doc->getWidth(), doc->getHeight(), true );
	else
		srf = cairo::SurfaceImage( 640, 480, true );
	cairo::Context ctx( srf );

	ctx.render( *doc );
	srf.flush();
	
	return gl::Texture( srf.getSurface() );
}
Surface renderCairo( svg::DocRef doc, const svg::RenderVisitor &visitor )
{
    cairo::SurfaceImage srf;
    if( doc->getWidth() && doc->getHeight() )
        srf = cairo::SurfaceImage( doc->getWidth(), doc->getHeight(), true );
    else
        srf = cairo::SurfaceImage( 640, 480, true );
    cairo::Context ctx( srf );

    ctx.setSourceRgb( 1, 1, 1 );
    ctx.paint();
    ctx.render( *doc, visitor );
    srf.flush();
    Surface result = srf.getSurface();
    return srf.getSurface();
}
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 );
}
void AnimatedRevealApp::load( const fs::path &path )
{
    mMinRenderElement = 0;
    try {
        if( path.extension() == ".svgz" ) // compressed
            mDoc = svg::Doc::createFromSvgz( loadFile( path ) );
        else
            mDoc = svg::Doc::create( loadFile( path ) );

        mDone = false;
#if defined( RECORD_MOVIE )
        mMovie = qtime::MovieWriter( fs::path( getHomeDirectory() + "AnimatedReveal.mov" ), mDoc->getWidth(), mDoc->getHeight() );
#endif
    }
    catch( ci::Exception &exc ) {
        console() << "failed to load doc, what: " << exc.what() << endl;
    }
}