You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
4.2 KiB
195 lines
4.2 KiB
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) |
|
} |
|
}
|
|
|