X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fmodules%2Fmod_geometry%2Frectangle.cpp;h=537f1ec46bec2e158f7a52a42ddf8f6babc28fe8;hb=37600b4b217caa5e316984ec0b035c5e8f9698af;hp=9925751b929946ddd43620dfb56be8d896a786ab;hpb=20a8054947d38fe892df03fe7c630d0190e13e87;p=synfig.git diff --git a/synfig-core/trunk/src/modules/mod_geometry/rectangle.cpp b/synfig-core/trunk/src/modules/mod_geometry/rectangle.cpp index 9925751..537f1ec 100644 --- a/synfig-core/trunk/src/modules/mod_geometry/rectangle.cpp +++ b/synfig-core/trunk/src/modules/mod_geometry/rectangle.cpp @@ -6,6 +6,7 @@ ** ** \legal ** Copyright (c) 2002 Robert B. Quattlebaum Jr. +** Copyright (c) 2007 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 @@ -177,6 +178,15 @@ Rectangle::hit_check(synfig::Context context, const synfig::Point &pos)const return context.hit_check(pos); } +bool +Rectangle::is_solid_color()const +{ + return Layer_Composite::is_solid_color() || + (get_blend_method() == Color::BLEND_COMPOSITE && + get_amount() == 1.0f && + color.get_a() == 1.0f); +} + Color Rectangle::get_color(Context context, const Point &pos)const { @@ -456,12 +466,7 @@ Rectangle::accelerated_render(Context context,Surface *surface,int quality, cons return true; } - // Render what is behind us - if(!context.accelerated_render(surface,quality,renddesc,cb)) - { - if(cb)cb->error(strprintf(__FILE__"%d: Accelerated Renderer Failure",__LINE__)); - return false; - } + // not inverted int left(ceil_to_int((min[0]-tl[0])/pw)); int right(floor_to_int((max[0]-tl[0])/pw)); @@ -485,12 +490,29 @@ Rectangle::accelerated_render(Context context,Surface *surface,int quality, cons right = std::min(w,right); */ - Surface::alpha_pen pen; + // optimisation - if the whole tile is covered by this rectangle, + // and the rectangle is a solid colour, we don't need to render + // what's behind us + if (is_solid_color() && top == 0 && left == 0 && bottom == h && right == w) + { + surface->set_wh(w,h); + surface->fill(color); + return true; + } + + // Render what is behind us + if(!context.accelerated_render(surface,quality,renddesc,cb)) + { + if(cb)cb->error(strprintf(__FILE__"%d: Accelerated Renderer Failure",__LINE__)); + return false; + } // In the case where there is nothing to render... - if(right-left<0||bottom-top<0) + if (right < left || bottom < top) return true; + Surface::alpha_pen pen; + if(right-left>0&&bottom-top>0) { if(is_solid_color())