From c0250d28ac7fa975aa235cafe9b3fc7494cd5c96 Mon Sep 17 00:00:00 2001 From: dooglus Date: Fri, 5 Oct 2007 21:57:38 +0000 Subject: [PATCH] Fix 1807709: radial blur doesn't render properly. It renders much more properly now. Compare http://dooglus.rincevent.net/synfig/radial-blur-without-fix.png and http://dooglus.rincevent.net/synfig/radial-blur-with-fix.png (rendered from http://dooglus.rincevent.net/synfig/radial-blur-3.sifz ). git-svn-id: http://svn.voria.com/code@843 1f10aa63-cdf2-0310-b900-c93c546f37ac --- .../trunk/src/modules/mod_filter/radialblur.cpp | 79 ++++++++++++++++++---- 1 file changed, 65 insertions(+), 14 deletions(-) diff --git a/synfig-core/trunk/src/modules/mod_filter/radialblur.cpp b/synfig-core/trunk/src/modules/mod_filter/radialblur.cpp index 786615a..0d0126d 100644 --- a/synfig-core/trunk/src/modules/mod_filter/radialblur.cpp +++ b/synfig-core/trunk/src/modules/mod_filter/radialblur.cpp @@ -133,25 +133,57 @@ RadialBlur::accelerated_render(Context context,Surface *surface,int quality, con 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; @@ -159,15 +191,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; @@ -219,7 +253,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) { @@ -261,5 +296,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; } -- 2.7.4