static unsafe void CopyOrBlend32_BasedOnAlphaAndCover(PixelBlenderBGRA recieveBlender, int[] destBuffer, int destArrayOffset, Color sourceColor, int cover) { if (cover == 255) { fixed(int *destAdd = &destBuffer[destArrayOffset]) { PixelBlenderBGRA.Blend32PixelInternal(destAdd, sourceColor); //CopyOrBlend32_BasedOnAlpha(recieveBlender, destBuffer, destArrayOffset, sourceColor); } } else { //if (sourceColor.m_A != 0) { #if false // we blend regardless of the alpha so that we can get Light Opacity working (used this way we have addative and faster blending in one blender) LBB if (sourceColor.m_A == base_mask) { Blender.CopyPixel(pDestBuffer, sourceColor); } else #endif fixed(int *destAdd = &destBuffer[destArrayOffset]) { PixelBlenderBGRA.Blend32PixelInternal(destAdd, sourceColor.NewFromChangeCoverage(cover)); //recieveBlender.BlendPixel(destBuffer, destArrayOffset, sourceColor.NewFromChangeCoverage(cover)); } } } }
/// <summary> /// set pixel blender for destination image buffer /// </summary> /// <param name="value"></param> public void SetRecieveBlender(IPixelBlender value) { if (BitDepth != 0 && value != null && value.NumPixelBits != BitDepth) { throw new NotSupportedException("The blender has to support the bit depth of this image."); } _recvBlender32 = (PixelBlenderBGRA)value; }
public override void Draw(Painter p) { //specific for agg if (p is PixelFarm.Agg.AggPainter) { var p2 = (PixelFarm.Agg.AggPainter)p; AggRenderSurface aggsx = p2.RenderSurface; ScanlineRasterizer rasterizer = aggsx.ScanlineRasterizer; var widgetsSubImage = ImageHelper.CreateSubImgRW(aggsx.DestImage, aggsx.GetClippingRect()); aggsx.UseSubPixelRendering = false; PixelBlenderBGRA normalBlender = new PixelBlenderBGRA(); PixelBlenderBGRA gammaBlender = new PixelBlenderBGRA(); //TODO: revisit, and fix this again gammaBlender.GammaValue = this.GammaValue; gammaBlender.EnableGamma = true; var rasterGamma = new SubImageRW(widgetsSubImage, gammaBlender); ClipProxyImage clippingProxyNormal = new ClipProxyImage(widgetsSubImage); ClipProxyImage clippingProxyGamma = new ClipProxyImage(rasterGamma); clippingProxyNormal.Clear(Color.White); ScanlineUnpacked8 sl = new ScanlineUnpacked8(); int size_mul = (int)this.PixelSize; CustomScanlineRasToBmp_EnlargedSubPixelRendering ren_en = new CustomScanlineRasToBmp_EnlargedSubPixelRendering(size_mul, aggsx.DestActualImage); rasterizer.Reset(); rasterizer.MoveTo(m_x[0] / size_mul, m_y[0] / size_mul); rasterizer.LineTo(m_x[1] / size_mul, m_y[1] / size_mul); rasterizer.LineTo(m_x[2] / size_mul, m_y[2] / size_mul); ren_en.RenderWithColor(clippingProxyGamma, rasterizer, sl, Color.Black); //---------------------------------------- ScanlineRasToDestBitmapRenderer sclineRasToBmp = aggsx.ScanlineRasToDestBitmap; aggsx.UseSubPixelRendering = false; sclineRasToBmp.RenderWithColor(clippingProxyGamma, rasterizer, sl, Color.Black); rasterizer.ResetGamma(new GammaNone()); aggsx.UseSubPixelRendering = false; //---------------------------------------- PathWriter ps = new PathWriter(); ps.Clear(); 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]); //---------------------------------------- //Stroke stroke = new Stroke(ps); //stroke.Width = 2; //rasterizer.AddPath(stroke.MakeVxs(ps.MakeVxs())); VectorToolBox.GetFreeVxs(out var v1); rasterizer.AddPath(stroke.MakeVxs(ps.Vxs, v1)); VectorToolBox.ReleaseVxs(ref v1); //---------------------------------------- sclineRasToBmp.RenderWithColor(clippingProxyNormal, rasterizer, sl, new Color(200, 0, 150, 160)); } }
public void OnDraw(Graphics2D graphics2D) { var widgetsSubImage = ImageHelper.CreateChildImage(graphics2D.DestImage, graphics2D.GetClippingRect()); graphics2D.UseSubPixelRendering = false; IPixelBlender NormalBlender = new PixelBlenderBGRA(); IPixelBlender GammaBlender = new PixelBlenderGammaBGRA(this.GammaValue); var rasterGamma = new ChildImage(widgetsSubImage, GammaBlender); ClipProxyImage clippingProxyNormal = new ClipProxyImage(widgetsSubImage); ClipProxyImage clippingProxyGamma = new ClipProxyImage(rasterGamma); clippingProxyNormal.Clear(ColorRGBA.White); var rasterizer = graphics2D.ScanlineRasterizer; ScanlineUnpacked8 sl = new ScanlineUnpacked8(); int size_mul = (int)this.PixelSize; CustomScanlineRasToBmp_EnlargedV3 ren_en = new CustomScanlineRasToBmp_EnlargedV3(size_mul, graphics2D.DestActualImage); rasterizer.Reset(); rasterizer.MoveTo(m_x[0] / size_mul, m_y[0] / size_mul); rasterizer.LineTo(m_x[1] / size_mul, m_y[1] / size_mul); rasterizer.LineTo(m_x[2] / size_mul, m_y[2] / size_mul); ren_en.RenderWithColor(clippingProxyGamma, rasterizer, sl, ColorRGBA.Black); //---------------------------------------- ScanlineRasToDestBitmapRenderer sclineRasToBmp = graphics2D.ScanlineRasToDestBitmap; graphics2D.UseSubPixelRendering = true; sclineRasToBmp.RenderWithColor(clippingProxyGamma, rasterizer, sl, ColorRGBA.Black); rasterizer.ResetGamma(new GammaNone()); graphics2D.UseSubPixelRendering = false; //---------------------------------------- PathWriter ps = new PathWriter(); ps.Clear(); 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]); //---------------------------------------- //Stroke stroke = new Stroke(ps); //stroke.Width = 2; //rasterizer.AddPath(stroke.MakeVxs(ps.MakeVxs())); rasterizer.AddPath(StrokeHelp.MakeVxs(ps.Vxs, 2)); //---------------------------------------- sclineRasToBmp.RenderWithColor(clippingProxyNormal, rasterizer, sl, new ColorRGBA(0, 150, 160, 200)); }
public ImageGraphics2D(ActualImage destImage) { //create from actual image this.destActualImage = destImage; this.destImageReaderWriter = new MyImageReaderWriter(destImage); this.sclineRas = new ScanlineRasterizer(); this.sclineRasToBmp = new ScanlineRasToDestBitmapRenderer(); this.destWidth = destImage.Width; this.destHeight = destImage.Height; this.clipBox = new RectInt(0, 0, destImage.Width, destImage.Height); this.sclineRas.SetClipBox(this.clipBox); this.sclinePack8 = new ScanlinePacked8(); this.currentBlender = this.pixBlenderRGBA32 = new PixelBlenderBGRA(); }
public override void Draw(CanvasPainter p) { //specific for agg if (p is PixelFarm.Agg.AggCanvasPainter) { var p2 = (PixelFarm.Agg.AggCanvasPainter)p; Graphics2D gx = p2.Graphics; var widgetsSubImage = ImageHelper.CreateChildImage(gx.DestImage, gx.GetClippingRect()); gx.UseSubPixelRendering = false; IPixelBlender NormalBlender = new PixelBlenderBGRA(); IPixelBlender GammaBlender = new PixelBlenderGammaBGRA(this.GammaValue); var rasterGamma = new ChildImage(widgetsSubImage, GammaBlender); ClipProxyImage clippingProxyNormal = new ClipProxyImage(widgetsSubImage); ClipProxyImage clippingProxyGamma = new ClipProxyImage(rasterGamma); clippingProxyNormal.Clear(Color.White); var rasterizer = gx.ScanlineRasterizer; ScanlineUnpacked8 sl = new ScanlineUnpacked8(); int size_mul = (int)this.PixelSize; CustomScanlineRasToBmp_EnlargedSubPixelRendering ren_en = new CustomScanlineRasToBmp_EnlargedSubPixelRendering(size_mul, gx.DestActualImage); rasterizer.Reset(); rasterizer.MoveTo(m_x[0] / size_mul, m_y[0] / size_mul); rasterizer.LineTo(m_x[1] / size_mul, m_y[1] / size_mul); rasterizer.LineTo(m_x[2] / size_mul, m_y[2] / size_mul); ren_en.RenderWithColor(clippingProxyGamma, rasterizer, sl, Color.Black); //---------------------------------------- ScanlineRasToDestBitmapRenderer sclineRasToBmp = gx.ScanlineRasToDestBitmap; gx.UseSubPixelRendering = true; sclineRasToBmp.RenderWithColor(clippingProxyGamma, rasterizer, sl, Color.Black); rasterizer.ResetGamma(new GammaNone()); gx.UseSubPixelRendering = false; //---------------------------------------- PathWriter ps = new PathWriter(); ps.Clear(); 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]); //---------------------------------------- //Stroke stroke = new Stroke(ps); //stroke.Width = 2; //rasterizer.AddPath(stroke.MakeVxs(ps.MakeVxs())); var v1 = GetFreeVxs(); rasterizer.AddPath(stroke.MakeVxs(ps.Vxs, v1)); ReleaseVxs(ref v1); //---------------------------------------- sclineRasToBmp.RenderWithColor(clippingProxyNormal, rasterizer, sl, new Color(200, 0, 150, 160)); } }
public AggRenderSurface() { //1. attach dst bmp before use this //2. you can detach this surface and attach to another bmp surface _pixelBlenderBGRA = new PixelBlenderBGRA(); _destBitmapBlender = new MyBitmapBlender(); _bmpRasterizer = new DestBitmapRasterizer(); _sclinePack8 = new ScanlinePacked8(); _sclineRas = new ScanlineRasterizer(); _currentImgSpanGen = _imgSpanGenBilinearClip; CurrentTransformMatrix = Affine.IdentityMatrix; }
public AggRenderSurface(MemBitmap dstBmp) { //create from actual image _destBmp = dstBmp; _pixelBlenderBGRA = new PixelBlenderBGRA(); _destBitmapBlender = new MyBitmapBlender(dstBmp, _pixelBlenderBGRA); // _bmpRasterizer = new DestBitmapRasterizer(); _sclinePack8 = new ScanlinePacked8(); _sclineRas = new ScanlineRasterizer(); // _sclineRas.SetClipBox( new RectInt(0, 0, _destWidth = dstBmp.Width, //** _destHeight = dstBmp.Height) //** ); CurrentTransformMatrix = Affine.IdentityMatrix; }
public override void Draw(Painter p) { //this specific for agg if (p is AggPainter) { AggPainter p2 = (AggPainter)p; AggRenderSurface aggsx = p2.RenderSurface; SubImageRW subImg = ImageHelper.CreateSubImgRW(aggsx.DestImage, aggsx.GetClippingRect()); //TODO: review here again PixelBlenderBGRA blenderWithGamma = new PixelBlenderBGRA(); SubImageRW rasterGamma = new SubImageRW(subImg, blenderWithGamma); ClipProxyImage clippingProxyNormal = new ClipProxyImage(subImg); ClipProxyImage clippingProxyGamma = new ClipProxyImage(rasterGamma); clippingProxyNormal.Clear(Color.White); ScanlineRasterizer rasterizer = aggsx.ScanlineRasterizer; var sl = new ScanlineUnpacked8(); int size_mul = this.PixelSize; var sclineToBmpEn2 = new CustomScanlineRasToBmp_EnlargedV2(size_mul, aggsx.DestActualImage); rasterizer.Reset(); rasterizer.MoveTo(m_x[0] / size_mul, m_y[0] / size_mul); rasterizer.LineTo(m_x[1] / size_mul, m_y[1] / size_mul); rasterizer.LineTo(m_x[2] / size_mul, m_y[2] / size_mul); sclineToBmpEn2.RenderWithColor(clippingProxyGamma, rasterizer, sl, Color.Black); ScanlineRasToDestBitmapRenderer sclineRasToBmp = aggsx.ScanlineRasToDestBitmap; sclineRasToBmp.RenderWithColor(clippingProxyGamma, rasterizer, sl, Color.Black); //----------------------------------------------------------------------------------------------------------- rasterizer.ResetGamma(new GammaNone()); PathWriter ps = new PathWriter(); ps.Clear(); 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]); VectorToolBox.GetFreeVxs(out var v1); rasterizer.AddPath((new Stroke(2)).MakeVxs(ps.Vxs, v1)); sclineRasToBmp.RenderWithColor(clippingProxyNormal, rasterizer, sl, new Color(200, 0, 150, 160)); VectorToolBox.ReleaseVxs(ref v1); } }
public void ReloadImage(ActualImage actualImage) { if (this.actualImage == actualImage) { return; } this.actualImage = actualImage; //calculate image stride switch (actualImage.PixelFormat) { case PixelFormat.ARGB32: { Attach(actualImage.Width, actualImage.Height, actualImage.BitDepth, ActualImage.GetBuffer(actualImage), pixelBlenderRGBA ?? (pixelBlenderRGBA = new PixelBlenderBGRA())); } break; case PixelFormat.GrayScale8: { Attach(actualImage.Width, actualImage.Height, actualImage.BitDepth, ActualImage.GetBuffer(actualImage), pixelBlenderGray ?? (pixelBlenderGray = new PixelBlenderGray(1))); } break; case PixelFormat.RGB24: default: { throw new NotSupportedException(); } } }
public void BlendColorVSpan(int x, int y, int len, Color[] colors, int colorsIndex, byte[] covers, int coversIndex, bool firstCoverForAll) { //int bufferOffset = GetBufferOffsetXY(x, y); int bufferOffset32 = GetBufferOffsetXY32(x, y); int scanWidthBytes = System.Math.Abs(Stride); if (!firstCoverForAll) { unsafe { fixed(int *head = &raw_buffer32[0]) { int actualWidth = scanWidthBytes / 4; do { CopyOrBlend32_BasedOnAlphaAndCover(_recvBlender32, head, bufferOffset32, colors[colorsIndex], covers[coversIndex++]); //bufferOffset += actualWidth; bufferOffset32++; ++colorsIndex; }while (--len != 0); } } } else { if (covers[coversIndex] == 255) { unsafe { fixed(int *destH = &raw_buffer32[0]) { int *destBuffer = (int *)destH; int actualWidth = scanWidthBytes / 4; do { PixelBlenderBGRA.Blend32PixelInternal(destBuffer, colors[colorsIndex]); //CopyOrBlend32_BasedOnAlpha(_recvBlender32, m_ByteBuffer, bufferOffset, colors[colorsIndex]); //bufferOffset += scanWidthBytes; ++colorsIndex; destBuffer += actualWidth; }while (--len != 0); } } } else { unsafe { fixed(int *head = &raw_buffer32[0]) { int actualWidth = scanWidthBytes / 4; do { CopyOrBlend32_BasedOnAlphaAndCover(_recvBlender32, head, bufferOffset32, colors[colorsIndex], covers[coversIndex]); // bufferOffset += actualWidth; ++colorsIndex; }while (--len != 0); } } } } }