1+ // Code authored by Dean Edis (DeanTheCoder).
2+ // Anyone is free to copy, modify, use, compile, or distribute this software,
3+ // either in source code form or as a compiled binary, for any non-commercial
4+ // purpose.
5+ //
6+ // If you modify the code, please retain this copyright header,
7+ // and consider contributing back to the repository or letting us know
8+ // about your modifications. Your contributions are valued!
9+ //
10+ // THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND.
11+ using System ;
12+ using System . Diagnostics ;
13+ using DTC . Core . Extensions ;
14+ using G33kShell . Desktop . Console . Controls ;
15+ using JetBrains . Annotations ;
16+ using SkiaSharp ;
17+
18+ namespace G33kShell . Desktop . Console . Screensavers ;
19+
20+ /// <summary>
21+ /// A canvas to displaying the Xenon 2 Shopkeeper.
22+ /// </summary>
23+ [ DebuggerDisplay ( "XenonCanvas:{X},{Y} {Width}x{Height}" ) ]
24+ [ UsedImplicitly ]
25+ public class XenonCanvas : ScreensaverBase
26+ {
27+ private const string PngData = "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" ;
28+ private double [ , ] m_imageLums ;
29+
30+ public XenonCanvas ( int screenWidth , int screenHeight ) : base ( screenWidth , screenHeight , 1 )
31+ {
32+ Name = "xenon" ;
33+ }
34+
35+ public override void BuildScreen ( ScreenData screen )
36+ {
37+ // Resize background to match ASCII screen dimension.
38+ using var original = SKBitmap . Decode ( Convert . FromBase64String ( PngData ) ) ;
39+ using var background = original . Resize ( new SKSizeI ( screen . Width , screen . Height ) , SKFilterQuality . Medium ) ;
40+
41+ // Get base luminosity values.
42+ m_imageLums = new double [ screen . Width , screen . Height ] ;
43+ for ( var y = 0 ; y < screen . Height ; y ++ )
44+ {
45+ for ( var x = 0 ; x < screen . Width ; x ++ )
46+ {
47+ var luminosity = background . GetPixel ( x , y ) . Red / 255.0 ;
48+ m_imageLums [ x , y ] = Math . Pow ( luminosity , 1.5 ) ;
49+ }
50+ }
51+
52+ // Draw the image.
53+ for ( var y = 0 ; y < screen . Height ; y ++ )
54+ {
55+ for ( var x = 0 ; x < screen . Width ; x ++ )
56+ {
57+ var luminosity = m_imageLums [ x , y ] ;
58+ screen . PrintAt ( x , y , new Attr ( luminosity . ToAscii ( ) , luminosity . Lerp ( 0.3 , 1.0 ) . Lerp ( Background , Foreground ) , luminosity . Lerp ( 0.0 , 0.3 ) . Lerp ( Background , Foreground ) ) ) ;
59+ }
60+ }
61+ }
62+
63+ public override void UpdateFrame ( ScreenData screen )
64+ {
65+ }
66+ }
0 commit comments