public override void OnDraw(Graphics2D graphics2D)
        {
            ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());

            IImageByte backBuffer = widgetsSubImage;

#if SourceDepth24
            pixfmt_alpha_blend_rgb pf = new pixfmt_alpha_blend_rgb(backBuffer, new blender_bgr());
#else
            ImageBuffer pf = new ImageBuffer();
            pf.Attach(backBuffer, new BlenderBGRA());
#endif
            ImageClippingProxy ren_base = new ImageClippingProxy(pf);
            ren_base.clear(new RGBA_Floats(1.0, 1.0, 1.0));

            scanline_unpacked_8 sl  = new scanline_unpacked_8();
            ScanlineRasterizer  ras = new ScanlineRasterizer();
#if true
            render_gouraud(backBuffer, sl, ras);
#else
            agg.span_allocator span_alloc = new span_allocator();
            span_gouraud_rgba  span_gen   = new span_gouraud_rgba(new rgba8(255, 0, 0, 255), new rgba8(0, 255, 0, 255), new rgba8(0, 0, 255, 255), 320, 220, 100, 100, 200, 100, 0);
            span_gouraud       test_sg    = new span_gouraud(new rgba8(0, 0, 0, 255), new rgba8(0, 0, 0, 255), new rgba8(0, 0, 0, 255), 320, 220, 100, 100, 200, 100, 0);
            ras.add_path(test_sg);
            renderer_scanlines.render_scanlines_aa(ras, sl, ren_base, span_alloc, span_gen);
            //renderer_scanlines.render_scanlines_aa_solid(ras, sl, ren_base, new rgba8(0, 0, 0, 255));
#endif

            ras.gamma(new gamma_none());
            //m_dilation.Render(ras, sl, ren_base);
            //m_gamma.Render(ras, sl, ren_base);
            //m_alpha.Render(ras, sl, ren_base);
            base.OnDraw(graphics2D);
        }
        public override void OnInitialize()
        {
            g_x1 = M.Zero <T>();
            g_y1 = M.Zero <T>();
            g_x2 = M.New <T>(rbuf_img(0).Width);
            g_y2 = M.New <T>(rbuf_img(0).Height);

            T x1 = g_x1; // * 100.0;
            T y1 = g_y1; // * 100.0;
            T x2 = g_x2; // * 100.0;
            T y2 = g_y2; // * 100.0;

            T dx = width().Divide(2.0).Subtract(x2.Subtract(x1).Divide(2.0));
            T dy = height().Divide(2.0).Subtract(y2.Subtract(y1).Divide(2.0));

            m_quad.SetXN(0, x1.Add(dx).Floor());
            m_quad.SetYN(0, y1.Add(dy).Floor()); // - 150;
            m_quad.SetXN(1, x2.Add(dx).Floor());
            m_quad.SetYN(1, y1.Add(dy).Floor()); // - 110;
            m_quad.SetXN(2, x2.Add(dx).Floor());
            m_quad.SetYN(2, y2.Add(dy).Floor()); // - 300;
            m_quad.SetXN(3, x1.Add(dx).Floor());
            m_quad.SetYN(3, y2.Add(dy).Floor()); // - 200;

#if SourceDepth24
            pixfmt_alpha_blend_rgb pixf = new pixfmt_alpha_blend_rgb(rbuf_img(0), new blender_bgr());
#else
            FormatRGBA pixf = new FormatRGBA(rbuf_img(0), new BlenderBGRA());
#endif
            //pixf.apply_gamma_dir(m_gamma_lut);

            base.OnInitialize();
        }
Exemple #3
0
        public override void OnDraw()
        {
#if SourceDepth24
            pixfmt_alpha_blend_rgb pf = new pixfmt_alpha_blend_rgb(rbuf_window(), new blender_bgr());
#else
            FormatRGBA pf = new FormatRGBA(rbuf_window(), new BlenderBGRA());
#endif
            FormatClippingProxy ren_base = new FormatClippingProxy(pf);
            ren_base.Clear(new RGBA_Doubles(1.0, 1.0, 1.0));

            ScanlineUnpacked8        sl  = new ScanlineUnpacked8();
            RasterizerScanlineAA <T> ras = new RasterizerScanlineAA <T>();
#if true
            render_gouraud(sl, ras);
#else
            agg.span_allocator span_alloc = new span_allocator();
            span_gouraud_rgba  span_gen   = new span_gouraud_rgba(new rgba8(255, 0, 0, 255), new rgba8(0, 255, 0, 255), new rgba8(0, 0, 255, 255), 320, 220, 100, 100, 200, 100, 0);
            span_gouraud       test_sg    = new span_gouraud(new rgba8(0, 0, 0, 255), new rgba8(0, 0, 0, 255), new rgba8(0, 0, 0, 255), 320, 220, 100, 100, 200, 100, 0);
            ras.add_path(test_sg);
            renderer_scanlines.render_scanlines_aa(ras, sl, ren_base, span_alloc, span_gen);
            //renderer_scanlines.render_scanlines_aa_solid(ras, sl, ren_base, new rgba8(0, 0, 0, 255));
#endif


            ras.Gamma(new GammaNone());
            m_dilation.SetTransform(trans_affine_resizing());
            //m_dilation.Render(ras, sl, ren_base);
            m_gamma.SetTransform(trans_affine_resizing());
            //m_gamma.Render(ras, sl, ren_base);
            m_alpha.SetTransform(trans_affine_resizing());
            //m_alpha.Render(ras, sl, ren_base);
            base.OnDraw();
        }
Exemple #4
0
        public override void OnDraw()
        {
#if SourceDepth24
            pixfmt_alpha_blend_rgb pf = new pixfmt_alpha_blend_rgb(rbuf_window(), new blender_bgr());
#else
            FormatRGBA pf = new FormatRGBA(rbuf_window(), new BlenderBGRA());
#endif
            FormatClippingProxy clippingProxy = new FormatClippingProxy(pf);
            clippingProxy.Clear(new RGBA_Doubles(0, 0, 0));

            RasterizerScanlineAA <T> ras = new RasterizerScanlineAA <T>();
            ScanlineUnpacked8        sl  = new ScanlineUnpacked8();
            ScanlineBin sl_bin           = new ScanlineBin();

            RasterizerCompoundAA <T> rasc  = new RasterizerCompoundAA <T>();
            SpanAllocator            alloc = new SpanAllocator();

            uint           i;
            styles_gouraud styles = new styles_gouraud(m_mesh, m_gamma);
            start_timer();
            rasc.Reset();
            //rasc.clip_box(40, 40, width() - 40, height() - 40);
            for (i = 0; i < m_mesh.num_edges(); i++)
            {
                mesh_edge  e  = m_mesh.edge(i);
                mesh_point p1 = m_mesh.vertex(e.p1);
                mesh_point p2 = m_mesh.vertex(e.p2);
                rasc.Styles(e.tl, e.tr);
                rasc.MoveToDbl(p1.x, p1.y);
                rasc.LineToDbl(p2.x, p2.y);
            }

            Renderer <T> .RenderCompound(rasc, sl, sl_bin, clippingProxy, alloc, styles);

            double tm = elapsed_time();

            GsvText <T> t = new GsvText <T>();
            t.SetFontSize(10.0);

            ConvStroke <T> pt = new ConvStroke <T>(t);
            pt.Width    = M.New <T>(1.5);
            pt.LineCap  = LineCap.Round;
            pt.LineJoin = LineJoin.RoundJoin;

            string buf = string.Format("{0:F2} ms, {1} triangles, {2:F0} tri/sec",
                                       tm,
                                       m_mesh.num_triangles(),
                                       m_mesh.num_triangles() / tm * 1000.0);
            t.StartPoint(10.0, 10.0);
            t.Text = buf;

            ras.AddPath(pt);
            Renderer <T> .RenderSolid(clippingProxy, ras, sl, new RGBA_Bytes(1, 1, 1).GetAsRGBA_Bytes());


            if (m_gamma.Gamma() != 1.0)
            {
                pf.ApplyGammaInv(m_gamma);
            }
        }
        public override void OnDraw()
        {
            if (m_gamma.value().NotEqual(m_old_gamma))
            {
                m_gamma_lut.Gamma(m_gamma.value().ToDouble());
                load_img(0, "spheres");
                FormatRGB pixf_change_gamma = new FormatRGB(rbuf_img(0), new BlenderBGR());
                //pixf_change_gamma.apply_gamma_dir(m_gamma_lut);
                m_old_gamma = m_gamma.value();
            }

#if SourceDepth24
            pixfmt_alpha_blend_rgb pixf     = new pixfmt_alpha_blend_rgb(rbuf_window(), new blender_bgr());
            pixfmt_alpha_blend_rgb pixf_pre = new pixfmt_alpha_blend_rgb(rbuf_window(), new blender_bgr_pre());
#else
            FormatRGBA pixf     = new FormatRGBA(rbuf_window(), new BlenderBGRA());
            FormatRGBA pixf_pre = new FormatRGBA(rbuf_window(), new BlenderPreMultBGRA());
#endif
            FormatClippingProxy clippingProxy     = new FormatClippingProxy(pixf);
            FormatClippingProxy clippingProxy_pre = new FormatClippingProxy(pixf_pre);

            clippingProxy.Clear(new RGBA_Doubles(1, 1, 1));

            if (m_trans_type.cur_item() < 2)
            {
                // For the IAffineTransformMatrix<T> parallelogram transformations we
                // calculate the 4-th (implicit) point of the parallelogram
                m_quad.SetXN(3, m_quad.xn(0).Add(m_quad.xn(2).Subtract(m_quad.xn(1))));
                m_quad.SetYN(3, m_quad.yn(0).Add(m_quad.yn(2).Subtract(m_quad.yn(1))));
            }

            //--------------------------
            // Render the "quad" tool and controls
            g_rasterizer.AddPath(m_quad);
            Renderer <T> .RenderSolid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(0, 0.3, 0.5, 0.1));

            // Prepare the polygon to rasterize. Here we need to fill
            // the destination (transformed) polygon.
            g_rasterizer.SetVectorClipBox(0, 0, width().ToDouble(), height().ToDouble());
            g_rasterizer.Reset();
            int b = 0;
            g_rasterizer.MoveToDbl(m_quad.xn(0).Subtract(b), m_quad.yn(0).Subtract(b));
            g_rasterizer.LineToDbl(m_quad.xn(1).Add(b), m_quad.yn(1).Subtract(b));
            g_rasterizer.LineToDbl(m_quad.xn(2).Add(b), m_quad.yn(2).Add(b));
            g_rasterizer.LineToDbl(m_quad.xn(3).Subtract(b), m_quad.yn(3).Add(b));

            //typedef agg::span_allocator<color_type> span_alloc_type;
            SpanAllocator              sa            = new SpanAllocator();
            ImageFilterBilinear <T>    filter_kernel = new ImageFilterBilinear <T>();
            ImageFilterLookUpTable <T> filter        = new ImageFilterLookUpTable <T>(filter_kernel, true);

#if SourceDepth24
            pixfmt_alpha_blend_rgb pixf_img = new pixfmt_alpha_blend_rgb(rbuf_img(0), new blender_bgr());
#else
            FormatRGBA pixf_img = new FormatRGBA(rbuf_img(0), new BlenderBGRA());
#endif
            RasterBufferAccessorClamp source = new RasterBufferAccessorClamp(pixf_img);

            start_timer();

            switch (m_trans_type.cur_item())
            {
            case 0:
            {
                /*
                 *      agg::trans_affine tr(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);
                 *
                 *      typedef agg::span_interpolator_linear<agg::trans_affine> interpolator_type;
                 *      interpolator_type interpolator(tr);
                 *
                 *      typedef image_filter_2x2_type<source_type,
                 *                                    interpolator_type> span_gen_type;
                 *      span_gen_type sg(source, interpolator, filter);
                 *      agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg);
                 */
                break;
            }

            case 1:
            {
                /*
                 *      agg::trans_affine tr(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);
                 *
                 *      typedef agg::span_interpolator_linear<agg::trans_affine> interpolator_type;
                 *      typedef image_resample_affine_type<source_type> span_gen_type;
                 *
                 *      interpolator_type interpolator(tr);
                 *      span_gen_type sg(source, interpolator, filter);
                 *      sg.blur(m_blur.Value());
                 *      agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg);
                 */
                break;
            }

            case 2:
            {
                /*
                 *      agg::trans_perspective tr(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);
                 *      if(tr.is_valid())
                 *      {
                 *          typedef agg::span_interpolator_linear_subdiv<agg::trans_perspective> interpolator_type;
                 *          interpolator_type interpolator(tr);
                 *
                 *          typedef image_filter_2x2_type<source_type,
                 *                                        interpolator_type> span_gen_type;
                 *          span_gen_type sg(source, interpolator, filter);
                 *          agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg);
                 *      }
                 */
                break;
            }

            case 3:
            {
                /*
                 *      agg::trans_perspective tr(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);
                 *      if(tr.is_valid())
                 *      {
                 *          typedef agg::span_interpolator_trans<agg::trans_perspective> interpolator_type;
                 *          interpolator_type interpolator(tr);
                 *
                 *          typedef image_filter_2x2_type<source_type,
                 *                                        interpolator_type> span_gen_type;
                 *          span_gen_type sg(source, interpolator, filter);
                 *          agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg);
                 *      }
                 */
                break;
            }

            case 4:
            {
                //typedef agg::span_interpolator_persp_lerp<> interpolator_type;
                //typedef agg::span_subdiv_adaptor<interpolator_type> subdiv_adaptor_type;

                SpanInterpolatorPerspLerp <T> interpolator   = new SpanInterpolatorPerspLerp <T>(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);
                SpanSubDivAdaptor <T>         subdiv_adaptor = new SpanSubDivAdaptor <T>(interpolator);

                if (interpolator.IsValid())
                {
#if SourceDepth24
                    span_image_resample_rgb sg = new span_image_resample_rgb(source, subdiv_adaptor, filter);
#else
                    span_image_resample_rgba <T> sg = new span_image_resample_rgba <T>(source, subdiv_adaptor, filter);
#endif
                    sg.Blur = m_blur.value().ToDouble();
                    Renderer <T> .GenerateAndRender(g_rasterizer, g_scanline, clippingProxy_pre, sa, sg);
                }
                break;
            }

            case 5:
            {
                /*
                 *      typedef agg::span_interpolator_persp_exact<> interpolator_type;
                 *      typedef agg::span_subdiv_adaptor<interpolator_type> subdiv_adaptor_type;
                 *
                 *      interpolator_type interpolator(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);
                 *      subdiv_adaptor_type subdiv_adaptor(interpolator);
                 *
                 *      if(interpolator.is_valid())
                 *      {
                 *          typedef image_resample_type<source_type,
                 *                                      subdiv_adaptor_type> span_gen_type;
                 *          span_gen_type sg(source, subdiv_adaptor, filter);
                 *          sg.blur(m_blur.Value());
                 *          agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg);
                 *      }
                 */
                break;
            }
            }

            double tm = elapsed_time();
            //pixf.apply_gamma_inv(m_gamma_lut);

            GsvText <T> t = new GsvText <T>();
            t.SetFontSize(10.0);

            ConvStroke <T> pt = new ConvStroke <T>(t);
            pt.Width = M.New <T>(1.5);

            string buf = string.Format("{0:F2} ms", tm);
            t.StartPoint(10.0, 70.0);
            t.Text = buf;

            g_rasterizer.AddPath(pt);
            Renderer <T> .RenderSolid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(0, 0, 0));

            //--------------------------
            //m_trans_type.Render(g_rasterizer, g_scanline, clippingProxy);
            //m_gamma.Render(g_rasterizer, g_scanline, clippingProxy);
            //m_blur.Render(g_rasterizer, g_scanline, clippingProxy);
            base.OnDraw();
        }
        //template<class Scanline, class Ras>
        public void render_gouraud(IImageByte backBuffer, IScanlineCache sl, IRasterizer ras)
        {
            double alpha = m_alpha.Value;
            double brc   = 1;

#if SourceDepth24
            pixfmt_alpha_blend_rgb pf = new pixfmt_alpha_blend_rgb(backBuffer, new blender_bgr());
#else
            ImageBuffer image = new ImageBuffer();
            image.Attach(backBuffer, new BlenderBGRA());
#endif
            ImageClippingProxy ren_base = new ImageClippingProxy(image);

            MatterHackers.Agg.span_allocator span_alloc = new span_allocator();
            span_gouraud_rgba span_gen = new span_gouraud_rgba();

            ras.gamma(new gamma_linear(0.0, m_gamma.Value));

            double d = m_dilation.Value;

            // Six triangles
            double xc = (m_x[0] + m_x[1] + m_x[2]) / 3.0;
            double yc = (m_y[0] + m_y[1] + m_y[2]) / 3.0;

            double x1 = (m_x[1] + m_x[0]) / 2 - (xc - (m_x[1] + m_x[0]) / 2);
            double y1 = (m_y[1] + m_y[0]) / 2 - (yc - (m_y[1] + m_y[0]) / 2);

            double x2 = (m_x[2] + m_x[1]) / 2 - (xc - (m_x[2] + m_x[1]) / 2);
            double y2 = (m_y[2] + m_y[1]) / 2 - (yc - (m_y[2] + m_y[1]) / 2);

            double x3 = (m_x[0] + m_x[2]) / 2 - (xc - (m_x[0] + m_x[2]) / 2);
            double y3 = (m_y[0] + m_y[2]) / 2 - (yc - (m_y[0] + m_y[2]) / 2);

            span_gen.colors(new RGBA_Floats(1, 0, 0, alpha),
                            new RGBA_Floats(0, 1, 0, alpha),
                            new RGBA_Floats(brc, brc, brc, alpha));
            span_gen.triangle(m_x[0], m_y[0], m_x[1], m_y[1], xc, yc, d);
            ras.add_path(span_gen);
            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
            scanlineRenderer.GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);

            span_gen.colors(new RGBA_Floats(0, 1, 0, alpha),
                            new RGBA_Floats(0, 0, 1, alpha),
                            new RGBA_Floats(brc, brc, brc, alpha));
            span_gen.triangle(m_x[1], m_y[1], m_x[2], m_y[2], xc, yc, d);
            ras.add_path(span_gen);
            scanlineRenderer.GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);

            span_gen.colors(new RGBA_Floats(0, 0, 1, alpha),
                            new RGBA_Floats(1, 0, 0, alpha),
                            new RGBA_Floats(brc, brc, brc, alpha));
            span_gen.triangle(m_x[2], m_y[2], m_x[0], m_y[0], xc, yc, d);
            ras.add_path(span_gen);
            scanlineRenderer.GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);

            brc = 1 - brc;
            span_gen.colors(new RGBA_Floats(1, 0, 0, alpha),
                            new RGBA_Floats(0, 1, 0, alpha),
                            new RGBA_Floats(brc, brc, brc, alpha));
            span_gen.triangle(m_x[0], m_y[0], m_x[1], m_y[1], x1, y1, d);
            ras.add_path(span_gen);
            scanlineRenderer.GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);

            span_gen.colors(new RGBA_Floats(0, 1, 0, alpha),
                            new RGBA_Floats(0, 0, 1, alpha),
                            new RGBA_Floats(brc, brc, brc, alpha));
            span_gen.triangle(m_x[1], m_y[1], m_x[2], m_y[2], x2, y2, d);
            ras.add_path(span_gen);
            scanlineRenderer.GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);

            span_gen.colors(new RGBA_Floats(0, 0, 1, alpha),
                            new RGBA_Floats(1, 0, 0, alpha),
                            new RGBA_Floats(brc, brc, brc, alpha));
            span_gen.triangle(m_x[2], m_y[2], m_x[0], m_y[0], x3, y3, d);
            ras.add_path(span_gen);
            scanlineRenderer.GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);
        }
        //template<class Scanline, class Ras>
        public void RenderGourand(CanvasPainter p)
        {
            float alpha = this.AlphaValue;
            float brc   = 1;

#if SourceDepth24
            pixfmt_alpha_blend_rgb pf = new pixfmt_alpha_blend_rgb(backBuffer, new blender_bgr());
#else
#endif
            ////var destImage = gx.DestImage;
            ////span_allocator span_alloc = new span_allocator();

            //specific for agg
            AggCanvasPainter painter = p as AggCanvasPainter;
            if (painter == null)
            {
                return;
            }

            //
            Graphics2D         gx             = painter.Graphics;
            SpanGenGouraudRGBA gouraudSpanGen = new SpanGenGouraudRGBA();
            gx.ScanlineRasterizer.ResetGamma(new GammaLinear(0.0f, this.LinearGamma));
            double d = this.DilationValue;
            // Six triangles
            double xc = (m_x[0] + m_x[1] + m_x[2]) / 3.0;
            double yc = (m_y[0] + m_y[1] + m_y[2]) / 3.0;
            double x1 = (m_x[1] + m_x[0]) / 2 - (xc - (m_x[1] + m_x[0]) / 2);
            double y1 = (m_y[1] + m_y[0]) / 2 - (yc - (m_y[1] + m_y[0]) / 2);
            double x2 = (m_x[2] + m_x[1]) / 2 - (xc - (m_x[2] + m_x[1]) / 2);
            double y2 = (m_y[2] + m_y[1]) / 2 - (yc - (m_y[2] + m_y[1]) / 2);
            double x3 = (m_x[0] + m_x[2]) / 2 - (xc - (m_x[0] + m_x[2]) / 2);
            double y3 = (m_y[0] + m_y[2]) / 2 - (yc - (m_y[0] + m_y[2]) / 2);
            gouraudSpanGen.SetColor(Drawing.Color.Make(1, 0, 0, alpha),
                                    Drawing.Color.Make(0, 1, 0, alpha),
                                    Drawing.Color.Make(brc, brc, brc, alpha));
            gouraudSpanGen.SetTriangle(m_x[0], m_y[0], m_x[1], m_y[1], xc, yc, d);

            var tmpVxs = _tmpVxs;
            painter.Fill(gouraudSpanGen.MakeVxs(tmpVxs), gouraudSpanGen);
            tmpVxs.Clear();
            gouraudSpanGen.SetColor(Drawing.Color.Make(0, 1, 0, alpha),
                                    Drawing.Color.Make(0, 0, 1, alpha),
                                    Drawing.Color.Make(brc, brc, brc, alpha));
            gouraudSpanGen.SetTriangle(m_x[1], m_y[1], m_x[2], m_y[2], xc, yc, d);
            painter.Fill(gouraudSpanGen.MakeVxs(tmpVxs), gouraudSpanGen);
            tmpVxs.Clear();
            gouraudSpanGen.SetColor(Drawing.Color.Make(0, 0, 1, alpha),
                                    Drawing.Color.Make(1, 0, 0, alpha),
                                    Drawing.Color.Make(brc, brc, brc, alpha));
            gouraudSpanGen.SetTriangle(m_x[2], m_y[2], m_x[0], m_y[0], xc, yc, d);
            painter.Fill(gouraudSpanGen.MakeVxs(tmpVxs), gouraudSpanGen);
            tmpVxs.Clear();
            brc = 1 - brc;
            gouraudSpanGen.SetColor(Drawing.Color.Make(1, 0, 0, alpha),
                                    Drawing.Color.Make(0, 1, 0, alpha),
                                    Drawing.Color.Make(brc, brc, brc, alpha));
            gouraudSpanGen.SetTriangle(m_x[0], m_y[0], m_x[1], m_y[1], x1, y1, d);
            painter.Fill(gouraudSpanGen.MakeVxs(tmpVxs), gouraudSpanGen);
            tmpVxs.Clear();
            gouraudSpanGen.SetColor(Drawing.Color.Make(0, 1, 0, alpha),
                                    Drawing.Color.Make(0, 0, 1, alpha),
                                    Drawing.Color.Make(brc, brc, brc, alpha));
            gouraudSpanGen.SetTriangle(m_x[1], m_y[1], m_x[2], m_y[2], x2, y2, d);
            painter.Fill(gouraudSpanGen.MakeVxs(tmpVxs), gouraudSpanGen);
            tmpVxs.Clear();
            gouraudSpanGen.SetColor(Drawing.Color.Make(0, 0, 1, alpha),
                                    Drawing.Color.Make(1, 0, 0, alpha),
                                    Drawing.Color.Make(brc, brc, brc, alpha));
            gouraudSpanGen.SetTriangle(m_x[2], m_y[2], m_x[0], m_y[0], x3, y3, d);
            painter.Fill(gouraudSpanGen.MakeVxs(tmpVxs), gouraudSpanGen);
            tmpVxs.Clear();
        }
        //template<class Scanline, class Ras>
        public void RenderGourand(Painter p)
        {
            float alpha = this.AlphaValue;
            float brc   = 1;

#if SourceDepth24
            pixfmt_alpha_blend_rgb pf = new pixfmt_alpha_blend_rgb(backBuffer, new blender_bgr());
#else
#endif
            ////var destImage = gx.DestImage;
            ////span_allocator span_alloc = new span_allocator();

            //specific for agg
            AggPainter painter = p as AggPainter;
            if (painter == null)
            {
                return;
            }

            //
            AggRenderSurface      aggsx          = painter.RenderSurface;
            RGBAGouraudSpanGen    gouraudSpanGen = new RGBAGouraudSpanGen();
            GouraudVerticeBuilder grBuilder      = new GouraudVerticeBuilder();

            aggsx.ScanlineRasterizer.ResetGamma(new GammaLinear(0.0f, this.LinearGamma));

            grBuilder.DilationValue = (float)this.DilationValue;
            // Six triangles

            double xc = (_x[0] + _x[1] + _x[2]) / 3.0;
            double yc = (_y[0] + _y[1] + _y[2]) / 3.0;
            double x1 = (_x[1] + _x[0]) / 2 - (xc - (_x[1] + _x[0]) / 2);
            double y1 = (_y[1] + _y[0]) / 2 - (yc - (_y[1] + _y[0]) / 2);
            double x2 = (_x[2] + _x[1]) / 2 - (xc - (_x[2] + _x[1]) / 2);
            double y2 = (_y[2] + _y[1]) / 2 - (yc - (_y[2] + _y[1]) / 2);
            double x3 = (_x[0] + _x[2]) / 2 - (xc - (_x[0] + _x[2]) / 2);
            double y3 = (_y[0] + _y[2]) / 2 - (yc - (_y[0] + _y[2]) / 2);
            grBuilder.SetColor(ColorEx.Make(1, 0, 0, alpha),
                               ColorEx.Make(0, 1, 0, alpha),
                               ColorEx.Make(brc, brc, brc, alpha));
            grBuilder.SetTriangle(_x[0], _y[0], _x[1], _y[1], xc, yc);

            GouraudVerticeBuilder.CoordAndColor c0, c1, c2;
            grBuilder.GetArrangedVertices(out c0, out c1, out c2);
            gouraudSpanGen.SetColorAndCoords(c0, c1, c2);

            using (Tools.BorrowVxs(out var v1))
            {
                painter.Fill(grBuilder.MakeVxs(v1), gouraudSpanGen);
                v1.Clear();

                //
                grBuilder.SetColor(
                    ColorEx.Make(0, 1, 0, alpha),
                    ColorEx.Make(0, 0, 1, alpha),
                    ColorEx.Make(brc, brc, brc, alpha));
                grBuilder.SetTriangle(_x[1], _y[1], _x[2], _y[2], xc, yc);
                grBuilder.GetArrangedVertices(out c0, out c1, out c2);
                gouraudSpanGen.SetColorAndCoords(c0, c1, c2);

                painter.Fill(grBuilder.MakeVxs(v1), gouraudSpanGen);
                v1.Clear();

                //
                grBuilder.SetColor(ColorEx.Make(0, 0, 1, alpha),
                                   ColorEx.Make(1, 0, 0, alpha),
                                   ColorEx.Make(brc, brc, brc, alpha));
                grBuilder.SetTriangle(_x[2], _y[2], _x[0], _y[0], xc, yc);
                grBuilder.GetArrangedVertices(out c0, out c1, out c2);
                gouraudSpanGen.SetColorAndCoords(c0, c1, c2);
                painter.Fill(grBuilder.MakeVxs(v1), gouraudSpanGen);
                v1.Clear();
                //
                brc = 1 - brc;
                grBuilder.SetColor(ColorEx.Make(1, 0, 0, alpha),
                                   ColorEx.Make(0, 1, 0, alpha),
                                   ColorEx.Make(brc, brc, brc, alpha));
                grBuilder.SetTriangle(_x[0], _y[0], _x[1], _y[1], x1, y1);
                grBuilder.GetArrangedVertices(out c0, out c1, out c2);
                gouraudSpanGen.SetColorAndCoords(c0, c1, c2);
                painter.Fill(grBuilder.MakeVxs(v1), gouraudSpanGen);
                v1.Clear();

                grBuilder.SetColor(ColorEx.Make(0, 1, 0, alpha),
                                   ColorEx.Make(0, 0, 1, alpha),
                                   ColorEx.Make(brc, brc, brc, alpha));
                grBuilder.SetTriangle(_x[1], _y[1], _x[2], _y[2], x2, y2);
                grBuilder.GetArrangedVertices(out c0, out c1, out c2);
                gouraudSpanGen.SetColorAndCoords(c0, c1, c2);
                painter.Fill(grBuilder.MakeVxs(v1), gouraudSpanGen);
                v1.Clear();
                //
                grBuilder.SetColor(ColorEx.Make(0, 0, 1, alpha),
                                   ColorEx.Make(1, 0, 0, alpha),
                                   ColorEx.Make(brc, brc, brc, alpha));
                grBuilder.SetTriangle(_x[2], _y[2], _x[0], _y[0], x3, y3);
                grBuilder.GetArrangedVertices(out c0, out c1, out c2);
                gouraudSpanGen.SetColorAndCoords(c0, c1, c2);
                painter.Fill(grBuilder.MakeVxs(v1), gouraudSpanGen);
                v1.Clear();
            }
        }
Exemple #9
0
        public override void on_draw()
        {
            pixfmt_alpha_blend_rgb pf       = new pixfmt_alpha_blend_rgb(rbuf_window(), new blender_bgr());
            renderer_base          ren_base = new renderer_base(pf);

            ren_base.clear(new rgba(1.0, 1.0, 0.95));
            renderer_scanline_aa_solid ren = new renderer_scanline_aa_solid(ren_base);

            rasterizer_scanline_aa ras = new rasterizer_scanline_aa();
            scanline_unpacked_8    sl  = new scanline_unpacked_8();

            path_storage path = new path_storage(new vertex_block_storage());

            double x, y;
            double curve_time = 0;

            path.remove_all();
            curve4 curve;

            curve.approximation_method(curve_approximation_method_e(m_curve_type.cur_item()));
            curve.approximation_scale(m_approximation_scale.value());
            curve.angle_tolerance(deg2rad(m_angle_tolerance.value()));
            curve.cusp_limit(deg2rad(m_cusp_limit.value()));
            curve_time = measure_time(curve);
            double max_angle_error_01  = 0;
            double max_angle_error_1   = 0;
            double max_angle_error1    = 0;
            double max_angle_error_10  = 0;
            double max_angle_error_100 = 0;
            double max_error_01        = 0;
            double max_error_1         = 0;
            double max_error1          = 0;
            double max_error_10        = 0;
            double max_error_100       = 0;

            max_error_01  = calc_max_error(curve, 0.01, &max_angle_error_01);
            max_error_1   = calc_max_error(curve, 0.1, &max_angle_error_1);
            max_error1    = calc_max_error(curve, 1, &max_angle_error1);
            max_error_10  = calc_max_error(curve, 10, &max_angle_error_10);
            max_error_100 = calc_max_error(curve, 100, &max_angle_error_100);

            curve.approximation_scale(m_approximation_scale.value());
            curve.angle_tolerance(deg2rad(m_angle_tolerance.value()));
            curve.cusp_limit(deg2rad(m_cusp_limit.value()));
            curve.init(m_curve1.x1(), m_curve1.y1(),
                       m_curve1.x2(), m_curve1.y2(),
                       m_curve1.x3(), m_curve1.y3(),
                       m_curve1.x4(), m_curve1.y4());

            path.concat_path(curve);
//path.move_to(m_curve1.x1(), m_curve1.y1());
//path.line_to(m_curve1.x2(), m_curve1.y2());
//path.line_to(m_curve1.x3(), m_curve1.y3());
//path.line_to(m_curve1.x4(), m_curve1.y4());


            conv_stroke stroke = new conv_stroke(path);

            stroke.width(m_width.value());
            stroke.line_join(line_join_e(m_line_join.cur_item()));
            stroke.line_cap(line_cap_e(m_line_cap.cur_item()));
            stroke.inner_join(inner_join_e(m_inner_join.cur_item()));
            stroke.inner_miter_limit(1.01);

            ras.add_path(stroke);
            ren.color(rgba(0, 0.5, 0, 0.5));
            render_scanlines(ras, sl, ren);

            uint cmd;
            uint num_points1 = 0;

            path.rewind(0);
            while (!is_stop(cmd = path.vertex(&x, &y)))
            {
                if (m_show_points.status())
                {
                    Shape.Ellipse ell = new agg.Shape.Ellipse(x, y, 1.5, 1.5, 8);
                    ras.add_path(ell);
                    ren.color(rgba(0, 0, 0, 0.5));
                    render_scanlines(ras, sl, ren);
                }
                ++num_points1;
            }

            if (m_show_outline.status())
            {
                // Draw a stroke of the stroke to see the internals
                //--------------
                conv_stroke stroke2 = new conv_stroke(stroke);
                ras.add_path(stroke2);
                ren.color(rgba(0, 0, 0, 0.5));
                render_scanlines(ras, sl, ren);
            }

            // Check ellipse and arc for the number of points
            //---------------
            //ellipse a(100, 100, m_width.value(), m_width.value(), 0);
            //ras.add_path(a);
            //ren.color(rgba(0.5,0,0, 0.5));
            //render_scanlines(ras, sl, ren);
            //a.rewind(0);
            //while(!is_stop(cmd = a.vertex(&x, &y)))
            //{
            //    if(is_vertex(cmd))
            //    {
            //        ellipse ell(x, y, 1.5, 1.5, 8);
            //        ras.add_path(ell);
            //        ren.color(rgba(0,0,0,0.5));
            //        render_scanlines(ras, sl, ren);
            //    }
            //}


            // Check a circle with huge radius (10,000,000) and high approximation accuracy
            //---------------
            //double circle_pnt_count = 0;
            //bezier_arc ell(0,0, 10000000, 10000000, 0, 2*pi);
            //conv_curve<bezier_arc, curve3_div, curve4_div3> crv(ell);
            //crv.approximation_scale(10.0);
            //crv.rewind(0);
            //while(crv.vertex(&x, &y)) ++circle_pnt_count;


            string   buf;
            gsv_text t;

            t.size(8.0);

            conv_stroke pt = new conv_stroke(t);

            pt.line_cap(round_cap);
            pt.line_join(round_join);
            pt.width(1.5);

            /*
             * sprintf(buf, "Num Points=%d Time=%.2fmks\n\n"
             *           " Dist Error: x0.01=%.5f x0.1=%.5f x1=%.5f x10=%.5f x100=%.5f\n\n"
             *           "Angle Error: x0.01=%.1f x0.1=%.1f x1=%.1f x10=%.1f x100=%.1f",
             *      num_points1, curve_time,
             *      max_error_01,
             *      max_error_1,
             *      max_error1,
             *      max_error_10,
             *      max_error_100,
             *      max_angle_error_01,
             *      max_angle_error_1,
             *      max_angle_error1,
             *      max_angle_error_10,
             *      max_angle_error_100);
             */

            t.start_point(10.0, 85.0);
            t.text(buf);

            ras.add_path(pt);
            ren.color(rgba(0, 0, 0));
            render_scanlines(ras, sl, ren);

            render_ctrl(ras, sl, ren_base, m_curve1);
            render_ctrl(ras, sl, ren_base, m_angle_tolerance);
            render_ctrl(ras, sl, ren_base, m_approximation_scale);
            render_ctrl(ras, sl, ren_base, m_cusp_limit);
            render_ctrl(ras, sl, ren_base, m_width);
            render_ctrl(ras, sl, ren_base, m_show_points);
            render_ctrl(ras, sl, ren_base, m_show_outline);
            render_ctrl(ras, sl, ren_base, m_curve_type);
            render_ctrl(ras, sl, ren_base, m_case_type);
            render_ctrl(ras, sl, ren_base, m_inner_join);
            render_ctrl(ras, sl, ren_base, m_line_join);
            render_ctrl(ras, sl, ren_base, m_line_cap);
        }
Exemple #10
0
    public override void on_draw()
    {
        pixfmt_alpha_blend_rgb pf = new pixfmt_alpha_blend_rgb(rbuf_window(), new blender_bgr());
        renderer_base ren_base = new renderer_base(pf);
        ren_base.clear(new rgba(1.0, 1.0, 0.95));
        renderer_scanline_aa_solid ren = new renderer_scanline_aa_solid(ren_base);

        rasterizer_scanline_aa ras = new rasterizer_scanline_aa();
        scanline_unpacked_8 sl = new scanline_unpacked_8();

        path_storage path = new path_storage(new vertex_block_storage());

        double x, y;
        double curve_time = 0;

        path.remove_all();
        curve4 curve;
        curve.approximation_method(curve_approximation_method_e(m_curve_type.cur_item()));
        curve.approximation_scale(m_approximation_scale.value());
        curve.angle_tolerance(deg2rad(m_angle_tolerance.value()));
        curve.cusp_limit(deg2rad(m_cusp_limit.value()));
        curve_time = measure_time(curve);
        double max_angle_error_01 = 0;
        double max_angle_error_1 = 0;
        double max_angle_error1 = 0;
        double max_angle_error_10 = 0;
        double max_angle_error_100 = 0;
        double max_error_01 = 0;
        double max_error_1 = 0;
        double max_error1 = 0;
        double max_error_10 = 0;
        double max_error_100 = 0;

        max_error_01   = calc_max_error(curve, 0.01, &max_angle_error_01);
        max_error_1    = calc_max_error(curve, 0.1,  &max_angle_error_1);
        max_error1     = calc_max_error(curve, 1,    &max_angle_error1);
        max_error_10   = calc_max_error(curve, 10,   &max_angle_error_10);
        max_error_100  = calc_max_error(curve, 100,  &max_angle_error_100);

        curve.approximation_scale(m_approximation_scale.value());
        curve.angle_tolerance(deg2rad(m_angle_tolerance.value()));
        curve.cusp_limit(deg2rad(m_cusp_limit.value()));
        curve.init(m_curve1.x1(), m_curve1.y1(),
                   m_curve1.x2(), m_curve1.y2(),
                   m_curve1.x3(), m_curve1.y3(),
                   m_curve1.x4(), m_curve1.y4());

        path.concat_path(curve);
//path.move_to(m_curve1.x1(), m_curve1.y1());
//path.line_to(m_curve1.x2(), m_curve1.y2());
//path.line_to(m_curve1.x3(), m_curve1.y3());
//path.line_to(m_curve1.x4(), m_curve1.y4());


        conv_stroke stroke = new conv_stroke(path);
        stroke.width(m_width.value());
        stroke.line_join(line_join_e(m_line_join.cur_item()));
        stroke.line_cap(line_cap_e(m_line_cap.cur_item()));
        stroke.inner_join(inner_join_e(m_inner_join.cur_item()));
        stroke.inner_miter_limit(1.01);

        ras.add_path(stroke);
        ren.color(rgba(0, 0.5, 0, 0.5));
        render_scanlines(ras, sl, ren);

        uint cmd;
        uint num_points1 = 0;
        path.rewind(0);
        while(!is_stop(cmd = path.vertex(&x, &y)))
        {
            if(m_show_points.status())
            {
                Shape.Ellipse ell = new agg.Shape.Ellipse(x, y, 1.5, 1.5, 8);
                ras.add_path(ell);
                ren.color(rgba(0,0,0, 0.5));
                render_scanlines(ras, sl, ren);
            }
            ++num_points1;
        }

        if(m_show_outline.status())
        {
            // Draw a stroke of the stroke to see the internals
            //--------------
            conv_stroke stroke2 = new conv_stroke(stroke);
            ras.add_path(stroke2);
            ren.color(rgba(0,0,0, 0.5));
            render_scanlines(ras, sl, ren);
        }

        // Check ellipse and arc for the number of points
        //---------------
        //ellipse a(100, 100, m_width.value(), m_width.value(), 0);
        //ras.add_path(a);
        //ren.color(rgba(0.5,0,0, 0.5));
        //render_scanlines(ras, sl, ren);
        //a.rewind(0);
        //while(!is_stop(cmd = a.vertex(&x, &y)))
        //{
        //    if(is_vertex(cmd))
        //    {
        //        ellipse ell(x, y, 1.5, 1.5, 8);
        //        ras.add_path(ell);
        //        ren.color(rgba(0,0,0,0.5));
        //        render_scanlines(ras, sl, ren);
        //    }
        //}


        // Check a circle with huge radius (10,000,000) and high approximation accuracy
        //---------------
        //double circle_pnt_count = 0;
        //bezier_arc ell(0,0, 10000000, 10000000, 0, 2*pi);
        //conv_curve<bezier_arc, curve3_div, curve4_div3> crv(ell);
        //crv.approximation_scale(10.0);
        //crv.rewind(0);
        //while(crv.vertex(&x, &y)) ++circle_pnt_count;


        string buf;
        gsv_text t;
        t.size(8.0);

        conv_stroke pt = new conv_stroke(t);
        pt.line_cap(round_cap);
        pt.line_join(round_join);
        pt.width(1.5);

        /*
        sprintf(buf, "Num Points=%d Time=%.2fmks\n\n"
                     " Dist Error: x0.01=%.5f x0.1=%.5f x1=%.5f x10=%.5f x100=%.5f\n\n"
                     "Angle Error: x0.01=%.1f x0.1=%.1f x1=%.1f x10=%.1f x100=%.1f", 
                num_points1, curve_time, 
                max_error_01,  
                max_error_1,   
                max_error1,   
                max_error_10,  
                max_error_100,
                max_angle_error_01,
                max_angle_error_1,
                max_angle_error1,
                max_angle_error_10,
                max_angle_error_100);
         */

        t.start_point(10.0, 85.0);
        t.text(buf);

        ras.add_path(pt);
        ren.color(rgba(0,0,0));
        render_scanlines(ras, sl, ren);

        render_ctrl(ras, sl, ren_base, m_curve1);
        render_ctrl(ras, sl, ren_base, m_angle_tolerance);
        render_ctrl(ras, sl, ren_base, m_approximation_scale);
        render_ctrl(ras, sl, ren_base, m_cusp_limit);
        render_ctrl(ras, sl, ren_base, m_width);
        render_ctrl(ras, sl, ren_base, m_show_points);
        render_ctrl(ras, sl, ren_base, m_show_outline);
        render_ctrl(ras, sl, ren_base, m_curve_type);
        render_ctrl(ras, sl, ren_base, m_case_type);
        render_ctrl(ras, sl, ren_base, m_inner_join);
        render_ctrl(ras, sl, ren_base, m_line_join);
        render_ctrl(ras, sl, ren_base, m_line_cap);
    }
Exemple #11
0
		//template<class Scanline, class Ras>
		public void render_gouraud(IImageByte backBuffer, IScanlineCache sl, IRasterizer ras)
		{
			double alpha = m_alpha.Value;
			double brc = 1;
#if SourceDepth24
            pixfmt_alpha_blend_rgb pf = new pixfmt_alpha_blend_rgb(backBuffer, new blender_bgr());
#else
			ImageBuffer image = new ImageBuffer();
			image.Attach(backBuffer, new BlenderBGRA());
#endif
			ImageClippingProxy ren_base = new ImageClippingProxy(image);

			MatterHackers.Agg.span_allocator span_alloc = new span_allocator();
			span_gouraud_rgba span_gen = new span_gouraud_rgba();

			ras.gamma(new gamma_linear(0.0, m_gamma.Value));

			double d = m_dilation.Value;

			// Six triangles
			double xc = (m_x[0] + m_x[1] + m_x[2]) / 3.0;
			double yc = (m_y[0] + m_y[1] + m_y[2]) / 3.0;

			double x1 = (m_x[1] + m_x[0]) / 2 - (xc - (m_x[1] + m_x[0]) / 2);
			double y1 = (m_y[1] + m_y[0]) / 2 - (yc - (m_y[1] + m_y[0]) / 2);

			double x2 = (m_x[2] + m_x[1]) / 2 - (xc - (m_x[2] + m_x[1]) / 2);
			double y2 = (m_y[2] + m_y[1]) / 2 - (yc - (m_y[2] + m_y[1]) / 2);

			double x3 = (m_x[0] + m_x[2]) / 2 - (xc - (m_x[0] + m_x[2]) / 2);
			double y3 = (m_y[0] + m_y[2]) / 2 - (yc - (m_y[0] + m_y[2]) / 2);

			span_gen.colors(new RGBA_Floats(1, 0, 0, alpha),
							new RGBA_Floats(0, 1, 0, alpha),
							new RGBA_Floats(brc, brc, brc, alpha));
			span_gen.triangle(m_x[0], m_y[0], m_x[1], m_y[1], xc, yc, d);
			ras.add_path(span_gen);
			ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
			scanlineRenderer.GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);

			span_gen.colors(new RGBA_Floats(0, 1, 0, alpha),
							new RGBA_Floats(0, 0, 1, alpha),
							new RGBA_Floats(brc, brc, brc, alpha));
			span_gen.triangle(m_x[1], m_y[1], m_x[2], m_y[2], xc, yc, d);
			ras.add_path(span_gen);
			scanlineRenderer.GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);

			span_gen.colors(new RGBA_Floats(0, 0, 1, alpha),
							new RGBA_Floats(1, 0, 0, alpha),
							new RGBA_Floats(brc, brc, brc, alpha));
			span_gen.triangle(m_x[2], m_y[2], m_x[0], m_y[0], xc, yc, d);
			ras.add_path(span_gen);
			scanlineRenderer.GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);

			brc = 1 - brc;
			span_gen.colors(new RGBA_Floats(1, 0, 0, alpha),
							new RGBA_Floats(0, 1, 0, alpha),
							new RGBA_Floats(brc, brc, brc, alpha));
			span_gen.triangle(m_x[0], m_y[0], m_x[1], m_y[1], x1, y1, d);
			ras.add_path(span_gen);
			scanlineRenderer.GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);

			span_gen.colors(new RGBA_Floats(0, 1, 0, alpha),
							new RGBA_Floats(0, 0, 1, alpha),
							new RGBA_Floats(brc, brc, brc, alpha));
			span_gen.triangle(m_x[1], m_y[1], m_x[2], m_y[2], x2, y2, d);
			ras.add_path(span_gen);
			scanlineRenderer.GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);

			span_gen.colors(new RGBA_Floats(0, 0, 1, alpha),
							new RGBA_Floats(1, 0, 0, alpha),
							new RGBA_Floats(brc, brc, brc, alpha));
			span_gen.triangle(m_x[2], m_y[2], m_x[0], m_y[0], x3, y3, d);
			ras.add_path(span_gen);
			scanlineRenderer.GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);
		}
Exemple #12
0
		public override void OnDraw(Graphics2D graphics2D)
		{
			ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());

			IImageByte backBuffer = widgetsSubImage;
#if SourceDepth24
            pixfmt_alpha_blend_rgb pf = new pixfmt_alpha_blend_rgb(backBuffer, new blender_bgr());
#else
			ImageBuffer pf = new ImageBuffer();
			pf.Attach(backBuffer, new BlenderBGRA());
#endif
			ImageClippingProxy ren_base = new ImageClippingProxy(pf);
			ren_base.clear(new RGBA_Floats(1.0, 1.0, 1.0));

			scanline_unpacked_8 sl = new scanline_unpacked_8();
			ScanlineRasterizer ras = new ScanlineRasterizer();
#if true
			render_gouraud(backBuffer, sl, ras);
#else
            agg.span_allocator span_alloc = new span_allocator();
            span_gouraud_rgba span_gen = new span_gouraud_rgba(new rgba8(255, 0, 0, 255), new rgba8(0, 255, 0, 255), new rgba8(0, 0, 255, 255), 320, 220, 100, 100, 200, 100, 0);
            span_gouraud test_sg = new span_gouraud(new rgba8(0, 0, 0, 255), new rgba8(0, 0, 0, 255), new rgba8(0, 0, 0, 255), 320, 220, 100, 100, 200, 100, 0);
            ras.add_path(test_sg);
            renderer_scanlines.render_scanlines_aa(ras, sl, ren_base, span_alloc, span_gen);
            //renderer_scanlines.render_scanlines_aa_solid(ras, sl, ren_base, new rgba8(0, 0, 0, 255));
#endif

			ras.gamma(new gamma_none());
			//m_dilation.Render(ras, sl, ren_base);
			//m_gamma.Render(ras, sl, ren_base);
			//m_alpha.Render(ras, sl, ren_base);
			base.OnDraw(graphics2D);
		}
Exemple #13
0
        //template<class Scanline, class Ras>
        public void render_gouraud(IScanlineCache sl, IRasterizer <T> ras)
        {
            T alpha = m_alpha.value();
            T brc   = M.One <T>();

#if SourceDepth24
            pixfmt_alpha_blend_rgb pf = new pixfmt_alpha_blend_rgb(rbuf_window(), new blender_bgr());
#else
            FormatRGBA pf = new FormatRGBA(rbuf_window(), new BlenderBGRA());
#endif
            FormatClippingProxy ren_base = new FormatClippingProxy(pf);

            AGG.SpanAllocator   span_alloc = new SpanAllocator();
            SpanGouraudRgba <T> span_gen   = new SpanGouraudRgba <T>();

            ras.Gamma(new GammaLinear(0.0, m_gamma.value().ToDouble()));

            T d = m_dilation.value();

            // Six triangles
            T xc = m_x[0].Add(m_x[1]).Add(m_x[2]).Divide(3.0);
            T yc = m_y[0].Add(m_y[1]).Add(m_y[2]).Divide(3.0);

            T x1 = m_x[1].Add(m_x[0]).Divide(2).Subtract(xc.Subtract(m_x[1].Add(m_x[0]).Divide(2)));
            T y1 = m_y[1].Add(m_y[0]).Divide(2).Subtract(yc.Subtract(m_y[1].Add(m_y[0]).Divide(2)));

            T x2 = m_x[2].Add(m_x[1]).Divide(2).Subtract(xc.Subtract(m_x[2].Add(m_x[1]).Divide(2)));
            T y2 = m_y[2].Add(m_y[1]).Divide(2).Subtract(yc.Subtract(m_y[2].Add(m_y[1]).Divide(2)));

            T x3 = m_x[0].Add(m_x[2]).Divide(2).Subtract(xc.Subtract(m_x[0].Add(m_x[2]).Divide(2)));
            T y3 = m_y[0].Add(m_y[2]).Divide(2).Subtract(yc.Subtract(m_y[0].Add(m_y[2]).Divide(2)));

            span_gen.Colors(new RGBA_Doubles(1, 0, 0, alpha.ToDouble()),
                            new RGBA_Doubles(0, 1, 0, alpha.ToDouble()),
                            new RGBA_Doubles(brc.ToDouble(), brc.ToDouble(), brc.ToDouble(), alpha.ToDouble()));
            span_gen.Triangle(m_x[0], m_y[0], m_x[1], m_y[1], xc, yc, d);
            ras.AddPath(span_gen);
            Renderer <T> .GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);


            span_gen.Colors(new RGBA_Doubles(0, 1, 0, alpha.ToDouble()),
                            new RGBA_Doubles(0, 0, 1, alpha.ToDouble()),
                            new RGBA_Doubles(brc.ToDouble(), brc.ToDouble(), brc.ToDouble(), alpha.ToDouble()));
            span_gen.Triangle(m_x[1], m_y[1], m_x[2], m_y[2], xc, yc, d);
            ras.AddPath(span_gen);
            Renderer <T> .GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);


            span_gen.Colors(new RGBA_Doubles(0, 0, 1, alpha.ToDouble()),
                            new RGBA_Doubles(1, 0, 0, alpha.ToDouble()),
                            new RGBA_Doubles(brc.ToDouble(), brc.ToDouble(), brc.ToDouble(), alpha.ToDouble()));
            span_gen.Triangle(m_x[2], m_y[2], m_x[0], m_y[0], xc, yc, d);
            ras.AddPath(span_gen);
            Renderer <T> .GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);


            brc = M.One <T>().Subtract(brc);
            span_gen.Colors(new RGBA_Doubles(1, 0, 0, alpha.ToDouble()),
                            new RGBA_Doubles(0, 1, 0, alpha.ToDouble()),
                            new RGBA_Doubles(brc.ToDouble(), brc.ToDouble(), brc.ToDouble(), alpha.ToDouble()));
            span_gen.Triangle(m_x[0], m_y[0], m_x[1], m_y[1], x1, y1, d);
            ras.AddPath(span_gen);
            Renderer <T> .GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);


            span_gen.Colors(new RGBA_Doubles(0, 1, 0, alpha.ToDouble()),
                            new RGBA_Doubles(0, 0, 1, alpha.ToDouble()),
                            new RGBA_Doubles(brc.ToDouble(), brc.ToDouble(), brc.ToDouble(), alpha.ToDouble()));
            span_gen.Triangle(m_x[1], m_y[1], m_x[2], m_y[2], x2, y2, d);
            ras.AddPath(span_gen);
            Renderer <T> .GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);


            span_gen.Colors(new RGBA_Doubles(0, 0, 1, alpha.ToDouble()),
                            new RGBA_Doubles(1, 0, 0, alpha.ToDouble()),
                            new RGBA_Doubles(brc.ToDouble(), brc.ToDouble(), brc.ToDouble(), alpha.ToDouble()));
            span_gen.Triangle(m_x[2], m_y[2], m_x[0], m_y[0], x3, y3, d);
            ras.AddPath(span_gen);
            Renderer <T> .GenerateAndRender(ras, sl, ren_base, span_alloc, span_gen);
        }
Exemple #14
0
        //template<class Scanline, class Ras>
        public void RenderGourand(Graphics2D gx)
        {
            float alpha = this.AlphaValue;
            float brc   = 1;

#if SourceDepth24
            pixfmt_alpha_blend_rgb pf = new pixfmt_alpha_blend_rgb(backBuffer, new blender_bgr());
#else
#endif
            var destImage = gx.DestImage;
            //span_allocator span_alloc = new span_allocator();

            CanvasPainter      painter        = new CanvasPainter(gx);
            SpanGenGouraudRGBA gouraudSpanGen = new SpanGenGouraudRGBA();
            gx.ScanlineRasterizer.ResetGamma(new GammaLinear(0.0f, this.LinearGamma));
            double d = this.DilationValue;

            // Six triangles
            double xc = (m_x[0] + m_x[1] + m_x[2]) / 3.0;
            double yc = (m_y[0] + m_y[1] + m_y[2]) / 3.0;

            double x1 = (m_x[1] + m_x[0]) / 2 - (xc - (m_x[1] + m_x[0]) / 2);
            double y1 = (m_y[1] + m_y[0]) / 2 - (yc - (m_y[1] + m_y[0]) / 2);

            double x2 = (m_x[2] + m_x[1]) / 2 - (xc - (m_x[2] + m_x[1]) / 2);
            double y2 = (m_y[2] + m_y[1]) / 2 - (yc - (m_y[2] + m_y[1]) / 2);

            double x3 = (m_x[0] + m_x[2]) / 2 - (xc - (m_x[0] + m_x[2]) / 2);
            double y3 = (m_y[0] + m_y[2]) / 2 - (yc - (m_y[0] + m_y[2]) / 2);


            gouraudSpanGen.SetColor(ColorRGBA.Make(1, 0, 0, alpha),
                                    ColorRGBA.Make(0, 1, 0, alpha),
                                    ColorRGBA.Make(brc, brc, brc, alpha));
            gouraudSpanGen.SetTriangle(m_x[0], m_y[0], m_x[1], m_y[1], xc, yc, d);

            painter.Fill(gouraudSpanGen.MakeVxs(), gouraudSpanGen);



            gouraudSpanGen.SetColor(ColorRGBA.Make(0, 1, 0, alpha),
                                    ColorRGBA.Make(0, 0, 1, alpha),
                                    ColorRGBA.Make(brc, brc, brc, alpha));

            gouraudSpanGen.SetTriangle(m_x[1], m_y[1], m_x[2], m_y[2], xc, yc, d);
            painter.Fill(gouraudSpanGen.MakeVxs(), gouraudSpanGen);

            gouraudSpanGen.SetColor(ColorRGBA.Make(0, 0, 1, alpha),
                                    ColorRGBA.Make(1, 0, 0, alpha),
                                    ColorRGBA.Make(brc, brc, brc, alpha));
            gouraudSpanGen.SetTriangle(m_x[2], m_y[2], m_x[0], m_y[0], xc, yc, d);
            painter.Fill(gouraudSpanGen.MakeVxs(), gouraudSpanGen);

            brc = 1 - brc;
            gouraudSpanGen.SetColor(ColorRGBA.Make(1, 0, 0, alpha),
                                    ColorRGBA.Make(0, 1, 0, alpha),
                                    ColorRGBA.Make(brc, brc, brc, alpha));
            gouraudSpanGen.SetTriangle(m_x[0], m_y[0], m_x[1], m_y[1], x1, y1, d);
            painter.Fill(gouraudSpanGen.MakeVxs(), gouraudSpanGen);

            gouraudSpanGen.SetColor(ColorRGBA.Make(0, 1, 0, alpha),
                                    ColorRGBA.Make(0, 0, 1, alpha),
                                    ColorRGBA.Make(brc, brc, brc, alpha));
            gouraudSpanGen.SetTriangle(m_x[1], m_y[1], m_x[2], m_y[2], x2, y2, d);
            painter.Fill(gouraudSpanGen.MakeVxs(), gouraudSpanGen);

            gouraudSpanGen.SetColor(ColorRGBA.Make(0, 0, 1, alpha),
                                    ColorRGBA.Make(1, 0, 0, alpha),
                                    ColorRGBA.Make(brc, brc, brc, alpha));
            gouraudSpanGen.SetTriangle(m_x[2], m_y[2], m_x[0], m_y[0], x3, y3, d);
            painter.Fill(gouraudSpanGen.MakeVxs(), gouraudSpanGen);
        }
Exemple #15
0
        public override void OnDraw()
        {
            //typedef agg::renderer_base<pixfmt>     renderer_base;
            //typedef agg::renderer_base<pixfmt_pre> renderer_base_pre;

#if SourceDepth24
            pixfmt_alpha_blend_rgb pixf     = new pixfmt_alpha_blend_rgb(rbuf_window(), new blender_bgr());
            pixfmt_alpha_blend_rgb pixf_pre = new pixfmt_alpha_blend_rgb(rbuf_window(), new blender_bgr_pre());
#else
            FormatRGBA pixf     = new FormatRGBA(rbuf_window(), new BlenderBGRA());
            FormatRGBA pixf_pre = new FormatRGBA(rbuf_window(), new BlenderPreMultBGRA());
#endif
            FormatClippingProxy clippingProxy     = new FormatClippingProxy(pixf);
            FormatClippingProxy clippingProxy_pre = new FormatClippingProxy(pixf_pre);

            clippingProxy.Clear(new RGBA_Doubles(1.0, 1.0, 1.0));

            IAffineTransformMatrix <T> src_mtx = MatrixFactory <T> .NewIdentity(VectorDimension.Two);

            src_mtx.Translate(MatrixFactory <T> .CreateVector2D(initial_width().Negative().Divide(2).Subtract(10), initial_height().Negative().Divide(2).Subtract(30)));
            src_mtx.RotateAlong(MatrixFactory <T> .CreateVector2D(0, 0), m_angle.value().Multiply(Math.PI / 180.0).ToDouble());
            src_mtx.Scale(m_scale.value());
            src_mtx.Translate(MatrixFactory <T> .CreateVector2D(initial_width().Divide(2), initial_height().Divide(2).Add(20)));
            src_mtx.Multiply(trans_affine_resizing());

            IAffineTransformMatrix <T> img_mtx = MatrixFactory <T> .NewIdentity(VectorDimension.Two);

            img_mtx.Translate(MatrixFactory <T> .CreateVector2D(initial_width().Negative().Divide(2).Add(10), initial_height().Negative().Divide(2).Add(30)));
            img_mtx.RotateAlong(MatrixFactory <T> .CreateVector2D(0, 0), m_angle.value().Multiply(Math.PI / 180.0).ToDouble());
            img_mtx.Scale(m_scale.value());
            img_mtx.Translate(MatrixFactory <T> .CreateVector2D(initial_width().Divide(2), initial_height().Divide(2).Add(20)));
            img_mtx.Multiply(trans_affine_resizing());
            img_mtx = img_mtx.Inverse;

            AGG.SpanAllocator sa = new SpanAllocator();

            SpanInterpolatorLinear <T> interpolator = new SpanInterpolatorLinear <T>(img_mtx);

#if SourceDepth24
            pixfmt_alpha_blend_rgb img_pixf = new pixfmt_alpha_blend_rgb(rbuf_img(0), new blender_bgr());
#else
            FormatRGBA img_pixf = new FormatRGBA(rbuf_img(0), new BlenderBGRA());
#endif

#if SourceDepth24
            span_image_filter_rgb_bilinear_clip sg;
            sg = new span_image_filter_rgb_bilinear_clip(img_pixf, rgba.rgba_pre(0, 0.4, 0, 0.5), interpolator);
#else
            SpanImageFilterRgbaBilinearClip <T> sg;
            RasterBufferAccessorClip            source = new RasterBufferAccessorClip(img_pixf, RGBA_Doubles.RgbaPre(0, 0, 0, 0));
            sg = new SpanImageFilterRgbaBilinearClip <T>(source, RGBA_Doubles.RgbaPre(0, 0.4, 0, 0.5), interpolator);
#endif

            RasterizerScanlineAA <T> ras = new RasterizerScanlineAA <T>();
            ras.SetVectorClipBox(M.Zero <T>(), M.Zero <T>(), width(), height());
            //agg.scanline_packed_8 sl = new scanline_packed_8();
            ScanlineUnpacked8 sl = new ScanlineUnpacked8();

            T r = initial_width();
            if (initial_height().Subtract(60).LessThan(r))
            {
                r = initial_height().Subtract(60);
            }

            Ellipse <T> ell = new Ellipse <T>(initial_width().Divide(2.0).Add(10),
                                              initial_height().Divide(2.0).Add(30),
                                              r.Divide(2.0).Add(16.0),
                                              r.Divide(2.0).Add(16.0), 200);

            ConvTransform <T> tr = new ConvTransform <T>(ell, src_mtx);

            ras.AddPath(tr);
#if use_timers
            for (uint j = 0; j < 10; j++)
            {
                Renderer.GenerateAndRender(ras, sl, clippingProxy_pre, sa, sg);
            }
            AllTimer.Start();
            image1_100_Times.Start();
            for (uint i = 0; i < 500; i++)
            {
#endif
            //clippingProxy_pre.SetClippingBox(30, 0, (int)width(), (int)height());
            //clippingProxy.SetClippingBox(30, 0, (int)width(), (int)height());
            Renderer <T> .GenerateAndRender(ras, sl, clippingProxy_pre, sa, sg);

#if use_timers
        }

        image1_100_Times.Stop();
#endif

            //m_angle.SetTransform(trans_affine_resizing());
            //m_scale.SetTransform(trans_affine_resizing());
#if use_timers
            AllTimer.Stop();
            CExecutionTimer.Instance.AppendResultsToFile("TimingTest.txt", AllTimer.GetTotalSeconds());
            CExecutionTimer.Instance.Reset();
#endif
            base.OnDraw();
        }