コード例 #1
0
        /// <summary>Renders a slice of this gradient at the given point.</summary>
        /// <param name="at">The percentage along this gradient to render. Variest from 0->100.</param>
        public RenderedGradient Render(float at)
        {
            int index = IndexOf(at);

            if (index == Gradients.Length - 1 || index < 0)
            {
                if (index < 0)
                {
                    index = 0;
                }

                return(RenderedGradients[index]);
            }
            else
            {
                RenderedGradient gradientA = RenderedGradients[index];
                RenderedGradient gradientB = RenderedGradients[index + 1];

                float delta = ((at - Positions[index]) / (Positions[index + 1] - Positions[index]));

                Color[] newPixels = new Color[PixelCount];

                for (int i = 0; i < PixelCount; i++)
                {
                    Color a = gradientA[i];
                    Color b = gradientB[i];

                    newPixels[i] = new Color(a.r + (b.r - a.r) * delta, a.g + (b.g - a.g) * delta, a.b + (b.b - a.b) * delta, a.a + (b.a - a.a) * delta);
                }

                return(new RenderedGradient(newPixels));
            }
        }
コード例 #2
0
        public void Add(Gradient2D gradient, float at)
        {
            RenderedGradient rendition = gradient.Render(PixelCount);

            if (Gradients == null)
            {
                Gradients         = new Gradient2D[] { gradient };
                RenderedGradients = new RenderedGradient[1] {
                    rendition
                };
                Positions = new float[] { at };
            }
            else
            {
                Gradient2D[]       newGradients = new Gradient2D[Gradients.Length + 1];
                RenderedGradient[] newRenders   = new RenderedGradient[Gradients.Length + 1];
                float[]            newPositions = new float[Gradients.Length + 1];

                int  index    = 0;
                bool inserted = false;

                for (int i = 0; i < Gradients.Length; i++)
                {
                    //Copy everything across.
                    if (!inserted && Positions[i] > at)
                    {
                        inserted              = true;
                        newGradients[index]   = gradient;
                        newRenders[index]     = rendition;
                        newPositions[index++] = at;
                    }

                    newGradients[index]   = Gradients[i];
                    newRenders[index]     = RenderedGradients[i];
                    newPositions[index++] = Positions[i];
                }

                if (!inserted)
                {
                    newGradients[index] = gradient;
                    newRenders[index]   = rendition;
                    newPositions[index] = at;
                }

                Gradients         = newGradients;
                Positions         = newPositions;
                RenderedGradients = newRenders;
            }
        }