agg_pixfmt_rgba.h

来自「这是VCF框架的代码」· C头文件 代码 · 共 1,565 行 · 第 1/5 页

H
1,565
字号
//----------------------------------------------------------------------------// Anti-Grain Geometry - Version 2.4// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)//// Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied// warranty, and with no claim as to its suitability for any purpose.////----------------------------------------------------------------------------// Contact: mcseem@antigrain.com//          mcseemagg@yahoo.com//          http://www.antigrain.com//----------------------------------------------------------------------------//// Adaptation for high precision colors has been sponsored by // Liberty Technology Systems, Inc., visit http://lib-sys.com//// Liberty Technology Systems, Inc. is the provider of// PostScript and PDF technology for software developers.// //----------------------------------------------------------------------------#ifndef AGG_PIXFMT_RGBA_INCLUDED#define AGG_PIXFMT_RGBA_INCLUDED#include <string.h>#include <math.h>#include "agg_basics.h"#include "agg_color_rgba.h"#include "agg_rendering_buffer.h"namespace agg{    //=========================================================multiplier_rgba    template<class ColorT, class Order> struct multiplier_rgba    {        typedef typename ColorT::value_type value_type;        typedef typename ColorT::calc_type calc_type;        //--------------------------------------------------------------------        static AGG_INLINE void premultiply(value_type* p)        {            calc_type a = p[Order::A];            if(a < ColorT::base_mask)            {                if(a == 0)                {                    p[Order::R] = p[Order::G] = p[Order::B] = 0;                    return;                }                p[Order::R] = value_type((p[Order::R] * a + ColorT::base_mask) >> ColorT::base_shift);                p[Order::G] = value_type((p[Order::G] * a + ColorT::base_mask) >> ColorT::base_shift);                p[Order::B] = value_type((p[Order::B] * a + ColorT::base_mask) >> ColorT::base_shift);            }        }        //--------------------------------------------------------------------        static AGG_INLINE void demultiply(value_type* p)        {            calc_type a = p[Order::A];            if(a < ColorT::base_mask)            {                if(a == 0)                {                    p[Order::R] = p[Order::G] = p[Order::B] = 0;                    return;                }                calc_type r = (calc_type(p[Order::R]) * ColorT::base_mask) / a;                calc_type g = (calc_type(p[Order::G]) * ColorT::base_mask) / a;                calc_type b = (calc_type(p[Order::B]) * ColorT::base_mask) / a;                p[Order::R] = value_type((r > ColorT::base_mask) ? ColorT::base_mask : r);                p[Order::G] = value_type((g > ColorT::base_mask) ? ColorT::base_mask : g);                p[Order::B] = value_type((b > ColorT::base_mask) ? ColorT::base_mask : b);            }        }    };    //=====================================================apply_gamma_dir_rgba    template<class ColorT, class Order, class GammaLut> class apply_gamma_dir_rgba    {    public:        typedef typename ColorT::value_type value_type;        apply_gamma_dir_rgba(const GammaLut& gamma) : m_gamma(gamma) {}        AGG_INLINE void operator () (value_type* p)        {            p[Order::R] = m_gamma.dir(p[Order::R]);            p[Order::G] = m_gamma.dir(p[Order::G]);            p[Order::B] = m_gamma.dir(p[Order::B]);        }    private:        const GammaLut& m_gamma;    };    //=====================================================apply_gamma_inv_rgba    template<class ColorT, class Order, class GammaLut> class apply_gamma_inv_rgba    {    public:        typedef typename ColorT::value_type value_type;        apply_gamma_inv_rgba(const GammaLut& gamma) : m_gamma(gamma) {}        AGG_INLINE void operator () (value_type* p)        {            p[Order::R] = m_gamma.inv(p[Order::R]);            p[Order::G] = m_gamma.inv(p[Order::G]);            p[Order::B] = m_gamma.inv(p[Order::B]);        }    private:        const GammaLut& m_gamma;    };        //=============================================================blender_rgba    template<class ColorT, class Order> struct blender_rgba    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        enum base_scale_e         {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        //--------------------------------------------------------------------        static AGG_INLINE void blend_pix(value_type* p,                                          unsigned cr, unsigned cg, unsigned cb,                                         unsigned alpha,                                          unsigned cover=0)        {            calc_type r = p[Order::R];            calc_type g = p[Order::G];            calc_type b = p[Order::B];            calc_type a = p[Order::A];            p[Order::R] = (value_type)(((cr - r) * alpha + (r << base_shift)) >> base_shift);            p[Order::G] = (value_type)(((cg - g) * alpha + (g << base_shift)) >> base_shift);            p[Order::B] = (value_type)(((cb - b) * alpha + (b << base_shift)) >> base_shift);            p[Order::A] = (value_type)((alpha + a) - ((alpha * a + base_mask) >> base_shift));        }    };    //=========================================================blender_rgba_pre    template<class ColorT, class Order> struct blender_rgba_pre    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        //--------------------------------------------------------------------        static AGG_INLINE void blend_pix(value_type* p,                                          unsigned cr, unsigned cg, unsigned cb,                                         unsigned alpha,                                         unsigned cover)        {            alpha = color_type::base_mask - alpha;            cover = (cover + 1) << (base_shift - 8);            p[Order::R] = (value_type)((p[Order::R] * alpha + cr * cover) >> base_shift);            p[Order::G] = (value_type)((p[Order::G] * alpha + cg * cover) >> base_shift);            p[Order::B] = (value_type)((p[Order::B] * alpha + cb * cover) >> base_shift);            p[Order::A] = (value_type)(base_mask - ((alpha * (base_mask - p[Order::A])) >> base_shift));        }        //--------------------------------------------------------------------        static AGG_INLINE void blend_pix(value_type* p,                                          unsigned cr, unsigned cg, unsigned cb,                                         unsigned alpha)        {            alpha = color_type::base_mask - alpha;            p[Order::R] = (value_type)(((p[Order::R] * alpha) >> base_shift) + cr);            p[Order::G] = (value_type)(((p[Order::G] * alpha) >> base_shift) + cg);            p[Order::B] = (value_type)(((p[Order::B] * alpha) >> base_shift) + cb);            p[Order::A] = (value_type)(base_mask - ((alpha * (base_mask - p[Order::A])) >> base_shift));        }    };    //======================================================blender_rgba_plain    template<class ColorT, class Order> struct blender_rgba_plain    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        typedef typename color_type::calc_type calc_type;        enum base_scale_e { base_shift = color_type::base_shift };        //--------------------------------------------------------------------        static AGG_INLINE void blend_pix(value_type* p,                                          unsigned cr, unsigned cg, unsigned cb,                                         unsigned alpha,                                         unsigned cover=0)        {            if(alpha == 0) return;            calc_type a = p[Order::A];            calc_type r = p[Order::R] * a;            calc_type g = p[Order::G] * a;            calc_type b = p[Order::B] * a;            a = ((alpha + a) << base_shift) - alpha * a;            p[Order::A] = (value_type)(a >> base_shift);            p[Order::R] = (value_type)((((cr << base_shift) - r) * alpha + (r << base_shift)) / a);            p[Order::G] = (value_type)((((cg << base_shift) - g) * alpha + (g << base_shift)) / a);            p[Order::B] = (value_type)((((cb << base_shift) - b) * alpha + (b << base_shift)) / a);        }    };    //=========================================================comp_op_rgba_clear    template<class ColorT, class Order> struct comp_op_rgba_clear    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        enum base_scale_e        {             base_shift = color_type::base_shift,            base_mask  = color_type::base_mask        };        static AGG_INLINE void blend_pix(value_type* p,                                          unsigned, unsigned, unsigned, unsigned,                                         unsigned cover)        {            if(cover < 255)            {                cover = 255 - cover;                p[Order::R] = (value_type)((p[Order::R] * cover + 255) >> 8);                p[Order::G] = (value_type)((p[Order::G] * cover + 255) >> 8);                p[Order::B] = (value_type)((p[Order::B] * cover + 255) >> 8);                p[Order::A] = (value_type)((p[Order::A] * cover + 255) >> 8);            }            else            {                p[0] = p[1] = p[2] = p[3] = 0;             }        }    };    //===========================================================comp_op_rgba_src    template<class ColorT, class Order> struct comp_op_rgba_src    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        static AGG_INLINE void blend_pix(value_type* p,                                          unsigned sr, unsigned sg, unsigned sb,                                          unsigned sa, unsigned cover)        {            if(cover < 255)            {                unsigned alpha = 255 - cover;                p[Order::R] = (value_type)(((p[Order::R] * alpha + 255) >> 8) + ((sr * cover + 255) >> 8));                p[Order::G] = (value_type)(((p[Order::G] * alpha + 255) >> 8) + ((sg * cover + 255) >> 8));                p[Order::B] = (value_type)(((p[Order::B] * alpha + 255) >> 8) + ((sb * cover + 255) >> 8));                p[Order::A] = (value_type)(((p[Order::A] * alpha + 255) >> 8) + ((sa * cover + 255) >> 8));            }            else            {                p[Order::R] = sr;                p[Order::G] = sg;                p[Order::B] = sb;                p[Order::A] = sa;            }        }    };    //===========================================================comp_op_rgba_dst    template<class ColorT, class Order> struct comp_op_rgba_dst    {        typedef ColorT color_type;        typedef Order order_type;        typedef typename color_type::value_type value_type;        static AGG_INLINE void blend_pix(value_type*,                                          unsigned, unsigned, unsigned,                                          unsigned, unsigned)        {        }    };    //======================================================comp_op_rgba_src_over    template<class ColorT, class Order> struct comp_op_rgba_src_over    {        typedef ColorT color_type;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?