예제 #1
0
        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));
        }
예제 #3
0
        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);
            //            }
            //        }
            //});
        }
예제 #4
0
 public override void Blend(PixcelImage source, CLBuffer trg, IBRectangle trgSize, CLBuffer buffer)
 {
     throw new NotImplementedException();
 }
예제 #5
0
 public PixcelImage(int w, int h, int offsetX, int offsetY)
 {
     imageData = new BGRA32FormattedImage(w, h);
     Rect      = new IBRectangle(w, h, offsetX, offsetY);
 }
예제 #6
0
 public abstract void Blend(PixcelImage source, CLBuffer trg, IBRectangle trgSize, CLBuffer buffer);
예제 #7
0
 public abstract void Blend(SingleColorImage source, CLBuffer trg, IBRectangle trgSize, CLBuffer buffer);