// Graphics prep private void PrepareForDisplay() { // This method will prepare the data for the graphics engine to make it faster // It take all the bible text and break it across multiple slides // Requirements: reload data on the fly (save state and start from where left off) // Clean up int currentVerseBackup = currentVerseNum; // back this up just in case this.slideData.Clear(); // Init bibFont = PresenterFont.GetFontFromDatabase(-1); // Get the bib font from db /// Split each of the verses if necessary foreach (BibleVerse bvCurrent in this.bibVerses.Values) { // Calculate max block size Size nativeSize = DisplayEngine.NativeResolution.Size; int transCount = TranslationList().Count; double insideHeight = nativeSize.Height; insideHeight -= imageFactory.paddingPixels * 2; // Top and bottom insideHeight -= imageFactory.paddingPixels * (transCount - 1); // Between translations insideHeight /= transCount; insideHeight -= bibFont.SizeInPoints * 1.5; // Space for verse labels int maxh = (int)insideHeight; Size maxSize = new Size(imageFactory.maxInsideWidth, maxh); VerseBreakDown d = new VerseBreakDown(); d.bibleVerse = bvCurrent; d.primaryText = InternalBreakString(bvCurrent.RefVerse, bvCurrent.Text, maxSize); d.secondaryText = InternalBreakString(bvCurrent.SecondaryVerse, bvCurrent.SecondaryText, maxSize); d.tertiaryText = InternalBreakString(bvCurrent.TertiaryVerse, bvCurrent.TertiaryText, maxSize); slideData.Add(bvCurrent.RefVerse, d); } // Read initial opacity EnsureBackground(); UpdateOpacity(Program.ConfigHelper.BibleImageOpacity); // Reset the current location if (bibVerses.Count > 0 && currentVerseBackup < bibVerses.Count + 1 && currentVerseBackup != -1) { currentVerseNum = currentVerseBackup; } else { currentVerseNum = 1; } }
public void PrepSlideSingleVerse(GfxContext ctx, VerseBreakDown data, int subIndex, PresenterFont font) { #region Format data string txt; string reference; if (data.bibleVerse.RefVersion != "") { reference = data.bibleVerse.ToString(); txt = data.primaryText[subIndex]; } else { reference = data.bibleVerse.ToString(true); txt = data.secondaryText[subIndex]; } #endregion Size nativeSize = DisplayEngine.NativeResolution.Size; #region Measure StringFormat sf = GetStringFormat(); int insideHeight = nativeSize.Height - paddingPixels * 2; int insideWidth = nativeSize.Width - paddingPixels * 2; Point anchorTop = new Point(paddingPixels, paddingPixels); Point anchorBottom = new Point(paddingPixels, paddingPixels + (int)((double)insideHeight / 2)); // Measure the reference blocks int refemSize = (int)(font.SizeInPoints * .9); // actual drawing size is smaller than usual int refBlockHeight = (int)(font.SizeInPoints * 1.2); #endregion #region Build context ctx.destSize = DisplayEngine.NativeResolution.Size; ctx.textRegions.Clear(); // Primary text GfxTextRegion rVerse = new GfxTextRegion(); ctx.textRegions.Add(rVerse); rVerse.font = font; rVerse.message = txt; RectangleF r1 = new RectangleF(paddingPixels, 0, insideWidth, InternalMeasureString(txt, font, insideWidth, sf).Height); if (font.VerticalStringAlignment == StringAlignment.Near) { r1.Y = paddingPixels; } else if (font.VerticalStringAlignment == StringAlignment.Center) { r1.Y = (float)(((double)insideHeight - r1.Height) / 2) + paddingPixels; } else { r1.Y = nativeSize.Height - r1.Height - refBlockHeight - paddingPixels * 2; } rVerse.bounds = r1; rVerse.bounds.Height += refBlockHeight; // give some slack // Reference GfxTextRegion rRef = new GfxTextRegion(); ctx.textRegions.Add(rRef); rRef.font = (PresenterFont)font.Clone(); SetRefFont(rRef.font); rRef.message = reference; r1.Y += r1.Height + refBlockHeight; // +refemSize; // relocate the box rRef.bounds = r1; rRef.bounds.Height = refBlockHeight; #endregion }
public bool PrepSlideMultiTranslation(GfxContext ctx, VerseBreakDown data, int subIndex, PresenterFont font) { // If only one version is available then fall back if (data.bibleVerse.RefVersion == "" || data.bibleVerse.SecondaryVersion == "" || data.bibleVerse.Text == "" || data.bibleVerse.SecondaryText == "") { return(false); } // Format data string primaryText = subIndex > data.primaryText.Count - 1 ? data.primaryText[data.primaryText.Count - 1] : data.primaryText[subIndex]; string secondaryText = subIndex > data.secondaryText.Count - 1 ? data.secondaryText[data.secondaryText.Count - 1] : data.secondaryText[subIndex]; string priRef = data.bibleVerse.ToString(); string secRef = data.bibleVerse.ToString(true); Size nativeSize = DisplayEngine.NativeResolution.Size; #region Measure StringFormat sf = GetStringFormat(); int insideHeight = nativeSize.Height - paddingPixels * 2; int insideWidth = nativeSize.Width - paddingPixels * 2; Point anchorTop = new Point(paddingPixels, paddingPixels); Point anchorBottom = new Point(paddingPixels, paddingPixels + (int)((double)insideHeight / 2)); // Measure the reference blocks int refemSize = (int)(font.SizeInPoints * .9); // actual drawing size is smaller than usual int refBlockHeight = (int)(font.SizeInPoints * 1.2); // Measure both strings RectangleF r1 = new RectangleF(anchorTop.X, anchorTop.Y, insideWidth, InternalMeasureString(primaryText, font, insideWidth, sf).Height); RectangleF r2 = new RectangleF(anchorBottom.X, anchorBottom.Y, insideWidth, InternalMeasureString(secondaryText, font, insideWidth, sf).Height); if (r1.Height + r2.Height + refBlockHeight * 2 > insideHeight) { return(false); } #endregion #region Build context ctx.destSize = DisplayEngine.NativeResolution.Size; ctx.textRegions.Clear(); // First part GfxTextRegion rVerse1 = new GfxTextRegion(); ctx.textRegions.Add(rVerse1); rVerse1.font = font; rVerse1.font.HorizontalAlignment = HorizontalAlignment.Left; rVerse1.font.VerticalAlignment = VerticalAlignment.Top; rVerse1.message = primaryText; // First reference GfxTextRegion rRef1 = new GfxTextRegion(); ctx.textRegions.Add(rRef1); rRef1.font = (PresenterFont)font.Clone(); SetRefFont(rRef1.font); rRef1.message = priRef; // Second part GfxTextRegion rVerse2 = new GfxTextRegion(); ctx.textRegions.Add(rVerse2); rVerse2.font = font; rVerse2.font.HorizontalAlignment = HorizontalAlignment.Left; rVerse2.font.VerticalAlignment = VerticalAlignment.Top; rVerse2.message = secondaryText; // Second reference GfxTextRegion rRef2 = new GfxTextRegion(); ctx.textRegions.Add(rRef2); rRef2.font = (PresenterFont)font.Clone(); SetRefFont(rRef2.font); rRef2.message = secRef; // Adjust bounds int standardMax = (int)((double)insideHeight / 2); if (r1.Height + refBlockHeight > standardMax || r2.Height + refBlockHeight > standardMax) { rVerse1.bounds = r1; // First part rVerse1.bounds.Height += refBlockHeight; // give some slack r1.Y += r1.Height; // First reference rRef1.bounds = r1; rRef1.bounds.Height = refBlockHeight; r1.Y += refBlockHeight; // Second part rVerse2.bounds = r1; rVerse2.bounds.Height += refBlockHeight; // give some slack r1.Y += r2.Height + refBlockHeight; // Second reference rRef2.bounds = r1; rRef2.bounds.Height = refBlockHeight; } else { rVerse1.bounds = r1; // First part rVerse1.bounds.Height += refBlockHeight; // give some slack r1.Y += r1.Height + refBlockHeight; // First reference rRef1.bounds = r1; rRef1.bounds.Height = refBlockHeight; r1.Y += refBlockHeight; // Second part rVerse2.bounds = r2; rVerse2.bounds.Height += refBlockHeight; // give some slack r2.Y += r2.Height + refBlockHeight; // Second reference rRef2.bounds = r2; rRef2.bounds.Height = refBlockHeight; } #endregion return(true); }