public PixcelImage(Bitmap bitmap) { LayerType = ImageTypes.Pixel; BitmapData data = bitmap.LockBits( new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); imageData = new BGRA32FormattedImage(data.Width, data.Height); Rect = new IBRectangle(data.Width, data.Height); unsafe { byte *ptr = (byte *)data.Scan0; for (int i = 0; i < data.Stride * data.Height; i++) { imageData.data[i] = ptr[i]; } } imageData.TextureUpdate(); }
public static void FillRectangle(CLBuffer trg, IBRectangle trgSize, PixelData color, IBRectangle rect) { if (fillRect == null) { fillRect = CL.GetKernel("fillRect"); } int[] _trgSize = new int[] { (int)trgSize.Width, (int)trgSize.Height }; int[] _offset = new int[] { (int)rect.OffsetX, (int)rect.OffsetY }; int[] _size = new int[] { (int)rect.Width, (int)rect.Height }; float[] _color = new float[] { color.b / 255.0f, color.g / 255.0f, color.r / 255.0f, color.a / 255.0f }; CLBuffer __trgSize = CL.GenBuffer(_trgSize); CLBuffer __offset = CL.GenBuffer(_offset); CLBuffer __size = CL.GenBuffer(_size); CLBuffer __color = CL.GenBuffer(_color); fillRect.SetArgument(0, trg.InternalPointer); fillRect.SetArgument(1, __trgSize); fillRect.SetArgument(2, __color); fillRect.SetArgument(3, __offset); fillRect.SetArgument(4, __size); CL.EnqueueRange(fillRect, new MultiDimension(1080), new MultiDimension(1)); }
public override void Blend(SingleColorImage source, CLBuffer trg, IBRectangle trgSize, CLBuffer buffer) { CLImageProcessing.FillRectangle(trg, trgSize, source.Color, source.Rect); //int trgSizeW = (int)trg.size.Width; //int trgSizeH = (int)trg.size.Height; //if ((int)source.Size.OffsetX > trgSizeW || (int)source.Size.OffsetY > trgSizeH) // return; //int strX = 0, strY = 0; //if ((int)source.Size.OffsetX < 0) // strX = 0; //else if ((int)source.Size.OffsetX > (int)trg.size.Width) // strX = (int)trg.size.Width; //else // strX = (int)source.Size.OffsetX; //if ((int)source.Size.OffsetY < 0) // strY = 0; //else if ((int)source.Size.OffsetY > (int)trg.size.Height) // strY = (int)trg.size.Height; //else // strY = (int)source.Size.OffsetY; //int maxX = 0, maxY = 0; //if ((int)source.Size.OffsetX + (int)source.Size.Width < 0) // maxX = 0; //else if ((int)source.Size.OffsetX + (int)source.Size.Width > (int)trg.size.Width) // maxX = (int)trg.size.Width; //else // maxX = (int)source.Size.OffsetX + (int)source.Size.Width; //if ((int)source.Size.OffsetY + (int)source.Size.Height < 0) // maxY = 0; //else if ((int)source.Size.OffsetY + (int)source.Size.Height > (int)trg.size.Height) // maxY = (int)trg.size.Height; //else // maxY = (int)source.Size.OffsetY + (int)source.Size.Height; //int trgDataLength = trg.data.Length; //double Cb2 = source.color.b; //double Cg2 = source.color.g; //double Cr2 = source.color.r; //Parallel.For(strY, maxY, y => //{ // if (trg.size.OffsetY <= y && y < trg.size.OffsetY + trg.size.Height) // for (int x = strX; x < maxX; x++) // { // double A1; // double A2; // double _A2; // double A; // double B; // double G; // double R; // if (trg.size.OffsetX <= y && y < trg.size.OffsetX + trg.size.Width) // { // int index = (x + y * trgSizeW) * 4; // if (index >= trgDataLength) break; // A1 = trg.data[index + 3] / 255.0; // A2 = source.color.a / 255.0; // _A2 = 1 - A2; // A = A2 + _A2 * A1; // B = (Cb2 * A2 + _A2 * A1 * trg.data[index]) / A; // G = (Cg2 * A2 + _A2 * A1 * trg.data[index + 1]) / A; // R = (Cr2 * A2 + _A2 * A1 * trg.data[index + 2]) / A; // trg.data[index] = (byte)B; // trg.data[index + 1] = (byte)G; // trg.data[index + 2] = (byte)R; // trg.data[index + 3] = (byte)(A * 255.0); // } // } //}); }
public override void Blend(PixcelImage source, CLBuffer trg, IBRectangle trgSize, CLBuffer buffer) { throw new NotImplementedException(); }
public PixcelImage(int w, int h, int offsetX, int offsetY) { imageData = new BGRA32FormattedImage(w, h); Rect = new IBRectangle(w, h, offsetX, offsetY); }
public abstract void Blend(PixcelImage source, CLBuffer trg, IBRectangle trgSize, CLBuffer buffer);
public abstract void Blend(SingleColorImage source, CLBuffer trg, IBRectangle trgSize, CLBuffer buffer);