⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 agg_pixfmt_rgb_packed.h

📁 这是VCF框架的代码
💻 H
📖 第 1 页 / 共 3 页
字号:
//----------------------------------------------------------------------------// 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_RGB_PACKED_INCLUDED#define AGG_PIXFMT_RGB_PACKED_INCLUDED#include <string.h>#include "agg_basics.h"#include "agg_color_rgba.h"#include "agg_rendering_buffer.h"namespace agg{    //=========================================================blender_rgb555    struct blender_rgb555    {        typedef rgba8 color_type;        typedef color_type::value_type value_type;        typedef color_type::calc_type calc_type;        typedef int16u pixel_type;        static AGG_INLINE void blend_pix(pixel_type* p,                                          unsigned cr, unsigned cg, unsigned cb,                                         unsigned alpha,                                          unsigned)        {            pixel_type rgb = *p;            calc_type r = (rgb >> 7) & 0xF8;            calc_type g = (rgb >> 2) & 0xF8;            calc_type b = (rgb << 3) & 0xF8;            *p = (pixel_type)               (((((cr - r) * alpha + (r << 8)) >> 1)  & 0x7C00) |                ((((cg - g) * alpha + (g << 8)) >> 6)  & 0x03E0) |                 (((cb - b) * alpha + (b << 8)) >> 11) | 0x8000);        }        static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)        {            return (pixel_type)(((r & 0xF8) << 7) |                                 ((g & 0xF8) << 2) |                                  (b >> 3) | 0x8000);        }        static AGG_INLINE color_type make_color(pixel_type p)        {            return color_type((p >> 7) & 0xF8,                               (p >> 2) & 0xF8,                               (p << 3) & 0xF8);        }    };    //=====================================================blender_rgb555_pre    struct blender_rgb555_pre    {        typedef rgba8 color_type;        typedef color_type::value_type value_type;        typedef color_type::calc_type calc_type;        typedef int16u pixel_type;        static AGG_INLINE void blend_pix(pixel_type* p,                                          unsigned cr, unsigned cg, unsigned cb,                                         unsigned alpha,                                          unsigned cover)        {            alpha = color_type::base_mask - alpha;            pixel_type rgb = *p;            calc_type r = (rgb >> 7) & 0xF8;            calc_type g = (rgb >> 2) & 0xF8;            calc_type b = (rgb << 3) & 0xF8;            *p = (pixel_type)               ((((r * alpha + cr * cover) >> 1)  & 0x7C00) |                (((g * alpha + cg * cover) >> 6)  & 0x03E0) |                 ((b * alpha + cb * cover) >> 11) | 0x8000);        }        static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)        {            return (pixel_type)(((r & 0xF8) << 7) |                                 ((g & 0xF8) << 2) |                                  (b >> 3) | 0x8000);        }        static AGG_INLINE color_type make_color(pixel_type p)        {            return color_type((p >> 7) & 0xF8,                               (p >> 2) & 0xF8,                               (p << 3) & 0xF8);        }    };    //=====================================================blender_rgb555_gamma    template<class Gamma> class blender_rgb555_gamma    {    public:        typedef rgba8 color_type;        typedef color_type::value_type value_type;        typedef color_type::calc_type calc_type;        typedef int16u pixel_type;        typedef Gamma gamma_type;        blender_rgb555_gamma() : m_gamma(0) {}        void gamma(const gamma_type& g) { m_gamma = &g; }        AGG_INLINE void blend_pix(pixel_type* p,                                   unsigned cr, unsigned cg, unsigned cb,                                  unsigned alpha,                                   unsigned)        {            pixel_type rgb = *p;            calc_type r = m_gamma->dir((rgb >> 7) & 0xF8);            calc_type g = m_gamma->dir((rgb >> 2) & 0xF8);            calc_type b = m_gamma->dir((rgb << 3) & 0xF8);            *p = (pixel_type)               (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 8)) >> 8) << 7) & 0x7C00) |                ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 8)) >> 8) << 2) & 0x03E0) |                 (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 8)) >> 8) >> 3) | 0x8000);        }        static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)        {            return (pixel_type)(((r & 0xF8) << 7) |                                 ((g & 0xF8) << 2) |                                  (b >> 3) | 0x8000);        }        static AGG_INLINE color_type make_color(pixel_type p)        {            return color_type((p >> 7) & 0xF8,                               (p >> 2) & 0xF8,                               (p << 3) & 0xF8);        }    private:        const Gamma* m_gamma;    };    //=========================================================blender_rgb565    struct blender_rgb565    {        typedef rgba8 color_type;        typedef color_type::value_type value_type;        typedef color_type::calc_type calc_type;        typedef int16u pixel_type;        static AGG_INLINE void blend_pix(pixel_type* p,                                          unsigned cr, unsigned cg, unsigned cb,                                         unsigned alpha,                                          unsigned)        {            pixel_type rgb = *p;            calc_type r = (rgb >> 8) & 0xF8;            calc_type g = (rgb >> 3) & 0xFC;            calc_type b = (rgb << 3) & 0xF8;            *p = (pixel_type)               (((((cr - r) * alpha + (r << 8))     ) & 0xF800) |                ((((cg - g) * alpha + (g << 8)) >> 5) & 0x07E0) |                 (((cb - b) * alpha + (b << 8)) >> 11));        }        static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)        {            return (pixel_type)(((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3));        }        static AGG_INLINE color_type make_color(pixel_type p)        {            return color_type((p >> 8) & 0xF8,                               (p >> 3) & 0xFC,                               (p << 3) & 0xF8);        }    };    //=====================================================blender_rgb565_pre    struct blender_rgb565_pre    {        typedef rgba8 color_type;        typedef color_type::value_type value_type;        typedef color_type::calc_type calc_type;        typedef int16u pixel_type;        static AGG_INLINE void blend_pix(pixel_type* p,                                          unsigned cr, unsigned cg, unsigned cb,                                         unsigned alpha,                                          unsigned cover)        {            alpha = color_type::base_mask - alpha;            pixel_type rgb = *p;            calc_type r = (rgb >> 8) & 0xF8;            calc_type g = (rgb >> 3) & 0xFC;            calc_type b = (rgb << 3) & 0xF8;            *p = (pixel_type)               ((((r * alpha + cr * cover)      ) & 0xF800) |                (((g * alpha + cg * cover) >> 5 ) & 0x07E0) |                 ((b * alpha + cb * cover) >> 11));        }        static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)        {            return (pixel_type)(((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3));        }        static AGG_INLINE color_type make_color(pixel_type p)        {            return color_type((p >> 8) & 0xF8,                               (p >> 3) & 0xFC,                               (p << 3) & 0xF8);        }    };    //=====================================================blender_rgb565_gamma    template<class Gamma> class blender_rgb565_gamma    {    public:        typedef rgba8 color_type;        typedef color_type::value_type value_type;        typedef color_type::calc_type calc_type;        typedef int16u pixel_type;        typedef Gamma gamma_type;        blender_rgb565_gamma() : m_gamma(0) {}        void gamma(const gamma_type& g) { m_gamma = &g; }        AGG_INLINE void blend_pix(pixel_type* p,                                   unsigned cr, unsigned cg, unsigned cb,                                  unsigned alpha,                                   unsigned)        {            pixel_type rgb = *p;            calc_type r = m_gamma->dir((rgb >> 8) & 0xF8);            calc_type g = m_gamma->dir((rgb >> 3) & 0xFC);            calc_type b = m_gamma->dir((rgb << 3) & 0xF8);            *p = (pixel_type)               (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 8)) >> 8) << 8) & 0xF800) |                ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 8)) >> 8) << 3) & 0x07E0) |                 (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 8)) >> 8) >> 3));        }        static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)        {            return (pixel_type)(((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3));        }        static AGG_INLINE color_type make_color(pixel_type p)        {            return color_type((p >> 8) & 0xF8,                               (p >> 3) & 0xFC,                               (p << 3) & 0xF8);        }    private:        const Gamma* m_gamma;    };    //=====================================================blender_rgbAAA    struct blender_rgbAAA    {        typedef rgba16 color_type;        typedef color_type::value_type value_type;        typedef color_type::calc_type calc_type;        typedef int32u pixel_type;        static AGG_INLINE void blend_pix(pixel_type* p,                                          unsigned cr, unsigned cg, unsigned cb,                                         unsigned alpha,                                          unsigned)        {            pixel_type rgb = *p;            calc_type r = (rgb >> 14) & 0xFFC0;            calc_type g = (rgb >> 4)  & 0xFFC0;            calc_type b = (rgb << 6)  & 0xFFC0;            *p = (pixel_type)               (((((cr - r) * alpha + (r << 16)) >> 2)  & 0x3FF00000) |                ((((cg - g) * alpha + (g << 16)) >> 12) & 0x000FFC00) |                 (((cb - b) * alpha + (b << 16)) >> 22) | 0xC0000000);        }        static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)        {            return (pixel_type)(((r & 0xFFC0) << 14) |                                 ((g & 0xFFC0) << 4) |                                  (b >> 6) | 0xC0000000);        }        static AGG_INLINE color_type make_color(pixel_type p)        {            return color_type((p >> 14) & 0xFFC0,                               (p >> 4)  & 0xFFC0,                               (p << 6)  & 0xFFC0);        }    };    //==================================================blender_rgbAAA_pre    struct blender_rgbAAA_pre    {        typedef rgba16 color_type;        typedef color_type::value_type value_type;        typedef color_type::calc_type calc_type;        typedef int32u pixel_type;        static AGG_INLINE void blend_pix(pixel_type* p,                                          unsigned cr, unsigned cg, unsigned cb,                                         unsigned alpha,                                          unsigned cover)        {            alpha = color_type::base_mask - alpha;            cover = (cover + 1) << (color_type::base_shift - 8);            pixel_type rgb = *p;            calc_type r = (rgb >> 14) & 0xFFC0;            calc_type g = (rgb >> 4)  & 0xFFC0;            calc_type b = (rgb << 6)  & 0xFFC0;            *p = (pixel_type)               ((((r * alpha + cr * cover) >> 2)  & 0x3FF00000) |                (((g * alpha + cg * cover) >> 12) & 0x000FFC00) |                 ((b * alpha + cb * cover) >> 22) | 0xC0000000);        }        static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)        {            return (pixel_type)(((r & 0xFFC0) << 14) |                                 ((g & 0xFFC0) << 4) |                                  (b >> 6) | 0xC0000000);        }        static AGG_INLINE color_type make_color(pixel_type p)        {            return color_type((p >> 14) & 0xFFC0,                               (p >> 4)  & 0xFFC0,                               (p << 6)  & 0xFFC0);        }    };    //=================================================blender_rgbAAA_gamma    template<class Gamma> class blender_rgbAAA_gamma    {    public:        typedef rgba16 color_type;        typedef color_type::value_type value_type;        typedef color_type::calc_type calc_type;        typedef int32u pixel_type;        typedef Gamma gamma_type;        blender_rgbAAA_gamma() : m_gamma(0) {}        void gamma(const gamma_type& g) { m_gamma = &g; }        AGG_INLINE void blend_pix(pixel_type* p,                                   unsigned cr, unsigned cg, unsigned cb,                                  unsigned alpha,                                   unsigned)        {            pixel_type rgb = *p;            calc_type r = m_gamma->dir((rgb >> 14) & 0xFFC0);            calc_type g = m_gamma->dir((rgb >> 4)  & 0xFFC0);            calc_type b = m_gamma->dir((rgb << 6)  & 0xFFC0);            *p = (pixel_type)               (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) << 14) & 0x3FF00000) |                ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 4 ) & 0x000FFC00) |                 (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) >> 6 ) | 0xC0000000);        }        static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)        {            return (pixel_type)(((r & 0xFFC0) << 14) |                                 ((g & 0xFFC0) << 4) |                                  (b >> 6) | 0xC0000000);        }        static AGG_INLINE color_type make_color(pixel_type p)        {            return color_type((p >> 14) & 0xFFC0, 

⌨️ 快捷键说明

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