void generate_alpha_mask(ScanlineRasToDestBitmapRenderer sclineRasToBmp, ScanlinePacked8 sclnPack, ScanlineRasterizer rasterizer, int width, int height) { //create 1 8-bits chanel (grayscale8) bmp alphaBitmap = new ActualImage(width, height, PixelFormat.GrayScale8); var bmpReaderWrtier = new MyImageReaderWriter(); bmpReaderWrtier.ReloadImage(alphaBitmap); alphaMaskImageBuffer = new ChildImage(bmpReaderWrtier, new PixelBlenderGray(1)); //create mask from alpahMaskImageBuffer alphaMask = new AlphaMaskByteClipped(alphaMaskImageBuffer, 1, 0); #if USE_CLIPPING_ALPHA_MASK //alphaMaskImageBuffer.AttachBuffer(alphaBitmap.GetBuffer(), 20 * width + 20, width - 40, height - 40, width, 8, 1); #else alphaMaskImageBuffer.attach(alphaByteArray, (int)cx, (int)cy, cx, 1); #endif var image = new ChildImage(alphaMaskImageBuffer, new PixelBlenderGray(1), 1, 0, 8); ClipProxyImage clippingProxy = new ClipProxyImage(image); clippingProxy.Clear(Drawing.Color.Black); VertexSource.Ellipse ellipseForMask = new PixelFarm.Agg.VertexSource.Ellipse(); System.Random randGenerator = new Random(1432); int i; int num = (int)maskAlphaSliderValue; var v1 = GetFreeVxs(); for (i = 0; i < num; i++) { if (i == num - 1) { //for the last one ellipseForMask.Reset(Width / 2, Height / 2, 110, 110, 100); rasterizer.AddPath(ellipseForMask.MakeVertexSnap(v1)); v1.Clear(); sclineRasToBmp.RenderWithColor(clippingProxy, rasterizer, sclnPack, Drawing.Color.Make(0, 0, 0, 255)); ellipseForMask.Reset(ellipseForMask.originX, ellipseForMask.originY, ellipseForMask.radiusX - 10, ellipseForMask.radiusY - 10, 100); rasterizer.AddPath(ellipseForMask.MakeVertexSnap(v1)); v1.Clear(); sclineRasToBmp.RenderWithColor(clippingProxy, rasterizer, sclnPack, Drawing.Color.Make(255, 0, 0, 255)); } else { ellipseForMask.Reset(randGenerator.Next() % width, randGenerator.Next() % height, randGenerator.Next() % 100 + 20, randGenerator.Next() % 100 + 20, 100); // set the color to draw into the alpha channel. // there is not very much reason to set the alpha as you will get the amount of // transparency based on the color you draw. (you might want some type of different edeg effect but it will be minor). rasterizer.AddPath(ellipseForMask.MakeVxs(v1)); v1.Clear(); sclineRasToBmp.RenderWithColor(clippingProxy, rasterizer, sclnPack, Drawing.Color.Make((int)((float)i / (float)num * 255), 0, 0, 255)); } } ReleaseVxs(ref v1); }
public override void Draw(PixelFarm.Drawing.Painter p) { //specific for agg if (!(p is AggPainter)) { return; } throw new NotSupportedException(); AggPainter p2 = (AggPainter)p; AggRenderSurface aggRdsf = p2.RenderSurface; if (aggRdsf.DestImage != null) { IImageReaderWriter backBuffer = aggRdsf.DestImage; IPixelBlender currentPixelBlender = aggRdsf.PixelBlender; int distBetween = backBuffer.BytesBetweenPixelsInclusive; //use different pixel blender var redImageBuffer = new SubImageRW(backBuffer, new PixelBlenderGray(distBetween), distBetween, CO.R, 8); var greenImageBuffer = new SubImageRW(backBuffer, new PixelBlenderGray(distBetween), distBetween, CO.G, 8); var blueImageBuffer = new SubImageRW(backBuffer, new PixelBlenderGray(distBetween), distBetween, CO.B, 8); ClipProxyImage clippingProxy = new ClipProxyImage(backBuffer); ClipProxyImage clippingProxyRed = new ClipProxyImage(redImageBuffer); ClipProxyImage clippingProxyGreen = new ClipProxyImage(greenImageBuffer); ClipProxyImage clippingProxyBlue = new ClipProxyImage(blueImageBuffer); ScanlineRasterizer sclineRas = aggRdsf.ScanlineRasterizer; ScanlinePacked8 scline = aggRdsf.ScanlinePacked8; Drawing.Color clearColor = this.UseBlackBlackground ? Drawing.Color.FromArgb(0, 0, 0) : Drawing.Color.FromArgb(255, 255, 255); clippingProxy.Clear(clearColor); Drawing.Color fillColor = this.UseBlackBlackground ? new Drawing.Color((byte)(this.AlphaValue), 255, 255, 255) : new Drawing.Color((byte)(this.AlphaValue), 0, 0, 0); ScanlineRasToDestBitmapRenderer sclineRasToBmp = aggRdsf.ScanlineRasToDestBitmap; VertexSource.Ellipse er = new PixelFarm.Agg.VertexSource.Ellipse(Width / 2 - 0.87 * 50, Height / 2 - 0.5 * 50, 100, 100, 100); // VectorToolBox.GetFreeVxs(out var v1); sclineRas.AddPath(er.MakeVxs(v1)); v1.Clear(); sclineRasToBmp.RenderWithColor(clippingProxyRed, sclineRas, scline, fillColor); VertexSource.Ellipse eg = new PixelFarm.Agg.VertexSource.Ellipse(Width / 2 + 0.87 * 50, Height / 2 - 0.5 * 50, 100, 100, 100); sclineRas.AddPath(eg.MakeVertexSnap(v1)); v1.Clear(); sclineRasToBmp.RenderWithColor(clippingProxyGreen, sclineRas, scline, fillColor); VertexSource.Ellipse eb = new PixelFarm.Agg.VertexSource.Ellipse(Width / 2, Height / 2 + 50, 100, 100, 100); sclineRas.AddPath(eb.MakeVertexSnap(v1)); v1.Clear(); sclineRasToBmp.RenderWithColor(clippingProxyBlue, sclineRas, scline, fillColor); VectorToolBox.ReleaseVxs(ref v1); } // 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 // } }
void GenerateMaskWithWinGdiPlus(int w, int h) { //1. create 32 bits for mask image this.a_alphaBmp = new System.Drawing.Bitmap(w, h); //2. create graphics based on a_alphaBmp using (System.Drawing.Graphics gfxBmp = System.Drawing.Graphics.FromImage(a_alphaBmp)) { gfxBmp.Clear(System.Drawing.Color.Black); //ClipProxyImage clippingProxy = new ClipProxyImage(image); //clippingProxy.Clear(ColorRGBA.Black); VertexSource.Ellipse ellipseForMask = new PixelFarm.Agg.VertexSource.Ellipse(); System.Random randGenerator = new Random(1432); int num = (int)maskAlphaSliderValue; int lim = num - 1; for (int i = 0; i < lim; ++i) { ellipseForMask.Reset(randGenerator.Next() % w, randGenerator.Next() % h, randGenerator.Next() % 100 + 20, randGenerator.Next() % 100 + 20, 100); // set the color to draw into the alpha channel. // there is not very much reason to set the alpha as you will get the amount of // transparency based on the color you draw. (you might want some type of different edeg effect but it will be minor). //rasterizer.AddPath(ellipseForMask.MakeVxs()); //sclineRasToBmp.RenderWithColor(clippingProxy, rasterizer, sclnPack, // ColorRGBA.Make((int)((float)i / (float)num * 255), 0, 0, 255)); var v1 = GetFreeVxs(); VxsHelper.FillVxsSnap(gfxBmp, ellipseForMask.MakeVertexSnap(v1), Drawing.Color.Make((int)((float)i / (float)num * 255), 0, 0, 255)); ReleaseVxs(ref v1); } //the last one ellipseForMask.Reset(Width / 2, Height / 2, 110, 110, 100); //fill var v2 = GetFreeVxs(); VxsHelper.FillVxsSnap(gfxBmp, ellipseForMask.MakeVertexSnap(v2), Drawing.Color.Make(0, 0, 0, 255)); v2.Clear();// reuse later //rasterizer.AddPath(ellipseForMask.MakeVertexSnap()); //sclineRasToBmp.RenderWithColor(clippingProxy, rasterizer, sclnPack, new ColorRGBA(0, 0, 0, 255)); ellipseForMask.Reset(ellipseForMask.originX, ellipseForMask.originY, ellipseForMask.radiusX - 10, ellipseForMask.radiusY - 10, 100); //rasterizer.AddPath(ellipseForMask.MakeVertexSnap()); //sclineRasToBmp.RenderWithColor(clippingProxy, rasterizer, sclnPack, new ColorRGBA(255, 0, 0, 255)); VxsHelper.FillVxsSnap(gfxBmp, ellipseForMask.MakeVertexSnap(v2), Drawing.Color.Make(255, 0, 0, 255)); ReleaseVxs(ref v2); //for (i = 0; i < num; i++) //{ // if (i == num - 1) // { // ellipseForMask.Reset(Width / 2, Height / 2, 110, 110, 100); // //fill // VxsHelper.DrawVxsSnap(gfxBmp, ellipseForMask.MakeVertexSnap(), new ColorRGBA(0, 0, 0, 255)); // //rasterizer.AddPath(ellipseForMask.MakeVertexSnap()); // //sclineRasToBmp.RenderWithColor(clippingProxy, rasterizer, sclnPack, new ColorRGBA(0, 0, 0, 255)); // ellipseForMask.Reset(ellipseForMask.originX, ellipseForMask.originY, ellipseForMask.radiusX - 10, ellipseForMask.radiusY - 10, 100); // //rasterizer.AddPath(ellipseForMask.MakeVertexSnap()); // //sclineRasToBmp.RenderWithColor(clippingProxy, rasterizer, sclnPack, new ColorRGBA(255, 0, 0, 255)); // VxsHelper.DrawVxsSnap(gfxBmp, ellipseForMask.MakeVertexSnap(), new ColorRGBA(255, 0, 0, 255)); // } // else // { // ellipseForMask.Reset(randGenerator.Next() % w, // randGenerator.Next() % h, // randGenerator.Next() % 100 + 20, // randGenerator.Next() % 100 + 20, // 100); // // set the color to draw into the alpha channel. // // there is not very much reason to set the alpha as you will get the amount of // // transparency based on the color you draw. (you might want some type of different edeg effect but it will be minor). // //rasterizer.AddPath(ellipseForMask.MakeVxs()); // //sclineRasToBmp.RenderWithColor(clippingProxy, rasterizer, sclnPack, // // ColorRGBA.Make((int)((float)i / (float)num * 255), 0, 0, 255)); // VxsHelper.DrawVxsSnap(gfxBmp, ellipseForMask.MakeVertexSnap(), ColorRGBA.Make((int)((float)i / (float)num * 255), 0, 0, 255)); // } //} } }
public override void Draw(CanvasPainter p) { //specific for agg if (!(p is AggCanvasPainter)) { return; } AggCanvasPainter p2 = (AggCanvasPainter)p; Graphics2D graphics2D = p2.Graphics; if (graphics2D.DestImage != null) { IImageReaderWriter backBuffer = graphics2D.DestImage; IPixelBlender currentPixelBlender = graphics2D.PixelBlender; int distBetween = backBuffer.BytesBetweenPixelsInclusive; //use different pixel blender var redImageBuffer = new ChildImage(backBuffer, new PixelBlenderGray(distBetween), distBetween, CO.R, 8); var greenImageBuffer = new ChildImage(backBuffer, new PixelBlenderGray(distBetween), distBetween, CO.G, 8); var blueImageBuffer = new ChildImage(backBuffer, new PixelBlenderGray(distBetween), distBetween, CO.B, 8); ClipProxyImage clippingProxy = new ClipProxyImage(backBuffer); ClipProxyImage clippingProxyRed = new ClipProxyImage(redImageBuffer); ClipProxyImage clippingProxyGreen = new ClipProxyImage(greenImageBuffer); ClipProxyImage clippingProxyBlue = new ClipProxyImage(blueImageBuffer); ScanlineRasterizer sclineRas = graphics2D.ScanlineRasterizer; ScanlinePacked8 scline = graphics2D.ScanlinePacked8; ColorRGBA clearColor = this.UseBlackBlackground ? new ColorRGBA(0, 0, 0) : new ColorRGBA(255, 255, 255); clippingProxy.Clear(clearColor); ColorRGBA fillColor = this.UseBlackBlackground ? new ColorRGBA(255, 255, 255, (byte)(this.AlphaValue)) : new ColorRGBA(0, 0, 0, (byte)(this.AlphaValue)); ScanlineRasToDestBitmapRenderer sclineRasToBmp = graphics2D.ScanlineRasToDestBitmap; VertexSource.Ellipse er = new PixelFarm.Agg.VertexSource.Ellipse(Width / 2 - 0.87 * 50, Height / 2 - 0.5 * 50, 100, 100, 100); sclineRas.AddPath(er.MakeVertexSnap()); sclineRasToBmp.RenderWithColor(clippingProxyRed, sclineRas, scline, fillColor); VertexSource.Ellipse eg = new PixelFarm.Agg.VertexSource.Ellipse(Width / 2 + 0.87 * 50, Height / 2 - 0.5 * 50, 100, 100, 100); sclineRas.AddPath(eg.MakeVertexSnap()); sclineRasToBmp.RenderWithColor(clippingProxyGreen, sclineRas, scline, fillColor); VertexSource.Ellipse eb = new PixelFarm.Agg.VertexSource.Ellipse(Width / 2, Height / 2 + 50, 100, 100, 100); sclineRas.AddPath(eb.MakeVertexSnap()); sclineRasToBmp.RenderWithColor(clippingProxyBlue, sclineRas, scline, 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 // } }