/// <summary> /// Erzeugt die aktuelle Seite als <see cref="Bitmap"/>. /// </summary> /// <param name="holder">Ein Anzeigeelement als Referenz für die Parameter der <see cref="Bitmap"/>.</param> /// <param name="digits">Alle auf der Seite verwendeten Zahlen.</param> /// <returns>Eine Darstellung der aktuellen Videotext Seite.</returns> public Bitmap CreatePage(Control holder, out DigitManager digits) { // Helper RectangleF extend; // Forward return(CreatePage(holder, out digits, out extend)); }
/// <summary> /// Erzeugt eine neue Instanz der Hilfsklasse. /// </summary> /// <param name="g">Die Zeichenumgebung, in der die Videotext Seite integriert werden muss.</param> /// <param name="isTransparent">Gesetzt, wenn die Seite durchscheinend sein soll.</param> public PageDrawingContext( Graphics g, bool isTransparent ) { // Remember IsTransparent = isTransparent; // Measure the size of a letter and a mosaic brick NormalCharacterSize = g.MeasureString( "X", LineDrawingContext.NormalTextFont ); MosaicElementSize = new SizeF( NormalCharacterSize.Width / 2, NormalCharacterSize.Height / 3 ); // Create the bitmap m_Bitmap = new Bitmap( (int) (40 * NormalCharacterSize.Width), (int) (26 * NormalCharacterSize.Height), g ); // Create digit manager Digits = new DigitManager( m_Bitmap ); // Create the drawing backbone m_Graphics = Graphics.FromImage( m_Bitmap ); // Remember background Background = isTransparent ? TTXPage.TransparentColor : LineDrawingContext.Brushes[Color.Black]; // Prepare the page m_Graphics.FillRectangle( Background, 0, 0, m_Bitmap.Width, m_Bitmap.Height ); }
/// <summary> /// Erzeugt eine neue Instanz der Hilfsklasse. /// </summary> /// <param name="g">Die Zeichenumgebung, in der die Videotext Seite integriert werden muss.</param> /// <param name="isTransparent">Gesetzt, wenn die Seite durchscheinend sein soll.</param> public PageDrawingContext(Graphics g, bool isTransparent) { // Remember IsTransparent = isTransparent; // Measure the size of a letter and a mosaic brick NormalCharacterSize = g.MeasureString("X", LineDrawingContext.NormalTextFont); MosaicElementSize = new SizeF(NormalCharacterSize.Width / 2, NormalCharacterSize.Height / 3); // Create the bitmap m_Bitmap = new Bitmap((int)(40 * NormalCharacterSize.Width), (int)(26 * NormalCharacterSize.Height), g); // Create digit manager Digits = new DigitManager(m_Bitmap); // Create the drawing backbone m_Graphics = Graphics.FromImage(m_Bitmap); // Remember background Background = isTransparent ? TTXPage.TransparentColor : LineDrawingContext.Brushes[Color.Black]; // Prepare the page m_Graphics.FillRectangle(Background, 0, 0, m_Bitmap.Width, m_Bitmap.Height); }
/// <summary> /// Erzeugt die aktuelle Seite als <see cref="Bitmap"/>. /// </summary> /// <param name="holder">Ein Anzeigeelement als Referenz für die Parameter der <see cref="Bitmap"/>.</param> /// <param name="digits">Alle auf der Seite verwendeten Zahlen.</param> /// <param name="extend">Beschreibt den tatsächlich relevanten Teil der Seite.</param> /// <returns>Eine Darstellung der aktuellen Videotext Seite.</returns> public Bitmap CreatePage(Control holder, out DigitManager digits, out RectangleF extend) { // Create device context using (var referenceContext = Graphics.FromHwnd(holder.Handle)) using (var pageDraw = new PageDrawingContext(referenceContext, IsTransparent)) { // Process header if (!IsTransparent) { if (!NoHeader) { // Get the prefix for the headline string prefix; if (!string.IsNullOrEmpty(Feedback)) { prefix = string.Format("{0} ", Feedback).Substring(0, 8); } else if (SubPage < 1) { prefix = string.Format("{0:000} ", Page); } else { prefix = string.Format("{0:000}/{1:00} ", Page, SubPage).Substring(0, 8); } // Fill the headline pageDraw.DrawHeader(prefix, Header); } } // Fill the body if (!Hide) { for (int i = 0; ++i < 26;) { // Line data byte[] line; if (!m_Lines.TryGetValue(i, out line)) { continue; } // Fill the line LineDrawingContext context = pageDraw.DrawLine(i, line); // Skip line if double height characters are used if (context.HasDoubleHeight) { i++; } } } // Attach to digit manager of context digits = pageDraw.Digits; extend = pageDraw.Extend; // Report return(pageDraw.Detach()); } }
/// <summary> /// Nimmt eine Videotextseite entgegen. /// </summary> /// <param name="page">Die gewünschte Videotextseite, eventuell leer.</param> /// <param name="digits">Informationen zum Auftreten von Zahlen in der Darstellung.</param> /// <returns>Gesetzt, wenn eine Seite erfolgreich angezeigt wurde.</returns> public bool ShowPage( TTXPage page, out DigitManager digits ) { // Safe create try { // Create the bitmap from the page RectangleF extend; using (var ttx = page.CreatePage( this, out digits, out extend )) { // Default position double left = GetNormalizedBorder( 0.8 ), top = 0.1; double right = 1.0 - left, bottom = 1.0 - top; // Get the transparency color if (page.IsTransparent) { // There is nothing to show if (extend.IsEmpty) return true; // Check mode if (UseLegacyOverlay) { // Get size double width = right - left, height = bottom - top; // Correct against bounds left += width * extend.Left; top += height * extend.Top; // Correct against bounds right = left + width * extend.Width; bottom = top + height * extend.Height; // Get the range of interest var srcRange = new RectangleF ( (float) (extend.Left * ttx.Width), (float) (extend.Top * ttx.Height), (float) (extend.Width * ttx.Width), (float) (extend.Height * ttx.Height) ); // Create new bitmap using (var clipped = new Bitmap( ttx, (int) Math.Round( srcRange.Width ), (int) Math.Round( srcRange.Height ) )) { // Prepare to update using (var dest = Graphics.FromImage( clipped )) { // Get full ranges var destRange = new RectangleF( 0, 0, clipped.Width, clipped.Height ); // Fill dest.DrawImage( ttx, destRange, srcRange, GraphicsUnit.Pixel ); } // Simpy show up ShowOverlay( clipped, left, top, right, bottom, null, null ); } } else { // Simpy show up ShowOverlay( ttx, left, top, right, bottom, null, TTXPage.TransparentColor.Color ); } } else { // Simpy show up ShowOverlay( ttx, left, top, right, bottom, null, null ); } } // Did it return true; } catch { // Reset digits = null; // Leave return false; } }
/// <summary> /// Erzeugt die aktuelle Seite als <see cref="Bitmap"/>. /// </summary> /// <param name="holder">Ein Anzeigeelement als Referenz für die Parameter der <see cref="Bitmap"/>.</param> /// <param name="digits">Alle auf der Seite verwendeten Zahlen.</param> /// <param name="extend">Beschreibt den tatsächlich relevanten Teil der Seite.</param> /// <returns>Eine Darstellung der aktuellen Videotext Seite.</returns> public Bitmap CreatePage( Control holder, out DigitManager digits, out RectangleF extend ) { // Create device context using (var referenceContext = Graphics.FromHwnd( holder.Handle )) using (var pageDraw = new PageDrawingContext( referenceContext, IsTransparent )) { // Process header if (!IsTransparent) if (!NoHeader) { // Get the prefix for the headline string prefix; if (!string.IsNullOrEmpty( Feedback )) prefix = string.Format( "{0} ", Feedback ).Substring( 0, 8 ); else if (SubPage < 1) prefix = string.Format( "{0:000} ", Page ); else prefix = string.Format( "{0:000}/{1:00} ", Page, SubPage ).Substring( 0, 8 ); // Fill the headline pageDraw.DrawHeader( prefix, Header ); } // Fill the body if (!Hide) for (int i = 0; ++i < 26; ) { // Line data byte[] line; if (!m_Lines.TryGetValue( i, out line )) continue; // Fill the line LineDrawingContext context = pageDraw.DrawLine( i, line ); // Skip line if double height characters are used if (context.HasDoubleHeight) i++; } // Attach to digit manager of context digits = pageDraw.Digits; extend = pageDraw.Extend; // Report return pageDraw.Detach(); } }
/// <summary> /// Erzeugt die aktuelle Seite als <see cref="Bitmap"/>. /// </summary> /// <param name="holder">Ein Anzeigeelement als Referenz für die Parameter der <see cref="Bitmap"/>.</param> /// <param name="digits">Alle auf der Seite verwendeten Zahlen.</param> /// <returns>Eine Darstellung der aktuellen Videotext Seite.</returns> public Bitmap CreatePage( Control holder, out DigitManager digits ) { // Helper RectangleF extend; // Forward return CreatePage( holder, out digits, out extend ); }