public static LinearGradientBrush Resolve(Drawing.LinearGradientBrush linearGradientBrush)
 {
     if (!(linearGradientBrush.InnerBrush is LinearGradientBrush glGradient))
     {
         //create a new one
         Build(linearGradientBrush, out float[] v2f, out float[] colors);
         glGradient = new LinearGradientBrush(v2f, colors);
         linearGradientBrush.InnerBrush = glGradient;
     }
     return(glGradient);
 }
示例#2
0
        /// <summary>
        /// we do not store input linearGradient
        /// </summary>
        /// <param name="linearGradient"></param>
        static void Build(Drawing.LinearGradientBrush linearGradient,
                          out float[] v2f,
                          out float[] colors)
        {
            ColorStop[] colorStops = linearGradient.ColorStops;


            s_vertices.Clear();
            s_v2fList.Clear();
            s_colorList.Clear();

            float x_1 = linearGradient.StartPoint.X;
            float y_1 = linearGradient.StartPoint.Y;

            double angleRad = linearGradient.Angle;
            double totalLen = linearGradient.Length;

            int pairCount = colorStops.Length - 1;

            ColorStop c0 = ColorStop.Empty;
            ColorStop c1 = ColorStop.Empty;

            //create a simple horizontal linear gradient bar
            //and we will rotate and translate it to target pos
            for (int i = 0; i < pairCount; ++i)
            {
                c0 = colorStops[i];
                c1 = colorStops[i + 1];

                CalculateLinearGradientVxs(s_vertices,
                                           i == 0,
                                           i == pairCount - 1,
                                           (float)(x_1 + (c0.Offset * totalLen)),
                                           (float)((c1.Offset - c0.Offset) * totalLen),
                                           c0,
                                           c1);
            }

            var txMatrix = PixelFarm.CpuBlit.VertexProcessing.Affine.NewMatix(
                PixelFarm.CpuBlit.VertexProcessing.AffinePlan.Translate(-x_1, -y_1),
                PixelFarm.CpuBlit.VertexProcessing.AffinePlan.Rotate(angleRad),
                PixelFarm.CpuBlit.VertexProcessing.AffinePlan.Translate(x_1, y_1)
                );

            //----------------------------------
            int j = s_vertices.Count;

            for (int m = 0; m < j; ++m)
            {
                VertexC4V3f v   = s_vertices[m];
                double      v_x = v.x;
                double      v_y = v.y;
                txMatrix.Transform(ref v_x, ref v_y);
                //vrx[i] = new VertexC4V3f(v.color, (float)v_x, (float)v_y);
                s_v2fList.Add((float)v_x);
                s_v2fList.Add((float)v_y);

                uint color = v.color;
                //a,b,g,r
                s_colorList.Add((color & 0xff) / 255f);         //r
                s_colorList.Add(((color >> 8) & 0xff) / 255f);  //g
                s_colorList.Add(((color >> 16) & 0xff) / 255f); //b
                s_colorList.Add(((color >> 24) & 0xff) / 255f); //a
            }

            v2f    = s_v2fList.ToArray();
            colors = s_colorList.ToArray();
        }
        /// <summary>
        /// we do not store input linearGradient
        /// </summary>
        /// <param name="linearGradient"></param>
        static void Build(Drawing.LinearGradientBrush linearGradient,
                          out float[] v2f,
                          out float[] colors)
        {
            ColorStop[] colorStops = linearGradient.ColorStops;


            s_vertices.Clear();
            s_v2fList.Clear();
            s_colorList.Clear();

            float x_1 = linearGradient.StartPoint.X;
            float y_1 = linearGradient.StartPoint.Y;

            double angleRad = linearGradient.Angle;
            double totalLen = linearGradient.Length;

            int pairCount = colorStops.Length - 1;

            ColorStop c0;
            ColorStop c1;

            //create a simple horizontal linear gradient bar
            //and we will rotate and translate it to target pos
            for (int i = 0; i < pairCount; ++i)
            {
                c0 = colorStops[i];
                c1 = colorStops[i + 1];

                CalculateLinearGradientVxs(s_vertices,
                                           i == 0,
                                           i == pairCount - 1,
                                           (float)(x_1 + (c0.Offset * totalLen)),
                                           (float)((c1.Offset - c0.Offset) * totalLen),
                                           c0,
                                           c1);
            }

            var txMatrix = AffineMat.Iden();

            txMatrix.Rotate(angleRad, x_1, y_1); //rotate around x_1,y_1

            int j = s_vertices.Count;

            for (int m = 0; m < j; ++m)
            {
                ColorAndCoord v   = s_vertices[m];
                double        v_x = v.x;
                double        v_y = v.y;

                txMatrix.Transform(ref v_x, ref v_y);

                s_v2fList.Add((float)v_x);
                s_v2fList.Add((float)v_y);

                Color color = v.color;

                s_colorList.Add(color.R / 255f);
                s_colorList.Add(color.G / 255f);
                s_colorList.Add(color.B / 255f);
                s_colorList.Add(color.A / 255f);
            }

            v2f    = s_v2fList.ToArray();
            colors = s_colorList.ToArray();
        }