Skip to content

Commit

Permalink
SuperSample layer: add support for Cairo render
Browse files Browse the repository at this point in the history
  • Loading branch information
genete committed Sep 6, 2012
1 parent d5ab011 commit 7629245
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 0 deletions.
60 changes: 60 additions & 0 deletions synfig-core/src/modules/lyr_std/supersample.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,66 @@ SuperSample::accelerated_render(Context context,Surface *surface,int quality, co
return true;
}

////
bool
SuperSample::accelerated_cairorender(Context context,cairo_surface_t *surface,int quality, const RendDesc &renddesc, ProgressCallback *cb)const
{
// don't bother supersampling if our quality is too low.
if(quality>=10 || (width==1 && height==1))
return context.accelerated_cairorender(surface,quality,renddesc,cb);

RendDesc desc(renddesc);

desc.clear_flags();
desc.set_wh(desc.get_w()*width,desc.get_h()*height);
cairo_surface_t* tempsurface=cairo_surface_create_similar(surface, CAIRO_CONTENT_COLOR_ALPHA, renddesc.get_w()*width, renddesc.get_h()*height);
// Render the scene
if(!context.accelerated_cairorender(tempsurface,quality,desc,cb))
{
if(cb)cb->error(strprintf(__FILE__"%d: Accelerated Renderer Failure",__LINE__));
return false;
}

// Calculate the scales values
float scalex=1.0/width;
float scaley=1.0/height;
// Calculate the cairo filter based on quality
cairo_filter_t filter;
switch(quality)
{
case 1:
case 2:
case 3:
case 4:
case 5: // Best
filter=CAIRO_FILTER_BEST;
break;
case 6:
case 7:
case 8: // Good
filter=CAIRO_FILTER_GOOD;
break;
case 9: // Fast
default:
filter=CAIRO_FILTER_FAST;
break;
}
cairo_t* cr=cairo_create(surface);
cairo_scale(cr, scalex, scaley);
cairo_set_source_surface(cr, tempsurface, 0,0);
cairo_pattern_set_filter(cairo_get_source(cr), filter);

cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
cairo_paint(cr);

cairo_destroy(cr);
cairo_surface_destroy(tempsurface);

return true;
}

////

Layer::Vocab
SuperSample::get_param_vocab(void)const
{
Expand Down
1 change: 1 addition & 0 deletions synfig-core/src/modules/lyr_std/supersample.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ class SuperSample : public synfig::Layer
virtual ValueBase get_param(const String & param)const;

virtual bool accelerated_render(Context context,Surface *surface,int quality, const RendDesc &renddesc, ProgressCallback *cb)const;
virtual bool accelerated_cairorender(Context context,cairo_surface_t *surface,int quality, const RendDesc &renddesc, ProgressCallback *cb)const;
virtual synfig::Rect get_bounding_rect(Context context)const;

virtual Vocab get_param_vocab()const;
Expand Down

0 comments on commit 7629245

Please sign in to comment.