agg_rasterizer_scanline_aa.h

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

H
507
字号
                        if(cur_cell->x != x) break;                        area  += cur_cell->area;                        cover += cur_cell->cover;                    }                    if(area)                    {                        alpha = calculate_alpha((cover << (poly_subpixel_shift + 1)) - area);                        if(alpha)                        {                            sl.add_cell(x, alpha);                        }                        x++;                    }                    if(num_cells && cur_cell->x > x)                    {                        alpha = calculate_alpha(cover << (poly_subpixel_shift + 1));                        if(alpha)                        {                            sl.add_span(x, cur_cell->x - x, alpha);                        }                    }                }                        if(sl.num_spans()) break;                ++m_scan_y;            }            sl.finalize(m_scan_y);            ++m_scan_y;            return true;        }        //--------------------------------------------------------------------        bool hit_test(int tx, int ty);    private:        //--------------------------------------------------------------------        // Disable copying        rasterizer_scanline_aa(const rasterizer_scanline_aa<Clip>&);        const rasterizer_scanline_aa<Clip>&         operator = (const rasterizer_scanline_aa<Clip>&);    private:        rasterizer_cells_aa<cell_aa> m_outline;        clip_type      m_clipper;        int            m_gamma[aa_scale];        filling_rule_e m_filling_rule;        bool           m_auto_close;        coord_type     m_start_x;        coord_type     m_start_y;        unsigned       m_status;        int            m_scan_y;    };    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_scanline_aa<Clip>::reset()     {         m_outline.reset();         m_status = status_initial;    }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_scanline_aa<Clip>::filling_rule(filling_rule_e filling_rule)     {         m_filling_rule = filling_rule;     }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_scanline_aa<Clip>::clip_box(double x1, double y1,                                                 double x2, double y2)    {        reset();        m_clipper.clip_box(conv_type::upscale(x1), conv_type::upscale(y1),                            conv_type::upscale(x2), conv_type::upscale(y2));    }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_scanline_aa<Clip>::reset_clipping()    {        reset();        m_clipper.reset_clipping();    }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_scanline_aa<Clip>::close_polygon()    {        if(m_auto_close && m_status == status_line_to)        {            m_clipper.line_to(m_outline, m_start_x, m_start_y);            m_status = status_closed;        }    }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_scanline_aa<Clip>::move_to(int x, int y)    {        if(m_outline.sorted()) reset();        if(m_status == status_line_to) close_polygon();        m_clipper.move_to(m_start_x = conv_type::downscale(x),                           m_start_y = conv_type::downscale(y));        m_status = status_move_to;    }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_scanline_aa<Clip>::line_to(int x, int y)    {        m_clipper.line_to(m_outline,                           conv_type::downscale(x),                           conv_type::downscale(y));        m_status = status_line_to;    }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_scanline_aa<Clip>::move_to_d(double x, double y)     {         if(m_outline.sorted()) reset();        if(m_status == status_line_to) close_polygon();        m_clipper.move_to(m_start_x = conv_type::upscale(x),                           m_start_y = conv_type::upscale(y));         m_status = status_move_to;    }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_scanline_aa<Clip>::line_to_d(double x, double y)     {         m_clipper.line_to(m_outline,                           conv_type::upscale(x),                           conv_type::upscale(y));         m_status = status_line_to;    }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_scanline_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_scanline_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));        m_status = status_move_to;    }        //------------------------------------------------------------------------    template<class Clip>     void rasterizer_scanline_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));         m_status = status_move_to;    }    //------------------------------------------------------------------------    template<class Clip>     void rasterizer_scanline_aa<Clip>::sort()    {        m_outline.sort_cells();    }    //------------------------------------------------------------------------    template<class Clip>     AGG_INLINE bool rasterizer_scanline_aa<Clip>::rewind_scanlines()    {        close_polygon();        m_outline.sort_cells();        if(m_outline.total_cells() == 0)         {            return false;        }        m_scan_y = m_outline.min_y();        return true;    }    //------------------------------------------------------------------------    template<class Clip>     AGG_INLINE bool rasterizer_scanline_aa<Clip>::navigate_scanline(int y)    {        close_polygon();        m_outline.sort_cells();        if(m_outline.total_cells() == 0 ||            y < m_outline.min_y() ||            y > m_outline.max_y())         {            return false;        }        m_scan_y = y;        return true;    }    //------------------------------------------------------------------------    template<class Clip>     bool rasterizer_scanline_aa<Clip>::hit_test(int tx, int ty)    {        if(!navigate_scanline(ty)) return false;        scanline_hit_test sl(tx);        sweep_scanline(sl);        return sl.hit();    }}#endif

⌨️ 快捷键说明

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