1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//----------------------------------------------------------------------------
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Anti-Grain Geometry - Version 2.3
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Permission to copy, use, modify, sell and distribute this software
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// is granted provided this copyright notice appears in all copies.
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// This software is provided "as is" without express or implied
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// warranty, and with no claim as to its suitability for any purpose.
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//----------------------------------------------------------------------------
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Contact: mcseem@antigrain.com
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//          mcseemagg@yahoo.com
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//          http://www.antigrain.com
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//----------------------------------------------------------------------------
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Adaptation for 32-bit screen coordinates (scanline32_u) has been sponsored by
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Liberty Technology Systems, Inc., visit http://lib-sys.com
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Liberty Technology Systems, Inc. is the provider of
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// PostScript and PDF technology for software developers.
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//----------------------------------------------------------------------------
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef AGG_SCANLINE_U_INCLUDED
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define AGG_SCANLINE_U_INCLUDED
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "agg_array.h"
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace agg
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtemplate<class CoverT> class scanline_u : public CFX_Object
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    typedef scanline_u<CoverT> self_type;
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    typedef CoverT cover_type;
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    typedef int16  coord_type;
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    struct span : public CFX_Object {
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        coord_type  x;
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        coord_type  len;
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        cover_type* covers;
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    };
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    typedef span* iterator;
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    typedef const span* const_iterator;
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~scanline_u()
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_Free(m_spans);
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_Free(m_covers);
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    scanline_u() :
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_min_x(0),
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_max_len(0),
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_last_x(0x7FFFFFF0),
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_covers(0),
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_spans(0),
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_cur_span(0)
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {}
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void reset(int min_x, int max_x)
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        unsigned max_len = max_x - min_x + 2;
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(max_len > m_max_len) {
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_Free(m_spans);
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_Free(m_covers);
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_covers  = FX_Alloc( cover_type , max_len);
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_spans   = FX_Alloc( span       , max_len);
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_max_len = max_len;
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_last_x        = 0x7FFFFFF0;
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_min_x         = min_x;
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_cur_span      = m_spans;
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void add_cell(int x, unsigned cover)
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        x -= m_min_x;
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_covers[x] = (cover_type)cover;
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(x == m_last_x + 1) {
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_cur_span->len++;
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_cur_span++;
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_cur_span->x      = (coord_type)(x + m_min_x);
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_cur_span->len    = 1;
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_cur_span->covers = m_covers + x;
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_last_x = x;
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void add_cells(int x, unsigned len, const CoverT* covers)
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        x -= m_min_x;
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FXSYS_memcpy(m_covers + x, covers, len * sizeof(CoverT));
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(x == m_last_x + 1) {
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_cur_span->len += (coord_type)len;
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_cur_span++;
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_cur_span->x      = (coord_type)(x + m_min_x);
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_cur_span->len    = (coord_type)len;
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_cur_span->covers = m_covers + x;
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_last_x = x + len - 1;
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void add_span(int x, unsigned len, unsigned cover)
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        x -= m_min_x;
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FXSYS_memset8(m_covers + x, cover, len);
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(x == m_last_x + 1) {
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_cur_span->len += (coord_type)len;
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_cur_span++;
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_cur_span->x      = (coord_type)(x + m_min_x);
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_cur_span->len    = (coord_type)len;
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_cur_span->covers = m_covers + x;
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_last_x = x + len - 1;
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void finalize(int y)
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_y = y;
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void reset_spans()
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_last_x    = 0x7FFFFFF0;
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_cur_span  = m_spans;
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int      y()           const
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_y;
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    unsigned num_spans()   const
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return unsigned(m_cur_span - m_spans);
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const_iterator begin() const
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_spans + 1;
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    iterator       begin()
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_spans + 1;
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate:
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    scanline_u(const self_type&);
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const self_type& operator = (const self_type&);
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate:
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int           m_min_x;
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    unsigned      m_max_len;
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int           m_last_x;
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int           m_y;
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cover_type*   m_covers;
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    span*         m_spans;
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    span*         m_cur_span;
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef scanline_u<int8u> scanline_u8;
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
151