Author: Carlos Lopez <[email protected]>
Date: Tue Apr 16 20:26:19 2013 +0200
Fix blend method DARKEN for CairoColor.
---
synfig-core/src/synfig/cairo_operators.cpp | 3 ++-
synfig-core/src/synfig/color.cpp | 20 ++++++++++----------
2 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/synfig-core/src/synfig/cairo_operators.cpp
b/synfig-core/src/synfig/cairo_operators.cpp
index f777e40..0c5f535 100644
--- a/synfig-core/src/synfig/cairo_operators.cpp
+++ b/synfig-core/src/synfig/cairo_operators.cpp
@@ -279,7 +279,8 @@ void cairo_paint_with_alpha_operator(cairo_t* acr, float
alpha, Color::BlendMeth
for(int y=0;y<h;y++)
for(int x=0;x<w;x++)
{
-
cdest[h0+y][w0+x]=CairoColor::blend(csource[y][x], cdest[h0+y][w0+x], alpha,
method);
+ CairoColor
ret=CairoColor::blend(csource[y][x].demult_alpha(), cdest[h0+y][w0+x], alpha,
method);
+ cdest[h0+y][w0+x]=ret.premult_alpha();
}
csource.unmap_cairo_image();
cdest.unmap_cairo_image();
diff --git a/synfig-core/src/synfig/color.cpp b/synfig-core/src/synfig/color.cpp
index 2323c9e..b88dad5 100644
--- a/synfig-core/src/synfig/color.cpp
+++ b/synfig-core/src/synfig/color.cpp
@@ -456,10 +456,11 @@ blendfunc_BRIGHTEN(CairoColor &a, CairoColor &b, float
amount)
gb=b.get_g();
bb=b.get_b();
ab=b.get_a();
-
- const int raab(ra*aa*amount/255.0);
- const int gaab(ga*aa*amount/255.0);
- const int baab(ba*aa*amount/255.0);
+
+ const float alpha = aa*amount/255.0;
+ const int raab(ra*alpha);
+ const int gaab(ga*alpha);
+ const int baab(ba*alpha);
if(rb<raab)
rc=raab;
@@ -520,22 +521,21 @@ blendfunc_DARKEN(CairoColor &a, CairoColor &b, float
amount)
bb=b.get_b();
ab=b.get_a();
- const int ab255=ab*255;
- const int abaa=ab*aa;
-
- int rcompare=(amount*(ra*ab-abaa)+ab255)/255;
+ const float alpha=aa*amount/255.0;
+
+ int rcompare=(ra-255)*alpha+255;
if(rb > rcompare)
rc=rcompare;
else
rc=rb;
- int gcompare=(amount*(ga*ab-abaa)+ab255)/255;
+ int gcompare=(ga-255)*alpha+255;
if(gb > gcompare)
gc=gcompare;
else
gc=gb;
- int bcompare=(amount*(ba*ab-abaa)+ab255)/255;
+ int bcompare=(ba-255)*alpha+255;
if(bb > bcompare)
bc=bcompare;
else
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/synfig-devl