Files
didder/main.go
2023-12-20 14:22:19 -05:00

196 lines
4.2 KiB
Go

package main
import (
"errors"
"fmt"
"os"
"github.com/urfave/cli/v2"
)
// Set by compiler, see Makefile
var (
version = "v1.3.0"
commit = "unknown"
builtBy = "unknown"
)
func main() {
app := &cli.App{
Name: "didder",
Usage: "dither images with a variety of algorithms and processing options.",
Description: "didder dithers images.\n\nRun `man didder` for more information, or view the manual online:\nhttps://github.com/makeworld-the-better-one/didder/blob/main/MANPAGE.md",
UseShortOptionHandling: true,
Flags: []cli.Flag{
&cli.StringFlag{
Name: "strength",
Aliases: []string{"s"},
},
&cli.UintFlag{
Name: "threads",
Aliases: []string{"j"},
},
&cli.StringFlag{
Name: "palette",
Aliases: []string{"p"},
Required: true,
},
&cli.BoolFlag{
Name: "grayscale",
Aliases: []string{"g"},
},
&cli.StringFlag{
Name: "saturation",
},
&cli.StringFlag{
Name: "brightness",
},
&cli.StringFlag{
Name: "contrast",
},
&cli.StringFlag{
Name: "recolor",
Aliases: []string{"r"},
},
&cli.BoolFlag{
Name: "no-exif-rotation",
},
&cli.StringFlag{
Name: "format",
Aliases: []string{"f"},
Value: "png",
},
&cli.StringFlag{
Name: "out",
Aliases: []string{"o"},
Required: true,
},
&cli.StringSliceFlag{
Name: "in",
Aliases: []string{"i"},
Required: true,
},
&cli.BoolFlag{
Name: "no-overwrite",
},
&cli.StringFlag{
Name: "compression",
Aliases: []string{"c"},
Value: "default",
},
&cli.Float64Flag{
Name: "fps",
},
&cli.UintFlag{
Name: "loop",
Aliases: []string{"l"},
},
&cli.UintFlag{
Name: "width",
Aliases: []string{"x"},
},
&cli.UintFlag{
Name: "height",
Aliases: []string{"y"},
},
&cli.UintFlag{
Name: "upscale",
Aliases: []string{"u"},
Value: 1,
},
&cli.BoolFlag{
Name: "version",
Aliases: []string{"v"},
},
},
Commands: []*cli.Command{
{
Name: "random",
Usage: "grayscale and RGB random dithering",
Flags: []cli.Flag{
&cli.Int64Flag{
Name: "seed",
Aliases: []string{"s"},
},
},
UseShortOptionHandling: true,
Action: random,
SkipFlagParsing: true, // Allow for numbers that start with a negative
},
{
Name: "bayer",
Usage: "Bayer matrix ordered dithering",
UseShortOptionHandling: true,
Action: bayer,
},
{
Name: "odm",
Usage: "Ordered Dither Matrix",
UseShortOptionHandling: true,
Action: odm,
},
{
Name: "edm",
Usage: "Error Diffusion Matrix",
Flags: []cli.Flag{
&cli.BoolFlag{
Name: "serpentine",
Aliases: []string{"s"},
},
},
UseShortOptionHandling: true,
Action: edm,
},
},
Before: preProcess,
Action: func(c *cli.Context) error {
return errors.New("no command specified")
},
}
// Handle version flag
if len(os.Args) == 2 && (os.Args[1] == "-v" || os.Args[1] == "--version") {
fmt.Println("didder", version)
fmt.Println("Commit:", commit)
fmt.Println("Built by:", builtBy)
return
}
// Hack around issue where required flags are still required even for help
// https://github.com/urfave/cli/issues/1247
if len(os.Args) == 3 {
if os.Args[1] == "h" || os.Args[1] == "help" {
// Like: didder help bayer
for _, c := range app.Commands {
if c.Name == os.Args[2] {
cli.HelpPrinter(os.Stdout, cli.CommandHelpTemplate, c)
return
}
}
fmt.Println("no command with that name")
os.Exit(1)
} else if os.Args[len(os.Args)-1] == "-h" || os.Args[len(os.Args)-1] == "--help" {
// Like: didder bayer --help
for _, c := range app.Commands {
if c.Name == os.Args[1] {
cli.HelpPrinter(os.Stdout, cli.CommandHelpTemplate, c)
return
}
}
fmt.Println("no command with that name")
os.Exit(1)
}
}
err := app.Run(os.Args)
if err != nil {
if len(os.Args) == 1 {
// Just ran the command with no flags
return
}
fmt.Println(err)
os.Exit(1)
}
}