void CreateAndRenderCombined(Graphics2D graphics2D, VertexStoreSnap ps1, VertexStoreSnap ps2) { PathWriter combined = null; switch (this.OpOption) { case OperationOption.OR: combined = CombinePaths(ps1, ps2, ClipType.ctUnion); break; case OperationOption.AND: combined = CombinePaths(ps1, ps2, ClipType.ctIntersection); break; case OperationOption.XOR: combined = CombinePaths(ps1, ps2, ClipType.ctXor); break; case OperationOption.A_B: combined = CombinePaths(ps1, ps2, ClipType.ctDifference); break; case OperationOption.B_A: combined = CombinePaths(ps2, ps1, ClipType.ctDifference); break; } if (combined != null) { graphics2D.Render(combined.MakeVertexSnap(), ColorRGBAf.MakeColorRGBA(0.5f, 0.0f, 0f, 0.5f)); } }
public BlurWithPainter() { //m_rbuf2 = new ReferenceImage(); m_shape_bounds = new RectD(); m_shadow_ctrl = new PolygonEditWidget(4); this.FlattenCurveChecked = true; this.BlurMethod = BlurMethod.RecursiveBlur; this.BlurRadius = 15; Font svgFont = SvgFontStore.LoadFont("svg-LiberationSansFont", 300); m_pathVxs = svgFont.GetGlyph('a').originalVxs;// typeFaceForLargeA.GetGlyphForCharacter('a'); Affine shape_mtx = Affine.NewMatix(AffinePlan.Translate(150, 100)); m_pathVxs = shape_mtx.TransformToVxs(m_pathVxs); var curveFlattener = new CurveFlattener(); m_path_2 = new VertexStoreSnap(curveFlattener.MakeVxs(m_pathVxs)); BoundingRect.GetBoundingRect(m_path_2, ref m_shape_bounds); m_shadow_ctrl.SetXN(0, m_shape_bounds.Left); m_shadow_ctrl.SetYN(0, m_shape_bounds.Bottom); m_shadow_ctrl.SetXN(1, m_shape_bounds.Right); m_shadow_ctrl.SetYN(1, m_shape_bounds.Bottom); m_shadow_ctrl.SetXN(2, m_shape_bounds.Right); m_shadow_ctrl.SetYN(2, m_shape_bounds.Top); m_shadow_ctrl.SetXN(3, m_shape_bounds.Left); m_shadow_ctrl.SetYN(3, m_shape_bounds.Top); m_shadow_ctrl.LineColor = ColorRGBAf.MakeColorRGBA(0f, 0.3f, 0.5f, 0.3f); }
void CreateAndRenderCombined(CanvasPainter p, VertexStoreSnap ps1, VertexStoreSnap ps2) { List <VertexStore> combined = null; switch (this.OpOption) { default: throw new NotSupportedException(); case OperationOption.None: return; case OperationOption.OR: combined = VxsClipper.CombinePaths(ps1, ps2, VxsClipperType.Union, false); break; case OperationOption.AND: combined = VxsClipper.CombinePaths(ps1, ps2, VxsClipperType.InterSect, false); break; case OperationOption.XOR: combined = VxsClipper.CombinePaths(ps1, ps2, VxsClipperType.Xor, false); break; case OperationOption.A_B: combined = VxsClipper.CombinePaths(ps1, ps2, VxsClipperType.Difference, false); break; case OperationOption.B_A: combined = VxsClipper.CombinePaths(ps2, ps1, VxsClipperType.Difference, false); break; } if (combined != null) { p.FillColor = ColorRGBAf.MakeColorRGBA(0.5f, 0.0f, 0f, 0.5f); p.Fill(new VertexStoreSnap(combined[0])); //graphics2D.Render(new VertexStoreSnap(combined[0]), ColorRGBAf.MakeColorRGBA(0.5f, 0.0f, 0f, 0.5f)); } }
void render_gpc(Graphics2D graphics2D) { switch (this.PolygonSet) { case PolygonExampleSet.TwoSimplePaths: { //------------------------------------ // Two simple paths // PathWriter ps1 = new PathWriter(); PathWriter ps2 = new PathWriter(); double x = m_x - Width / 2 + 100; double y = m_y - Height / 2 + 100; ps1.MoveTo(x + 140, y + 145); ps1.LineTo(x + 225, y + 44); ps1.LineTo(x + 296, y + 219); ps1.CloseFigure(); ps1.LineTo(x + 226, y + 289); ps1.LineTo(x + 82, y + 292); ps1.MoveTo(x + 220, y + 222); ps1.LineTo(x + 363, y + 249); ps1.LineTo(x + 265, y + 331); ps1.MoveTo(x + 242, y + 243); ps1.LineTo(x + 268, y + 309); ps1.LineTo(x + 325, y + 261); ps1.MoveTo(x + 259, y + 259); ps1.LineTo(x + 273, y + 288); ps1.LineTo(x + 298, y + 266); ps2.MoveTo(100 + 32, 100 + 77); ps2.LineTo(100 + 473, 100 + 263); ps2.LineTo(100 + 351, 100 + 290); ps2.LineTo(100 + 354, 100 + 374); graphics2D.Render(ps1.MakeVertexSnap(), ColorRGBAf.MakeColorRGBA(0f, 0f, 0f, 0.1f)); graphics2D.Render(ps2.MakeVertexSnap(), ColorRGBAf.MakeColorRGBA(0f, 0.6f, 0f, 0.1f)); CreateAndRenderCombined(graphics2D, ps1.MakeVertexSnap(), ps2.MakeVertexSnap()); } break; case PolygonExampleSet.CloseStroke: { //------------------------------------ // Closed stroke // PathWriter ps1 = new PathWriter(); PathWriter ps2 = new PathWriter(); Stroke stroke = new Stroke(1); stroke.Width = 10; double x = m_x - Width / 2 + 100; double y = m_y - Height / 2 + 100; //----------------------------------------- ps1.MoveTo(x + 140, y + 145); ps1.LineTo(x + 225, y + 44); ps1.LineTo(x + 296, y + 219); ps1.CloseFigure(); ps1.LineTo(x + 226, y + 289); ps1.LineTo(x + 82, y + 292); ps1.MoveTo(x + 220 - 50, y + 222); ps1.LineTo(x + 265 - 50, y + 331); ps1.LineTo(x + 363 - 50, y + 249); ps1.CloseFigureCCW(); //----------------------------------------- ps2.MoveTo(100 + 32, 100 + 77); ps2.LineTo(100 + 473, 100 + 263); ps2.LineTo(100 + 351, 100 + 290); ps2.LineTo(100 + 354, 100 + 374); ps2.CloseFigure(); graphics2D.Render(ps1.MakeVertexSnap(), ColorRGBAf.MakeColorRGBA(0f, 0f, 0f, 0.1f)); var vxs = ps2.Vxs; graphics2D.Render(stroke.MakeVxs(vxs), ColorRGBAf.MakeColorRGBA(0f, 0.6f, 0f, 0.1f)); CreateAndRenderCombined(graphics2D, ps1.MakeVertexSnap(), new VertexStoreSnap(vxs)); } break; case PolygonExampleSet.GBAndArrow: { //------------------------------------ // Great Britain and Arrows // PathWriter gb_poly = new PathWriter(); PathWriter arrows = new PathWriter(); PixelFarm.Agg.Sample_PolygonClipping.GreatBritanPathStorage.Make(gb_poly); make_arrows(arrows); //Affine mtx1 = Affine.NewIdentity(); //mtx1 *= Affine.NewTranslation(-1150, -1150); //mtx1 *= Affine.NewScaling(2.0); Affine mtx1 = Affine.NewMatix( AffinePlan.Translate(-1150, -1150), AffinePlan.Scale(2) ); //Affine.NewIdentity(); //mtx2 = mtx1; //mtx2 *= Affine.NewTranslation(m_x - Width / 2, m_y - Height / 2); Affine mtx2 = mtx1 * Affine.NewTranslation(m_x - Width / 2, m_y - Height / 2); //VertexSourceApplyTransform trans_gb_poly = new VertexSourceApplyTransform(gb_poly, mtx1); //VertexSourceApplyTransform trans_arrows = new VertexSourceApplyTransform(arrows, mtx2); var trans_gb_poly = mtx1.TransformToVxs(gb_poly.Vxs); var trans_arrows = mtx2.TransformToVxs(arrows.Vxs); graphics2D.Render(trans_gb_poly, ColorRGBAf.MakeColorRGBA(0.5f, 0.5f, 0f, 0.1f)); //stroke_gb_poly.Width = 0.1; graphics2D.Render(new Stroke(0.1).MakeVxs(trans_gb_poly), ColorRGBAf.MakeColorRGBA(0, 0, 0)); graphics2D.Render(trans_arrows, ColorRGBAf.MakeColorRGBA(0f, 0.5f, 0.5f, 0.1f)); CreateAndRenderCombined(graphics2D, new VertexStoreSnap(trans_gb_poly), new VertexStoreSnap(trans_arrows)); } break; case PolygonExampleSet.GBAndSpiral: { //------------------------------------ // Great Britain and a Spiral // spiral sp = new spiral(m_x, m_y, 10, 150, 30, 0.0); PathWriter gb_poly = new PathWriter(); PixelFarm.Agg.Sample_PolygonClipping.GreatBritanPathStorage.Make(gb_poly); Affine mtx = Affine.NewMatix( AffinePlan.Translate(-1150, -1150), AffinePlan.Scale(2)); VertexStore s1 = mtx.TransformToVxs(gb_poly.Vxs); graphics2D.Render(s1, ColorRGBAf.MakeColorRGBA(0.5f, 0.5f, 0f, 0.1f)); graphics2D.Render(new Stroke(0.1).MakeVxs(s1), ColorRGBA.Black); var stroke_vxs = new Stroke(15).MakeVxs(sp.MakeVxs()); graphics2D.Render(stroke_vxs, ColorRGBAf.MakeColorRGBA(0.0f, 0.5f, 0.5f, 0.1f)); CreateAndRenderCombined(graphics2D, new VertexStoreSnap(s1), new VertexStoreSnap(stroke_vxs)); } break; case PolygonExampleSet.SprialAndGlyph: { //------------------------------------ // Spiral and glyph // spiral sp = new spiral(m_x, m_y, 10, 150, 30, 0.0); Stroke stroke = new Stroke(15); PathWriter glyph = new PathWriter(); glyph.MoveTo(28.47, 6.45); glyph.Curve3(21.58, 1.12, 19.82, 0.29); glyph.Curve3(17.19, -0.93, 14.21, -0.93); glyph.Curve3(9.57, -0.93, 6.57, 2.25); glyph.Curve3(3.56, 5.42, 3.56, 10.60); glyph.Curve3(3.56, 13.87, 5.03, 16.26); glyph.Curve3(7.03, 19.58, 11.99, 22.51); glyph.Curve3(16.94, 25.44, 28.47, 29.64); glyph.LineTo(28.47, 31.40); glyph.Curve3(28.47, 38.09, 26.34, 40.58); glyph.Curve3(24.22, 43.07, 20.17, 43.07); glyph.Curve3(17.09, 43.07, 15.28, 41.41); glyph.Curve3(13.43, 39.75, 13.43, 37.60); glyph.LineTo(13.53, 34.77); glyph.Curve3(13.53, 32.52, 12.38, 31.30); glyph.Curve3(11.23, 30.08, 9.38, 30.08); glyph.Curve3(7.57, 30.08, 6.42, 31.35); glyph.Curve3(5.27, 32.62, 5.27, 34.81); glyph.Curve3(5.27, 39.01, 9.57, 42.53); glyph.Curve3(13.87, 46.04, 21.63, 46.04); glyph.Curve3(27.59, 46.04, 31.40, 44.04); glyph.Curve3(34.28, 42.53, 35.64, 39.31); glyph.Curve3(36.52, 37.21, 36.52, 30.71); glyph.LineTo(36.52, 15.53); glyph.Curve3(36.52, 9.13, 36.77, 7.69); glyph.Curve3(37.01, 6.25, 37.57, 5.76); glyph.Curve3(38.13, 5.27, 38.87, 5.27); glyph.Curve3(39.65, 5.27, 40.23, 5.62); glyph.Curve3(41.26, 6.25, 44.19, 9.18); glyph.LineTo(44.19, 6.45); glyph.Curve3(38.72, -0.88, 33.74, -0.88); glyph.Curve3(31.35, -0.88, 29.93, 0.78); glyph.Curve3(28.52, 2.44, 28.47, 6.45); glyph.CloseFigure(); glyph.MoveTo(28.47, 9.62); glyph.LineTo(28.47, 26.66); glyph.Curve3(21.09, 23.73, 18.95, 22.51); glyph.Curve3(15.09, 20.36, 13.43, 18.02); glyph.Curve3(11.77, 15.67, 11.77, 12.89); glyph.Curve3(11.77, 9.38, 13.87, 7.06); glyph.Curve3(15.97, 4.74, 18.70, 4.74); glyph.Curve3(22.41, 4.74, 28.47, 9.62); glyph.CloseFigure(); //Affine mtx = Affine.NewIdentity(); //mtx *= Affine.NewScaling(4.0); //mtx *= Affine.NewTranslation(220, 200); Affine mtx = Affine.NewMatix( AffinePlan.Scale(4), AffinePlan.Translate(220, 200)); var t_glyph = mtx.TransformToVertexSnap(glyph.Vxs); CurveFlattener curveFlattener = new CurveFlattener(); var sp1 = stroke.MakeVxs(sp.MakeVxs()); var curveVxs = curveFlattener.MakeVxs(t_glyph); CreateAndRenderCombined(graphics2D, new VertexStoreSnap(sp1), new VertexStoreSnap(curveVxs)); graphics2D.Render(stroke.MakeVxs(sp1), ColorRGBAf.MakeColorRGBA(0f, 0f, 0f, 0.1f)); graphics2D.Render(curveVxs, ColorRGBAf.MakeColorRGBA(0f, 0.6f, 0f, 0.1f)); } break; } }
void DrawWithPainter(Graphics2D graphics2D) { //create painter CanvasPainter painter = new CanvasPainter(graphics2D); painter.SetClipBox(0, 0, Width, Height); painter.Clear(ColorRGBA.White); //----------------------------------------------------------------------- //green glyph Perspective shadow_persp = new Perspective( m_shape_bounds, m_shadow_ctrl.GetInnerCoords()); VertexStore s2; if (FlattenCurveChecked) { s2 = shadow_persp.TransformToVxs(m_path_2); } else { s2 = shadow_persp.TransformToVxs(m_pathVxs); } painter.FillColor = new ColorRGBAf(0.2f, 0.3f, 0f).ToColorRGBA(); painter.Fill(s2); //--------------------------------------------------------------------------------------------------------- //shadow //--------------------------------------------------------------------------------------------------------- // Calculate the bounding box and extend it by the blur radius RectInt boundRect = BoundingRectInt.GetBoundingRect(s2); var widgetImg = graphics2D.DestImage; int m_radius = this.BlurRadius; //expand bound rect boundRect.Left -= m_radius; boundRect.Bottom -= m_radius; boundRect.Right += m_radius; boundRect.Top += m_radius; if (BlurMethod == BlurMethod.RecursiveBlur) { // 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. //------------------ boundRect.Right += m_radius; boundRect.Top += m_radius; } stopwatch.Stop(); stopwatch.Reset(); stopwatch.Start(); if (BlurMethod != BlurMethod.ChannelBlur) { // 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 (boundRect.Clip(new RectInt(0, 0, widgetImg.Width - 1, widgetImg.Height - 1))) { //check if intersect var prevClip = painter.ClipBox; painter.ClipBox = boundRect; // Blur it switch (BlurMethod) { case BlurMethod.StackBlur: { //------------------ // Faster, but bore specific. // Works only for 8 bits per channel and only with radii <= 254. //------------------ painter.DoFilterBlurStack(boundRect, m_radius); } break; default: { // True Gaussian Blur, 3-5 times slower than Stack Blur, // but still constant time of radius. Very sensitive // to precision, doubles are must here. //------------------ painter.DoFilterBlurRecursive(boundRect, m_radius); } break; } //store back painter.ClipBox = prevClip; } } double tm = stopwatch.ElapsedMilliseconds; painter.FillColor = ColorRGBAf.MakeColorRGBA(0.6f, 0.9f, 0.7f, 0.8f); // Render the shape itself ////------------------ if (FlattenCurveChecked) { //m_ras.AddPath(m_path_2); painter.Fill(m_path_2); } else { //m_ras.AddPath(m_pathVxs); painter.Fill(m_pathVxs); } painter.FillColor = ColorRGBA.Black; painter.DrawString(string.Format("{0:F2} ms", tm), 140, 30); //------------------------------------------------------------- //control m_shadow_ctrl.OnDraw(graphics2D); }