agg_rasterizer_compound_aa.h

来自「这是VCF框架的代码」· C头文件 代码 · 共 600 行 · 第 1/2 页

H
600
字号
    }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_compound_aa<Clip>::styles(int left, int right)    {        cell_style_aa cell;        cell.initial();        cell.left = (int16)left;        cell.right = (int16)right;        m_outline.style(cell);        if(left  >= 0 && left  < m_min_style) m_min_style = left;        if(left  >= 0 && left  > m_max_style) m_max_style = left;        if(right >= 0 && right < m_min_style) m_min_style = right;        if(right >= 0 && right > m_max_style) m_max_style = right;    }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_compound_aa<Clip>::move_to(int x, int y)    {        if(m_outline.sorted()) reset();        m_clipper.move_to(conv_type::downscale(x), conv_type::downscale(y));    }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_compound_aa<Clip>::line_to(int x, int y)    {        m_clipper.line_to(m_outline,                           conv_type::downscale(x),                           conv_type::downscale(y));    }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_compound_aa<Clip>::move_to_d(double x, double y)     {         if(m_outline.sorted()) reset();        m_clipper.move_to(conv_type::upscale(x), conv_type::upscale(y));     }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_compound_aa<Clip>::line_to_d(double x, double y)     {         m_clipper.line_to(m_outline,                           conv_type::upscale(x),                           conv_type::upscale(y));     }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_compound_aa<Clip>::add_vertex(double x, double y, unsigned cmd)    {        if(is_move_to(cmd))         {            move_to_d(x, y);        }        else         {            if(is_vertex(cmd))            {                line_to_d(x, y);            }        }    }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_compound_aa<Clip>::edge(int x1, int y1, int x2, int y2)    {        if(m_outline.sorted()) reset();        m_clipper.move_to(conv_type::downscale(x1), conv_type::downscale(y1));        m_clipper.line_to(m_outline,                           conv_type::downscale(x2),                           conv_type::downscale(y2));    }        //------------------------------------------------------------------------    template<class Clip>     void rasterizer_compound_aa<Clip>::edge_d(double x1, double y1,                                               double x2, double y2)    {        if(m_outline.sorted()) reset();        m_clipper.move_to(conv_type::upscale(x1), conv_type::upscale(y1));         m_clipper.line_to(m_outline,                           conv_type::upscale(x2),                           conv_type::upscale(y2));     }    //------------------------------------------------------------------------    template<class Clip>     AGG_INLINE void rasterizer_compound_aa<Clip>::sort()    {        m_outline.sort_cells();    }    //------------------------------------------------------------------------    template<class Clip>     AGG_INLINE bool rasterizer_compound_aa<Clip>::rewind_scanlines()    {        m_outline.sort_cells();        if(m_outline.total_cells() == 0)         {            return false;        }        if(m_max_style < m_min_style)        {            return false;        }        m_scan_y = m_outline.min_y();        m_styles.allocate(m_max_style - m_min_style + 2, 128);        return true;    }    //------------------------------------------------------------------------    template<class Clip>     AGG_INLINE void rasterizer_compound_aa<Clip>::add_style(int style_id)    {        if(style_id < 0) style_id  = 0;        else             style_id -= m_min_style - 1;        unsigned nbyte = style_id >> 3;        unsigned mask = 1 << (style_id & 7);        style_info* style = &m_styles[style_id];        if((m_asm[nbyte] & mask) == 0)        {            m_ast.add(style_id);            m_asm[nbyte] |= mask;            style->start_cell = 0;            style->num_cells = 0;            style->last_x = -0x7FFFFFFF;        }        ++style->start_cell;    }    //------------------------------------------------------------------------    // Returns the number of styles    template<class Clip>     unsigned rasterizer_compound_aa<Clip>::sweep_styles()    {        for(;;)        {            if(m_scan_y > m_outline.max_y()) return 0;            unsigned num_cells = m_outline.scanline_num_cells(m_scan_y);            const cell_style_aa* const* cells = m_outline.scanline_cells(m_scan_y);            unsigned num_styles = m_max_style - m_min_style + 2;            const cell_style_aa* curr_cell;            unsigned style_id;            style_info* style;            cell_info* cell;            m_cells.allocate(num_cells * 2, 256); // Each cell can have two styles            m_ast.capacity(num_styles, 64);            m_asm.allocate((num_styles + 7) >> 3, 8);            m_asm.zero();            // Pre-add zero (for no-fill style, that is, -1).            // We need that to ensure that the "-1 style" would go first.            m_asm[0] |= 1;             m_ast.add(0);            style = &m_styles[0];            style->start_cell = 0;            style->num_cells = 0;            style->last_x = -0x7FFFFFFF;            while(num_cells--)            {                curr_cell = *cells++;                add_style(curr_cell->left);                add_style(curr_cell->right);            }            // Convert the Y-histogram into the array of starting indexes            unsigned i;            unsigned start_cell = 0;            for(i = 0; i < m_ast.size(); i++)            {                style_info& st = m_styles[m_ast[i]];                unsigned v = st.start_cell;                st.start_cell = start_cell;                start_cell += v;            }            cells = m_outline.scanline_cells(m_scan_y);            num_cells = m_outline.scanline_num_cells(m_scan_y);            while(num_cells--)            {                curr_cell = *cells++;                style_id = (curr_cell->left < 0) ? 0 :                             curr_cell->left - m_min_style + 1;                style = &m_styles[style_id];                if(curr_cell->x == style->last_x)                {                    cell = &m_cells[style->start_cell + style->num_cells - 1];                    cell->area  += curr_cell->area;                    cell->cover += curr_cell->cover;                }                else                {                    cell = &m_cells[style->start_cell + style->num_cells];                    cell->x       = curr_cell->x;                    cell->area    = curr_cell->area;                    cell->cover   = curr_cell->cover;                    style->last_x = curr_cell->x;                    style->num_cells++;                }                style_id = (curr_cell->right < 0) ? 0 :                             curr_cell->right - m_min_style + 1;                style = &m_styles[style_id];                if(curr_cell->x == style->last_x)                {                    cell = &m_cells[style->start_cell + style->num_cells - 1];                    cell->area  -= curr_cell->area;                    cell->cover -= curr_cell->cover;                }                else                {                    cell = &m_cells[style->start_cell + style->num_cells];                    cell->x       =  curr_cell->x;                    cell->area    = -curr_cell->area;                    cell->cover   = -curr_cell->cover;                    style->last_x =  curr_cell->x;                    style->num_cells++;                }            }            if(m_ast.size() > 1) break;            ++m_scan_y;        }        ++m_scan_y;        return m_ast.size() - 1;    }    //------------------------------------------------------------------------    // Returns style ID depending of the existing style index    template<class Clip>     AGG_INLINE     unsigned rasterizer_compound_aa<Clip>::style(unsigned style_idx) const    {        return m_ast[style_idx + 1] + m_min_style - 1;    }    //------------------------------------------------------------------------     template<class Clip>     AGG_INLINE bool rasterizer_compound_aa<Clip>::navigate_scanline(int y)    {        m_outline.sort_cells();        if(m_outline.total_cells() == 0)         {            return false;        }        if(m_max_style < m_min_style)        {            return false;        }        if(y < m_outline.min_y() || y > m_outline.max_y())         {            return false;        }        m_scan_y = y;        m_styles.allocate(m_max_style - m_min_style + 2, 128);        return true;    }        //------------------------------------------------------------------------     template<class Clip>     bool rasterizer_compound_aa<Clip>::hit_test(int tx, int ty)    {        if(!navigate_scanline(ty))         {            return false;        }        unsigned num_styles = sweep_styles();         if(num_styles <= 0)        {            return false;        }        scanline_hit_test sl(tx);        sweep_scanline(sl, -1);        return sl.hit();    }}#endif

⌨️ 快捷键说明

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