Bitmap GenerateComic(Random a_rand, List <Panel> a_panels) { int width = spacing + (panWidth + spacing) * Math.Min(a_panels.Count, 3); int height = spacing + (panHeight + spacing) * ((a_panels.Count - 1) / 3 + 1); Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb); using (Graphics g = Graphics.FromImage(bmp)) { g.Clear(Color.FromArgb(a_rand.Next(Int32.MinValue, Int32.MaxValue))); var userColours = new Dictionary <ulong, Color> (); // Draw each panel. Font font = new Font("Comic Sans MS", 8, FontStyle.Regular); for (int i = 0; i < a_panels.Count; ++i) { Point offset = new Point( spacing + (panWidth + spacing) * (i % 3), spacing + (panHeight + spacing) * (i / 3) ); Panel panel = a_panels[i]; PanelDef def = panel.PanelDef; DrawPanel(g, def.Bmp, offset, 2); for (int j = 0; j < def.Rects.Length; ++j) { var rect = def.Rects[j]; var msg = panel.Messages[j]; // Get text colour from user. Color colour; if (userColours.ContainsKey(msg.User)) { colour = userColours[msg.User]; } else { colour = Color.FromArgb(0xFF, m_rand.Next(0x7F), m_rand.Next(0x7F), m_rand.Next(0x7F) ); userColours[msg.User] = colour; } // Draw Rectangle offRect = rect; offRect.Offset(offset); using (SolidBrush brush = new SolidBrush(colour)) { g.DrawString(msg.Text, font, brush, offRect); } } } } return(bmp); }
List <Panel> GeneratePanels(Random a_rand, List <PanelDef> a_panelDefs, List <Message> a_messages) { List <Panel> panels = new List <Panel> (); for (int i = 0; i < a_messages.Count;) { PanelDef def = null; while (def == null || (i + def.Rects.Length) > a_messages.Count) { def = a_panelDefs[a_rand.Next(a_panelDefs.Count())]; } Panel pan = new Panel(); pan.PanelDef = def; pan.Messages = new Message[def.Rects.Length]; for (int j = 0; j < def.Rects.Length; ++j) { pan.Messages[j] = a_messages[i++]; } panels.Add(pan); } return(panels); }