|
|
@@ -0,0 +1,114 @@ |
|
|
|
package main |
|
|
|
|
|
|
|
import ( |
|
|
|
"fmt" |
|
|
|
"image/color" |
|
|
|
"os" |
|
|
|
"path/filepath" |
|
|
|
"time" |
|
|
|
|
|
|
|
"github.com/fogleman/gg" |
|
|
|
"github.com/writeas/web-core/log" |
|
|
|
) |
|
|
|
|
|
|
|
func main() { |
|
|
|
log.Info("Starting...") |
|
|
|
start := time.Now() |
|
|
|
err := run() |
|
|
|
if err != nil { |
|
|
|
log.Error("%s", err) |
|
|
|
os.Exit(1) |
|
|
|
} |
|
|
|
log.Info("Completed in %s", time.Since(start)) |
|
|
|
} |
|
|
|
|
|
|
|
func loadFont(dc *gg.Context, bold bool, points float64) error { |
|
|
|
fontLoraBoldPath := filepath.Join("fonts", "Lora-Bold.ttf") |
|
|
|
fontLoraPath := filepath.Join("fonts", "Lora-Regular.ttf") |
|
|
|
path := fontLoraPath |
|
|
|
if bold { |
|
|
|
path = fontLoraBoldPath |
|
|
|
} |
|
|
|
|
|
|
|
err := dc.LoadFontFace(path, points) |
|
|
|
if err != nil { |
|
|
|
return fmt.Errorf("load bold font: %s", err) |
|
|
|
} |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
func run() error { |
|
|
|
w := 900 |
|
|
|
h := 900 |
|
|
|
wf := float64(w) |
|
|
|
hf := float64(h) |
|
|
|
dc := gg.NewContext(w, h) |
|
|
|
dc.DrawRectangle(0, 0, wf, hf) |
|
|
|
dc.SetRGB(1, 1, 1) |
|
|
|
dc.Fill() |
|
|
|
|
|
|
|
// Define margins for footer text |
|
|
|
footerFontSize := 32.0 |
|
|
|
footerMargin := 20.0 |
|
|
|
x := footerMargin |
|
|
|
y := footerMargin |
|
|
|
footerMarginY := 20.0 |
|
|
|
|
|
|
|
// Content parameters |
|
|
|
contentFontSize := 48.0 |
|
|
|
lineSpacing := 1.8 |
|
|
|
contentRightMargin := 50.0 |
|
|
|
contentTopMargin := 50.0 |
|
|
|
|
|
|
|
// Create bold instance name |
|
|
|
err := loadFont(dc, true, footerFontSize) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
instance := "write.as" |
|
|
|
baseTextWidth, textHeight := dc.MeasureString(instance) |
|
|
|
|
|
|
|
// Create user path |
|
|
|
err = loadFont(dc, false, footerFontSize) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
dc.SetColor(color.Black) |
|
|
|
|
|
|
|
userPath := "/matt" |
|
|
|
userTextWidth, _ := dc.MeasureString(userPath) |
|
|
|
// x = canvas halfway point - total text width halfway point |
|
|
|
x = wf/2 - (baseTextWidth+userTextWidth)/2 |
|
|
|
y = hf - textHeight - footerMarginY |
|
|
|
err = loadFont(dc, true, footerFontSize) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
dc.DrawString(instance, x, y) |
|
|
|
|
|
|
|
// x = original x coordinate + base text width |
|
|
|
x += baseTextWidth |
|
|
|
y = hf - textHeight - footerMarginY |
|
|
|
err = loadFont(dc, false, footerFontSize) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
dc.DrawString(userPath, x, y) |
|
|
|
|
|
|
|
// Draw the content |
|
|
|
err = loadFont(dc, false, contentFontSize) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
s := "The rest of the travelers in our flying bus napped or stared listlessly at a shiny slab in their lap and the staring yellow orb morphed into a full circle out in the blue. As we banked to the right — a nod to its awakening — it seemed to rest in acknowledgement, hanging for a moment on the invisible horizon." |
|
|
|
x = contentRightMargin |
|
|
|
y = contentTopMargin |
|
|
|
maxWidth := float64(dc.Width()) - contentRightMargin - contentRightMargin |
|
|
|
dc.DrawStringWrapped(s, x, y, 0, 0, maxWidth, lineSpacing, gg.AlignLeft) |
|
|
|
|
|
|
|
err = dc.SavePNG("out.png") |
|
|
|
if err != nil { |
|
|
|
return fmt.Errorf("save png: %s", err) |
|
|
|
} |
|
|
|
return nil |
|
|
|
} |