Author: Carlos Lopez <genet...@gmail.com>
Date:   Sun Apr 14 20:30:18 2013 +0200

Fix blend method COMPOSITE for CairoColor.

---

 synfig-core/src/synfig/color.cpp |   28 +++++++++++++++++++---------
 1 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/synfig-core/src/synfig/color.cpp b/synfig-core/src/synfig/color.cpp
index e08f322..0b14090 100644
--- a/synfig-core/src/synfig/color.cpp
+++ b/synfig-core/src/synfig/color.cpp
@@ -289,24 +289,34 @@ blendfunc_COMPOSITE(CairoColor &a, CairoColor &b, float 
amount)
 {
        int ra, ga, ba, aa;
        int rb, gb, bb, ab;
-       int rc, gc, bc, ac;
+       int rc, gc, bc;
+       float ac;
+       
+       float faa, fab, A, AA;
        
        ra=a.get_r();
        ga=a.get_g();
        ba=a.get_b();
-       aa=a.get_a()*amount;
+       aa=a.get_a();
+       aa=aa*amount;
+       A=aa/255.0;
+       AA=1.0-A;
        
        rb=b.get_r();
        gb=b.get_g();
        bb=b.get_b();
        ab=b.get_a();
-       
-       ac=aa+(ab*(255-aa))/255;
-       if(ac==0) return CairoColor::alpha();
-       
-       rc=(ra*aa+rb*ab*(255-aa)/255)/255;
-       gc=(ga*aa+gb*ab*(255-aa)/255)/255;
-       bc=(ba*aa+bb*ab*(255-aa)/255)/255;
+
+       ac=aa+ab*AA;
+       if(fabsf(ac)<COLOR_EPSILON)
+               return CairoColor::alpha();
+
+       faa=aa/ac;
+       fab=ab*AA/ac;
+
+       rc=ra*faa+rb*fab;
+       gc=ga*faa+gb*fab;
+       bc=ba*faa+bb*fab;
        
        return CairoColor(rc, gc, bc, ac);
 


------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter
_______________________________________________
Synfig-devl mailing list
Synfig-devl@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/synfig-devl

Reply via email to