nori/renderer/apng.go

48 lines
980 B
Go

package renderer
import (
"git.tuxpa.in/a/nori"
"gitlab.com/gfxlabs/gfximg/apng"
"image"
"strings"
)
func newRenderApngFunc(a *apng.APNG) nori.RenderFunc {
return func(img image.Image, delay int) {
fr := apng.Frame{
Image: img,
DelayDenominator: 1000,
}
if delay != 0 {
fr.DelayNumerator = uint16(delay)
}
a.Frames = append(a.Frames, fr)
}
}
func RenderAnimationsApng(n *nori.Nori) ([]*apng.APNG, error) {
apngs := make([]*apng.APNG, 0, len(n.Animations))
for i := range n.Animations {
a, err := RenderAnimationApng(n, i)
if err != nil {
if strings.Contains(err.Error(), "no frame") {
continue
}
return nil, err
}
apngs = append(apngs, a)
}
return apngs, nil
}
func RenderAnimationApng(n *nori.Nori, i int) (*apng.APNG, error) {
a := &apng.APNG{
Frames: make([]apng.Frame, 0, len(n.Gawi.Images)),
}
err := nori.RenderAnimation(n, i, newRenderApngFunc(a))
if err != nil {
return nil, err
}
return a, nil
}