package main
import (
"flag"
"fmt"
"github.com/ftrvxmtrx/tga"
"image"
"image/color"
"image/draw"
"image/png"
"os"
"path/filepath"
)
func main() {
input := flag.String("i", "", "input files glob pattern")
output := flag.String("o", "merge%04d.png", "output files name mask")
merge := flag.Int("m", 0, "number of frames to be merged")
overlap := flag.Int("b", 0, "number of frames to be overlapped")
flag.Parse()
if *input == "" || *merge < 1 || *overlap < 0 {
flag.Usage()
os.Exit(2)
}
files, e := filepath.Glob(*input)
if e != nil {
panic(e)
}
if len(files) < *merge {
fmt.Fprint(os.Stderr, "no (or not enough) input files found")
os.Exit(3)
}
encoder := &png.Encoder{
CompressionLevel: png.NoCompression,
}
buffer := make([]image.Image, *merge+*overlap*2)
w := -1
h := -1
f := 0
for i := 0; i < len(files); i++ {
file, e := os.Open(files[i])
if e != nil {
panic(e)
}
c, e := tga.DecodeConfig(file)
if e != nil {
panic(e)
}
fmt.Printf("decoded: %s\n", file.Name())
if w == -1 {
w = c.Width
h = c.Height
}
if w != c.Width || h != c.Height {
fmt.Fprint(os.Stderr, "incorrect frame size\n")
os.Exit(4)
}
_, _ = file.Seek(0, 0)
frame, e := tga.Decode(file)
if e != nil {
panic(e)
}
e = file.Close()
if e != nil {
panic(e)
}
if i >= *merge+*overlap*2 {
for j := 0; j < *merge+*overlap*2-1; j++ {
buffer[j] = buffer[j+1]
}
}
if i < *merge+*overlap*2 {
buffer[i] = frame
} else {
buffer[*merge+*overlap*2-1] = frame
}
if i+1 < *merge+*overlap*2 || (i+*overlap*2)%*merge != 0 {
continue
}
merged := image.NewRGBA(buffer[0].Bounds())
for j := 0; j < len(buffer); j++ {
mask := image.NewUniform(color.Alpha{A: uint8(255 - j*(255/(*merge+*overlap*2)))})
draw.DrawMask(merged, buffer[j].Bounds(), buffer[j], image.ZP, mask, image.ZP, draw.Over)
}
result, _ := os.Create(fmt.Sprintf(*output, f))
e = encoder.Encode(result, merged)
if e != nil {
panic(e)
}
fmt.Printf("encoded: %s\n", result.Name())
result.Close()
f++
}
}