github.com/Kintar/etxt@v0.0.0-20221224033739-2fc69f000137/examples/gtxt/rect_size/main.go (about) 1 //go:build gtxt 2 3 package main 4 5 import "os" 6 import "image" 7 import "image/color" 8 import "image/png" 9 import "path/filepath" 10 import "log" 11 import "fmt" 12 import "math/rand" 13 import "time" 14 import "strings" 15 16 import "github.com/Kintar/etxt" 17 18 // Must be compiled with '-tags gtxt' 19 20 func main() { 21 // we want random sentences in order to find the text size dynamically, 22 // so we start declaring different text fragments to combine later 23 who := []string{ 24 "my doggy", "methuselah", "the king", "the queen", "mr. skywalker", 25 "your little pony", "my banana", "gopher", "jigglypuff", "evil jin", 26 "the genius programmer", "your boyfriend", "the last samurai", 27 "the cute robot", "your ancestor's ghost", 28 } 29 what := []string{ 30 "climbs a tree", "writes a book", "stares at you", "commissions naughty art", 31 "smiles", "takes scenery pics", "pays the bill", "practices times tables", 32 "prays", "runs to take cover", "joins the chat", "downvotes your post", 33 "discovers the moon", "poops", "questions your sense of humor", 34 "re-opens the github issue", "talks to its clone", "arrives at the disco", 35 "spies the neighbours", "solves the hardest equation", "discusses geopolitics", 36 "gets mad at you for crossing the street", 37 } 38 how := []string{ 39 "while dancing", "in style", "while undressing", "while getting high", 40 "maniacally", "early in the morning", "right at the last moment", 41 "as the world ends", "without much fuss", "bare-chested", "periodically", 42 "every day", "with the gang", "without using the hands", 43 "with the eyes closed", "bored as hell", "while remembering the past", 44 } 45 46 // get font path 47 if len(os.Args) != 2 { 48 msg := "Usage: expects one argument with the path to the font to be used\n" 49 fmt.Fprint(os.Stderr, msg) 50 os.Exit(1) 51 } 52 53 // parse font 54 font, fontName, err := etxt.ParseFontFrom(os.Args[1]) 55 if err != nil { 56 log.Fatal(err) 57 } 58 fmt.Printf("Font loaded: %s\n", fontName) 59 60 // create cache 61 cache := etxt.NewDefaultCache(1024 * 1024 * 1024) // 1GB cache 62 63 // create and configure renderer 64 renderer := etxt.NewStdRenderer() 65 renderer.SetCacheHandler(cache.NewHandler()) 66 renderer.SetSizePx(16) 67 renderer.SetFont(font) 68 renderer.SetAlign(etxt.YCenter, etxt.XCenter) 69 renderer.SetColor(color.RGBA{0, 0, 0, 255}) // black 70 71 // generate the random sentences 72 rand.Seed(time.Now().UnixNano()) 73 sentences := make([]string, 2+rand.Intn(6)) 74 fmt.Printf("Generating %d sentences...\n", len(sentences)) 75 for i := 0; i < len(sentences); i++ { 76 sentence := who[rand.Intn(len(who))] + " " 77 sentence += what[rand.Intn(len(what))] + " " 78 sentence += how[rand.Intn(len(how))] 79 sentences[i] = sentence 80 } 81 fullText := strings.Join(sentences, "\n") 82 83 // determine how much space should it take to draw the sentences, 84 // plus a bit of vertical and horizontal padding 85 rect := renderer.SelectionRect(fullText) 86 w, h := rect.Width.Ceil()+8, rect.Height.Ceil()+8 87 88 // create target image and fill it with white 89 outImage := image.NewRGBA(image.Rect(0, 0, w, h)) 90 for i := 0; i < w*h*4; i++ { 91 outImage.Pix[i] = 255 92 } 93 94 // set target and draw 95 renderer.SetTarget(outImage) 96 renderer.Draw(fullText, w/2, h/2) 97 98 // store image as png 99 filename, err := filepath.Abs("gtxt_rect_size.png") 100 if err != nil { 101 log.Fatal(err) 102 } 103 fmt.Printf("Output image: %s\n", filename) 104 file, err := os.Create(filename) 105 if err != nil { 106 log.Fatal(err) 107 } 108 err = png.Encode(file, outImage) 109 if err != nil { 110 log.Fatal(err) 111 } 112 err = file.Close() 113 if err != nil { 114 log.Fatal(err) 115 } 116 fmt.Print("Program exited successfully.\n") 117 }