From 6d74208ff461c4bfe2f325cb78a54f7272980497 Mon Sep 17 00:00:00 2001 From: Hans Kokx Date: Mon, 16 Mar 2026 13:33:48 +0100 Subject: [PATCH] Dramatically improve ASCII renderer Signed-off-by: Hans Kokx --- .../lib/wolf_3d_ascii_renderer.dart | 64 +++++++++++-------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/packages/wolf_3d_renderer/lib/wolf_3d_ascii_renderer.dart b/packages/wolf_3d_renderer/lib/wolf_3d_ascii_renderer.dart index 5b02179..97ae1a1 100644 --- a/packages/wolf_3d_renderer/lib/wolf_3d_ascii_renderer.dart +++ b/packages/wolf_3d_renderer/lib/wolf_3d_ascii_renderer.dart @@ -63,7 +63,7 @@ class _WolfAsciiRendererState extends State // Calculate frame synchronously and trigger UI rebuild setState(() { // 120x40 is a great sweet spot for text density vs aspect ratio - _asciiFrame = _asciiRasterizer.render(engine, FrameBuffer(120, 40)); + _asciiFrame = _asciiRasterizer.render(engine, FrameBuffer(160, 100)); }); } @@ -87,34 +87,48 @@ class _WolfAsciiRendererState extends State autofocus: true, onKeyEvent: (_) {}, // Added the missing argument here - child: _asciiFrame.isEmpty - ? const SizedBox.shrink() - : _buildAsciiFrame(_asciiFrame), + child: Center( + child: _asciiFrame.isEmpty + ? const SizedBox.shrink() + : AsciiFrameWidget(frameData: _asciiFrame), + ), ), ); } +} - Widget _buildAsciiFrame(List> frameData) { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - children: frameData.map((row) { - return RichText( - text: TextSpan( - style: const TextStyle( - fontFamily: 'Courier', - fontSize: 8, // Bumped slightly for better visibility - height: 1.0, - letterSpacing: 2.0, - ), - children: row.map((cell) { - return TextSpan( - text: cell.char, - style: TextStyle(color: cell.color), - ); - }).toList(), - ), - ); - }).toList(), +class AsciiFrameWidget extends StatelessWidget { + final List> frameData; + + const AsciiFrameWidget({super.key, required this.frameData}); + + @override + Widget build(BuildContext context) { + return FittedBox( + fit: BoxFit.contain, + child: Container( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: frameData.map((row) { + return RichText( + text: TextSpan( + style: const TextStyle( + fontFamily: 'monospace', + height: 1.0, + letterSpacing: 2.0, + ), + children: row.map((cell) { + return TextSpan( + text: cell.char, + style: TextStyle(color: cell.color), + ); + }).toList(), + ), + ); + }).toList(), + ), + ), ); } }