|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  | // 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 |