X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fmodules%2Fmod_filter%2Fradialblur.cpp;h=6ecc5bb330c1b37593f322e8883b175506ebe68d;hb=9459638ad6797b8139f1e9f0715c96076dbf0890;hp=3efe293e10b937ff547b4aef30116aae5418f135;hpb=5ddcf36f04cfbd10fabda4e3c5633cb27cdd4c0a;p=synfig.git diff --git a/synfig-core/trunk/src/modules/mod_filter/radialblur.cpp b/synfig-core/trunk/src/modules/mod_filter/radialblur.cpp index 3efe293..6ecc5bb 100644 --- a/synfig-core/trunk/src/modules/mod_filter/radialblur.cpp +++ b/synfig-core/trunk/src/modules/mod_filter/radialblur.cpp @@ -1,9 +1,12 @@ -/*! ======================================================================== -** Synfig -** Template File -** $Id: radialblur.cpp,v 1.1.1.1 2005/01/04 01:23:10 darco Exp $ +/* === S Y N F I G ========================================================= */ +/*! \file radialblur.cpp +** \brief Implementation of the "Radial Blur" layer ** +** $Id$ +** +** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007, 2008 Chris Moore ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as @@ -14,6 +17,7 @@ ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** General Public License for more details. +** \endlegal ** ** === N O T E S =========================================================== ** @@ -48,10 +52,10 @@ SYNFIG_LAYER_INIT(RadialBlur); SYNFIG_LAYER_SET_NAME(RadialBlur,"radial_blur"); -SYNFIG_LAYER_SET_LOCAL_NAME(RadialBlur,_("Radial Blur")); -SYNFIG_LAYER_SET_CATEGORY(RadialBlur,_("Blurs")); +SYNFIG_LAYER_SET_LOCAL_NAME(RadialBlur,N_("Radial Blur")); +SYNFIG_LAYER_SET_CATEGORY(RadialBlur,N_("Blurs")); SYNFIG_LAYER_SET_VERSION(RadialBlur,"0.1"); -SYNFIG_LAYER_SET_CVS_ID(RadialBlur,"$Id: radialblur.cpp,v 1.1.1.1 2005/01/04 01:23:10 darco Exp $"); +SYNFIG_LAYER_SET_CVS_ID(RadialBlur,"$Id$"); /* === P R O C E D U R E S ================================================= */ @@ -126,29 +130,65 @@ RadialBlur::get_color(Context context, const Point &p)const bool RadialBlur::accelerated_render(Context context,Surface *surface,int quality, const RendDesc &renddesc, ProgressCallback *cb)const { + // don't do anything at quality 10 + if (quality == 10) + return context.accelerated_render(surface,quality,renddesc,cb); + if(cb && !cb->amount_complete(0,10000)) return false; Surface tmp_surface; + const Point tl(renddesc.get_tl()), br(renddesc.get_br()); + const int w(renddesc.get_w()), h(renddesc.get_h()); + const Real pw(renddesc.get_pw()),ph(renddesc.get_ph()); - if(!context.accelerated_render(surface,quality,renddesc,cb)) - return false; - - tmp_surface=*surface; + Rect rect(tl, br); + Point pos; - int x,y; + // find how far towards the origin of the blur we are going to + // wander for each of the 4 corners of our tile, expanding the + // render description for each of them if necessary + int x, y; + for(y=0,pos[1]=tl[1];yget_w()); - const int h(surface->get_h()); - const Real pw(renddesc.get_pw()),ph(renddesc.get_ph()); + // copy the part of the layers beneath us that corresponds to this tile + surface->set_wh(w, h); + Surface::pen pen(surface->get_pen(0, 0)); + tmp_surface.blit_to(pen, + int((tl[0] - tmp_surface_tl[0])/pw + 0.5), + int((tl[1] - tmp_surface_tl[1])/ph + 0.5), + w, h); Surface::alpha_pen apen(surface->begin()); apen.set_alpha(get_amount()); apen.set_blend_method(get_blend_method()); +/* int steps(5); if(quality>=9)steps=20; @@ -156,15 +196,17 @@ RadialBlur::accelerated_render(Context context,Surface *surface,int quality, con else if(quality>=4)steps=60; else if(quality>=3)steps=100; else steps=120; +*/ Surface::value_prep_type cooker; + // loop through the pixels for(y=0,pos[1]=tl[1];y 0) ? 1 : -1; @@ -216,7 +258,8 @@ RadialBlur::accelerated_render(Context context,Surface *surface,int quality, con pool+=cooker.cook(tmp_surface[x0][y0]); poolsize+=1; } - } + } else + printf("%s:%d unexpected %d >= %d or %d >= %d?\n", __FILE__, __LINE__, x0, w, y0, h); while (e >= 0) { @@ -258,5 +301,21 @@ RadialBlur::accelerated_render(Context context,Surface *surface,int quality, con if(cb && !cb->amount_complete(10000,10000)) return false; +// #define DRAW_TILE_OUTLINES +#ifdef DRAW_TILE_OUTLINES + // draw red lines to show tiles + { + int x, y; + if (w != 0 && h != 0) { + Surface::alpha_pen apen(surface->begin()); + apen.set_alpha(get_amount()); + apen.set_blend_method(get_blend_method()); + apen.set_value(Color(1, 0, 0, .1)); + for (x = 0; x < w; x++) { apen.put_value(); apen.inc_x(); } apen.dec_x(w); + for (y = 0; y < h; y++) { apen.put_value(); apen.inc_y(); } apen.dec_y(h); + } + } +#endif // DRAW_TILE_OUTLINES + return true; }