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(); }
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(); }
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(); } }
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); }
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); }
//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); }
//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); }
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(); }