public override void Render (ConsoleBuffer buffer) { if (buffer == null) throw new ArgumentNullException(nameof(buffer)); Rect renderRectWithoutShadow = new Rect(RenderSize).Deflate(Thickness.Max(Shadow, 0)); //base.Render(buffer); if (Background != null) buffer.FillBackgroundRectangle(renderRectWithoutShadow, Background.Value); buffer.FillForegroundRectangle(new Rect(RenderSize), EffectiveColor); if (!Shadow.IsEmpty) { // 3 2 2 1: -1 -1 2 3: // ▄▄▄▄▄▄▄▄▄ oooo▄▄ // █████████ oooo██ // ███oooo██ █████ // ███oooo██ █████ // ▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀ Thickness shadowLineDelta = new Thickness(0, 1); Thickness shadowOffset = Thickness.Max(-Shadow - shadowLineDelta, 0); Rect shadowRect = new Rect(RenderSize).Deflate(shadowOffset); if (Shadow.Top != 0) buffer.FillForegroundLine(shadowRect.TopLine, ShadowColor, Chars.LowerHalfBlock); if (Shadow.Bottom != 0) buffer.FillForegroundLine(shadowRect.BottomLine, ShadowColor, Chars.UpperHalfBlock); buffer.FillForegroundRectangle(shadowRect.Deflate(shadowLineDelta), ShadowColor, Chars.FullBlock); if (ShadowColor == null && ShadowColorMap != null) buffer.ApplyColorMap(shadowRect, ShadowColorMap, (ref ConsoleChar c) => c.ForegroundColor = ShadowColorMap[(int)c.BackgroundColor]); } buffer.FillForegroundRectangle(renderRectWithoutShadow, EffectiveColor); buffer.DrawRectangle(renderRectWithoutShadow, EffectiveColor, Stroke); }
protected override void RenderOverride(ConsoleBuffer buffer) { if (buffer == null) throw new ArgumentNullException(nameof(buffer)); Rect renderRectWithoutShadow = new Rect(RenderSize).Deflate(Thickness.Max(Shadow, 0)); //base.Render(buffer); if (Background != null) buffer.FillBackgroundRectangle(renderRectWithoutShadow, Background.Value); buffer.FillForegroundRectangle(new Rect(RenderSize), EffectiveColor); if (!Shadow.IsEmpty) { // 3 2 2 1: -1 -1 2 3: // ▄▄▄▄▄▄▄▄▄ oooo▄▄ // █████████ oooo██ // ███oooo██ █████ // ███oooo██ █████ // ▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀ Thickness shadowLineDelta = new Thickness(0, 1); Thickness shadowOffset = Thickness.Max(-Shadow - shadowLineDelta, 0); Rect shadowRect = new Rect(RenderSize).Deflate(shadowOffset); if (Shadow.Top != 0) buffer.FillForegroundLine(shadowRect.TopLine, ShadowColor, Chars.LowerHalfBlock); if (Shadow.Bottom != 0) buffer.FillForegroundLine(shadowRect.BottomLine, ShadowColor, Chars.UpperHalfBlock); buffer.FillForegroundRectangle(shadowRect.Deflate(shadowLineDelta), ShadowColor, Chars.FullBlock); if (ShadowColor == null && ShadowColorMap != null) buffer.ApplyColorMap(shadowRect, ShadowColorMap, (ref ConsoleChar c) => c.ForegroundColor = ShadowColorMap[(int)c.BackgroundColor]); } buffer.FillForegroundRectangle(renderRectWithoutShadow, EffectiveColor); buffer.DrawRectangle(renderRectWithoutShadow, EffectiveColor, Stroke); }
protected virtual void RenderOverride([NotNull] ConsoleBuffer buffer) { if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } if (Background != null) { buffer.FillBackgroundRectangle(new Rect(RenderSize), Background.Value); } buffer.FillForegroundRectangle(new Rect(RenderSize), EffectiveColor); }
protected override void RenderOverride(ConsoleBuffer buffer) { base.RenderOverride(buffer); if (_inlineSequence.IsEmpty) { return; } ConsoleColor color = EffectiveColor, background = EffectiveBackground; for (int y = 0; y < _lines.Count; y++) { List <InlineSegment> line = _lines[y]; int length = GetLineLength(line); int offset = 0; if (TextAlign == TextAlign.Left || TextAlign == TextAlign.Justify) { offset = 0; } else if (TextAlign == TextAlign.Center) { offset = (ActualWidth - length) / 2; } else if (TextAlign == TextAlign.Right) { offset = ActualWidth - length; } int x = offset; foreach (InlineSegment segment in line) { if (segment.Color != null) { color = segment.Color.Value; } if (segment.Background != null) { background = segment.Background.Value; } if (segment.TextBuilder != null) { string text = segment.ToString(); buffer.FillBackgroundRectangle(x, y, text.Length, 1, background); buffer.DrawString(x, y, color, text); x += text.Length; } } } }