public void Render(RenderSlide slide, TextRenderer r)
        {
            if (RenderLayoutMode == LayoutMode.Auto)
            {
                slide.gfx.DrawImage(Image, new Rectangle(0, 0, r.DisplayWidth, r.DisplayHeight), new Rectangle(new Point(0, 0), Image.Size), GraphicsUnit.Pixel);
            }
            else if (RenderLayoutMode == LayoutMode.PreserveScale)
            {
                double scale = 1;
                Point  p;
                Size   s;
                // scale by either width or height

                double xscale = 1;
                double yscale = 1;

                xscale = (double)r.DisplayWidth / (double)Image.Width;
                yscale = (double)r.DisplayHeight / (double)Image.Height;

                scale = xscale < yscale ? xscale : yscale;

                s = new Size((int)(Image.Width * scale), (int)(Image.Height * scale));
                p = new Point((r.DisplayWidth - s.Width) / 2, (r.DisplayHeight - s.Height) / 2);


                // clear background
                slide.gfx.Clear(Color.White);

                // draw image scaled fullscrean
                slide.gfx.DrawImage(Image, new Rectangle(p, s), new Rectangle(new Point(0, 0), Image.Size), GraphicsUnit.Pixel);
            }
        }
        public RenderSlide TypesetSlide(RenderSlide slide, TextRenderer r)
        {
            // will force a new slide
            RenderSlide rslide = slide;

            if (!slide.Blank)
            {
                r.Slides.Add(r.FinalizeSlide(slide));
                rslide = new RenderSlide()
                {
                    Order = slide.Order + 1
                };
            }

            // uses default renderline
            RenderFullImage ril = new RenderFullImage()
            {
                Image = ImageAsset.Image, Height = ImageAsset.Image.Height, Width = ImageAsset.Image.Width, RenderLayoutMode = Streach ? LayoutMode.Auto : LayoutMode.PreserveScale
            };

            rslide.RenderLines.Add(ril);

            r.Slides.Add(r.FinalizeSlide(rslide));
            return(new RenderSlide()
            {
                Order = rslide.Order + 1
            });
        }
        public void Render(RenderSlide slide, TextRenderer r)
        {
            RenderLine target = this;

            // draw text
            slide.gfx.DrawString(target.Text, target.Font, target.TextBrush, new Rectangle(r.TextboxRect.X + target.RenderX, r.TextboxRect.Y + target.RenderY, r.TextboxRect.Width - target.RenderX, r.TextboxRect.Height - target.RenderY), r.format);
            //slide.gfx.FillRectangle(Brushes.Red, new Rectangle(r.TextboxRect.X + target.RenderX, r.TextboxRect.Y + target.RenderY, r.TextboxRect.Width - target.RenderX, r.TextboxRect.Height - target.RenderY));
            // draw speaker
            if (target.ShowSpeaker)
            {
                Font      speakerfont    = new Font(target.Font, FontStyle.Bold);
                int       speakeroffsety = (int)Math.Floor(Math.Ceiling((slide.gfx.MeasureString(r.SpeakerText.TryGetVal(target.Speaker, "?"), speakerfont).Height - r.blocksize) / 2) - 1);
                Rectangle speakerblock   = new Rectangle(r.LayoutRect.X, r.TextboxRect.Y + target.RenderY + speakeroffsety, r.blocksize, r.blocksize);

                if (target.Speaker == Speaker.None)
                {
                    return;
                }

                if (r.SpeakerFills.TryGetVal(target.Speaker, false))
                {
                    slide.gfx.FillPath(Brushes.Red, r.RoundedRect(speakerblock, 2));
                    slide.gfx.DrawString(r.SpeakerText.TryGetVal(target.Speaker, "?"), speakerfont, Brushes.White, speakerblock, r.format);
                }
                else
                {
                    slide.gfx.FillPath(Brushes.White, r.RoundedRect(speakerblock, 2));
                    slide.gfx.DrawPath(Pens.Red, r.RoundedRect(speakerblock, 2));
                    slide.gfx.DrawString(r.SpeakerText.TryGetVal(target.Speaker, "?"), speakerfont, Brushes.Red, speakerblock, r.format);
                }
            }
        }
        public RenderSlide TypesetSlide(RenderSlide slide, TextRenderer r)
        {
            // force a new slide
            RenderSlide rslide = slide;

            if (!slide.Blank)
            {
                r.Slides.Add(r.FinalizeSlide(slide));
                rslide = new RenderSlide()
                {
                    Order = slide.Order + 1
                };
            }


            // create the slide


            Font titlefont = new Font(r.Font, FontStyle.Bold);
            Font reffont   = new Font(r.Font, FontStyle.Bold | FontStyle.Italic);

            // add render lines for title and for reference
            Size tsize  = rslide.gfx.MeasureString(Title, titlefont).ToSize();
            int  titley = r.TextboxRect.Height / 2 - (tsize.Height / 2);


            RenderLine titleline = new RenderLine()
            {
                Height = tsize.Height, Width = tsize.Width, LineNum = 0, RenderLayoutMode = LayoutMode.Fixed, ShowSpeaker = false, Speaker = Speaker.None, Text = Title, RenderX = 0, RenderY = titley, Font = titlefont
            };

            Size rsize = rslide.gfx.MeasureString(Reference, reffont).ToSize();
            // add equal column spacing
            int        padright = r.TextboxRect.X - r.KeyRect.X + r.PaddingCol;
            int        refx     = r.TextboxRect.Width - rsize.Width - padright;
            int        refy     = r.TextboxRect.Height / 2 - (rsize.Height / 2);
            RenderLine refline  = new RenderLine()
            {
                Height = rsize.Height, Width = rsize.Width, LineNum = 0, RenderLayoutMode = LayoutMode.Fixed, ShowSpeaker = false, Speaker = Speaker.None, Text = Reference, RenderX = refx, RenderY = refy, Font = reffont
            };

            rslide.RenderLines.Add(titleline);
            rslide.RenderLines.Add(refline);


            r.Slides.Add(r.FinalizeSlide(rslide));

            // return a new black slide
            return(new RenderSlide()
            {
                Order = rslide.Order + 1
            });
        }
Exemple #5
0
        public RenderSlide FinalizeSlide(RenderSlide slide)
        {
            // now that all the renderlines are determined, layout the lines to be centered vertically

            // compute vertical spacing height that's spare
            // divide this up
            int spareheight = TextboxRect.Height;

            foreach (var rl in slide.RenderLines)
            {
                if (rl.RenderLayoutMode == LayoutMode.Auto)
                {
                    spareheight -= rl.Height;
                }
            }
            int verticalspace = (int)(spareheight / (slide.RenderLines.Count + 1d));

            // set y-offsets
            int yoff = verticalspace;

            foreach (var rl in slide.RenderLines)
            {
                if (rl.RenderLayoutMode == LayoutMode.Auto)
                {
                    rl.RenderY = yoff;
                    yoff      += rl.Height + verticalspace;
                }
            }


            // center horizontally?

            // replace characters


            // determine if slide is fullscreen
            if (slide.RenderLines.Count == 1)
            {
                IRenderable rl = slide.RenderLines[0];

                if (rl is RenderFullImage)
                {
                    slide.IsFullscreen = true;
                }
            }


            return(slide);
        }
Exemple #6
0
        private void Render_Slide(RenderSlide slide)
        {
            // clear background
            slide.gfx.Clear(Color.Black);
            // draw textbox
            slide.gfx.FillRectangle(Brushes.White, KeyRect);


            // go through the renderlist and display it

            foreach (var target in slide.RenderLines)
            {
                target.Render(slide, this);
            }
        }
 public RenderSlide TypesetSlide(RenderSlide slide, TextRenderer r)
 {
     if (Command == Command.NewSlide)
     {
         // force new slide
         r.Slides.Add(r.FinalizeSlide(slide));
         return(new RenderSlide()
         {
             Order = slide.Order + 1
         });
     }
     if (Command == Command.WrapSpeakerText)
     {
         r.LLState.SpeakerWrap = true;
     }
     return(slide);
 }
Exemple #8
0
        public void Typeset_Text(TextData td)
        {
            // create a series of 'slides' given some liturgy lines


            // figure out how many 'lines' fit in the box
            // compute size and posititon of words
            // generate a renderlist for the text
            // this is broken into slides


            // go through lines
            // create new slide
            // check if line fits into current 'slide'
            // if so add renderline to slide
            // if not check if can split to fit (ignore for now)
            // create new slide etc.

            Slides.Clear();

            int         slideCount   = 0;
            RenderSlide currentSlide = new RenderSlide()
            {
                Order = slideCount++
            };

            int linestartX = TextboxRect.X;
            int linestartY = TextboxRect.Y;


            foreach (var line in td.LineData)
            {
                // typeset the line
                currentSlide = line.TypesetSlide(currentSlide, this);
            }

            if (!currentSlide.Blank)
            {
                Slides.Add(FinalizeSlide(currentSlide));
            }
        }
        public void Render(RenderSlide slide, TextRenderer r)
        {
            if (RenderLayoutMode == LayoutMode.Auto)
            {
                // center image in textrect
                slide.gfx.DrawImage(Image, r.KeyRect, new Rectangle(new Point(0, 0), Image.Size), GraphicsUnit.Pixel);
            }
            else
            {
                // scale image to fit height, may not fit center
                int oldw = Image.Width;
                int oldh = Image.Height;

                float      scale = (float)r.TextboxRect.Height / (float)oldh;
                RectangleF imgr  = new RectangleF(0, 0, oldw * scale, oldh * scale);

                // center
                imgr.Location = new PointF((r.TextboxRect.Width - imgr.Width) / 2, r.TextboxRect.Y);

                slide.gfx.DrawImage(Image, imgr);
            }
        }
        public RenderSlide TypesetSlide(RenderSlide slide, TextRenderer r)
        {
            // force new slide
            RenderSlide rslide = slide;

            if (!slide.Blank)
            {
                r.Slides.Add(r.FinalizeSlide(slide));
                rslide = new RenderSlide()
                {
                    Order = slide.Order + 1
                };
            }

            // on new slide create it with only content for video
            rslide.IsMediaReference = true;
            rslide.MediaReference   = Asset.ResourcePath;

            // add a render line to show it's a video

            RenderFullImage ril = new RenderFullImage()
            {
                Image = Asset.Image, Height = Asset.Image.Height, Width = Asset.Image.Width, RenderLayoutMode = LayoutMode.Auto
            };

            rslide.RenderLines.Add(ril);


            r.Slides.Add(r.FinalizeSlide(slide));

            // return new slide
            return(new RenderSlide()
            {
                Order = rslide.Order + 1
            });
        }
        public RenderSlide TypesetSlide(RenderSlide slide, TextRenderer r)
        {
            LiturgyLine line = this;


            // update state if not in wrapmode
            if (!r.LLState.SpeakerWrap)
            {
                r.LLState.LastSpeaker = line.Speaker;
            }
            else
            {
                line.Speaker = r.LLState.LastSpeaker;
            }

            // try to fit to current slide
            int lineheight = (int)Math.Ceiling(slide.gfx.MeasureString("CPALTgy", r.SpeakerFonts.TryGetVal(line.Speaker, r.Font)).Height);

            // check if whole line will fit

            SizeF s = slide.gfx.MeasureString(line.Text, r.SpeakerFonts.TryGetVal(line.Speaker, r.Font), r.TextboxRect.Width);

            if (slide.YOffset + s.Height <= r.TextboxRect.Height)
            {
                // it fits, add this line at position and compute
                RenderLine rl = new RenderLine()
                {
                    Height = (int)s.Height, Width = (int)s.Width, ShowSpeaker = line.SubSplit == 0 || slide.Lines == 0, Speaker = line.Speaker, Text = line.Text, RenderX = 0, RenderY = 0, RenderLayoutMode = LayoutMode.Auto, LineNum = slide.Lines++, Font = r.SpeakerFonts.TryGetVal(line.Speaker, r.Font)
                };
                slide.RenderLines.Add(rl);
                slide.YOffset += (int)s.Height;
                // wrap only works for one line
                r.LLState.SpeakerWrap = false;
                return(slide);
            }
            // if slide isn't blank, then try it on a blank slide
            if (!slide.Blank)
            {
                r.Slides.Add(r.FinalizeSlide(slide));
                // wrap only works for one line
                r.LLState.SpeakerWrap = false;
                return(line.TypesetSlide(new RenderSlide()
                {
                    Order = slide.Order + 1
                }, r));
            }
            // if doesn't fit on a blank slide
            // try to split into sentences. put as many sentences as fit on one slide until done


            // If have already split into sentences... split into chunks of words?
            if (line.IsSubsplit)
            {
                RenderSlide errorslide;
                if (!slide.Blank)
                {
                    r.Slides.Add(r.FinalizeSlide(slide));
                    errorslide = new RenderSlide()
                    {
                        Order = slide.Order + 1
                    };
                }
                else
                {
                    errorslide = slide;
                }
                // for now abandon
                string     emsg      = "ERROR";
                Size       esize     = slide.gfx.MeasureString(emsg, r.Font).ToSize();
                RenderLine errorline = new RenderLine()
                {
                    Height = esize.Height, Width = esize.Width, ShowSpeaker = r.LLState.SpeakerWrap, Speaker = Speaker.None, Text = emsg, RenderX = 0, RenderY = 0, RenderLayoutMode = LayoutMode.Auto, LineNum = 0, Font = r.Font, TextBrush = Brushes.Red
                };
                errorslide.RenderLines.Add(errorline);
                r.Slides.Add(r.FinalizeSlide(errorslide));
                // wrap only works for one line
                r.LLState.SpeakerWrap = false;
                return(new RenderSlide()
                {
                    Order = errorslide.Order + 1
                });
            }


            // split line text into sentences
            var sentences = line.Text.Split(new string[] { "." }, StringSplitOptions.RemoveEmptyEntries);

            var tmp = Regex.Matches(line.Text, @"((?<sentence>[^\.;!?]+)(?<delimiter>[\.;!?])+)");



            // keep trying to stuff a sentence
            List <LiturgyLine> sublines = new List <LiturgyLine>();
            int splitnum = 0;

            foreach (var sentence in tmp)
            {
                // create a bunch of sub-liturgy-lines and try to typeset them all
                string t = sentence.ToString();
                sublines.Add(new LiturgyLine()
                {
                    Speaker = line.Speaker, Text = t.Trim(), SubSplit = splitnum++, IsSubsplit = true
                });
            }

            foreach (var sl in sublines)
            {
                slide = sl.TypesetSlide(slide, r);
            }


            // wrap only works for one line
            r.LLState.SpeakerWrap = false;
            return(slide);
        }