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 }); }
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); }
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); }
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); }