
//----------------------------------------------------------------------------
// 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
//----------------------------------------------------------------------------
//
// class renderer_base
//
//----------------------------------------------------------------------------
#ifndef AGG_RENDERER_BASE_INCLUDED
#define AGG_RENDERER_BASE_INCLUDED
#include "agg_basics.h"
#include "agg_rendering_buffer.h"
namespace pdfium
{
namespace agg
{
template<class PixelFormat> class renderer_base 
{
public:
    typedef PixelFormat pixfmt_type;
    typedef typename pixfmt_type::color_type color_type;
    typedef typename pixfmt_type::row_data row_data;
    typedef typename pixfmt_type::span_data span_data;
    renderer_base() : m_ren(0), m_clip_box(1, 1, 0, 0) {}
    renderer_base(pixfmt_type& ren) :
        m_ren(&ren),
        m_clip_box(0, 0, ren.width() - 1, ren.height() - 1)
    {}
    void attach(pixfmt_type& ren)
    {
        m_ren = &ren;
        m_clip_box = rect(0, 0, ren.width() - 1, ren.height() - 1);
    }
    const pixfmt_type& ren() const
    {
        return *m_ren;
    }
    pixfmt_type& ren()
    {
        return *m_ren;
    }
    unsigned width()  const
    {
        return m_ren->width();
    }
    unsigned height() const
    {
        return m_ren->height();
    }
    void first_clip_box() {}
    bool next_clip_box()
    {
        return false;
    }
    const rect& clip_box() const
    {
        return m_clip_box;
    }
    int         xmin()     const
    {
        return m_clip_box.x1;
    }
    int         ymin()     const
    {
        return m_clip_box.y1;
    }
    int         xmax()     const
    {
        return m_clip_box.x2;
    }
    int         ymax()     const
    {
        return m_clip_box.y2;
    }
    const rect& bounding_clip_box() const
    {
        return m_clip_box;
    }
    int         bounding_xmin()     const
    {
        return m_clip_box.x1;
    }
    int         bounding_ymin()     const
    {
        return m_clip_box.y1;
    }
    int         bounding_xmax()     const
    {
        return m_clip_box.x2;
    }
    int         bounding_ymax()     const
    {
        return m_clip_box.y2;
    }
    void blend_hline(int x1, int y, int x2,
                     const color_type& c, cover_type cover)
    {
        if(x1 > x2) {
            int t = x2;
            x2 = x1;
            x1 = t;
        }
        if(y  > ymax()) {
            return;
        }
        if(y  < ymin()) {
            return;
        }
        if(x1 > xmax()) {
            return;
        }
        if(x2 < xmin()) {
            return;
        }
        if(x1 < xmin()) {
            x1 = xmin();
        }
        if(x2 > xmax()) {
            x2 = xmax();
        }
        m_ren->blend_hline(x1, y, x2 - x1 + 1, c, cover);
    }
    void blend_solid_hspan(int x, int y, int len,
                           const color_type& c,
                           const cover_type* covers)
    {
        if(y > ymax()) {
            return;
        }
        if(y < ymin()) {
            return;
        }
        if(x < xmin()) {
            len -= xmin() - x;
            if(len <= 0) {
                return;
            }
            covers += xmin() - x;
            x = xmin();
        }
        if(x + len > xmax()) {
            len = xmax() - x + 1;
            if(len <= 0) {
                return;
            }
        }
        m_ren->blend_solid_hspan(x, y, len, c, covers);
    }
private:
    pixfmt_type* m_ren;
    rect         m_clip_box;
};
}
}  // namespace pdfium
#endif
