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); }
/// <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(); }