示例#1
0
        public float[] GetBlendData()
        {
            var maxBlend = (float)MaxBlend;
            var blend3   = new float[_resolution.Width * _resolution.Height * 3];

            Helpers.ArrayFill(blend3, maxBlend);

            var blendXList = new List <int>();
            var blendYList = new List <int>();

            foreach (var i in BlendRegionIndexes)
            {
                blendXList.Add(BlendRegionControlPoints[i].X);
                blendYList.Add(BlendRegionControlPoints[i].Y);
            }
            var blendx = blendXList.ToArray();
            var blendy = blendYList.ToArray();

            var bmp    = new Bitmap(_resolution.Width, _resolution.Height);
            var g      = Graphics.FromImage(bmp);
            var points = new System.Drawing.Point[blendx.Length];

            for (var i = 0; i < blendx.Length; i++)
            {
                points[i] = new System.Drawing.Point(blendx[i], blendy[i]);
            }
            g.FillPolygon(Brushes.Black, points, System.Drawing.Drawing2D.FillMode.Winding);
            var bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);
            var data    = new byte[bmp.Height * bmpData.Stride];

            Marshal.Copy(bmpData.Scan0, data, 0, data.Length);
            bmp.UnlockBits(bmpData);
            var f = bmpData.Stride / bmp.Width;

            double ox = -1;
            int    w  = -1;

            for (int y = 0; y < _resolution.Height; y++)
            {
                var yf = y * _resolution.Width * f;
                for (int x = 0; x < _resolution.Width; x++)
                {
                    if (data[x * f + yf + 3] > 0)
                    {
                        if (w == -1)
                        {
                            w  = CalcWidth(data, f, _resolution.Width, x, y);
                            ox = x;
                        }
                        var value = maxBlend;
                        if (w > 0)
                        {
                            var x2 = 1d / w * (x - ox);
                            if (Index == 1)
                            {
                                x2 = 1d - x2;
                            }
                            value = (float)(BlendCurve.GetY(x2) * maxBlend);
                        }
                        blend3[(x + y * _resolution.Width) * 3 + 0] = value;
                        blend3[(x + y * _resolution.Width) * 3 + 1] = value;
                        blend3[(x + y * _resolution.Width) * 3 + 2] = value;
                    }
                    else
                    {
                        w = -1;
                    }
                }
            }

            return(blend3.ToArray());
        }