private void WriteGradientDefs(List <GradientFill> gradients) { WriteTag(VexDrawTag.GradientFillList); WriteBits(0, 5); // note: no nBits here, just padding WriteBits(gradients.Count, 11); for (int index = 0; index < gradients.Count; index++) { GradientFill gf = gradients[index]; // first type - all non radial will be solid // use 8 bits for future expansion and to keep semi aligned int type = (gf.FillType == FillType.Radial) ? 1 : 0; WriteBits(type, 3); float[] tltr = DrawObject.GetGradientLine(gf); int[] values = new int[4]; for (int i = 0; i < tltr.Length; i++) { values[i] = (int)(tltr[i] * DrawObject.twips); } WriteFourNBitValues(values); // new argb colors List <Color> colors = new List <Color>(gf.Fills); List <float> positions = new List <float>(gf.Stops); if (gf.FillType == FillType.Radial) { gf.ReverseStops(colors, positions); } // stops and ratios [[col,rat],[col,rat]...] int stopCount = colors.Count; if (stopCount > 8) { stopCount = 8; Console.WriteLine("*Flash only supports 8 colors max in gradients"); } uint[] wCols = new uint[stopCount]; for (int i = 0; i < stopCount; i++) { wCols[i] = colors[i].AFlipRGB; } uint colBits = MinBits(wCols); WriteNBitsCount(colBits); int[] ratios = new int[positions.Count]; for (int i = 0; i < stopCount; i++) { ratios[i] = (int)(positions[i] * 255); } uint ratioBits = MinBits(ratios); WriteNBitsCount(ratioBits); WriteBits(stopCount, 11); for (int i = 0; i < stopCount; i++) { WriteBits(wCols[i], colBits); WriteBits(ratios[i], ratioBits); } } FlushTag(); }
public void ToJson(StringBuilder sb) { sb.Append("\n{\n"); // Definition Names sb.Append("\"definitionNameTable\":["); string comma = ""; foreach (uint id in definitionNames.Keys) { sb.Append(comma + "[" + id + ",\"" + definitionNames[id] + "\"]"); comma = ","; } sb.Append("],\n"); // Instance Names sb.Append("\"instanceNameTable\":["); comma = ""; foreach (uint id in instanceNames.Keys) { sb.Append(comma + "[" + id + ",\"" + instanceNames[id] + "\"]"); comma = ","; } sb.Append("],\n"); // strokes sb.Append("\"strokes\":["); //sb.Append("\\\\ strokes\n["); comma = ""; foreach (SolidStroke ss in strokes) { sb.Append(comma + ss.LineWidth.ToString("0.##") + ","); sb.Append(ss.Color.AFlipRGB.ToString()); comma = ","; } sb.Append("],\n"); // solid fills sb.Append("\"fills\":[\n"); //sb.Append("[\n\\\\ solid fills\n"); comma = ""; bool inGradients = false; foreach (FillStyle fs in fills) { if (fs.FillType == FillType.Solid) { SolidFill sf = (SolidFill)fs; sb.Append(comma + sf.Color.AFlipRGB.ToString()); comma = ","; } else { if (!inGradients) { sb.Append(",\n"); //sb.Append(",\n\\\\ gradients\n"); comma = ""; } inGradients = true; GradientFill gf = (GradientFill)fs; sb.Append(comma + "["); sb.Append(gf.GradientType == GradientType.Linear ? "\"L\"," : "\"R\","); sb.Append("[" + GetGradientLineString(gf) + "],"); // new argb colors List <Color> colors = new List <Color>(gf.Fills); List <float> positions = new List <float>(gf.Stops); if (gf.FillType == FillType.Radial) { gf.ReverseStops(colors, positions); } string comma2 = ""; sb.Append("["); for (int i = 0; i < colors.Count; i++) { Color c = colors[i]; sb.Append(comma2 + c.AFlipRGB.ToString() + ","); sb.Append(positions[i].ToString("0.##")); comma2 = ","; } sb.Append("]]"); comma = ",\n"; } } sb.Append("\n],\n"); sb.Append("\"images\":[\n"); comma = ""; foreach (DrawImage image in drawImages) { sb.Append(comma); image.ToJson(sb); comma = ",\n"; } sb.Append("\n],\n"); sb.Append("\"symbols\":[\n"); comma = ""; foreach (DrawSymbol symbol in drawSymbols) { sb.Append(comma); symbol.ToJson(sb); comma = ",\n"; } sb.Append("\n],\n"); sb.Append("\"timelines\":[\n"); comma = ""; foreach (DrawTimeline tl in drawTimelines) { sb.Append(comma); tl.ToJson(sb); comma = ",\n"; } sb.Append("\n]\n"); sb.Append("\n}\n"); }