
//----------------------------------------------------------------------------
// Anti-Grain Geometry - Version 2.3
// 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_GRAY_INCLUDED
#define AGG_PIXFMT_GRAY_INCLUDED
#include "agg_basics.h"
#include "agg_color_gray.h"
#include "agg_rendering_buffer.h"
namespace pdfium
{
namespace agg
{
template<class ColorT> struct blender_gray  {
    typedef ColorT color_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 cv,
                                     unsigned alpha, unsigned cover = 0)
    {
        *p = (value_type)((((cv - calc_type(*p)) * alpha) + (calc_type(*p) << base_shift)) >> base_shift);
    }
};
template<class Blender, unsigned Step = 1, unsigned Offset = 0>
class pixel_formats_gray 
{
public:
    typedef rendering_buffer::row_data row_data;
    typedef rendering_buffer::span_data span_data;
    typedef typename Blender::color_type color_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_size  = color_type::base_size,
        base_mask  = color_type::base_mask
    };
private:
    static AGG_INLINE void copy_or_blend_pix(value_type* p,
            const color_type& c,
            unsigned cover)
    {
        if (c.a) {
            calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
            if(alpha == base_mask) {
                *p = c.v;
            } else {
                Blender::blend_pix(p, c.v, alpha, cover);
            }
        }
    }
    static AGG_INLINE void copy_or_blend_pix(value_type* p,
            const color_type& c)
    {
        if (c.a) {
            if(c.a == base_mask) {
                *p = c.v;
            } else {
                Blender::blend_pix(p, c.v, c.a);
            }
        }
    }
public:
    pixel_formats_gray(rendering_buffer& rb) :
        m_rbuf(&rb)
    {}
    AGG_INLINE unsigned width()  const
    {
        return m_rbuf->width();
    }
    AGG_INLINE unsigned height() const
    {
        return m_rbuf->height();
    }
    AGG_INLINE color_type pixel(int x, int y) const
    {
        value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;
        return color_type(*p);
    }
    row_data row(int x, int y) const
    {
        return row_data(x,
                        width() - 1,
                        m_rbuf->row(y) +
                        x * Step * sizeof(value_type) +
                        Offset * sizeof(value_type));
    }
    span_data span(int x, int y, unsigned len)
    {
        return span_data(x, len,
                         m_rbuf->row(y) +
                         x * Step * sizeof(value_type) +
                         Offset * sizeof(value_type));
    }
    AGG_INLINE void copy_pixel(int x, int y, const color_type& c)
    {
        *((value_type*)m_rbuf->row(y) + x * Step + Offset) = c.v;
    }
    AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover)
    {
        copy_or_blend_pix((value_type*)m_rbuf->row(y) + x * Step + Offset, c, cover);
    }
    AGG_INLINE void copy_hline(int x, int y,
                               unsigned len,
                               const color_type& c)
    {
        value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;
        do {
            *p = c.v;
            p += Step;
        } while(--len);
    }
    void blend_hline(int x, int y,
                     unsigned len,
                     const color_type& c,
                     int8u cover)
    {
        if (c.a) {
            value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;
            calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
            if(alpha == base_mask) {
                do {
                    *p = c.v;
                    p += Step;
                } while(--len);
            } else {
                do {
                    Blender::blend_pix(p, c.v, alpha, cover);
                    p += Step;
                } while(--len);
            }
        }
    }
    void blend_solid_hspan(int x, int y,
                           unsigned len,
                           const color_type& c,
                           const int8u* covers)
    {
        if (c.a) {
            value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;
            do {
                calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8;
                if(alpha == base_mask) {
                    *p = c.v;
                } else {
                    Blender::blend_pix(p, c.v, alpha, *covers);
                }
                p += Step;
                ++covers;
            } while(--len);
        }
    }
private:
    rendering_buffer* m_rbuf;
};
typedef blender_gray<gray8>      blender_gray8;
typedef pixel_formats_gray<blender_gray8, 1, 0> pixfmt_gray8;
}
}  // namespace pdfium
#endif
