예제 #1
0
        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);
        }
예제 #2
0
        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);
        }