string ToRtf (IEnumerable<Color> knownColors, IEnumerable<string> knownFonts)
{
var r = new StringBuilder ();
var colorTableIndex = new Dictionary<int, int> ();
var colorTable = new List<Color> ();
foreach (var col in knownColors) {
var coli = col.ToArgb ();
if (!colorTableIndex.ContainsKey (coli)) {
colorTable.Add (col);
colorTableIndex.Add (coli, colorTableIndex.Count + 1);
}
}
var fontTableIndex = new Dictionary<string, int> ();
var fontTable = new List<string> ();
foreach (var col in knownFonts) {
if (!fontTableIndex.ContainsKey (col)) {
fontTable.Add (col);
fontTableIndex.Add (col, fontTableIndex.Count);
}
}
r.Append (@"{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033");
r.Append (@"{\fonttbl");
foreach (var k in fontTableIndex)
r.AppendFormat (@"{{\f{0}\fnil\fcharset0 {1};}}", k.Value, k.Key);
r.AppendLine ("}");
r.Append (@"{\colortbl ;");
foreach (var c in colorTable)
r.AppendFormat (@"\red{0}\green{1}\blue{2};", c.Red, c.Green, c.Blue);
r.AppendLine ("}");
r.AppendLine (@"{\*\generator Calca 1}\viewkind4\uc1");
r.Append (@"\pard\sa0\sb0\sl0\slmult1\f0\fs22\lang9 ");
AppendRtfBody (r, colorTableIndex, fontTableIndex);
if (PlainText.Length > 0 && PlainText[PlainText.Length-1] == '\n')
r.AppendLine (@"\par");
r.AppendLine ("}");
//Debug.WriteLine (r.ToString ());
return r.ToString ();
}