From: cristy Date: Wed, 3 Jun 2015 15:56:19 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 7.0.1-0~969 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=caa592ef9d5a7cb08affb2d3922fbedc7bcd22cb;p=imagemagick --- diff --git a/MagickCore/composite-private.h b/MagickCore/composite-private.h index cf9bca64f..0d233e5d4 100644 --- a/MagickCore/composite-private.h +++ b/MagickCore/composite-private.h @@ -32,8 +32,8 @@ extern "C" { /* ImageMagick Alpha Composite Inline Methods (special export) */ -static inline double MagickOver_(const double p, - const double alpha,const double q,const double beta) +static inline double MagickOver_(const double p,const double alpha, + const double q,const double beta) { double Da, @@ -44,11 +44,17 @@ static inline double MagickOver_(const double p, return(Sa*p-Sa*Da*q+Da*q); } +static inline double RoundToUnity(const double value) +{ + return(value < 0.0 ? 0.0 : (value > 1.0) ? 1.0 : value); +} + static inline void CompositePixelOver(const Image *image,const PixelInfo *p, const double alpha,const Quantum *q,const double beta,Quantum *composite) { double Da, + gamma, Sa; register ssize_t @@ -59,6 +65,8 @@ static inline void CompositePixelOver(const Image *image,const PixelInfo *p, */ Sa=QuantumScale*alpha; Da=QuantumScale*beta; + gamma=Sa+Da-Sa*Da; + gamma=PerceptibleReciprocal(gamma); for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -75,31 +83,31 @@ static inline void CompositePixelOver(const Image *image,const PixelInfo *p, { case RedPixelChannel: { - composite[i]=ClampToQuantum(MagickOver_((double) p->red,alpha, + composite[i]=ClampToQuantum(gamma*MagickOver_((double) p->red,alpha, (double) q[i],beta)); break; } case GreenPixelChannel: { - composite[i]=ClampToQuantum(MagickOver_((double) p->green,alpha, + composite[i]=ClampToQuantum(gamma*MagickOver_((double) p->green,alpha, (double) q[i],beta)); break; } case BluePixelChannel: { - composite[i]=ClampToQuantum(MagickOver_((double) p->blue,alpha, + composite[i]=ClampToQuantum(gamma*MagickOver_((double) p->blue,alpha, (double) q[i],beta)); break; } case BlackPixelChannel: { - composite[i]=ClampToQuantum(MagickOver_((double) p->black,alpha, + composite[i]=ClampToQuantum(gamma*MagickOver_((double) p->black,alpha, (double) q[i],beta)); break; } case AlphaPixelChannel: { - composite[i]=ClampToQuantum(QuantumRange*(Sa+Da-Sa*-Da)); + composite[i]=ClampToQuantum(QuantumRange*RoundToUnity(Sa+Da-Sa*Da)); break; } default: @@ -116,6 +124,7 @@ static inline void CompositePixelInfoOver(const PixelInfo *p, { double Da, + gamma, Sa; /* @@ -123,17 +132,14 @@ static inline void CompositePixelInfoOver(const PixelInfo *p, */ Sa=QuantumScale*alpha; Da=QuantumScale*beta, - composite->alpha=(double) QuantumRange*(Sa+Da-Sa*Da); - composite->red=MagickOver_(p->red,alpha,q->red,beta); - composite->green=MagickOver_(p->green,alpha,q->green,beta); - composite->blue=MagickOver_(p->blue,alpha,q->blue,beta); + gamma=Sa+Da-Sa*Da; + composite->alpha=(double) QuantumRange*RoundToUnity(gamma); + gamma=PerceptibleReciprocal(gamma); + composite->red=gamma*MagickOver_(p->red,alpha,q->red,beta); + composite->green=gamma*MagickOver_(p->green,alpha,q->green,beta); + composite->blue=gamma*MagickOver_(p->blue,alpha,q->blue,beta); if (q->colorspace == CMYKColorspace) - composite->black=MagickOver_(p->black,alpha,q->black,beta); -} - -static inline double RoundToUnity(const double value) -{ - return(value < 0.0 ? 0.0 : (value > 1.0) ? 1.0 : value); + composite->black=gamma*MagickOver_(p->black,alpha,q->black,beta); } static inline void CompositePixelInfoPlus(const PixelInfo *p, @@ -150,7 +156,7 @@ static inline void CompositePixelInfoPlus(const PixelInfo *p, Sa=QuantumScale*alpha; Da=QuantumScale*beta; gamma=RoundToUnity(Sa+Da); /* 'Plus' blending -- not 'Over' blending */ - composite->alpha=(double) QuantumRange*gamma; + composite->alpha=(double) QuantumRange*RoundToUnity(gamma); gamma=PerceptibleReciprocal(gamma); composite->red=gamma*(Sa*p->red+Da*q->red); composite->green=gamma*(Sa*p->green+Da*q->green);