X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fmodules%2Fmod_geometry%2Frectangle.cpp;h=9925751b929946ddd43620dfb56be8d896a786ab;hb=20a8054947d38fe892df03fe7c630d0190e13e87;hp=d0831e2de25026b3c3bba8630f6fcd40d1ee1df6;hpb=05dbfcbf51ce0991a27fa64b96d470dbaa106e08;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 d0831e2..9925751 100644 --- a/synfig-core/trunk/src/modules/mod_geometry/rectangle.cpp +++ b/synfig-core/trunk/src/modules/mod_geometry/rectangle.cpp @@ -377,7 +377,7 @@ Rectangle::accelerated_render(Context context,Surface *surface,int quality, cons surface->fill(color); // Check for the case where there is nothing to render - if(right-left<=0||bottom-top<=0) + if (right <= left || bottom <= top) return true; desc.set_subwindow(left,top,right-left,bottom-top); @@ -400,26 +400,31 @@ Rectangle::accelerated_render(Context context,Surface *surface,int quality, cons if(cb)cb->error(strprintf(__FILE__"%d: Accelerated Renderer Failure",__LINE__)); return false; } + Surface subimage; - // Check for the case where there is nothing to render - if(!(right-left<=0||bottom-top<=0)) + // Check for the case where there is something to render + if (right > left && bottom > top) { + // save a copy of the overlapping region from surface into subimage subimage.set_wh(right-left,bottom-top); Surface::pen subimage_pen(subimage.begin()); surface->blit_to(subimage_pen,left,top,right-left,bottom-top); } + // fill surface with the rectangle's colour Surface::alpha_pen surface_pen(surface->begin(),get_amount(),get_blend_method()); - surface->fill(color,surface_pen,w,h); - if(subimage) + if (subimage) { + // copy the saved overlapping region back from subimage into surface Surface::pen pen(surface->get_pen(left,top)); subimage.blit_to(pen); } - else return true; + else + // if there's no overlapping region, return now of the following code corrupts memory + return true; } Surface::alpha_pen pen;