Author: Carlos Lopez <genet...@gmail.com>
Date:   Thu Apr 18 18:56:27 2013 +0200

CairoColor: add specialization for Blend mode ALPHA_OVER and HARD_LIGHT

---

 synfig-core/src/synfig/color.cpp |   51 ++++++++++++++++++++++++++++++++++++++
 1 files changed, 51 insertions(+), 0 deletions(-)

diff --git a/synfig-core/src/synfig/color.cpp b/synfig-core/src/synfig/color.cpp
index c7aecef..ae53747 100644
--- a/synfig-core/src/synfig/color.cpp
+++ b/synfig-core/src/synfig/color.cpp
@@ -1058,6 +1058,45 @@ blendfunc_HARD_LIGHT(C &a,C &b,float amount)
        return blendfunc_ONTO(a,b,amount);
 }
 
+template <>
+CairoColor
+blendfunc_HARD_LIGHT(CairoColor &a, CairoColor &b, float amount)
+{
+       if(amount<0) a=~a, amount=-amount;
+       
+       int ra, ga, ba, aa;
+       int rb, gb, bb, ab;
+       int rc, gc, bc, ac;
+       
+       ra=a.get_r();
+       ga=a.get_g();
+       ba=a.get_b();
+       aa=a.get_a();
+       
+       rb=b.get_r();
+       gb=b.get_g();
+       bb=b.get_b();
+       ab=b.get_a();
+       
+       if(ra>127)      rc =255 -  (255-(ra*2-255))  *  (255-rb)/255.0;
+       else            rc= rb*(ra*2)/255.0;
+       if(ga>127)      gc =255 -  (255-(ga*2-255))  *  (255-gb)/255.0;
+       else            gc= gb*(ga*2)/255.0;
+       if(ba>127)      bc =255 -  (255-(ba*2-255))  *  (255-bb)/255.0;
+       else            bc= bb*(ba*2)/255.0;
+
+       return CairoColor::blend(CairoColor(rc, gc, bc, aa),b,amount, 
Color::BLEND_ONTO);
+//
+//     if(a.get_r()>half)      
a.set_r(one-(one-(a.get_r()*2*one-one))*(one-b.get_r()));
+//     else                            a.set_r(b.get_r()*(a.get_r()*2*one));
+//     if(a.get_g()>half)      
a.set_g(one-(one-(a.get_g()*2*one-one))*(one-b.get_g()));
+//     else                            a.set_g(b.get_g()*(a.get_g()*2*one));
+//     if(a.get_b()>half)      
a.set_b(one-(one-(a.get_b()*2*one-one))*(one-b.get_b()));
+//     else                            a.set_b(b.get_b()*(a.get_b()*2*one));
+//     
+//     return blendfunc_ONTO(a,b,amount);
+}
+
 template <class C>
 static C
 blendfunc_ALPHA_OVER(C &a,C &b,float amount)
@@ -1071,6 +1110,18 @@ blendfunc_ALPHA_OVER(C &a,C &b,float amount)
        return blendfunc_STRAIGHT(rm,b,amount);
 }
 
+template <>
+CairoColor
+blendfunc_ALPHA_OVER(CairoColor &a, CairoColor &b, float amount)
+{
+       CairoColor rm(b);
+       
+       //multiply the inverse alpha channel with the one below us
+       rm.set_a((255-a.get_a())*b.get_a()/255.0);
+       
+       return CairoColor::blend(rm,b,amount, Color::BLEND_STRAIGHT);
+}
+
 
 Color
 Color::blend(Color a, Color b,float amount, Color::BlendMethod type)


------------------------------------------------------------------------------
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