From c4fa0287b0920adf20f0a0339c8668cd988b993e Mon Sep 17 00:00:00 2001 From: dooglus Date: Mon, 21 Jan 2008 17:02:32 +0000 Subject: [PATCH] Don't use the optimization of using STRAIGHT blends instead of COMPOSITE when SYNFIG_CLIP_PASTECANVAS isn't defined, because it causes incorrect rendering in, for example, the 'examples/pirates.sifz' file. git-svn-id: http://svn.voria.com/code@1412 1f10aa63-cdf2-0310-b900-c93c546f37ac --- synfig-core/trunk/src/synfig/layer_pastecanvas.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/synfig-core/trunk/src/synfig/layer_pastecanvas.cpp b/synfig-core/trunk/src/synfig/layer_pastecanvas.cpp index 1994162..d19f066 100644 --- a/synfig-core/trunk/src/synfig/layer_pastecanvas.cpp +++ b/synfig-core/trunk/src/synfig/layer_pastecanvas.cpp @@ -333,13 +333,27 @@ Layer_PasteCanvas::accelerated_render(Context context,Surface *surface,int quali Color::BlendMethod blend_method(get_blend_method()); const Rect full_bounding_rect(canvas->get_context().get_full_bounding_rect()); - if(context->empty() || - !etl::intersect(context.get_full_bounding_rect(),full_bounding_rect+origin)) + if(context->empty()) { if (Color::is_onto(blend_method)) return true; if (blend_method==Color::BLEND_COMPOSITE) blend_method=Color::BLEND_STRAIGHT; } + if (!etl::intersect(context.get_full_bounding_rect(),full_bounding_rect+origin)) + { + if (Color::is_onto(blend_method)) return true; + + /* 'straight' is faster than 'composite' and has the same + * effect if the affected area of the lower layer is + * transparent; however, if we're not clipping the blit to + * just the bounding rectangle, the affected area is the whole + * tile, so we can't use this optimisation + */ +#ifdef SYNFIG_CLIP_PASTECANVAS + if (blend_method==Color::BLEND_COMPOSITE) blend_method=Color::BLEND_STRAIGHT; +#endif // SYNFIG_CLIP_PASTECANVAS + } + #ifdef SYNFIG_CLIP_PASTECANVAS Rect area(desc.get_rect() & full_bounding_rect); -- 2.7.4