Don't use the optimization of using STRAIGHT blends instead of COMPOSITE when SYNFIG_...
authordooglus <dooglus@1f10aa63-cdf2-0310-b900-c93c546f37ac>
Mon, 21 Jan 2008 17:02:32 +0000 (17:02 +0000)
committerdooglus <dooglus@1f10aa63-cdf2-0310-b900-c93c546f37ac>
Mon, 21 Jan 2008 17:02:32 +0000 (17:02 +0000)
git-svn-id: http://svn.voria.com/code@1412 1f10aa63-cdf2-0310-b900-c93c546f37ac

synfig-core/trunk/src/synfig/layer_pastecanvas.cpp

index 1994162..d19f066 100644 (file)
@@ -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);