agg_scanline_boolean_algebra.h

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

H
1,568
字号
        if(flag2) flag2 = sg2.sweep_scanline(sl2);        ren.prepare();        // A fake span2 processor        sbool_add_span_empty<Scanline2, Scanline> add_span2;        // The main loop        // Here we synchronize the scanlines with         // the same Y coordinate, ignoring all other ones.        // Only scanlines having the same Y-coordinate         // are to be combined.        //-----------------        bool flag1 = true;        do        {            // Synchronize "slave" with "master"            //-----------------            while(flag2 && sl2.y() < sl1.y())            {                flag2 = sg2.sweep_scanline(sl2);            }            if(flag2 && sl2.y() == sl1.y())            {                // The Y coordinates are the same.                // Combine the scanlines and render if they contain any spans.                //----------------------                sbool_unite_scanlines(sl1, sl2, sl, add_span1, add_span2, combine_spans);                if(sl.num_spans())                {                    sl.finalize(sl1.y());                    ren.render(sl);                }            }            else            {                sbool_add_spans_and_render(sl1, sl, ren, add_span1);            }            // Advance the "master"            flag1 = sg1.sweep_scanline(sl1);        }        while(flag1);    }    //---------------------------------------------sbool_intersect_shapes_aa    // Intersect two anti-aliased scanline shapes.     // Here the "Scanline Generator" abstraction is used.     // ScanlineGen1 and ScanlineGen2 are the generators, and can be of     // type rasterizer_scanline_aa<>. There function requires three     // scanline containers that can be of different types.    // "sl1" and "sl2" are used to retrieve scanlines from the generators,    // "sl" is ised as the resulting scanline to render it.    // The external "sl1" and "sl2" are used only for the sake of    // optimization and reusing of the scanline objects.    //----------    template<class ScanlineGen1,              class ScanlineGen2,              class Scanline1,              class Scanline2,              class Scanline,              class Renderer>    void sbool_intersect_shapes_aa(ScanlineGen1& sg1, ScanlineGen2& sg2,                                   Scanline1& sl1, Scanline2& sl2,                                   Scanline& sl, Renderer& ren)    {        sbool_intersect_spans_aa<Scanline1, Scanline2, Scanline> combine_functor;        sbool_intersect_shapes(sg1, sg2, sl1, sl2, sl, ren, combine_functor);    }    //--------------------------------------------sbool_intersect_shapes_bin    // Intersect two binary scanline shapes (without anti-aliasing).     // See intersect_shapes_aa for more comments    //----------    template<class ScanlineGen1,              class ScanlineGen2,              class Scanline1,              class Scanline2,              class Scanline,              class Renderer>    void sbool_intersect_shapes_bin(ScanlineGen1& sg1, ScanlineGen2& sg2,                                    Scanline1& sl1, Scanline2& sl2,                                    Scanline& sl, Renderer& ren)    {        sbool_combine_spans_bin<Scanline1, Scanline2, Scanline> combine_functor;        sbool_intersect_shapes(sg1, sg2, sl1, sl2, sl, ren, combine_functor);    }    //-------------------------------------------------sbool_unite_shapes_aa    // Unite two anti-aliased scanline shapes     // See intersect_shapes_aa for more comments    //----------    template<class ScanlineGen1,              class ScanlineGen2,              class Scanline1,              class Scanline2,              class Scanline,              class Renderer>    void sbool_unite_shapes_aa(ScanlineGen1& sg1, ScanlineGen2& sg2,                               Scanline1& sl1, Scanline2& sl2,                               Scanline& sl, Renderer& ren)    {        sbool_add_span_aa<Scanline1, Scanline> add_functor1;        sbool_add_span_aa<Scanline2, Scanline> add_functor2;        sbool_unite_spans_aa<Scanline1, Scanline2, Scanline> combine_functor;        sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren,                            add_functor1, add_functor2, combine_functor);    }    //------------------------------------------------sbool_unite_shapes_bin    // Unite two binary scanline shapes (without anti-aliasing).     // See intersect_shapes_aa for more comments    //----------    template<class ScanlineGen1,              class ScanlineGen2,              class Scanline1,              class Scanline2,              class Scanline,              class Renderer>    void sbool_unite_shapes_bin(ScanlineGen1& sg1, ScanlineGen2& sg2,                                Scanline1& sl1, Scanline2& sl2,                                Scanline& sl, Renderer& ren)    {        sbool_add_span_bin<Scanline1, Scanline> add_functor1;        sbool_add_span_bin<Scanline2, Scanline> add_functor2;        sbool_combine_spans_bin<Scanline1, Scanline2, Scanline> combine_functor;        sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren,                            add_functor1, add_functor2, combine_functor);    }    //---------------------------------------------------sbool_xor_shapes_aa    // Apply eXclusive OR to two anti-aliased scanline shapes. There's     // a modified "Linear" XOR used instead of classical "Saddle" one.    // The reason is to have the result absolutely conststent with what    // the scanline rasterizer produces.    // See intersect_shapes_aa for more comments    //----------    template<class ScanlineGen1,              class ScanlineGen2,              class Scanline1,              class Scanline2,              class Scanline,              class Renderer>    void sbool_xor_shapes_aa(ScanlineGen1& sg1, ScanlineGen2& sg2,                             Scanline1& sl1, Scanline2& sl2,                             Scanline& sl, Renderer& ren)    {        sbool_add_span_aa<Scanline1, Scanline> add_functor1;        sbool_add_span_aa<Scanline2, Scanline> add_functor2;        sbool_xor_spans_aa<Scanline1, Scanline2, Scanline,                            sbool_xor_formula_linear<> > combine_functor;        sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren,                            add_functor1, add_functor2, combine_functor);    }    //------------------------------------------sbool_xor_shapes_saddle_aa    // Apply eXclusive OR to two anti-aliased scanline shapes.     // There's the classical "Saddle" used to calculate the     // Anti-Aliasing values, that is:    // a XOR b : 1-((1-a+a*b)*(1-b+a*b))    // See intersect_shapes_aa for more comments    //----------    template<class ScanlineGen1,              class ScanlineGen2,              class Scanline1,              class Scanline2,              class Scanline,              class Renderer>    void sbool_xor_shapes_saddle_aa(ScanlineGen1& sg1, ScanlineGen2& sg2,                                    Scanline1& sl1, Scanline2& sl2,                                    Scanline& sl, Renderer& ren)    {        sbool_add_span_aa<Scanline1, Scanline> add_functor1;        sbool_add_span_aa<Scanline2, Scanline> add_functor2;        sbool_xor_spans_aa<Scanline1,                            Scanline2,                            Scanline,                            sbool_xor_formula_saddle<> > combine_functor;        sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren,                            add_functor1, add_functor2, combine_functor);    }    //--------------------------------------sbool_xor_shapes_abs_diff_aa    // Apply eXclusive OR to two anti-aliased scanline shapes.     // There's the absolute difference used to calculate     // Anti-Aliasing values, that is:    // a XOR b : abs(a-b)    // See intersect_shapes_aa for more comments    //----------    template<class ScanlineGen1,              class ScanlineGen2,              class Scanline1,              class Scanline2,              class Scanline,              class Renderer>    void sbool_xor_shapes_abs_diff_aa(ScanlineGen1& sg1, ScanlineGen2& sg2,                                      Scanline1& sl1, Scanline2& sl2,                                      Scanline& sl, Renderer& ren)    {        sbool_add_span_aa<Scanline1, Scanline> add_functor1;        sbool_add_span_aa<Scanline2, Scanline> add_functor2;        sbool_xor_spans_aa<Scanline1,                            Scanline2,                            Scanline,                            sbool_xor_formula_abs_diff> combine_functor;        sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren,                            add_functor1, add_functor2, combine_functor);    }    //--------------------------------------------------sbool_xor_shapes_bin    // Apply eXclusive OR to two binary scanline shapes (without anti-aliasing).     // See intersect_shapes_aa for more comments    //----------    template<class ScanlineGen1,              class ScanlineGen2,              class Scanline1,              class Scanline2,              class Scanline,              class Renderer>    void sbool_xor_shapes_bin(ScanlineGen1& sg1, ScanlineGen2& sg2,                              Scanline1& sl1, Scanline2& sl2,                              Scanline& sl, Renderer& ren)    {        sbool_add_span_bin<Scanline1, Scanline> add_functor1;        sbool_add_span_bin<Scanline2, Scanline> add_functor2;        sbool_combine_spans_empty<Scanline1, Scanline2, Scanline> combine_functor;        sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren,                            add_functor1, add_functor2, combine_functor);    }    //----------------------------------------------sbool_subtract_shapes_aa    // Subtract shapes "sg1-sg2" with anti-aliasing    // See intersect_shapes_aa for more comments    //----------    template<class ScanlineGen1,              class ScanlineGen2,              class Scanline1,              class Scanline2,              class Scanline,              class Renderer>    void sbool_subtract_shapes_aa(ScanlineGen1& sg1, ScanlineGen2& sg2,                                  Scanline1& sl1, Scanline2& sl2,                                  Scanline& sl, Renderer& ren)    {        sbool_add_span_aa<Scanline1, Scanline> add_functor;        sbool_subtract_spans_aa<Scanline1, Scanline2, Scanline> combine_functor;        sbool_subtract_shapes(sg1, sg2, sl1, sl2, sl, ren,                               add_functor, combine_functor);    }    //---------------------------------------------sbool_subtract_shapes_bin    // Subtract binary shapes "sg1-sg2" without anti-aliasing    // See intersect_shapes_aa for more comments    //----------    template<class ScanlineGen1,              class ScanlineGen2,              class Scanline1,              class Scanline2,              class Scanline,              class Renderer>    void sbool_subtract_shapes_bin(ScanlineGen1& sg1, ScanlineGen2& sg2,                                   Scanline1& sl1, Scanline2& sl2,                                   Scanline& sl, Renderer& ren)    {        sbool_add_span_bin<Scanline1, Scanline> add_functor;        sbool_combine_spans_empty<Scanline1, Scanline2, Scanline> combine_functor;        sbool_subtract_shapes(sg1, sg2, sl1, sl2, sl, ren,                               add_functor, combine_functor);    }    //------------------------------------------------------------sbool_op_e    enum sbool_op_e    {        sbool_or,            //----sbool_or        sbool_and,           //----sbool_and        sbool_xor,           //----sbool_xor        sbool_xor_saddle,    //----sbool_xor_saddle        sbool_xor_abs_diff,  //----sbool_xor_abs_diff        sbool_a_minus_b,     //----sbool_a_minus_b        sbool_b_minus_a      //----sbool_b_minus_a    };    //----------------------------------------------sbool_combine_shapes_bin    template<class ScanlineGen1,              class ScanlineGen2,              class Scanline1,              class Scanline2,              class Scanline,              class Renderer>    void sbool_combine_shapes_bin(sbool_op_e op,                                  ScanlineGen1& sg1, ScanlineGen2& sg2,                                  Scanline1& sl1, Scanline2& sl2,                                  Scanline& sl, Renderer& ren)    {        switch(op)        {        case sbool_or          : sbool_unite_shapes_bin    (sg1, sg2, sl1, sl2, sl, ren); break;        case sbool_and         : sbool_intersect_shapes_bin(sg1, sg2, sl1, sl2, sl, ren); break;        case sbool_xor         :        case sbool_xor_saddle  :         case sbool_xor_abs_diff: sbool_xor_shapes_bin      (sg1, sg2, sl1, sl2, sl, ren); break;        case sbool_a_minus_b   : sbool_subtract_shapes_bin (sg1, sg2, sl1, sl2, sl, ren); break;        case sbool_b_minus_a   : sbool_subtract_shapes_bin (sg2, sg1, sl2, sl1, sl, ren); break;        }    }    //-----------------------------------------------sbool_combine_shapes_aa    template<class ScanlineGen1,              class ScanlineGen2,              class Scanline1,              class Scanline2,              class Scanline,              class Renderer>    void sbool_combine_shapes_aa(sbool_op_e op,                                 ScanlineGen1& sg1, ScanlineGen2& sg2,                                 Scanline1& sl1, Scanline2& sl2,                                 Scanline& sl, Renderer& ren)    {        switch(op)        {        case sbool_or          : sbool_unite_shapes_aa       (sg1, sg2, sl1, sl2, sl, ren); break;        case sbool_and         : sbool_intersect_shapes_aa   (sg1, sg2, sl1, sl2, sl, ren); break;        case sbool_xor         : sbool_xor_shapes_aa         (sg1, sg2, sl1, sl2, sl, ren); break;        case sbool_xor_saddle  : sbool_xor_shapes_saddle_aa  (sg1, sg2, sl1, sl2, sl, ren); break;        case sbool_xor_abs_diff: sbool_xor_shapes_abs_diff_aa(sg1, sg2, sl1, sl2, sl, ren); break;        case sbool_a_minus_b   : sbool_subtract_shapes_aa    (sg1, sg2, sl1, sl2, sl, ren); break;        case sbool_b_minus_a   : sbool_subtract_shapes_aa    (sg2, sg1, sl2, sl1, sl, ren); break;        }    }}#endif

⌨️ 快捷键说明

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