public override void OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); IImageByte backBuffer = widgetsSubImage; GammaLookUpTable gamma = new GammaLookUpTable(m_gamma.Value); IRecieveBlenderByte NormalBlender = new BlenderBGRA(); IRecieveBlenderByte GammaBlender = new BlenderGammaBGRA(gamma); ImageBuffer rasterNormal = new ImageBuffer(); rasterNormal.Attach(backBuffer, NormalBlender); ImageBuffer rasterGamma = new ImageBuffer(); rasterGamma.Attach(backBuffer, GammaBlender); ImageClippingProxy clippingProxyNormal = new ImageClippingProxy(rasterNormal); ImageClippingProxy clippingProxyGamma = new ImageClippingProxy(rasterGamma); clippingProxyNormal.clear(m_white_on_black.Checked ? new RGBA_Floats(0, 0, 0) : new RGBA_Floats(1, 1, 1)); ScanlineRasterizer ras = new ScanlineRasterizer(); ScanlineCachePacked8 sl = new ScanlineCachePacked8(); VertexSource.Ellipse e = new VertexSource.Ellipse(); // TODO: If you drag the control circles below the bottom of the window we get an exception. This does not happen in AGG. // It needs to be debugged. Turning on clipping fixes it. But standard agg works without clipping. Could be a bigger problem than this. //ras.clip_box(0, 0, width(), height()); // Render two "control" circles e.init(m_x[0], m_y[0], 3, 3, 16); ras.add_path(e); ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); scanlineRenderer.render_scanlines_aa_solid(clippingProxyNormal, ras, sl, new RGBA_Bytes(127, 127, 127)); e.init(m_x[1], m_y[1], 3, 3, 16); ras.add_path(e); scanlineRenderer.render_scanlines_aa_solid(clippingProxyNormal, ras, sl, new RGBA_Bytes(127, 127, 127)); double d = m_offset.Value; // Creating a rounded rectangle VertexSource.RoundedRect r = new VertexSource.RoundedRect(m_x[0] + d, m_y[0] + d, m_x[1] + d, m_y[1] + d, m_radius.Value); r.normalize_radius(); // Drawing as an outline if (!m_DrawAsOutlineCheckBox.Checked) { Stroke p = new Stroke(r); p.width(1.0); ras.add_path(p); } else { ras.add_path(r); } scanlineRenderer.render_scanlines_aa_solid(clippingProxyGamma, ras, sl, m_white_on_black.Checked ? new RGBA_Bytes(255, 255, 255) : new RGBA_Bytes(0, 0, 0)); base.OnDraw(graphics2D); }
public override void OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); IImageByte backBuffer = widgetsSubImage; if (firstTime) { firstTime = false; m_SuperFast = new MatterHackers.Agg.UI.CheckBox(10, 10, "Run Super Fast"); AddChild(m_SuperFast); m_Controller = new CController(backBuffer, 30, 40, .1, .7, .3, 4, 1, 2000); } graphics2D.Clear(new RGBA_Floats(1, 1, 1, 1)); graphics2D.Rasterizer.SetVectorClipBox(0, 0, (int)Width, (int)Height); m_Controller.FastRender(m_SuperFast.Checked); m_Controller.Render(graphics2D); //m_SuperFast.Render(graphics2D); base.OnDraw(graphics2D); }
public override void OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); IImageByte backBuffer = widgetsSubImage; GammaLookUpTable gamma = new GammaLookUpTable(m_gamma.Value); IRecieveBlenderByte NormalBlender = new BlenderBGRA(); IRecieveBlenderByte GammaBlender = new BlenderGammaBGRA(gamma); ImageBuffer rasterNormal = new ImageBuffer(); rasterNormal.Attach(backBuffer, NormalBlender); ImageBuffer rasterGamma = new ImageBuffer(); rasterGamma.Attach(backBuffer, GammaBlender); ImageClippingProxy clippingProxyNormal = new ImageClippingProxy(rasterNormal); ImageClippingProxy clippingProxyGamma = new ImageClippingProxy(rasterGamma); clippingProxyNormal.clear(m_white_on_black.Checked ? new ColorF(0, 0, 0) : new ColorF(1, 1, 1)); ScanlineRasterizer ras = new ScanlineRasterizer(); ScanlineCachePacked8 sl = new ScanlineCachePacked8(); VertexSource.Ellipse e = new VertexSource.Ellipse(); // TODO: If you drag the control circles below the bottom of the window we get an exception. This does not happen in AGG. // It needs to be debugged. Turning on clipping fixes it. But standard agg works without clipping. Could be a bigger problem than this. //ras.clip_box(0, 0, width(), height()); // Render two "control" circles e.init(m_x[0], m_y[0], 3, 3, 16); ras.add_path(e); ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); scanlineRenderer.RenderSolid(clippingProxyNormal, ras, sl, new Color(127, 127, 127)); e.init(m_x[1], m_y[1], 3, 3, 16); ras.add_path(e); scanlineRenderer.RenderSolid(clippingProxyNormal, ras, sl, new Color(127, 127, 127)); double d = m_offset.Value; // Creating a rounded rectangle VertexSource.RoundedRect r = new VertexSource.RoundedRect(m_x[0] + d, m_y[0] + d, m_x[1] + d, m_y[1] + d, m_radius.Value); r.normalize_radius(); // Drawing as an outline if (!m_DrawAsOutlineCheckBox.Checked) { Stroke p = new Stroke(r); p.width(1.0); ras.add_path(p); } else { ras.add_path(r); } scanlineRenderer.RenderSolid(clippingProxyGamma, ras, sl, m_white_on_black.Checked ? new Color(255, 255, 255) : new Color(0, 0, 0)); base.OnDraw(graphics2D); }
public override void OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); ImageClippingProxy clippingProxy = new ImageClippingProxy(widgetsSubImage); clippingProxy.clear(new ColorF(1, 1, 1)); m_ras.SetVectorClipBox(0, 0, Width, Height); Affine move = Affine.NewTranslation(10, 10); Perspective shadow_persp = new Perspective(m_shape_bounds.Left, m_shape_bounds.Bottom, m_shape_bounds.Right, m_shape_bounds.Top, m_shadow_ctrl.polygon()); IVertexSource shadow_trans; if (m_FlattenCurves.Checked) { shadow_trans = new VertexSourceApplyTransform(m_shape, shadow_persp); } else { shadow_trans = new VertexSourceApplyTransform(m_path, shadow_persp); // this will make it very smooth after the transform //shadow_trans = new conv_curve(shadow_trans); } // Render shadow m_ras.add_path(shadow_trans); ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); scanlineRenderer.RenderSolid(clippingProxy, m_ras, m_sl, new ColorF(0.2, 0.3, 0).ToColor()); // Calculate the bounding box and extend it by the blur radius RectangleDouble bbox = new RectangleDouble(); bounding_rect.bounding_rect_single(shadow_trans, 0, ref bbox); bbox.Left -= m_radius.Value; bbox.Bottom -= m_radius.Value; bbox.Right += m_radius.Value; bbox.Top += m_radius.Value; if (m_method.SelectedIndex == 1) { // The recursive blur method represents the true Gaussian Blur, // with theoretically infinite kernel. The restricted window size // results in extra influence of edge pixels. It's impossible to // solve correctly, but extending the right and top areas to another // radius value produces fair result. //------------------ bbox.Right += m_radius.Value; bbox.Top += m_radius.Value; } stopwatch.Restart(); if (m_method.SelectedIndex != 2) { // Create a new pixel renderer and attach it to the main one as a child image. // It returns true if the attachment succeeded. It fails if the rectangle // (bbox) is fully clipped. //------------------ #if SourceDepth24 ImageBuffer image2 = new ImageBuffer(new BlenderBGR()); #else ImageBuffer image2 = new ImageBuffer(new BlenderBGRA()); #endif if (image2.Attach(widgetsSubImage, (int)bbox.Left, (int)bbox.Bottom, (int)bbox.Right, (int)bbox.Top)) { // Blur it if (m_method.SelectedIndex == 0) { // More general method, but 30-40% slower. //------------------ //m_stack_blur.blur(pixf2, agg::uround(m_radius.Value)); // Faster, but bore specific. // Works only for 8 bits per channel and only with radii <= 254. //------------------ stack_blur test = new stack_blur(); test.Blur(image2, agg_basics.uround(m_radius.Value), agg_basics.uround(m_radius.Value)); } else { // True Gaussian Blur, 3-5 times slower than Stack Blur, // but still constant time of radius. Very sensitive // to precision, doubles are must here. //------------------ m_recursive_blur.blur(image2, m_radius.Value); } } } else { /* * // Blur separate channels * //------------------ * if(m_channel_r.Checked) * { * typedef agg::pixfmt_alpha_blend_gray< * agg::blender_gray8, * agg::rendering_buffer, * 3, 2> pixfmt_gray8r; * * pixfmt_gray8r pixf2r(m_rbuf2); * if(pixf2r.attach(pixf, int(bbox.x1), int(bbox.y1), int(bbox.x2), int(bbox.y2))) * { * agg::stack_blur_gray8(pixf2r, agg::uround(m_radius.Value), * agg::uround(m_radius.Value)); * } * } * * if(m_channel_g.Checked) * { * typedef agg::pixfmt_alpha_blend_gray< * agg::blender_gray8, * agg::rendering_buffer, * 3, 1> pixfmt_gray8g; * * pixfmt_gray8g pixf2g(m_rbuf2); * if(pixf2g.attach(pixf, int(bbox.x1), int(bbox.y1), int(bbox.x2), int(bbox.y2))) * { * agg::stack_blur_gray8(pixf2g, agg::uround(m_radius.Value), * agg::uround(m_radius.Value)); * } * } * * if(m_channel_b.Checked) * { * typedef agg::pixfmt_alpha_blend_gray< * agg::blender_gray8, * agg::rendering_buffer, * 3, 0> pixfmt_gray8b; * * pixfmt_gray8b pixf2b(m_rbuf2); * if(pixf2b.attach(pixf, int(bbox.x1), int(bbox.y1), int(bbox.x2), int(bbox.y2))) * { * agg::stack_blur_gray8(pixf2b, agg::uround(m_radius.Value), * agg::uround(m_radius.Value)); * } * } */ } double tm = stopwatch.ElapsedMilliseconds; // Render the shape itself //------------------ if (m_FlattenCurves.Checked) { m_ras.add_path(m_shape); } else { m_ras.add_path(m_path); } scanlineRenderer.RenderSolid(clippingProxy, m_ras, m_sl, new ColorF(0.6, 0.9, 0.7, 0.8).ToColor()); graphics2D.DrawString(string.Format("{0:F2} ms", tm), 140, 30); base.OnDraw(graphics2D); }
public override void OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); IImageByte backBuffer = widgetsSubImage; if (!didInit) { didInit = true; OnInitialize(); } ImageBuffer image; if (backBuffer.BitDepth == 32) { image = new ImageBuffer(); image.Attach(backBuffer, new BlenderBGRA()); } else { if (backBuffer.BitDepth != 24) { throw new System.NotSupportedException(); } image = new ImageBuffer(); image.Attach(backBuffer, new BlenderBGR()); } ImageClippingProxy clippingProxy = new ImageClippingProxy(image); clippingProxy.clear(new RGBA_Floats(1, 1, 1)); g_rasterizer.SetVectorClipBox(0, 0, Width, Height); ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); if (transformationTypeRadioButton.SelectedIndex == 0) { Bilinear tr = new Bilinear(lionShape.Bounds.Left, lionShape.Bounds.Bottom, lionShape.Bounds.Right, lionShape.Bounds.Top, quadPolygonControl.polygon()); if (tr.is_valid()) { //-------------------------- // Render transformed lion // VertexSourceApplyTransform trans = new VertexSourceApplyTransform(lionShape.Path, tr); scanlineRenderer.RenderSolidAllPaths(clippingProxy, g_rasterizer, g_scanline, trans, lionShape.Colors, lionShape.PathIndex, lionShape.NumPaths); //-------------------------- //-------------------------- // Render transformed ellipse // VertexSource.Ellipse ell = new MatterHackers.Agg.VertexSource.Ellipse((lionShape.Bounds.Left + lionShape.Bounds.Right) * 0.5, (lionShape.Bounds.Bottom + lionShape.Bounds.Top) * 0.5, (lionShape.Bounds.Right - lionShape.Bounds.Left) * 0.5, (lionShape.Bounds.Top - lionShape.Bounds.Bottom) * 0.5, 200); Stroke ell_stroke = new Stroke(ell); ell_stroke.width(3.0); VertexSourceApplyTransform trans_ell = new VertexSourceApplyTransform(ell, tr); VertexSourceApplyTransform trans_ell_stroke = new VertexSourceApplyTransform(ell_stroke, tr); g_rasterizer.add_path(trans_ell); scanlineRenderer.RenderSolid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(0.5, 0.3, 0.0, 0.3)); g_rasterizer.add_path(trans_ell_stroke); scanlineRenderer.RenderSolid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(0.0, 0.3, 0.2, 1.0)); } } else { Perspective tr = new Perspective(lionShape.Bounds.Left, lionShape.Bounds.Bottom, lionShape.Bounds.Right, lionShape.Bounds.Top, quadPolygonControl.polygon()); if (tr.is_valid()) { // Render transformed lion VertexSourceApplyTransform trans = new VertexSourceApplyTransform(lionShape.Path, tr); scanlineRenderer.RenderSolidAllPaths(clippingProxy, g_rasterizer, g_scanline, trans, lionShape.Colors, lionShape.PathIndex, lionShape.NumPaths); // Render transformed ellipse VertexSource.Ellipse FilledEllipse = new MatterHackers.Agg.VertexSource.Ellipse((lionShape.Bounds.Left + lionShape.Bounds.Right) * 0.5, (lionShape.Bounds.Bottom + lionShape.Bounds.Top) * 0.5, (lionShape.Bounds.Right - lionShape.Bounds.Left) * 0.5, (lionShape.Bounds.Top - lionShape.Bounds.Bottom) * 0.5, 200); Stroke EllipseOutline = new Stroke(FilledEllipse); EllipseOutline.width(3.0); VertexSourceApplyTransform TransformedFilledEllipse = new VertexSourceApplyTransform(FilledEllipse, tr); VertexSourceApplyTransform TransformedEllipesOutline = new VertexSourceApplyTransform(EllipseOutline, tr); g_rasterizer.add_path(TransformedFilledEllipse); scanlineRenderer.RenderSolid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(0.5, 0.3, 0.0, 0.3)); g_rasterizer.add_path(TransformedEllipesOutline); scanlineRenderer.RenderSolid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(0.0, 0.3, 0.2, 1.0)); } } //-------------------------- // Render the "quad" tool and controls g_rasterizer.add_path(quadPolygonControl); scanlineRenderer.RenderSolid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(0, 0.3, 0.5, 0.6)); //m_trans_type.Render(g_rasterizer, g_scanline, clippingProxy); base.OnDraw(graphics2D); }
public override void OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); int width = (int)widgetsSubImage.Width; int height = (int)widgetsSubImage.Height; ImageBuffer clippedSubImage = new ImageBuffer(); clippedSubImage.Attach(widgetsSubImage, new BlenderBGRA()); ImageClippingProxy imageClippingProxy = new ImageClippingProxy(clippedSubImage); imageClippingProxy.clear(new ColorF(1, 1, 1)); Affine transform = Affine.NewIdentity(); transform *= Affine.NewTranslation(-lionShape.Center.X, -lionShape.Center.Y); transform *= Affine.NewScaling(lionScale, lionScale); transform *= Affine.NewRotation(angle + Math.PI); transform *= Affine.NewSkewing(skewX / 1000.0, skewY / 1000.0); transform *= Affine.NewTranslation(width / 2, height / 2); if (renderAsScanlineCheckBox.Checked) { rasterizer.SetVectorClipBox(0, 0, width, height); Stroke stroke = new Stroke(lionShape.Path); stroke.width(widthSlider.Value); stroke.line_join(LineJoin.Round); VertexSourceApplyTransform trans = new VertexSourceApplyTransform(stroke, transform); ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); scanlineRenderer.RenderSolidAllPaths(imageClippingProxy, rasterizer, scanlineCache, trans, lionShape.Colors, lionShape.PathIndex, lionShape.NumPaths); } else { double w = widthSlider.Value * transform.GetScale(); LineProfileAnitAlias lineProfile = new LineProfileAnitAlias(w, new gamma_none()); OutlineRenderer outlineRenderer = new OutlineRenderer(imageClippingProxy, lineProfile); rasterizer_outline_aa rasterizer = new rasterizer_outline_aa(outlineRenderer); rasterizer.line_join(renderAccurateJoinsCheckBox.Checked ? rasterizer_outline_aa.outline_aa_join_e.outline_miter_accurate_join : rasterizer_outline_aa.outline_aa_join_e.outline_round_join); rasterizer.round_cap(true); VertexSourceApplyTransform trans = new VertexSourceApplyTransform(lionShape.Path, transform); rasterizer.RenderAllPaths(trans, lionShape.Colors, lionShape.PathIndex, lionShape.NumPaths); } base.OnDraw(graphics2D); }
public override void OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); if (orignialSize.x == 0) { orignialSize.x = WindowSize.x; orignialSize.y = WindowSize.y; } ImageBuffer destImageWithPreMultBlender = new ImageBuffer(); switch (widgetsSubImage.BitDepth) { case 24: destImageWithPreMultBlender.Attach(widgetsSubImage, new BlenderPreMultBGR()); break; case 32: destImageWithPreMultBlender.Attach(widgetsSubImage, new BlenderPreMultBGRA()); break; default: throw new Exception("Unknown bit depth"); } ImageClippingProxy clippingProxy_pre = new ImageClippingProxy(destImageWithPreMultBlender); clippingProxy_pre.clear(new RGBA_Floats(1.0, 1.0, 1.0)); Affine src_mtx = Affine.NewIdentity(); src_mtx *= Affine.NewTranslation(-orignialSize.x / 2 - 10, -orignialSize.y / 2 - 20 - 10); src_mtx *= Affine.NewRotation(drawAngle.Value * Math.PI / 180.0); src_mtx *= Affine.NewScaling(drawScale.Value); src_mtx *= Affine.NewTranslation(orignialSize.x / 2, orignialSize.y / 2 + 20); Affine img_mtx = Affine.NewIdentity(); img_mtx *= Affine.NewTranslation(-orignialSize.x / 2 + 10, -orignialSize.y / 2 + 20 + 10); img_mtx *= Affine.NewRotation(drawAngle.Value * Math.PI / 180.0); img_mtx *= Affine.NewScaling(drawScale.Value); img_mtx *= Affine.NewTranslation(orignialSize.x / 2, orignialSize.y / 2 + 20); img_mtx.invert(); MatterHackers.Agg.span_allocator sa = new span_allocator(); span_interpolator_linear interpolator = new span_interpolator_linear(img_mtx); span_image_filter sg; switch (sourceImage.BitDepth) { case 24: { ImageBufferAccessorClip source = new ImageBufferAccessorClip(sourceImage, RGBA_Floats.rgba_pre(0, 0, 0, 0).GetAsRGBA_Bytes()); sg = new span_image_filter_rgb_bilinear_clip(source, RGBA_Floats.rgba_pre(0, 0.4, 0, 0.5), interpolator); } break; case 32: { ImageBufferAccessorClip source = new ImageBufferAccessorClip(sourceImage, RGBA_Floats.rgba_pre(0, 0, 0, 0).GetAsRGBA_Bytes()); sg = new span_image_filter_rgba_bilinear_clip(source, RGBA_Floats.rgba_pre(0, 0.4, 0, 0.5), interpolator); } break; default: throw new Exception("Bad sourc depth"); } ScanlineRasterizer ras = new ScanlineRasterizer(); ras.SetVectorClipBox(0, 0, Width, Height); ScanlineCachePacked8 sl = new ScanlineCachePacked8(); //scanline_unpacked_8 sl = new scanline_unpacked_8(); double r = orignialSize.x; if (orignialSize.y - 60 < r) { r = orignialSize.y - 60; } VertexSource.Ellipse ell = new VertexSource.Ellipse(orignialSize.x / 2.0 + 10, orignialSize.y / 2.0 + 20 + 10, r / 2.0 + 16.0, r / 2.0 + 16.0, 200); VertexSourceApplyTransform tr = new VertexSourceApplyTransform(ell, src_mtx); ras.add_path(tr); //clippingProxy_pre.SetClippingBox(30, 0, (int)width(), (int)height()); ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); scanlineRenderer.GenerateAndRender(ras, sl, clippingProxy_pre, sa, sg); if (false) // this is test code to check different quality settings for scalling { Vector2 screenCenter = new Vector2(Width / 2, Height / 2); Vector2 deltaToMouse = mousePosition - screenCenter; double angleToMouse = Math.Atan2(deltaToMouse.y, deltaToMouse.x); double diagonalSize = Math.Sqrt(sourceImage.Width * sourceImage.Width + sourceImage.Height * sourceImage.Height); double distToMouse = deltaToMouse.Length; double scalling = distToMouse / diagonalSize; graphics2D.Render(sourceImage, Width / 2, Height / 2, angleToMouse - MathHelper.Tau / 8, scalling, scalling); } base.OnDraw(graphics2D); }
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.RenderSolid(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 OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); #if SourceDepthFloat ImageClippingProxyFloat clippingProxy = new ImageClippingProxyFloat(graphics2D.DestImageFloat); clippingProxy.clear(new RGBA_Floats(1.0, 1.0, 1.0)); clippingProxy.CopyFrom(m_TempDestImage, new RectangleInt(0, 0, (int)Width, (int)Height), 110, 35); #else ImageClippingProxy clippingProxy = new ImageClippingProxy(widgetsSubImage); clippingProxy.clear(new ColorF(1.0, 1.0, 1.0)); clippingProxy.CopyFrom(m_TempDestImage, new RectangleInt(0, 0, (int)Width, (int)Height), 110, 35); #endif string buf = string.Format("NSteps={0:F0}", m_num_steps); gsv_text t = new gsv_text(); t.start_point(200.0, 430); t.SetFontSize(10.0); t.text(buf); Stroke pt = new Stroke(t); pt.Width = 1.5; m_Rasterizer.add_path(pt); #if SourceDepthFloat RGBA_Floats colorBlack = new RGBA_Floats(0, 0, 0); #else Color colorBlack = new Color(0, 0, 0); #endif ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); scanlineRenderer.RenderSolid(clippingProxy, m_Rasterizer, m_ScanlinePacked, colorBlack); if (m_time1 != m_time2 && m_num_pix > 0.0) { buf = string.Format("{0:F2} Kpix/sec", m_num_pix / (m_time2 - m_time1)); t.start_point(200.0, 450); t.text(buf); m_Rasterizer.add_path(pt); scanlineRenderer.RenderSolid(clippingProxy, m_Rasterizer, m_ScanlinePacked, colorBlack); } if (filterSelectionButtons.SelectedIndex >= 14) { m_radius.Visible = true; } else { m_radius.Visible = true; } base.OnDraw(graphics2D); }
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 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 OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); ImageClippingProxy clippingProxy = new ImageClippingProxy(widgetsSubImage); clippingProxy.clear(new RGBA_Floats(1, 1, 1)); m_ras.SetVectorClipBox(0, 0, Width, Height); Affine move = Affine.NewTranslation(10, 10); Perspective shadow_persp = new Perspective(m_shape_bounds.Left, m_shape_bounds.Bottom, m_shape_bounds.Right, m_shape_bounds.Top, m_shadow_ctrl.polygon()); IVertexSource shadow_trans; if (m_FlattenCurves.Checked) { shadow_trans = new VertexSourceApplyTransform(m_shape, shadow_persp); } else { shadow_trans = new VertexSourceApplyTransform(m_path, shadow_persp); // this will make it very smooth after the transform //shadow_trans = new conv_curve(shadow_trans); } // Render shadow m_ras.add_path(shadow_trans); ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); scanlineRenderer.RenderSolid(clippingProxy, m_ras, m_sl, new RGBA_Floats(0.2, 0.3, 0).GetAsRGBA_Bytes()); // Calculate the bounding box and extend it by the blur radius RectangleDouble bbox = new RectangleDouble(); bounding_rect.bounding_rect_single(shadow_trans, 0, ref bbox); bbox.Left -= m_radius.Value; bbox.Bottom -= m_radius.Value; bbox.Right += m_radius.Value; bbox.Top += m_radius.Value; if (m_method.SelectedIndex == 1) { // The recursive blur method represents the true Gaussian Blur, // with theoretically infinite kernel. The restricted window size // results in extra influence of edge pixels. It's impossible to // solve correctly, but extending the right and top areas to another // radius value produces fair result. //------------------ bbox.Right += m_radius.Value; bbox.Top += m_radius.Value; } stopwatch.Restart(); if (m_method.SelectedIndex != 2) { // Create a new pixel renderer and attach it to the main one as a child image. // It returns true if the attachment succeeded. It fails if the rectangle // (bbox) is fully clipped. //------------------ #if SourceDepth24 ImageBuffer image2 = new ImageBuffer(new BlenderBGR()); #else ImageBuffer image2 = new ImageBuffer(new BlenderBGRA()); #endif if (image2.Attach(widgetsSubImage, (int)bbox.Left, (int)bbox.Bottom, (int)bbox.Right, (int)bbox.Top)) { // Blur it if (m_method.SelectedIndex == 0) { // More general method, but 30-40% slower. //------------------ //m_stack_blur.blur(pixf2, agg::uround(m_radius.Value)); // Faster, but bore specific. // Works only for 8 bits per channel and only with radii <= 254. //------------------ stack_blur test = new stack_blur(); test.Blur(image2, agg_basics.uround(m_radius.Value), agg_basics.uround(m_radius.Value)); } else { // True Gaussian Blur, 3-5 times slower than Stack Blur, // but still constant time of radius. Very sensitive // to precision, doubles are must here. //------------------ m_recursive_blur.blur(image2, m_radius.Value); } } } else { /* // Blur separate channels //------------------ if(m_channel_r.Checked) { typedef agg::pixfmt_alpha_blend_gray< agg::blender_gray8, agg::rendering_buffer, 3, 2> pixfmt_gray8r; pixfmt_gray8r pixf2r(m_rbuf2); if(pixf2r.attach(pixf, int(bbox.x1), int(bbox.y1), int(bbox.x2), int(bbox.y2))) { agg::stack_blur_gray8(pixf2r, agg::uround(m_radius.Value), agg::uround(m_radius.Value)); } } if(m_channel_g.Checked) { typedef agg::pixfmt_alpha_blend_gray< agg::blender_gray8, agg::rendering_buffer, 3, 1> pixfmt_gray8g; pixfmt_gray8g pixf2g(m_rbuf2); if(pixf2g.attach(pixf, int(bbox.x1), int(bbox.y1), int(bbox.x2), int(bbox.y2))) { agg::stack_blur_gray8(pixf2g, agg::uround(m_radius.Value), agg::uround(m_radius.Value)); } } if(m_channel_b.Checked) { typedef agg::pixfmt_alpha_blend_gray< agg::blender_gray8, agg::rendering_buffer, 3, 0> pixfmt_gray8b; pixfmt_gray8b pixf2b(m_rbuf2); if(pixf2b.attach(pixf, int(bbox.x1), int(bbox.y1), int(bbox.x2), int(bbox.y2))) { agg::stack_blur_gray8(pixf2b, agg::uround(m_radius.Value), agg::uround(m_radius.Value)); } } */ } double tm = stopwatch.ElapsedMilliseconds; // Render the shape itself //------------------ if (m_FlattenCurves.Checked) { m_ras.add_path(m_shape); } else { m_ras.add_path(m_path); } scanlineRenderer.RenderSolid(clippingProxy, m_ras, m_sl, new RGBA_Floats(0.6, 0.9, 0.7, 0.8).GetAsRGBA_Bytes()); graphics2D.DrawString(string.Format("{0:F2} ms", tm), 140, 30); base.OnDraw(graphics2D); }
public override void OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); int width = (int)widgetsSubImage.Width; int height = (int)widgetsSubImage.Height; if (numMasksSlider.Value != sliderValue) { generate_alpha_mask(width, height); sliderValue = numMasksSlider.Value; } rasterizer.SetVectorClipBox(0, 0, width, height); unsafe { alphaMaskImageBuffer.AttachBuffer(alphaByteArray, 0, width, height, width, 8, 1); MatterHackers.Agg.Image.AlphaMaskAdaptor imageAlphaMaskAdaptor = new MatterHackers.Agg.Image.AlphaMaskAdaptor(widgetsSubImage, alphaMask); ImageClippingProxy alphaMaskClippingProxy = new ImageClippingProxy(imageAlphaMaskAdaptor); ImageClippingProxy clippingProxy = new ImageClippingProxy(widgetsSubImage); Affine transform = Affine.NewIdentity(); transform *= Affine.NewTranslation(-lionShape.Center.X, -lionShape.Center.Y); transform *= Affine.NewScaling(lionScale, lionScale); transform *= Affine.NewRotation(angle + Math.PI); transform *= Affine.NewSkewing(skewX / 1000.0, skewY / 1000.0); transform *= Affine.NewTranslation(Width / 2, Height / 2); clippingProxy.clear(new ColorF(1, 1, 1)); ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); // draw a background to show how the mask is working better int RectWidth = 30; for (int i = 0; i < 40; i++) { for (int j = 0; j < 40; j++) { if ((i + j) % 2 != 0) { VertexSource.RoundedRect rect = new VertexSource.RoundedRect(i * RectWidth, j * RectWidth, (i + 1) * RectWidth, (j + 1) * RectWidth, 0); rect.normalize_radius(); // Drawing as an outline rasterizer.add_path(rect); scanlineRenderer.RenderSolid(clippingProxy, rasterizer, scanlineCache, new Color(.9, .9, .9)); } } } //int x, y; // Render the lion VertexSourceApplyTransform trans = new VertexSourceApplyTransform(lionShape.Path, transform); scanlineRenderer.RenderSolidAllPaths(alphaMaskClippingProxy, rasterizer, scanlineCache, trans, lionShape.Colors, lionShape.PathIndex, lionShape.NumPaths); /* * // Render random Bresenham lines and markers * agg::renderer_markers<amask_ren_type> m(r); * for(i = 0; i < 50; i++) * { * m.line_color(agg::rgba8(randGenerator.Next() & 0x7F, * randGenerator.Next() & 0x7F, * randGenerator.Next() & 0x7F, * (randGenerator.Next() & 0x7F) + 0x7F)); * m.fill_color(agg::rgba8(randGenerator.Next() & 0x7F, * randGenerator.Next() & 0x7F, * randGenerator.Next() & 0x7F, * (randGenerator.Next() & 0x7F) + 0x7F)); * * m.line(m.coord(randGenerator.Next() % width), m.coord(randGenerator.Next() % height), * m.coord(randGenerator.Next() % width), m.coord(randGenerator.Next() % height)); * * m.marker(randGenerator.Next() % width, randGenerator.Next() % height, randGenerator.Next() % 10 + 5, * agg::marker_e(randGenerator.Next() % agg::end_of_markers)); * } * * // Render random anti-aliased lines * double w = 5.0; * agg::line_profile_aa profile; * profile.width(w); * * typedef agg::renderer_outline_aa<amask_ren_type> renderer_type; * renderer_type ren(r, profile); * * typedef agg::rasterizer_outline_aa<renderer_type> rasterizer_type; * rasterizer_type ras(ren); * ras.round_cap(true); * * for(i = 0; i < 50; i++) * { * ren.Color = agg::rgba8(randGenerator.Next() & 0x7F, * randGenerator.Next() & 0x7F, * randGenerator.Next() & 0x7F, * //255)); * (randGenerator.Next() & 0x7F) + 0x7F); * ras.move_to_d(randGenerator.Next() % width, randGenerator.Next() % height); * ras.line_to_d(randGenerator.Next() % width, randGenerator.Next() % height); * ras.render(false); * } * * // Render random circles with gradient * typedef agg::gradient_linear_color<color_type> grad_color; * typedef agg::gradient_circle grad_func; * typedef agg::span_interpolator_linear<> interpolator_type; * typedef agg::span_gradient<color_type, * interpolator_type, * grad_func, * grad_color> span_grad_type; * * agg::trans_affine grm; * grad_func grf; * grad_color grc(agg::rgba8(0,0,0), agg::rgba8(0,0,0)); * agg::ellipse ell; * agg::span_allocator<color_type> sa; * interpolator_type inter(grm); * span_grad_type sg(inter, grf, grc, 0, 10); * agg::renderer_scanline_aa<amask_ren_type, * agg::span_allocator<color_type>, * span_grad_type> rg(r, sa, sg); * for(i = 0; i < 50; i++) * { * x = randGenerator.Next() % width; * y = randGenerator.Next() % height; * double r = randGenerator.Next() % 10 + 5; * grm.reset(); * grm *= agg::trans_affine_scaling(r / 10.0); * grm *= agg::trans_affine_translation(x, y); * grm.invert(); * grc.colors(agg::rgba8(255, 255, 255, 0), * agg::rgba8(randGenerator.Next() & 0x7F, * randGenerator.Next() & 0x7F, * randGenerator.Next() & 0x7F, * 255)); * sg.color_function(grc); * ell.init(x, y, r, r, 32); * g_rasterizer.add_path(ell); * agg::render_scanlines(g_rasterizer, g_scanline, rg); * } */ //m_num_cb.Render(g_rasterizer, g_scanline, clippingProxy); } alphaMaskImageBuffer.DettachBuffer(); base.OnDraw(graphics2D); }
public override void OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); int width = (int)widgetsSubImage.Width; int height = (int)widgetsSubImage.Height; if (numMasksSlider.Value != sliderValue) { generate_alpha_mask(width, height); sliderValue = numMasksSlider.Value; } rasterizer.SetVectorClipBox(0, 0, width, height); unsafe { alphaMaskImageBuffer.AttachBuffer(alphaByteArray, 0, width, height, width, 8, 1); MatterHackers.Agg.Image.AlphaMaskAdaptor imageAlphaMaskAdaptor = new MatterHackers.Agg.Image.AlphaMaskAdaptor(widgetsSubImage, alphaMask); ImageClippingProxy alphaMaskClippingProxy = new ImageClippingProxy(imageAlphaMaskAdaptor); ImageClippingProxy clippingProxy = new ImageClippingProxy(widgetsSubImage); Affine transform = Affine.NewIdentity(); transform *= Affine.NewTranslation(-lionShape.Center.x, -lionShape.Center.y); transform *= Affine.NewScaling(lionScale, lionScale); transform *= Affine.NewRotation(angle + Math.PI); transform *= Affine.NewSkewing(skewX / 1000.0, skewY / 1000.0); transform *= Affine.NewTranslation(Width / 2, Height / 2); clippingProxy.clear(new RGBA_Floats(1, 1, 1)); ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); // draw a background to show how the mask is working better int RectWidth = 30; for (int i = 0; i < 40; i++) { for (int j = 0; j < 40; j++) { if ((i + j) % 2 != 0) { VertexSource.RoundedRect rect = new VertexSource.RoundedRect(i * RectWidth, j * RectWidth, (i + 1) * RectWidth, (j + 1) * RectWidth, 0); rect.normalize_radius(); // Drawing as an outline rasterizer.add_path(rect); scanlineRenderer.render_scanlines_aa_solid(clippingProxy, rasterizer, scanlineCache, new RGBA_Bytes(.9, .9, .9)); } } } //int x, y; // Render the lion VertexSourceApplyTransform trans = new VertexSourceApplyTransform(lionShape.Path, transform); scanlineRenderer.RenderSolidAllPaths(alphaMaskClippingProxy, rasterizer, scanlineCache, trans, lionShape.Colors, lionShape.PathIndex, lionShape.NumPaths); /* // Render random Bresenham lines and markers agg::renderer_markers<amask_ren_type> m(r); for(i = 0; i < 50; i++) { m.line_color(agg::rgba8(randGenerator.Next() & 0x7F, randGenerator.Next() & 0x7F, randGenerator.Next() & 0x7F, (randGenerator.Next() & 0x7F) + 0x7F)); m.fill_color(agg::rgba8(randGenerator.Next() & 0x7F, randGenerator.Next() & 0x7F, randGenerator.Next() & 0x7F, (randGenerator.Next() & 0x7F) + 0x7F)); m.line(m.coord(randGenerator.Next() % width), m.coord(randGenerator.Next() % height), m.coord(randGenerator.Next() % width), m.coord(randGenerator.Next() % height)); m.marker(randGenerator.Next() % width, randGenerator.Next() % height, randGenerator.Next() % 10 + 5, agg::marker_e(randGenerator.Next() % agg::end_of_markers)); } // Render random anti-aliased lines double w = 5.0; agg::line_profile_aa profile; profile.width(w); typedef agg::renderer_outline_aa<amask_ren_type> renderer_type; renderer_type ren(r, profile); typedef agg::rasterizer_outline_aa<renderer_type> rasterizer_type; rasterizer_type ras(ren); ras.round_cap(true); for(i = 0; i < 50; i++) { ren.Color = agg::rgba8(randGenerator.Next() & 0x7F, randGenerator.Next() & 0x7F, randGenerator.Next() & 0x7F, //255)); (randGenerator.Next() & 0x7F) + 0x7F); ras.move_to_d(randGenerator.Next() % width, randGenerator.Next() % height); ras.line_to_d(randGenerator.Next() % width, randGenerator.Next() % height); ras.render(false); } // Render random circles with gradient typedef agg::gradient_linear_color<color_type> grad_color; typedef agg::gradient_circle grad_func; typedef agg::span_interpolator_linear<> interpolator_type; typedef agg::span_gradient<color_type, interpolator_type, grad_func, grad_color> span_grad_type; agg::trans_affine grm; grad_func grf; grad_color grc(agg::rgba8(0,0,0), agg::rgba8(0,0,0)); agg::ellipse ell; agg::span_allocator<color_type> sa; interpolator_type inter(grm); span_grad_type sg(inter, grf, grc, 0, 10); agg::renderer_scanline_aa<amask_ren_type, agg::span_allocator<color_type>, span_grad_type> rg(r, sa, sg); for(i = 0; i < 50; i++) { x = randGenerator.Next() % width; y = randGenerator.Next() % height; double r = randGenerator.Next() % 10 + 5; grm.reset(); grm *= agg::trans_affine_scaling(r / 10.0); grm *= agg::trans_affine_translation(x, y); grm.invert(); grc.colors(agg::rgba8(255, 255, 255, 0), agg::rgba8(randGenerator.Next() & 0x7F, randGenerator.Next() & 0x7F, randGenerator.Next() & 0x7F, 255)); sg.color_function(grc); ell.init(x, y, r, r, 32); g_rasterizer.add_path(ell); agg::render_scanlines(g_rasterizer, g_scanline, rg); } */ //m_num_cb.Render(g_rasterizer, g_scanline, clippingProxy); } alphaMaskImageBuffer.DettachBuffer(); base.OnDraw(graphics2D); }
public override void OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); if (orignialSize.x == 0) { orignialSize.x = WindowSize.x; orignialSize.y = WindowSize.y; } ImageBuffer destImageWithPreMultBlender = new ImageBuffer(); switch (widgetsSubImage.BitDepth) { case 24: destImageWithPreMultBlender.Attach(widgetsSubImage, new BlenderPreMultBGR()); break; case 32: destImageWithPreMultBlender.Attach(widgetsSubImage, new BlenderPreMultBGRA()); break; default: throw new Exception("Unknown bit depth"); } ImageClippingProxy clippingProxy_pre = new ImageClippingProxy(destImageWithPreMultBlender); clippingProxy_pre.clear(new RGBA_Floats(1.0, 1.0, 1.0)); Affine src_mtx = Affine.NewIdentity(); src_mtx *= Affine.NewTranslation(-orignialSize.x / 2 - 10, -orignialSize.y / 2 - 20 - 10); src_mtx *= Affine.NewRotation(drawAngle.Value * Math.PI / 180.0); src_mtx *= Affine.NewScaling(drawScale.Value); src_mtx *= Affine.NewTranslation(orignialSize.x / 2, orignialSize.y / 2 + 20); Affine img_mtx = Affine.NewIdentity(); img_mtx *= Affine.NewTranslation(-orignialSize.x / 2 + 10, -orignialSize.y / 2 + 20 + 10); img_mtx *= Affine.NewRotation(drawAngle.Value * Math.PI / 180.0); img_mtx *= Affine.NewScaling(drawScale.Value); img_mtx *= Affine.NewTranslation(orignialSize.x / 2, orignialSize.y / 2 + 20); img_mtx.invert(); MatterHackers.Agg.span_allocator sa = new span_allocator(); span_interpolator_linear interpolator = new span_interpolator_linear(img_mtx); span_image_filter sg; switch (sourceImage.BitDepth) { case 24: { ImageBufferAccessorClip source = new ImageBufferAccessorClip(sourceImage, RGBA_Floats.rgba_pre(0, 0, 0, 0).GetAsRGBA_Bytes()); sg = new span_image_filter_rgb_bilinear_clip(source, RGBA_Floats.rgba_pre(0, 0.4, 0, 0.5), interpolator); } break; case 32: { ImageBufferAccessorClip source = new ImageBufferAccessorClip(sourceImage, RGBA_Floats.rgba_pre(0, 0, 0, 0).GetAsRGBA_Bytes()); sg = new span_image_filter_rgba_bilinear_clip(source, RGBA_Floats.rgba_pre(0, 0.4, 0, 0.5), interpolator); } break; default: throw new Exception("Bad sourc depth"); } ScanlineRasterizer ras = new ScanlineRasterizer(); ras.SetVectorClipBox(0, 0, Width, Height); ScanlineCachePacked8 sl = new ScanlineCachePacked8(); //scanline_unpacked_8 sl = new scanline_unpacked_8(); double r = orignialSize.x; if (orignialSize.y - 60 < r) { r = orignialSize.y - 60; } VertexSource.Ellipse ell = new VertexSource.Ellipse(orignialSize.x / 2.0 + 10, orignialSize.y / 2.0 + 20 + 10, r / 2.0 + 16.0, r / 2.0 + 16.0, 200); VertexSourceApplyTransform tr = new VertexSourceApplyTransform(ell, src_mtx); ras.add_path(tr); //clippingProxy_pre.SetClippingBox(30, 0, (int)width(), (int)height()); ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); scanlineRenderer.GenerateAndRender(ras, sl, clippingProxy_pre, sa, sg); base.OnDraw(graphics2D); }
public override void OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); if (!didInit) { didInit = true; OnInitialize(); } if (m_gamma.Value != m_old_gamma) { m_gamma_lut.SetGamma(m_gamma.Value); ImageIO.LoadImageData("spheres.bmp", m_SourceImage); //m_SourceImage.apply_gamma_dir(m_gamma_lut); m_old_gamma = m_gamma.Value; } ImageBuffer pixf = new ImageBuffer(); switch (widgetsSubImage.BitDepth) { case 24: pixf.Attach(widgetsSubImage, new BlenderBGR()); break; case 32: pixf.Attach(widgetsSubImage, new BlenderBGRA()); break; default: throw new NotImplementedException(); } ImageClippingProxy clippingProxy = new ImageClippingProxy(pixf); clippingProxy.clear(new RGBA_Floats(1, 1, 1)); if (m_trans_type.SelectedIndex < 2) { // For the affine parallelogram transformations we // calculate the 4-th (implicit) point of the parallelogram m_quad.SetXN(3, m_quad.GetXN(0) + (m_quad.GetXN(2) - m_quad.GetXN(1))); m_quad.SetYN(3, m_quad.GetYN(0) + (m_quad.GetYN(2) - m_quad.GetYN(1))); } ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); // draw a background to show how the alpha is working int RectWidth = 70; int xoffset = 50; int yoffset = 50; 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(); g_rasterizer.add_path(rect); scanlineRenderer.RenderSolid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(.2, .2, .2)); } } } //-------------------------- // Render the "quad" tool and controls g_rasterizer.add_path(m_quad); scanlineRenderer.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, Height); g_rasterizer.reset(); int b = 0; g_rasterizer.move_to_d(m_quad.GetXN(0) - b, m_quad.GetYN(0) - b); g_rasterizer.line_to_d(m_quad.GetXN(1) + b, m_quad.GetYN(1) - b); g_rasterizer.line_to_d(m_quad.GetXN(2) + b, m_quad.GetYN(2) + b); g_rasterizer.line_to_d(m_quad.GetXN(3) - b, m_quad.GetYN(3) + b); //typedef agg::span_allocator<color_type> span_alloc_type; span_allocator sa = new span_allocator(); image_filter_bilinear filter_kernel = new image_filter_bilinear(); ImageFilterLookUpTable filter = new ImageFilterLookUpTable(filter_kernel, true); ImageBufferAccessorClamp source = new ImageBufferAccessorClamp(m_SourceImage); stopwatch.Restart(); switch (m_trans_type.SelectedIndex) { 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; span_interpolator_persp_lerp interpolator = new span_interpolator_persp_lerp(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2); span_subdiv_adaptor subdiv_adaptor = new span_subdiv_adaptor(interpolator); span_image_resample sg = null; if (interpolator.is_valid()) { switch (source.SourceImage.BitDepth) { case 24: sg = new span_image_resample_rgb(source, subdiv_adaptor, filter); break; case 32: sg = new span_image_resample_rgba(source, subdiv_adaptor, filter); break; } sg.blur(m_blur.Value); scanlineRenderer.GenerateAndRender(g_rasterizer, g_scanline, clippingProxy, 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 = stopwatch.ElapsedMilliseconds; //pixf.apply_gamma_inv(m_gamma_lut); gsv_text t = new gsv_text(); t.SetFontSize(10.0); Stroke pt = new Stroke(t); pt.width(1.5); string buf = string.Format("{0:F2} ms", tm); t.start_point(10.0, 70.0); t.text(buf); g_rasterizer.add_path(pt); scanlineRenderer.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(graphics2D); }
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) { { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); Graphics2D subGraphics2D = widgetsSubImage.NewGraphics2D(); subGraphics2D.Clear(new RGBA_Bytes(255, 255, 255)); for (int y = 0; y < MomsGame.GetHeight(); y++) { for (int x = 0; x < MomsGame.GetWidth(); x++) { DrawCard(subGraphics2D, x, y); } } String whatToDo = "Select any open space marked with an 'O'"; RGBA_Bytes backFillCollor = new RGBA_Bytes(0xe1, 0xe0, 0xf6); if (MomsGame.GetWaitingForKing()) { backFillCollor = new RGBA_Bytes(0xf8, 0x89, 0x78); whatToDo = "Select a King for the hole"; } else if (MomsGame.IsSolved()) { backFillCollor = new RGBA_Bytes(0xf8, 0x89, 0x78); whatToDo = "You win!"; } else if (!MomsGame.MoveAvailable()) { backFillCollor = new RGBA_Bytes(0xf8, 0x89, 0x78); whatToDo = "No more moves! Shuffle to continue."; } if (whatToDo != null) { TextWidget stringToDraw = new TextWidget(whatToDo, 12); RectangleDouble Size = stringToDraw.Printer.LocalBounds; double TextX = m_BoardX + CARD_WIDTH * 4; double TextY = m_BoardY - 34; RoundedRect BackFill = new RoundedRect(Size.Left - 6, Size.Bottom - 3, Size.Right + 6, Size.Top + 6, 3); Stroke BackBorder = new Stroke(BackFill); BackBorder.width(2); subGraphics2D.SetTransform(Affine.NewTranslation(TextX, TextY)); subGraphics2D.Render(BackFill, backFillCollor); subGraphics2D.Render(BackBorder, new RGBA_Bytes(0, 0, 0)); subGraphics2D.Render(stringToDraw.Printer, new RGBA_Bytes(0, 0, 0)); } String ShufflesString; ShufflesString = "Number of shuffles so far = "; ShufflesString += MomsGame.GetNumShuffles().ToString(); TextWidget shuffelStringToDraw = new TextWidget(ShufflesString, 12); subGraphics2D.SetTransform(Affine.NewTranslation(m_BoardX, 350)); subGraphics2D.Render(shuffelStringToDraw.Printer, new RGBA_Bytes(0, 0, 0)); subGraphics2D.SetTransform(Affine.NewIdentity()); } base.OnDraw(graphics2D); }
public override void OnDraw(Graphics2D graphics2D) { if (graphics2D.DestImage != null) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); IImageByte backBuffer = widgetsSubImage; int distBetween = backBuffer.GetBytesBetweenPixelsInclusive(); ImageBuffer redImageBuffer = new ImageBuffer(); redImageBuffer.Attach(backBuffer, new blender_gray(distBetween), distBetween, 2, 8); ImageBuffer greenImageBuffer = new ImageBuffer(); greenImageBuffer.Attach(backBuffer, new blender_gray(distBetween), distBetween, 1, 8); ImageBuffer blueImageBuffer = new ImageBuffer(); blueImageBuffer.Attach(backBuffer, new blender_gray(distBetween), distBetween, 0, 8); ImageClippingProxy clippingProxy = new ImageClippingProxy(backBuffer); ImageClippingProxy clippingProxyRed = new ImageClippingProxy(redImageBuffer); ImageClippingProxy clippingProxyGreen = new ImageClippingProxy(greenImageBuffer); ImageClippingProxy clippingProxyBlue = new ImageClippingProxy(blueImageBuffer); ScanlineRasterizer ras = new ScanlineRasterizer(); ScanlineCachePacked8 sl = new ScanlineCachePacked8(); RGBA_Bytes clearColor = useBlackBackgroundCheckbox.Checked ? new RGBA_Bytes(0, 0, 0) : new RGBA_Bytes(255, 255, 255); clippingProxy.clear(clearColor); alphaSlider.View.BackgroundColor = clearColor; RGBA_Bytes FillColor = useBlackBackgroundCheckbox.Checked ? new RGBA_Bytes(255, 255, 255, (int)(alphaSlider.Value)) : new RGBA_Bytes(0, 0, 0, (int)(alphaSlider.Value)); VertexSource.Ellipse er = new MatterHackers.Agg.VertexSource.Ellipse(Width / 2 - 0.87 * 50, Height / 2 - 0.5 * 50, 100, 100, 100); ras.add_path(er); ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); scanlineRenderer.RenderSolid(clippingProxyRed, ras, sl, FillColor); VertexSource.Ellipse eg = new MatterHackers.Agg.VertexSource.Ellipse(Width / 2 + 0.87 * 50, Height / 2 - 0.5 * 50, 100, 100, 100); ras.add_path(eg); scanlineRenderer.RenderSolid(clippingProxyGreen, ras, sl, FillColor); VertexSource.Ellipse eb = new MatterHackers.Agg.VertexSource.Ellipse(Width / 2, Height / 2 + 50, 100, 100, 100); ras.add_path(eb); scanlineRenderer.RenderSolid(clippingProxyBlue, ras, sl, FillColor); } else if (graphics2D.DestImageFloat != null) { #if false IImageFloat backBuffer = graphics2D.DestImageFloat; int distBetween = backBuffer.GetFloatsBetweenPixelsInclusive(); ImageBufferFloat redImageBuffer = new ImageBufferFloat(); redImageBuffer.Attach(backBuffer, new blender_gray(distBetween), distBetween, 2, 8); ImageBufferFloat greenImageBuffer = new ImageBufferFloat(); greenImageBuffer.Attach(backBuffer, new blender_gray(distBetween), distBetween, 1, 8); ImageBufferFloat blueImageBuffer = new ImageBufferFloat(); blueImageBuffer.Attach(backBuffer, new blender_gray(distBetween), distBetween, 0, 8); ImageClippingProxy clippingProxy = new ImageClippingProxy(backBuffer); ImageClippingProxy clippingProxyRed = new ImageClippingProxy(redImageBuffer); ImageClippingProxy clippingProxyGreen = new ImageClippingProxy(greenImageBuffer); ImageClippingProxy clippingProxyBlue = new ImageClippingProxy(blueImageBuffer); ScanlineRasterizer ras = new ScanlineRasterizer(); ScanlineCachePacked8 sl = new ScanlineCachePacked8(); RGBA_Bytes clearColor = useBlackBackgroundCheckbox.Checked ? new RGBA_Bytes(0, 0, 0) : new RGBA_Bytes(255, 255, 255); clippingProxy.clear(clearColor); alphaSlider.View.BackGroundColor = clearColor; RGBA_Bytes FillColor = useBlackBackgroundCheckbox.Checked ? new RGBA_Bytes(255, 255, 255, (int)(alphaSlider.Value)) : new RGBA_Bytes(0, 0, 0, (int)(alphaSlider.Value)); VertexSource.Ellipse er = new AGG.VertexSource.Ellipse(Width / 2 - 0.87 * 50, Height / 2 - 0.5 * 50, 100, 100, 100); ras.add_path(er); agg_renderer_scanline.Default.render_scanlines_aa_solid(clippingProxyRed, ras, sl, FillColor); VertexSource.Ellipse eg = new AGG.VertexSource.Ellipse(Width / 2 + 0.87 * 50, Height / 2 - 0.5 * 50, 100, 100, 100); ras.add_path(eg); agg_renderer_scanline.Default.render_scanlines_aa_solid(clippingProxyGreen, ras, sl, FillColor); VertexSource.Ellipse eb = new AGG.VertexSource.Ellipse(Width / 2, Height / 2 + 50, 100, 100, 100); ras.add_path(eb); agg_renderer_scanline.Default.render_scanlines_aa_solid(clippingProxyBlue, ras, sl, FillColor); #endif } base.OnDraw(graphics2D); }
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 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 RGBA_Floats(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, RGBA_Bytes.Black); ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); scanlineRenderer.RenderSolid(clippingProxyGamma, rasterizer, sl, RGBA_Bytes.Black); rasterizer.gamma(new gamma_none()); PathStorage ps = new PathStorage(); 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 RGBA_Bytes(0, 150, 160, 200)); base.OnDraw(graphics2D); }
public override void OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); IImageByte backBuffer = widgetsSubImage; if (!didInit) { didInit = true; OnInitialize(); } ImageBuffer image; if (backBuffer.BitDepth == 32) { image = new ImageBuffer(); image.Attach(backBuffer, new BlenderBGRA()); } else { if (backBuffer.BitDepth != 24) { throw new System.NotSupportedException(); } image = new ImageBuffer(); image.Attach(backBuffer, new BlenderBGR()); } ImageClippingProxy clippingProxy = new ImageClippingProxy(image); clippingProxy.clear(new ColorF(1, 1, 1)); g_rasterizer.SetVectorClipBox(0, 0, Width, Height); ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); if (transformationTypeRadioButton.SelectedIndex == 0) { Bilinear tr = new Bilinear(lionShape.Bounds.Left, lionShape.Bounds.Bottom, lionShape.Bounds.Right, lionShape.Bounds.Top, quadPolygonControl.polygon()); if (tr.is_valid()) { //-------------------------- // Render transformed lion // foreach (var shape in lionShape.Shapes) { g_rasterizer.add_path(new VertexSourceApplyTransform(shape.VertexStorage, tr)); scanlineRenderer.RenderSolid(clippingProxy, g_rasterizer, g_scanline, shape.Color); } //-------------------------- //-------------------------- // Render transformed ellipse // VertexSource.Ellipse ell = new MatterHackers.Agg.VertexSource.Ellipse((lionShape.Bounds.Left + lionShape.Bounds.Right) * 0.5, (lionShape.Bounds.Bottom + lionShape.Bounds.Top) * 0.5, (lionShape.Bounds.Right - lionShape.Bounds.Left) * 0.5, (lionShape.Bounds.Top - lionShape.Bounds.Bottom) * 0.5, 200); Stroke ell_stroke = new Stroke(ell); ell_stroke.width(3.0); VertexSourceApplyTransform trans_ell = new VertexSourceApplyTransform(ell, tr); VertexSourceApplyTransform trans_ell_stroke = new VertexSourceApplyTransform(ell_stroke, tr); g_rasterizer.add_path(trans_ell); scanlineRenderer.RenderSolid(clippingProxy, g_rasterizer, g_scanline, new Color(0.5, 0.3, 0.0, 0.3)); g_rasterizer.add_path(trans_ell_stroke); scanlineRenderer.RenderSolid(clippingProxy, g_rasterizer, g_scanline, new Color(0.0, 0.3, 0.2, 1.0)); } } else { Perspective tr = new Perspective(lionShape.Bounds.Left, lionShape.Bounds.Bottom, lionShape.Bounds.Right, lionShape.Bounds.Top, quadPolygonControl.polygon()); if (tr.is_valid()) { // Render transformed lion foreach (var shape in lionShape.Shapes) { VertexSourceApplyTransform trans = new VertexSourceApplyTransform(shape.VertexStorage, tr); g_rasterizer.reset(); g_rasterizer.add_path(trans); scanlineRenderer.RenderSolid(clippingProxy, g_rasterizer, g_scanline, shape.Color); } // Render transformed ellipse VertexSource.Ellipse FilledEllipse = new MatterHackers.Agg.VertexSource.Ellipse((lionShape.Bounds.Left + lionShape.Bounds.Right) * 0.5, (lionShape.Bounds.Bottom + lionShape.Bounds.Top) * 0.5, (lionShape.Bounds.Right - lionShape.Bounds.Left) * 0.5, (lionShape.Bounds.Top - lionShape.Bounds.Bottom) * 0.5, 200); Stroke EllipseOutline = new Stroke(FilledEllipse); EllipseOutline.width(3.0); VertexSourceApplyTransform TransformedFilledEllipse = new VertexSourceApplyTransform(FilledEllipse, tr); VertexSourceApplyTransform TransformedEllipesOutline = new VertexSourceApplyTransform(EllipseOutline, tr); g_rasterizer.add_path(TransformedFilledEllipse); scanlineRenderer.RenderSolid(clippingProxy, g_rasterizer, g_scanline, new Color(0.5, 0.3, 0.0, 0.3)); g_rasterizer.add_path(TransformedEllipesOutline); scanlineRenderer.RenderSolid(clippingProxy, g_rasterizer, g_scanline, new Color(0.0, 0.3, 0.2, 1.0)); } } //-------------------------- // Render the "quad" tool and controls g_rasterizer.add_path(quadPolygonControl); scanlineRenderer.RenderSolid(clippingProxy, g_rasterizer, g_scanline, new Color(0, 0.3, 0.5, 0.6)); //m_trans_type.Render(g_rasterizer, g_scanline, clippingProxy); base.OnDraw(graphics2D); }
public override void OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); if (!didInit) { didInit = true; OnInitialize(); } if (m_gamma.Value != m_old_gamma) { m_gamma_lut.SetGamma(m_gamma.Value); ImageIO.LoadImageData("spheres.bmp", m_SourceImage); //m_SourceImage.apply_gamma_dir(m_gamma_lut); m_old_gamma = m_gamma.Value; } ImageBuffer pixf = new ImageBuffer(); switch (widgetsSubImage.BitDepth) { case 24: pixf.Attach(widgetsSubImage, new BlenderBGR()); break; case 32: pixf.Attach(widgetsSubImage, new BlenderBGRA()); break; default: throw new NotImplementedException(); } ImageClippingProxy clippingProxy = new ImageClippingProxy(pixf); clippingProxy.clear(new ColorF(1, 1, 1)); if (m_trans_type.SelectedIndex < 2) { // For the affine parallelogram transformations we // calculate the 4-th (implicit) point of the parallelogram m_quad.SetXN(3, m_quad.GetXN(0) + (m_quad.GetXN(2) - m_quad.GetXN(1))); m_quad.SetYN(3, m_quad.GetYN(0) + (m_quad.GetYN(2) - m_quad.GetYN(1))); } ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); // draw a background to show how the alpha is working int RectWidth = 70; int xoffset = 50; int yoffset = 50; 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(); g_rasterizer.add_path(rect); scanlineRenderer.RenderSolid(clippingProxy, g_rasterizer, g_scanline, new Color(.2, .2, .2)); } } } //-------------------------- // Render the "quad" tool and controls g_rasterizer.add_path(m_quad); scanlineRenderer.RenderSolid(clippingProxy, g_rasterizer, g_scanline, new Color(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, Height); g_rasterizer.reset(); int b = 0; g_rasterizer.move_to_d(m_quad.GetXN(0) - b, m_quad.GetYN(0) - b); g_rasterizer.line_to_d(m_quad.GetXN(1) + b, m_quad.GetYN(1) - b); g_rasterizer.line_to_d(m_quad.GetXN(2) + b, m_quad.GetYN(2) + b); g_rasterizer.line_to_d(m_quad.GetXN(3) - b, m_quad.GetYN(3) + b); //typedef agg::span_allocator<color_type> span_alloc_type; span_allocator sa = new span_allocator(); image_filter_bilinear filter_kernel = new image_filter_bilinear(); ImageFilterLookUpTable filter = new ImageFilterLookUpTable(filter_kernel, true); ImageBufferAccessorClamp source = new ImageBufferAccessorClamp(m_SourceImage); stopwatch.Restart(); switch (m_trans_type.SelectedIndex) { 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; span_interpolator_persp_lerp interpolator = new span_interpolator_persp_lerp(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2); span_subdiv_adaptor subdiv_adaptor = new span_subdiv_adaptor(interpolator); span_image_resample sg = null; if (interpolator.is_valid()) { switch (source.SourceImage.BitDepth) { case 24: sg = new span_image_resample_rgb(source, subdiv_adaptor, filter); break; case 32: sg = new span_image_resample_rgba(source, subdiv_adaptor, filter); break; } sg.blur(m_blur.Value); scanlineRenderer.GenerateAndRender(g_rasterizer, g_scanline, clippingProxy, 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 = stopwatch.ElapsedMilliseconds; //pixf.apply_gamma_inv(m_gamma_lut); gsv_text t = new gsv_text(); t.SetFontSize(10.0); Stroke pt = new Stroke(t); pt.Width = 1.5; string buf = string.Format("{0:F2} ms", tm); t.start_point(10.0, 70.0); t.text(buf); g_rasterizer.add_path(pt); scanlineRenderer.RenderSolid(clippingProxy, g_rasterizer, g_scanline, new Color(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(graphics2D); }
public override void OnDraw(Graphics2D graphics2D) { ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect()); int width = (int)widgetsSubImage.Width; int height = (int)widgetsSubImage.Height; ImageBuffer clippedSubImage = new ImageBuffer(); clippedSubImage.Attach(widgetsSubImage, new BlenderBGRA()); ImageClippingProxy imageClippingProxy = new ImageClippingProxy(clippedSubImage); imageClippingProxy.clear(new RGBA_Floats(1, 1, 1)); Affine transform = Affine.NewIdentity(); transform *= Affine.NewTranslation(-lionShape.Center.x, -lionShape.Center.y); transform *= Affine.NewScaling(lionScale, lionScale); transform *= Affine.NewRotation(angle + Math.PI); transform *= Affine.NewSkewing(skewX / 1000.0, skewY / 1000.0); transform *= Affine.NewTranslation(width / 2, height / 2); if (renderAsScanlineCheckBox.Checked) { rasterizer.SetVectorClipBox(0, 0, width, height); Stroke stroke = new Stroke(lionShape.Path); stroke.width(widthSlider.Value); stroke.line_join(LineJoin.Round); VertexSourceApplyTransform trans = new VertexSourceApplyTransform(stroke, transform); ScanlineRenderer scanlineRenderer = new ScanlineRenderer(); scanlineRenderer.RenderSolidAllPaths(imageClippingProxy, rasterizer, scanlineCache, trans, lionShape.Colors, lionShape.PathIndex, lionShape.NumPaths); } else { double w = widthSlider.Value * transform.GetScale(); LineProfileAnitAlias lineProfile = new LineProfileAnitAlias(w, new gamma_none()); OutlineRenderer outlineRenderer = new OutlineRenderer(imageClippingProxy, lineProfile); rasterizer_outline_aa rasterizer = new rasterizer_outline_aa(outlineRenderer); rasterizer.line_join(renderAccurateJoinsCheckBox.Checked ? rasterizer_outline_aa.outline_aa_join_e.outline_miter_accurate_join : rasterizer_outline_aa.outline_aa_join_e.outline_round_join); rasterizer.round_cap(true); VertexSourceApplyTransform trans = new VertexSourceApplyTransform(lionShape.Path, transform); rasterizer.RenderAllPaths(trans, lionShape.Colors, lionShape.PathIndex, lionShape.NumPaths); } base.OnDraw(graphics2D); }