composite-private.h

Go to the documentation of this file.
00001 /*
00002   Copyright 1999-2010 ImageMagick Studio LLC, a non-profit organization
00003   dedicated to making software imaging solutions freely available.
00004   
00005   You may not use this file except in compliance with the License.
00006   obtain a copy of the License at
00007   
00008     http://www.imagemagick.org/script/license.php
00009   
00010   Unless required by applicable law or agreed to in writing, software
00011   distributed under the License is distributed on an "AS IS" BASIS,
00012   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013   See the License for the specific language governing permissions and
00014   limitations under the License.
00015 
00016   MagickCore image composite private methods.
00017 */
00018 #ifndef _MAGICKCORE_COMPOSITE_PRIVATE_H
00019 #define _MAGICKCORE_COMPOSITE_PRIVATE_H
00020 
00021 #if defined(__cplusplus) || defined(c_plusplus)
00022 extern "C" {
00023 #endif
00024 
00025 /*
00026   ImageMagick Alpha Composite Inline Methods (special export)
00027 */
00028 
00029 #include "magick/color.h"
00030 #include "magick/image.h"
00031 #include "magick/image-private.h"
00032 
00033 static inline MagickRealType RoundToUnity(const MagickRealType value)
00034 {
00035   return(value < 0.0 ? 0.0 : (value > 1.0) ? 1.0 : value);
00036 }
00037 
00038 static inline MagickRealType MagickOver_(const MagickRealType p,
00039   const MagickRealType alpha,const MagickRealType q,const MagickRealType beta)
00040 {
00041   MagickRealType
00042     pixel;
00043 
00044   pixel=(1.0-QuantumScale*alpha)*p+(1.0-QuantumScale*beta)*q*QuantumScale*alpha;
00045   return(pixel);
00046 }
00047 
00048 /*
00049   Compose pixel p over pixel q with the given opacities
00050 */
00051 static inline void MagickCompositeOver(const PixelPacket *p,
00052   const MagickRealType alpha,const PixelPacket *q,const MagickRealType beta,
00053   PixelPacket *composite)
00054 {
00055   MagickRealType
00056     gamma;
00057 
00058   if (alpha == TransparentOpacity)
00059     {
00060       *composite=(*q);
00061       return;
00062     }
00063   gamma=1.0-QuantumScale*QuantumScale*alpha*beta;
00064 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00065   composite->opacity=(Quantum) (QuantumRange*(1.0-gamma)+0.5);
00066   gamma=1.0/(gamma <= MagickEpsilon ? 1.0 : gamma);
00067   composite->red=(Quantum) (gamma*MagickOver_((MagickRealType) p->red,alpha,
00068     (MagickRealType) q->red,beta)+0.5);
00069   composite->green=(Quantum) (gamma*MagickOver_((MagickRealType) p->green,alpha,
00070     (MagickRealType) q->green,beta)+0.5);
00071   composite->blue=(Quantum) (gamma*MagickOver_((MagickRealType) p->blue,alpha,
00072     (MagickRealType) q->blue,beta)+0.5);
00073 #else
00074   composite->opacity=(Quantum) (QuantumRange*(1.0-gamma));
00075   gamma=1.0/(gamma <= MagickEpsilon ? 1.0 : gamma);
00076   composite->red=(Quantum) (gamma*MagickOver_((MagickRealType) p->red,alpha,
00077     (MagickRealType) q->red,beta));
00078   composite->green=(Quantum) (gamma*MagickOver_((MagickRealType) p->green,alpha,
00079     (MagickRealType) q->green,beta));
00080   composite->blue=(Quantum) (gamma*MagickOver_((MagickRealType) p->blue,alpha,
00081     (MagickRealType) q->blue,beta));
00082 #endif
00083 }
00084 
00085 /*
00086   Compose pixel p over pixel q with the given opacities
00087 */
00088 static inline void MagickPixelCompositeOver(const MagickPixelPacket *p,
00089   const MagickRealType alpha,const MagickPixelPacket *q,
00090   const MagickRealType beta,MagickPixelPacket *composite)
00091 {
00092   MagickRealType
00093     gamma;
00094 
00095   if (alpha == TransparentOpacity)
00096     {
00097       *composite=(*q);
00098       return;
00099     }
00100   gamma=1.0-QuantumScale*QuantumScale*alpha*beta;
00101   composite->opacity=(MagickRealType) QuantumRange*(1.0-gamma);
00102   gamma=1.0/(gamma <= MagickEpsilon ? 1.0 : gamma);
00103   composite->red=gamma*MagickOver_(p->red,alpha,q->red,beta);
00104   composite->green=gamma*MagickOver_(p->green,alpha,q->green,beta);
00105   composite->blue=gamma*MagickOver_(p->blue,alpha,q->blue,beta);
00106   if ((p->colorspace == CMYKColorspace) && (q->colorspace == CMYKColorspace))
00107     composite->index=gamma*MagickOver_(p->index,alpha,q->index,beta);
00108 }
00109 
00110 
00111 static inline MagickRealType MagickPlus_(const MagickRealType p,
00112   const MagickRealType alpha,const MagickRealType q,const MagickRealType beta)
00113 {
00114   return((1.0-QuantumScale*alpha)*p+(1.0-QuantumScale*beta)*q);
00115 }
00116 
00117 /*
00118   Add two pixels with the given opacities
00119 */
00120 static inline void MagickPixelCompositePlus(const MagickPixelPacket *p,
00121   const MagickRealType alpha,const MagickPixelPacket *q,
00122   const MagickRealType beta,MagickPixelPacket *composite)
00123 {
00124   MagickRealType
00125     gamma;
00126 
00127   gamma=RoundToUnity((1.0-QuantumScale*alpha)+(1.0-QuantumScale*beta));
00128   composite->opacity=(MagickRealType) QuantumRange*(1.0-gamma);
00129   gamma=1.0/(fabs(gamma) <= MagickEpsilon ? 1.0 : gamma);
00130   composite->red=gamma*MagickPlus_(p->red,alpha,q->red,beta);
00131   composite->green=gamma*MagickPlus_(p->green,alpha,q->green,beta);
00132   composite->blue=gamma*MagickPlus_(p->blue,alpha,q->blue,beta);
00133   if (q->colorspace == CMYKColorspace)
00134     composite->index=gamma*MagickPlus_(p->index,alpha,q->index,beta);
00135 }
00136 
00137 /*
00138   Blend pixel colors p and q by the amount given
00139 */
00140 static inline void MagickPixelCompositeBlend(const MagickPixelPacket *p,
00141   const MagickRealType alpha,const MagickPixelPacket *q,
00142   const MagickRealType beta,MagickPixelPacket *composite)
00143 {
00144   MagickPixelCompositePlus(p,(MagickRealType) (QuantumRange-alpha*
00145     (QuantumRange-p->opacity)),q,(MagickRealType) (QuantumRange-beta*
00146     (QuantumRange-q->opacity)),composite);
00147 }
00148 
00149 #if defined(__cplusplus) || defined(c_plusplus)
00150 }
00151 #endif
00152 
00153 #endif

Generated on Sat Jan 26 14:50:29 2008 for MagickCore by  doxygen 1.5.4