From dee65c4188070c5a9a10d7e75a3b290f715562fd Mon Sep 17 00:00:00 2001 From: Brian Buller Date: Wed, 24 Sep 2025 17:40:01 -0500 Subject: [PATCH] Ascii Art Widget --- wdgt_asciiarttext.go | 443 ++++++++++++++++++++++++++++++++++++++++++ wdgt_linear_layout.go | 15 ++ 2 files changed, 458 insertions(+) create mode 100644 wdgt_asciiarttext.go diff --git a/wdgt_asciiarttext.go b/wdgt_asciiarttext.go new file mode 100644 index 0000000..5cd61d5 --- /dev/null +++ b/wdgt_asciiarttext.go @@ -0,0 +1,443 @@ +/* +Copyright © Brian Buller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +package widgets + +import ( + "fmt" + "time" + "unicode" + + "github.com/gdamore/tcell" +) + +// ArtWidget displays it's text as ascii art. +type ArtWidget struct { + id string + x, y int + w, h int + style tcell.Style + + active bool + visible bool + focusable bool + + font string + text string + keyMap KeyMap + + allFonts []ArtWidgetFont + currFont ArtWidgetFont + + logger func(string, ...any) +} + +var _ Widget = (*ArtWidget)(nil) + +func NewArtWidget(id string, st tcell.Style) *ArtWidget { + ret := &ArtWidget{} + ret.Init(id, st) + return ret +} + +func (w *ArtWidget) Init(id string, st tcell.Style) { + w.id = id + w.style = st + w.keyMap = BlankKeyMap() + w.initFonts() +} +func (w *ArtWidget) Id() string { return w.id } +func (w *ArtWidget) HandleResize(ev *tcell.EventResize) { w.w, w.h = ev.Size() } +func (w *ArtWidget) SetKeyMap(km KeyMap) { w.keyMap = km } +func (w *ArtWidget) AddToKeyMap(km KeyMap) { w.keyMap.Merge(km) } +func (w *ArtWidget) RemoveFromKeyMap(km KeyMap) { + for k := range km.Keys { + w.keyMap.Remove(k) + } + for r := range km.Runes { + w.keyMap.RemoveRune(r) + } +} +func (w *ArtWidget) HandleKey(ev *tcell.EventKey) bool { return false } +func (w *ArtWidget) HandleTime(ev *tcell.EventTime) {} +func (w *ArtWidget) Draw(screen tcell.Screen) { + x, y := w.x, w.y + for _, ch := range w.text { + w.drawRune(ch, x, y, screen) + x += w.getRuneWidth(ch) + } +} + +func (w *ArtWidget) drawRune(r rune, x, y int, screen tcell.Screen) { + wx, wy := x, y + rs := w.getRune(r) + for _, ln := range rs { + wx = x + for _, d := range ln { + screen.SetContent(wx, wy, d, nil, w.style) + wx++ + } + wy++ + } +} + +func (w *ArtWidget) getRune(r rune) [][]rune { return w.currFont.GetRune(r) } +func (w *ArtWidget) getRuneHeight(r rune) int { return len(w.getRune(r)) } +func (w *ArtWidget) getRuneWidth(r rune) int { + rn := w.getRune(r) + if len(rn) > 0 { + return len(rn[0]) + } + return 0 +} + +func (w *ArtWidget) Active() bool { return w.active } +func (w *ArtWidget) SetActive(a bool) { w.active = a } +func (w *ArtWidget) Visible() bool { return w.visible } +func (w *ArtWidget) SetVisible(v bool) { w.visible = v } +func (w *ArtWidget) Focusable() bool { return w.focusable } +func (w *ArtWidget) SetFocusable(t bool) { w.focusable = t } +func (w *ArtWidget) SetX(x int) { w.x = x } +func (w *ArtWidget) SetY(y int) { w.y = y } +func (w *ArtWidget) GetX() int { return w.x } +func (w *ArtWidget) GetY() int { return w.y } +func (w *ArtWidget) GetPos() Coord { return Coord{X: w.x, Y: w.y} } +func (w *ArtWidget) SetPos(pos Coord) { w.x, w.y = pos.X, pos.Y } +func (w *ArtWidget) SetSize(size Coord) { w.w, w.h = size.X, size.Y } +func (w *ArtWidget) SetW(wd int) { w.w = wd } +func (w *ArtWidget) SetH(h int) { w.h = h } +func (w *ArtWidget) GetW() int { return w.w } +func (w *ArtWidget) GetH() int { return w.h } + +func (w *ArtWidget) WantW() int { + var wd int + for _, ch := range w.text { + r := w.getRune(ch) + if len(r) > 0 { + wd += len(r[0]) + } + } + w.Log("%s: Want Width: %d", w.Id(), wd) + return wd +} + +func (w *ArtWidget) WantH() int { + h := len(w.getRune('Q')) + w.Log("%s: Want Height: %d", w.Id(), h) + return h +} +func (w *ArtWidget) MinW() int { return w.WantW() } +func (w *ArtWidget) MinH() int { return w.WantH() } + +func (w *ArtWidget) SetText(txt string) { w.text = txt } +func (w *ArtWidget) GetText() string { return w.text } + +func (w *ArtWidget) SetFont(fnt string) { w.font = fnt } +func (w *ArtWidget) GetFont() string { return w.font } + +func (w *ArtWidget) initFonts() { + f := NewArtWidgetFont("miniwi") + f.SetRune('a', [][]rune{{' ', ' '}, {'▀', '▌'}, {'█', '▌'}, {' ', ' '}}) + f.SetRune('b', [][]rune{{'▌', ' '}, {'▛', '▌'}, {'▙', '▌'}, {' ', ' '}}) + f.SetRune('c', [][]rune{{' ', ' '}, {'▛', '▘'}, {'▙', '▖'}, {' ', ' '}}) + f.SetRune('d', [][]rune{{' ', '▌'}, {'▛', '▌'}, {'▙', '▌'}, {' ', ' '}}) + f.SetRune('e', [][]rune{{' ', ' '}, {'█', '▌'}, {'▙', '▖'}, {' ', ' '}}) + f.SetRune('f', [][]rune{{'▐', '▘'}, {'▜', '▘'}, {'▐', ' '}, {' ', ' '}}) + f.SetRune('g', [][]rune{{' ', ' '}, {'▛', '▌'}, {'▙', '▌'}, {'▄', '▌'}}) + f.SetRune('h', [][]rune{{'▌', ' '}, {'▛', '▌'}, {'▌', '▌'}, {' ', ' '}}) + f.SetRune('i', [][]rune{{'▘'}, {'▌'}, {'▌'}, {' '}}) + f.SetRune('j', [][]rune{{' ', '▘'}, {' ', '▌'}, {' ', '▌'}, {'▙', '▌'}}) + f.SetRune('k', [][]rune{{'▌', ' '}, {'▙', '▘'}, {'▛', '▖'}, {' ', ' '}}) + f.SetRune('l', [][]rune{{'▜', ' '}, {'▐', ' '}, {'▐', '▖'}, {' ', ' '}}) + f.SetRune('m', [][]rune{{' ', ' ', ' '}, {'▛', '▛', '▌'}, {'▌', '▌', '▌'}, {' ', ' ', ' '}}) + f.SetRune('n', [][]rune{{' ', ' '}, {'▛', '▌'}, {'▌', '▌'}, {' ', ' '}}) + f.SetRune('o', [][]rune{{' ', ' '}, {'▛', '▌'}, {'▙', '▌'}, {' ', ' '}}) + f.SetRune('p', [][]rune{{' ', ' '}, {'▛', '▌'}, {'▙', '▌'}, {'▌', ' '}}) + f.SetRune('q', [][]rune{{' ', ' '}, {'▛', '▌'}, {'▙', '▌'}, {' ', '▌'}}) + f.SetRune('r', [][]rune{{' ', ' '}, {'▛', '▘'}, {'▌', ' '}, {' ', ' '}}) + f.SetRune('s', [][]rune{{' ', ' '}, {'▛', '▘'}, {'▄', '▌'}, {' ', ' '}}) + f.SetRune('t', [][]rune{{'▗', ' '}, {'▜', '▘'}, {'▐', '▖'}, {' ', ' '}}) + f.SetRune('u', [][]rune{{' ', ' '}, {'▌', '▌'}, {'▙', '▌'}, {' ', ' '}}) + f.SetRune('v', [][]rune{{' ', ' '}, {'▌', '▌'}, {'▚', '▘'}, {' ', ' '}}) + f.SetRune('w', [][]rune{{' ', ' ', ' '}, {'▌', '▌', '▌'}, {'▚', '▚', '▘'}, {' ', ' ', ' '}}) + f.SetRune('x', [][]rune{{' ', ' '}, {'▚', '▘'}, {'▞', '▖'}, {' ', ' '}}) + f.SetRune('y', [][]rune{{' ', ' '}, {'▌', '▌'}, {'▙', '▌'}, {'▄', '▌'}}) + f.SetRune('z', [][]rune{{' ', ' '}, {'▀', '▌'}, {'▙', '▖'}, {' ', ' '}}) + f.SetRune('A', [][]rune{{'▄', '▖'}, {'▌', '▌'}, {'▛', '▌'}, {' ', ' '}}) + f.SetRune('B', [][]rune{{'▄', ' '}, {'▙', '▘'}, {'▙', '▘'}, {' ', ' '}}) + f.SetRune('C', [][]rune{{'▄', '▖'}, {'▌', ' '}, {'▙', '▖'}, {' ', ' '}}) + f.SetRune('D', [][]rune{{'▄', ' '}, {'▌', '▌'}, {'▙', '▘'}, {' ', ' '}}) + f.SetRune('E', [][]rune{{'▄', '▖'}, {'▙', '▖'}, {'▙', '▖'}, {' ', ' '}}) + f.SetRune('F', [][]rune{{'▄', '▖'}, {'▙', '▖'}, {'▌', ' '}, {' ', ' '}}) + f.SetRune('G', [][]rune{{'▄', '▖'}, {'▌', ' '}, {'▙', '▌'}, {' ', ' '}}) + f.SetRune('H', [][]rune{{'▖', '▖'}, {'▙', '▌'}, {'▌', '▌'}, {' ', ' '}}) + f.SetRune('I', [][]rune{{'▄', '▖'}, {'▐', ' '}, {'▟', '▖'}, {' ', ' '}}) + f.SetRune('J', [][]rune{{' ', '▖'}, {' ', '▌'}, {'▙', '▌'}, {' ', ' '}}) + f.SetRune('K', [][]rune{{'▖', '▖'}, {'▙', '▘'}, {'▌', '▌'}, {' ', ' '}}) + f.SetRune('L', [][]rune{{'▖', ' '}, {'▌', ' '}, {'▙', '▖'}, {' ', ' '}}) + f.SetRune('M', [][]rune{{'▖', ' ', ' ', '▖'}, {'▛', '▖', '▞', '▌'}, {'▌', '▝', ' ', '▌'}, {' ', ' ', ' ', ' '}}) + f.SetRune('N', [][]rune{{'▖', ' ', '▖'}, {'▛', '▖', '▌'}, {'▌', '▝', '▌'}, {' ', ' ', ' '}}) + f.SetRune('O', [][]rune{{'▄', '▖'}, {'▌', '▌'}, {'▙', '▌'}, {' ', ' '}}) + f.SetRune('P', [][]rune{{'▄', '▖'}, {'▙', '▌'}, {'▌', ' '}, {' ', ' '}}) + f.SetRune('Q', [][]rune{{'▄', '▖'}, {'▌', '▌'}, {'█', '▌'}, {' ', '▘'}}) + f.SetRune('R', [][]rune{{'▄', '▖'}, {'▙', '▘'}, {'▌', '▌'}, {' ', ' '}}) + f.SetRune('S', [][]rune{{'▄', '▖'}, {'▚', ' '}, {'▄', '▌'}, {' ', ' '}}) + f.SetRune('T', [][]rune{{'▄', '▖'}, {'▐', ' '}, {'▐', ' '}, {' ', ' '}}) + f.SetRune('U', [][]rune{{'▖', '▖'}, {'▌', '▌'}, {'▙', '▌'}, {' ', ' '}}) + f.SetRune('V', [][]rune{{'▖', '▖'}, {'▌', '▌'}, {'▚', '▘'}, {' ', ' '}}) + f.SetRune('W', [][]rune{{'▖', ' ', ' ', '▖'}, {'▌', '▞', '▖', '▌'}, {'▛', ' ', '▝', '▌'}, {' ', ' ', ' ', ' '}}) + f.SetRune('X', [][]rune{{'▖', '▖'}, {'▚', '▘'}, {'▌', '▌'}, {' ', ' '}}) + f.SetRune('Y', [][]rune{{'▖', '▖'}, {'▌', '▌'}, {'▐', ' '}, {' ', ' '}}) + f.SetRune('Z', [][]rune{{'▄', '▖'}, {'▗', '▘'}, {'▙', '▖'}, {' ', ' '}}) + f.SetRune(' ', [][]rune{{' ', ' '}, {' ', ' '}, {' ', ' '}, {' ', ' '}}) + w.allFonts = append(w.allFonts, *f) + w.currFont = *f +} + +func (w *ArtWidget) SetLogger(l func(string, ...any)) { w.logger = l } +func (w *ArtWidget) Log(txt string, args ...any) { + if w.logger != nil { + txt = fmt.Sprintf("%s:%s", time.Now().Format(time.TimeOnly), txt) + w.logger(txt, args...) + } +} + +type ArtWidgetFont struct { + name string + runes map[rune][][]rune +} + +func NewArtWidgetFont(nm string) *ArtWidgetFont { + return &ArtWidgetFont{ + name: nm, + runes: make(map[rune][][]rune), + } +} + +func (f *ArtWidgetFont) HasLower() bool { + // Naively just check if the map has an 'a' element + _, ok := f.runes['a'] + return ok +} +func (f *ArtWidgetFont) SetRune(r rune, bts [][]rune) { f.runes[r] = bts } + +func (f *ArtWidgetFont) GetRune(r rune) [][]rune { + if bts, ok := f.runes[r]; ok { + return bts + } + if bts, ok := f.runes[unicode.ToUpper(r)]; ok { + return bts + } + if bts, ok := f.runes[unicode.ToLower(r)]; ok { + return bts + } + return [][]rune{} +} + +func (f *ArtWidgetFont) RuneWidth(r rune) int { + bts := f.GetRune(r) + if len(bts) > 0 { + return len(bts[0]) + } + return 0 +} + +func (f *ArtWidgetFont) RuneHeight(r rune) int { + return len(f.GetRune(r)) +} + +/* +# Big +## Uppercase + ____ _____ _____ ______ ______ _____ _ _ _____ _ _ __ __ _ _ ____ _____ ____ _____ _____ _______ _ ___ ____ ____ ____ ________ + /\ | _ \ / ____| __ \| ____| ____/ ____| | | |_ _| | | | | \/ | \ | |/ __ \| __ \ / __ \| __ \ / ____|__ __| | | \ \ / /\ \ / /\ \ / /\ \ / /___ / + / \ | |_) | | | | | | |__ | |__ | | __| |__| | | | | | | | \ / | \| | | | | |__) | | | | |__) | (___ | | | | | |\ \ / / \ \ /\ / / \ V / \ \_/ / / / + / /\ \ | _ <| | | | | | __| | __|| | |_ | __ | | | _ | | | | |\/| | . ` | | | | ___/| | | | _ / \___ \ | | | | | | \ \/ / \ \/ \/ / > < \ / / / + / ____ \| |_) | |____| |__| | |____| | | |__| | | | |_| || |__| | |____| | | | |\ | |__| | | | |__| | | \ \ ____) | | | | |__| | \ / \ /\ / / . \ | | / /__ + /_/ \_\____/ \_____|_____/|______|_| \_____|_| |_|_____\____/|______|_| |_|_| \_|\____/|_| \___\_\_| \_\_____/ |_| \____/ \/ \/ \/ /_/ \_\ |_| /_____| +## Lowercase + _ _ __ _ _ _ _ _ _ + | | | | / _| | | (_|_) | | | | | + __ _| |__ ___ __| | ___| |_ __ _| |__ _ _| | _| |_ __ ___ _ __ ___ _ __ __ _ _ __ ___| |_ _ ___ ____ ____ ___ _ ____ + / _` | '_ \ / __/ _` |/ _ \ _/ _` | '_ \| | | |/ / | '_ ` _ \| '_ \ / _ \| '_ \ / _` | '__/ __| __| | | \ \ / /\ \ /\ / /\ \/ / | | |_ / + | (_| | |_) | (_| (_| | __/ || (_| | | | | | | <| | | | | | | | | | (_) | |_) | (_| | | \__ \ |_| |_| |\ V / \ V V / > <| |_| |/ / + \__,_|_.__/ \___\__,_|\___|_| \__, |_| |_|_| |_|\_\_|_| |_| |_|_| |_|\___/| .__/ \__, |_| |___/\__|\__,_| \_/ \_/\_/ /_/\_\\__, /___| + __/ | _/ | | | | | __/ | + |___/ |__/ |_| |_| |___/ + +# BlurVision + ░▒▓██████▓▒░░▒▓███████▓▒░ ░▒▓██████▓▒░░▒▓███████▓▒░░▒▓████████▓▒░▒▓████████▓▒░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓██████████████▓▒░░▒▓███████▓▒░ ░▒▓██████▓▒░░▒▓███████▓▒░ ░▒▓██████▓▒░░▒▓███████▓▒░ ░▒▓███████▓▒░▒▓████████▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓████████▓▒░ +░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ +░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓██▓▒░ +░▒▓████████▓▒░▒▓███████▓▒░░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓██████▓▒░ ░▒▓██████▓▒░░▒▓█▓▒▒▓███▓▒░▒▓████████▓▒░▒▓█▓▒░ ░▒▓█▓▒░▒▓███████▓▒░░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░ ░▒▓██████▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░░▒▓██████▓▒░ ░▒▓██████▓▒░ ░▒▓██▓▒░ +░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓██▓▒░ +░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▓�▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ +░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░ ░▒▓██████▓▒░░▒▓███████▓▒░░▒▓████████▓▒░▒▓█▓▒░ ░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓████████▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓██████▓▒░░▒▓█▓▒░ ░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░ ░▒▓█▓▒░ ░▒▓██████▓▒░ ░▒▓██▓▒░ ░▒▓█████████████▓▒░░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓████████▓▒░ + ░▒▓█▓▒░ + ░▒▓██▓▒░ + +# Bulbhead + __ ____ ___ ____ ____ ____ ___ _ _ ____ ____ _ _ __ __ __ _ _ _____ ____ _____ ____ ___ ____ __ __ _ _ _ _ _ _ _ _ ____ + /__\ ( _ \ / __)( _ \( ___)( ___)/ __)( )_( )(_ _) (_ _)( )/ )( ) ( \/ )( \( )( _ )( _ \( _ )( _ \/ __)(_ _)( )( )( \/ )( \/\/ )( \/ )( \/ )(_ ) + /(__)\ ) _ <( (__ )(_) ))__) )__)( (_-. ) _ ( _)(_ .-_)( ) ( )(__ ) ( ) ( )(_)( )___/ )(_)( ) /\__ \ )( )(__)( \ / ) ( ) ( \ / / /_ +(__)(__)(____/ \___)(____/(____)(__) \___/(_) (_)(____)\____) (_)\_)(____)(_/\/\_)(_)\_)(_____)(__) (___/\\(_)\_)(___/ (__) (______) \/ (__/\__)(_/\_) (__) (____) + +# Crawford2 + ____ ____ __ ___ ___ _____ ____ __ __ ____ ____ __ _ _ ___ ___ ____ ___ ____ ___ ____ _____ ______ __ __ __ __ __ __ __ __ __ __ _____ + / || \ / ]| \ / _]| | / || | || || || |/ ]| | | | || \ / \ | \ / \ | \ / ___/| || | || | || |__| || | || | || | +| o || o ) / / | \ / [_ | __|| __|| | | | | |__ || ' / | | | _ _ || _ || || o ) || D )( \_ | || | || | || | | || | || | ||__/ | +| || |/ / | D || _]| |_ | | || _ | | | __| || \ | |___ | \_/ || | || O || _/| Q || / \__ ||_| |_|| | || | || | | ||_ _|| ~ || __| +| _ || O / \_ | || [_ | _] | |_ || | | | |/ | || \| || | || | || || | | || \ / \ | | | | : || : || ` ' || ||___, || / | +| | || \ || || || | | || | | | |\ ` || . || || | || | || || | | || . \ \ | | | | | \ / \ / | | || || | +|__|__||_____|\____||_____||_____||__| |___,_||__|__||____|\____||__|\_||_____||___|___||__|__| \___/ |__| \__,_||__|\_| \___| |__| \__,_| \_/ \_/\_/ |__|__||____/ |_____| + +# Doom +## Uppercase + ___ ______ ___________ ___________ _____ _ _ _____ ___ _ __ _ ___ ___ _ _ ___________ ___________ _____ _____ _ _ _ _ _ ___ ____ ________ + / _ \ | ___ \/ __ \ _ \ ___| ___| __ \| | | |_ _| |_ | | / /| | | \/ || \ | | _ | ___ \ _ | ___ \/ ___|_ _| | | | | | || | | \ \ / /\ \ / /___ / +/ /_\ \| |_/ /| / \/ | | | |__ | |_ | | \/| |_| | | | | | |/ / | | | . . || \| | | | | |_/ / | | | |_/ /\ `--. | | | | | | | | || | | |\ V / \ V / / / +| _ || ___ \| | | | | | __|| _| | | __ | _ | | | | | \ | | | |\/| || . ` | | | | __/| | | | / `--. \ | | | | | | | | || |/\| |/ \ \ / / / +| | | || |_/ /| \__/\ |/ /| |___| | | |_\ \| | | |_| |_/\__/ / |\ \| |____| | | || |\ \ \_/ / | \ \/' / |\ \ /\__/ / | | | |_| \ \_/ /\ /\ / /^\ \ | | ./ /___ +\_| |_/\____/ \____/___/ \____/\_| \____/\_| |_/\___/\____/\_| \_/\_____/\_| |_/\_| \_/\___/\_| \_/\_\_| \_|\____/ \_/ \___/ \___/ \/ \/\/ \/ \_/ \_____/ + +## Lowercase + _ _ __ _ _ _ _ _ _ + | | | | / _| | | (_|_) | | | | | + __ _| |__ ___ __| | ___| |_ __ _| |__ _ _| | _| |_ __ ___ _ __ ___ _ __ __ _ _ __ ___| |_ _ ___ ____ ____ ___ _ ____ + / _` | '_ \ / __/ _` |/ _ \ _/ _` | '_ \| | | |/ / | '_ ` _ \| '_ \ / _ \| '_ \ / _` | '__/ __| __| | | \ \ / /\ \ /\ / /\ \/ / | | |_ / +| (_| | |_) | (_| (_| | __/ || (_| | | | | | | <| | | | | | | | | | (_) | |_) | (_| | | \__ \ |_| |_| |\ V / \ V V / > <| |_| |/ / + \__,_|_.__/ \___\__,_|\___|_| \__, |_| |_|_| |_|\_\_|_| |_| |_|_| |_|\___/| .__/ \__, |_| |___/\__|\__,_| \_/ \_/\_/ /_/\_\\__, /___| + __/ | _/ | | | | | __/ | + |___/ |__/ |_| |_| |___/ + +# Epic +## Uppercase + _______ ______ _______ ______ _______ _______ _______ __________________ _ _ _______ _ _______ _______ _______ _______ _______ _________ _______ +( ___ )( ___ \ ( ____ \( __ \ ( ____ \( ____ \( ____ \|\ /|\__ __/\__ _/| \ /\( \ ( )( ( /|( ___ )( ____ )( ___ )( ____ )( ____ \\__ __/|\ /||\ /||\ /||\ /||\ /|/ ___ ) +| ( ) || ( ) )| ( \/| ( \ )| ( \/| ( \/| ( \/| ) ( | ) ( ) ( | \ / /| ( | () () || \ ( || ( ) || ( )|| ( ) || ( )|| ( \/ ) ( | ) ( || ) ( || ) ( |( \ / )( \ / )\/ ) | +| (___) || (__/ / | | | | ) || (__ | (__ | | | (___) | | | | | | (_/ / | | | || || || \ | || | | || (____)|| | | || (____)|| (_____ | | | | | || | | || | _ | | \ (_) / \ (_) / / ) +| ___ || __ ( | | | | | || __) | __) | | ____ | ___ | | | | | | _ ( | | | |(_)| || (\ \) || | | || _____)| | | || __)(_____ ) | | | | | |( ( ) )| |( )| | ) _ ( \ / / / +| ( ) || ( \ \ | | | | ) || ( | ( | | \_ )| ( ) | | | | | | ( \ \ | | | | | || | \ || | | || ( | | /\| || (\ ( ) | | | | | | | \ \_/ / | || || | / ( ) \ ) ( / / +| ) ( || )___) )| (____/\| (__/ )| (____/\| ) | (___) || ) ( |___) (___|\_) ) | / \ \| (____/\| ) ( || ) \ || (___) || ) | (_\ \ || ) \ \__/\____) | | | | (___) | \ / | () () |( / \ ) | | / (_/\ +|/ \||/ \___/ (_______/(______/ (_______/|/ (_______)|/ \|\_______/(____/ |_/ \/(_______/|/ \||/ )_)(_______)|/ (____\/_)|/ \__/\_______) )_( (_______) \_/ (_______)|/ \| \_/ (_______/ + +# Graceful + __ ____ ___ ____ ____ ____ ___ _ _ __ __ __ _ __ _ _ __ _ __ ____ __ ____ ____ ____ _ _ _ _ _ _ _ _ _ _ ____ + / _\ ( _ \ / __)( \( __)( __)/ __)/ )( \( ) _( )( / )( ) ( \/ )( ( \ / \( _ \ / \ ( _ \/ ___)(_ _)/ )( \/ )( \/ )( \( \/ )( \/ )(__ ) +/ \ ) _ (( (__ ) D ( ) _) ) _)( (_ \) __ ( )( / \) \ ) ( / (_/\/ \/ \/ /( O )) __/( O ) ) /\___ \ )( ) \/ (\ \/ /\ /\ / ) ( ) / / _/ +\_/\_/(____/ \___)(____/(____)(__) \___/\_)(_/(__)\____/(__\_)\____/\_)(_/\_)__) \__/(__) \__\)(__\_)(____/ (__) \____/ \__/ (_/\_)(_/\_)(__/ (____) + +# Graffiti +## Uppercase + _____ ___________________ ________ ______________________________ ___ ___ .___ ____.____ __.____ _____ _______ ________ __________________ __________ ________________________ _______ ______ ______ ________.___.__________ + / _ \\______ \_ ___ \\______ \ \_ _____/\_ _____/ _____/ / | \| | | | |/ _| | / \ \ \ \_____ \\______ \_____ \\______ \/ _____/\__ ___/ | \ \ / / \ / \ \/ /\__ | |\____ / + / /_\ \| | _/ \ \/ | | \ | __)_ | __)/ \ ___/ ~ \ | | | < | | / \ / \ / | \ / | \| ___// / \ \| _/\_____ \ | | | | /\ Y /\ \/\/ /\ / / | | / / +/ | \ | \ \____| ` \| \ | \ \ \_\ \ Y / /\__| | | \| |___/ Y \/ | \/ | \ | / \_/. \ | \/ \ | | | | / \ / \ / / \ \____ | / /_ +\____|__ /______ /\______ /_______ /_______ / \___ / \______ /\___|_ /|___\________|____|__ \_______ \____|__ /\____|__ /\_______ /____| \_____\ \_/____|_ /_______ / |____| |______/ \___/ \__/\ / /___/\ \ / ______|/_______ \ + \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \__> \/ \/ \/ \_/ \/ \/ + +## Lowercase + ___. .___ _____ .__ .__ __ __ .__ __ +_____ \_ |__ ____ __| _/_____/ ____\____ | |__ |__| |__| | _| | _____ ____ ____ ______ _____________ _______/ |_ __ _____ ____ _ _____ ______.__.________ +\__ \ | __ \_/ ___\ / __ |/ __ \ __\/ ___\| | \| | | | |/ / | / \ / \ / _ \\____ \ / ____/\_ __ \/ ___/\ __\ | \ \/ /\ \/ \/ /\ \/ < | |\___ / + / __ \| \_\ \ \___/ /_/ \ ___/| | / /_/ > Y \ | | | <| |_| Y Y \ | ( <_> ) |_> >< <_| | | | \/\___ \ | | | | /\ / \ / > < \___ | / / +(____ /___ /\___ >____ |\___ >__| \___ /|___| /__/\__| |__|_ \____/__|_| /___| /\____/| __/ \__ | |__| /____ > |__| |____/ \_/ \/\_/ /__/\_ \/ ____|/_____ \ + \/ \/ \/ \/ \/ /_____/ \/ \______| \/ \/ \/ |__| |__| \/ \/\/ \/ + +# miniwi +## Uppercase +▄▖▄ ▄▖▄ ▄▖▄▖▄▖▖▖▄▖ ▖▖▖▖ ▖ ▖▖ ▖▄▖▄▖▄▖▄▖▄▖▄▖▖▖▖▖▖ ▖▖▖▖▖▄▖ +▌▌▙▘▌ ▌▌▙▖▙▖▌ ▙▌▐ ▌▙▘▌ ▛▖▞▌▛▖▌▌▌▙▌▌▌▙▘▚ ▐ ▌▌▌▌▌▞▖▌▚▘▌▌▗▘ +▛▌▙▘▙▖▙▘▙▖▌ ▙▌▌▌▟▖▙▌▌▌▙▖▌▝ ▌▌▝▌▙▌▌ █▌▌▌▄▌▐ ▙▌▚▘▛ ▝▌▌▌▐ ▙▖ + ▘ +## Lowercase + ▌ ▌ ▐▘ ▌ ▘ ▘▌ ▜ ▗ +▀▌▛▌▛▘▛▌█▌▜▘▛▌▛▌▌ ▌▙▘▐ ▛▛▌▛▌▛▌▛▌▛▌▛▘▛▘▜▘▌▌▌▌▌▌▌▚▘▌▌▀▌ +█▌▙▌▙▖▙▌▙▖▐ ▙▌▌▌▌ ▌▛▖▐▖▌▌▌▌▌▙▌▙▌▙▌▌ ▄▌▐▖▙▌▚▘▚▚▘▞▖▙▌▙▖ + ▄▌ ▙▌ ▌ ▌ ▄▌ + +# Shaded Blocky +░░ ░░░ ░░░░ ░░░ ░░░ ░░ ░░░ ░░░ ░░░░ ░░ ░░ ░░ ░░░░ ░░ ░░░░░░░░ ░░░░ ░░ ░░░ ░░░ ░░░ ░░░░ ░░░ ░░░░ ░░░ ░░ ░░░░ ░░ ░░░░ ░░ ░░░░ ░░ ░░░░ ░░ ░░░░ ░░ ░ +▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒ ▒▒ ▒▒▒ ▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒ ▒ ▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒▒▒▒▒ ▒▒ +▓ ▓▓▓▓ ▓▓ ▓▓▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓ ▓▓ ▓▓▓▓ ▓▓▓▓ ▓▓▓ ▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓ ▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓▓▓ ▓▓ ▓ ▓ ▓▓ ▓▓▓▓ ▓▓ ▓▓▓ ▓▓ ▓ ▓▓ ▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓ ▓▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓▓▓ ▓▓▓▓ +█ ██ ████ ██ ████ ██ ████ ██ ████████ ████████ ████ ██ ████ █████ █████ ████ ██ ███ ███ ████████ █ █ ██ ██ ██ ████ ██ ████████ ███ ██ ███ █████████ █████ █████ ████ ████ ████ ██ ███ ██ ██████ ██████ ██████ +█ ████ ██ ████ ███ ███ ██ █████████ ███ ████ ██ ███ ███ ████ ██ ██ ████ ██ ███ ███ ███ █████████ █ █ ████ ███ ██████ ██████ ██████ █████ ████ ██ ████ █████ █████ █ + +# Slant +## Uppercase + ___ ____ __________ ____________________ ______ ____ __ __ __ ____ ______ ____ ____ ____ _____________ ___ ___ ___ ____ _______ + / | / __ )/ ____/ __ \/ ____/ ____/ ____/ / / / _/ / / //_// / / |/ / | / / __ \/ __ \/ __ \ / __ \/ ___/_ __/ / / / | / / | / / |/ /\ \/ /__ / + / /| | / __ / / / / / / __/ / /_ / / __/ /_/ // /__ / / ,< / / / /|_/ / |/ / / / / /_/ / / / / / /_/ /\__ \ / / / / / /| | / /| | /| / /| / \ / / / + / ___ |/ /_/ / /___/ /_/ / /___/ __/ / /_/ / __ // // /_/ / /| |/ /___/ / / / /| / /_/ / ____/ /_/ / / _, _/___/ // / / /_/ / | |/ / | |/ |/ // | / / / /__ +/_/ |_/_____/\____/_____/_____/_/ \____/_/ /_/___/\____/_/ |_/_____/_/ /_/_/ |_/\____/_/ \___\_\/_/ |_|/____//_/ \____/ |___/ |__/|__//_/|_| /_/ /____/ + +## Lowercase + __ __ ____ __ _ _ __ __ __ + ____ _/ /_ _________/ /__ / __/___ _/ /_ (_) (_) /__/ /___ ___ ____ ____ ____ ____ ___________/ /___ ___ ___ ___ ____ ______ + / __ `/ __ \/ ___/ __ / _ \/ /_/ __ `/ __ \/ / / / //_/ / __ `__ \/ __ \/ __ \/ __ \/ __ `/ ___/ ___/ __/ / / / | / / | /| / / |/_/ / / /_ / +/ /_/ / /_/ / /__/ /_/ / __/ __/ /_/ / / / / / / / ,< / / / / / / / / / / /_/ / /_/ / /_/ / / (__ ) /_/ /_/ /| |/ /| |/ |/ />