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 image_resample() { m_gamma_lut = new GammaLookUpTable(2.0); m_quad = new MatterHackers.Agg.UI.PolygonEditWidget(4, 5.0); m_trans_type = new MatterHackers.Agg.UI.RadioButtonGroup(new Vector2(400, 5.0), new Vector2(30 + 170.0, 95)); m_gamma = new MatterHackers.Agg.UI.Slider(5.0, 5.0 + 15 * 0, 400 - 5, 10.0 + 15 * 0); m_blur = new MatterHackers.Agg.UI.Slider(5.0, 5.0 + 15 * 1, 400 - 5, 10.0 + 15 * 1); m_blur.ValueChanged += new EventHandler(NeedRedraw); m_gamma.ValueChanged += new EventHandler(NeedRedraw); m_old_gamma = 2.0; g_rasterizer = new ScanlineRasterizer(); g_scanline = new scanline_unpacked_8(); m_trans_type.AddRadioButton("Affine No Resample"); m_trans_type.AddRadioButton("Affine Resample"); m_trans_type.AddRadioButton("Perspective No Resample LERP"); m_trans_type.AddRadioButton("Perspective No Resample Exact"); m_trans_type.AddRadioButton("Perspective Resample LERP"); m_trans_type.AddRadioButton("Perspective Resample Exact"); m_trans_type.SelectedIndex = 4; AddChild(m_trans_type); m_gamma.SetRange(0.5, 3.0); m_gamma.Value = 2.0; m_gamma.Text = "Gamma={0:F3}"; AddChild(m_gamma); m_blur.SetRange(0.5, 5.0); m_blur.Value = 1.0; m_blur.Text = "Blur={0:F3}"; AddChild(m_blur); }
public override void OnMouseDown(MouseEventArgs mouseEvent) { int i; if (mouseEvent.Button == MouseButtons.Right) { scanline_unpacked_8 sl = new scanline_unpacked_8(); ScanlineRasterizer ras = new ScanlineRasterizer(); stopwatch.Restart(); for (i = 0; i < 100; i++) { //render_gouraud(sl, ras); } stopwatch.Stop(); string buf; buf = "Time=" + stopwatch.ElapsedMilliseconds.ToString() + "ms"; throw new NotImplementedException(); //guiSurface.ShowSystemMessage(buf); } if (mouseEvent.Button == MouseButtons.Left) { double x = mouseEvent.X; double y = mouseEvent.Y; for (i = 0; i < 3; i++) { if (Math.Sqrt((x - m_x[i]) * (x - m_x[i]) + (y - m_y[i]) * (y - m_y[i])) < 10.0) { m_dx = x - m_x[i]; m_dy = y - m_y[i]; m_idx = (int)i; break; } } if (i == 3) { if (agg_math.point_in_triangle(m_x[0], m_y[0], m_x[1], m_y[1], m_x[2], m_y[2], x, y)) { m_dx = x - m_x[0]; m_dy = y - m_y[0]; m_idx = 3; } } } base.OnMouseDown(mouseEvent); }
public override void OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); GammaLookUpTable gamma = new GammaLookUpTable(gammaSlider.Value); IRecieveBlenderByte NormalBlender = new BlenderBGRA(); IRecieveBlenderByte GammaBlender = new BlenderGammaBGRA(gamma); ImageBuffer rasterGamma = new ImageBuffer(); rasterGamma.Attach(widgetsSubImage, GammaBlender); ImageClippingProxy clippingProxyNormal = new ImageClippingProxy(widgetsSubImage); ImageClippingProxy clippingProxyGamma = new ImageClippingProxy(rasterGamma); clippingProxyNormal.clear(new ColorF(1, 1, 1)); ScanlineRasterizer rasterizer = new ScanlineRasterizer(); scanline_unpacked_8 sl = new scanline_unpacked_8(); int size_mul = (int)pixelSizeSlider.Value; renderer_enlarged ren_en = new renderer_enlarged(size_mul); rasterizer.reset(); rasterizer.move_to_d(m_x[0] / size_mul, m_y[0] / size_mul); rasterizer.line_to_d(m_x[1] / size_mul, m_y[1] / size_mul); rasterizer.line_to_d(m_x[2] / size_mul, m_y[2] / size_mul); ren_en.RenderSolid(clippingProxyGamma, rasterizer, sl, Color.Black); ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); scanlineRenderer.RenderSolid(clippingProxyGamma, rasterizer, sl, Color.Black); rasterizer.gamma(new gamma_none()); VertexStorage ps = new VertexStorage(); Stroke pg = new Stroke(ps); pg.Width = 2; ps.remove_all(); ps.MoveTo(m_x[0], m_y[0]); ps.LineTo(m_x[1], m_y[1]); ps.LineTo(m_x[2], m_y[2]); ps.LineTo(m_x[0], m_y[0]); rasterizer.add_path(pg); scanlineRenderer.RenderSolid(clippingProxyNormal, rasterizer, sl, new Color(0, 150, 160, 200)); base.OnDraw(graphics2D); }
public override void OnDraw(Graphics2D graphics2D) { GammaLookUpTable gamma = new GammaLookUpTable(gammaSlider.Value); IRecieveBlenderByte NormalBlender = new BlenderBGR(); IRecieveBlenderByte GammaBlender = new BlenderGammaBGR(gamma); ImageBuffer rasterNormal = new ImageBuffer(); rasterNormal.Attach(graphics2D.DestImage, NormalBlender); ImageBuffer rasterGamma = new ImageBuffer(); rasterGamma.Attach(graphics2D.DestImage, GammaBlender); ImageClippingProxy clippingProxyNormal = new ImageClippingProxy(rasterNormal); ImageClippingProxy clippingProxyGamma = new ImageClippingProxy(rasterGamma); clippingProxyNormal.clear(new RGBA_Floats(1, 1, 1)); ScanlineRasterizer ras = new ScanlineRasterizer(); scanline_unpacked_8 sl = new scanline_unpacked_8(); int size_mul = (int)pixelSizeSlider.Value; renderer_enlarged ren_en = new renderer_enlarged(size_mul); StyledTypeFace type = new StyledTypeFace(LiberationSansFont.Instance, 12); IVertexSource character = type.GetGlyphForCharacter('E'); character.rewind(0); ras.reset(); ras.add_path(character); ren_en.RenderSolid(clippingProxyGamma, ras, sl, RGBA_Bytes.Black); ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); scanlineRenderer.RenderSolid(clippingProxyGamma, ras, sl, RGBA_Bytes.Black); ras.gamma(new gamma_none()); PathStorage ps = new PathStorage(); Stroke pg = new Stroke(ps); pg.width(2); DrawBigA(graphics2D); base.OnDraw(graphics2D); }
public image_filters() : base(FlowDirection.BottomToTop) { m_step = new Slider(new Vector2(115, 5), new Vector2(285, 6)); m_radius = new Slider(new Vector2(115, 5 + 15), new Vector2(285, 6)); filterSelectionButtons = new RadioButtonGroup(new Vector2(0.0, 10.0), new Vector2(110.0, 210.0)); m_normalize = new CheckBox(8.0, 215.0, "Normalize Filter"); m_refresh = new Button(8.0, 273.0, new ButtonViewText("Refresh", 8, 1, 3)); m_refresh.Click += RefreshImage; m_run = new Button(8.0, 253.0, new ButtonViewText("RUN Test!", 8, 1, 3)); m_run.Click += RunTest; m_single_step = new Button(8.0, 233.0, new ButtonViewText("Single Step", 8, 1, 3)); m_single_step.Click += SingleStep; m_cur_angle = (0.0); m_cur_filter = (1); m_num_steps = (0); m_num_pix = (0.0); m_time1 = (0); m_time2 = (0); m_ScanlinePacked = new ScanlineCachePacked8(); m_Rasterizer = new ScanlineRasterizer(); m_ScanlineUnpacked = new scanline_unpacked_8(); m_SpanAllocator = new span_allocator(); AddChild(m_radius); AddChild(m_step); AddChild(filterSelectionButtons); AddChild(m_run); AddChild(m_single_step); AddChild(m_normalize); AddChild(m_refresh); m_normalize.Checked = true; m_radius.Text = "Filter Radius={0:F2}"; m_step.Text = "Step={0:F2}"; m_radius.SetRange(2.0, 8.0); m_radius.Value = 4.0; m_step.SetRange(1.0, 10.0); m_step.Value = 5.0; filterSelectionButtons.AddRadioButton("simple (NN)"); filterSelectionButtons.AddRadioButton("bilinear"); filterSelectionButtons.AddRadioButton("bicubic"); filterSelectionButtons.AddRadioButton("spline16"); filterSelectionButtons.AddRadioButton("spline36"); filterSelectionButtons.AddRadioButton("hanning"); filterSelectionButtons.AddRadioButton("hamming"); filterSelectionButtons.AddRadioButton("hermite"); filterSelectionButtons.AddRadioButton("kaiser"); filterSelectionButtons.AddRadioButton("quadric"); filterSelectionButtons.AddRadioButton("catrom"); filterSelectionButtons.AddRadioButton("gaussian"); filterSelectionButtons.AddRadioButton("bessel"); filterSelectionButtons.AddRadioButton("mitchell"); filterSelectionButtons.AddRadioButton("sinc"); filterSelectionButtons.AddRadioButton("lanczos"); filterSelectionButtons.AddRadioButton("blackman"); filterSelectionButtons.SelectedIndex = 1; filterSelectionButtons.background_color(new ColorF(0.0, 0.0, 0.0, 0.1)); }
public void DrawTo(Graphics2D graphics2D, Mesh meshToDraw, RGBA_Bytes partColorIn, double minZ, double maxZ) { RGBA_Floats partColor = partColorIn.GetAsRGBA_Floats(); graphics2D.Rasterizer.gamma(new gamma_power(.3)); RenderPoint[] points = new RenderPoint[3] { new RenderPoint(), new RenderPoint(), new RenderPoint() }; foreach (Face face in meshToDraw.Faces) { int i = 0; Vector3 normal = Vector3.TransformVector(face.normal, trackballTumbleWidget.ModelviewMatrix).GetNormal(); if (normal.z > 0) { foreach (FaceEdge faceEdge in face.FaceEdges()) { points[i].position = trackballTumbleWidget.GetScreenPosition(faceEdge.firstVertex.Position); Vector3 transformedPosition = Vector3.TransformPosition(faceEdge.firstVertex.Position, trackballTumbleWidget.ModelviewMatrix); points[i].z = transformedPosition.z; i++; } RGBA_Floats polyDrawColor = new RGBA_Floats(); double L = Vector3.Dot(lightNormal, normal); if (L > 0.0f) { polyDrawColor = partColor * lightIllumination * L; } polyDrawColor = RGBA_Floats.ComponentMax(polyDrawColor, partColor * ambiantIllumination); for (i = 0; i < 3; i++) { double ratio = (points[i].z - minZ) / (maxZ - minZ); int ratioInt16 = (int)(ratio * 65536); points[i].color = new RGBA_Bytes(polyDrawColor.Red0To255, ratioInt16 >> 8, ratioInt16 & 0xFF); } #if true scanline_unpacked_8 sl = new scanline_unpacked_8(); ScanlineRasterizer ras = new ScanlineRasterizer(); render_gouraud(graphics2D.DestImage, sl, ras, points); #else IRecieveBlenderByte oldBlender = graphics2D.DestImage.GetRecieveBlender(); graphics2D.DestImage.SetRecieveBlender(new BlenderZBuffer()); graphics2D.Render(polygonProjected, renderColor); graphics2D.DestImage.SetRecieveBlender(oldBlender); #endif byte[] buffer = graphics2D.DestImage.GetBuffer(); int pixels = graphics2D.DestImage.Width * graphics2D.DestImage.Height; for (int pixelIndex = 0; pixelIndex < pixels; pixelIndex++) { buffer[pixelIndex * 4 + ImageBuffer.OrderR] = buffer[pixelIndex * 4 + ImageBuffer.OrderR]; buffer[pixelIndex * 4 + ImageBuffer.OrderG] = buffer[pixelIndex * 4 + ImageBuffer.OrderR]; buffer[pixelIndex * 4 + ImageBuffer.OrderB] = buffer[pixelIndex * 4 + ImageBuffer.OrderR]; } } } }
public override void OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); ScanlineRasterizer ras = new ScanlineRasterizer(); scanline_unpacked_8 sl = new scanline_unpacked_8(); ImageClippingProxy clippingProxy = new ImageClippingProxy(widgetsSubImage); clippingProxy.clear(new RGBA_Floats(0, 0, 0)); m_profile.text_size(8.0); // draw a background to show how the alpha is working int RectWidth = 32; int xoffset = 238; int yoffset = 171; ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); for (int i = 0; i < 7; i++) { for (int j = 0; j < 7; j++) { if ((i + j) % 2 != 0) { VertexSource.RoundedRect rect = new VertexSource.RoundedRect(i * RectWidth + xoffset, j * RectWidth + yoffset, (i + 1) * RectWidth + xoffset, (j + 1) * RectWidth + yoffset, 2); rect.normalize_radius(); ras.add_path(rect); scanlineRenderer.render_scanlines_aa_solid(clippingProxy, ras, sl, new RGBA_Bytes(.9, .9, .9)); } } } double ini_scale = 1.0; Transform.Affine mtx1 = Affine.NewIdentity(); mtx1 *= Affine.NewScaling(ini_scale, ini_scale); mtx1 *= Affine.NewTranslation(center_x, center_y); VertexSource.Ellipse e1 = new MatterHackers.Agg.VertexSource.Ellipse(); e1.init(0.0, 0.0, 110.0, 110.0, 64); Transform.Affine mtx_g1 = Affine.NewIdentity(); mtx_g1 *= Affine.NewScaling(ini_scale, ini_scale); mtx_g1 *= Affine.NewScaling(m_SaveData.m_scale, m_SaveData.m_scale); mtx_g1 *= Affine.NewScaling(m_scale_x, m_scale_y); mtx_g1 *= Affine.NewRotation(m_SaveData.m_angle); mtx_g1 *= Affine.NewTranslation(m_SaveData.m_center_x, m_SaveData.m_center_y); mtx_g1.invert(); RGBA_Bytes[] color_profile = new RGBA_Bytes[256]; // color_type is defined in pixel_formats.h for (int i = 0; i < 256; i++) { color_profile[i] = new RGBA_Bytes(m_spline_r.spline()[i], m_spline_g.spline()[i], m_spline_b.spline()[i], m_spline_a.spline()[i]); } VertexSourceApplyTransform t1 = new VertexSourceApplyTransform(e1, mtx1); IGradient innerGradient = null; switch (m_GradTypeRBox.SelectedIndex) { case 0: innerGradient = new gradient_radial(); break; case 1: innerGradient = new gradient_diamond(); break; case 2: innerGradient = new gradient_x(); break; case 3: innerGradient = new gradient_xy(); break; case 4: innerGradient = new gradient_sqrt_xy(); break; case 5: innerGradient = new gradient_conic(); break; } IGradient outerGradient = null; switch (m_GradWrapRBox.SelectedIndex) { case 0: outerGradient = new gradient_reflect_adaptor(innerGradient); break; case 1: outerGradient = new gradient_repeat_adaptor(innerGradient); break; case 2: outerGradient = new gradient_clamp_adaptor(innerGradient); break; } span_allocator span_alloc = new span_allocator(); color_function_profile colors = new color_function_profile(color_profile, m_profile.gamma()); span_interpolator_linear inter = new span_interpolator_linear(mtx_g1); span_gradient span_gen = new span_gradient(inter, outerGradient, colors, 0, 150); ras.add_path(t1); scanlineRenderer.GenerateAndRender(ras, sl, clippingProxy, span_alloc, span_gen); base.OnDraw(graphics2D); }
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 OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); IImageByte backBuffer = widgetsSubImage; IImageByte destImage = backBuffer; ImageClippingProxy clippingProxy = new ImageClippingProxy(destImage); clippingProxy.clear(new RGBA_Floats(0, 0, 0)); ScanlineRasterizer ras = new ScanlineRasterizer(); scanline_unpacked_8 sl = new scanline_unpacked_8(); scanline_bin sl_bin = new scanline_bin(); rasterizer_compound_aa rasc = new rasterizer_compound_aa(); span_allocator alloc = new span_allocator(); int i; styles_gouraud styles = new styles_gouraud(m_mesh, m_gamma); stopwatch.Restart(); 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.move_to_d(p1.x, p1.y); rasc.line_to_d(p2.x, p2.y); } ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); scanlineRenderer.RenderCompound(rasc, sl, sl_bin, clippingProxy, alloc, styles); double tm = stopwatch.ElapsedMilliseconds; gsv_text t = new gsv_text(); t.SetFontSize(10.0); Stroke pt = new Stroke(t); pt.width(1.5); pt.line_cap(LineCap.Round); pt.line_join(LineJoin.Round); 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.start_point(10.0, 10.0); t.text(buf); ras.add_path(pt); scanlineRenderer.RenderSolid(clippingProxy, ras, sl, new RGBA_Bytes(255, 255, 255)); if (m_gamma.GetGamma() != 1.0) { ((ImageBuffer)destImage).apply_gamma_inv(m_gamma); } base.OnDraw(graphics2D); }
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); }