shithub: xui

ref: ca677a50fd03b97e8421d5ddcc9c793338c81058
dir: /anim/anim.go/

View raw version
package anim

import (
	"9fans.net/go/draw"
	"9fans.net/go/draw/memdraw"
	"image"
	"time"
	"github.com/psilva261/xui"
	"github.com/psilva261/xui/events"
	"github.com/psilva261/xui/internal/color"
	"github.com/psilva261/xui/layout"
	"github.com/psilva261/xui/space"
)

type Interface interface {
}

type Anim struct {
	Orig image.Point
	x xui.Interface
	images []*memdraw.Image
	current *memdraw.Image
	delay []int
	delaySum []int
	Margin space.Sp
}

func NewFromSeq(x xui.Interface, images []*memdraw.Image, delay []int) *Anim {
	a := &Anim{
		x: x,
		images: images,
		delay: delay,
	}
	a.delaySum = make([]int, len(a.delay))
	for i := 0; i < len(a.delay); i++ {
		a.delaySum[i] = a.delay[i]
		if i > 0 {
			a.delaySum[i] += a.delaySum[i-1]
		}
	}

	var err error
	a.current, err = memdraw.AllocImage(a.images[0].R, draw.ABGR32)
	if err != nil {
		panic(err.Error())
	}
	memdraw.FillColor(a.current, draw.Transparent)

	return a
}

func (a Anim) CurrentFrame(unixNano int64) int {
	m := a.delaySum[len(a.delay)-1]
	aTime := int((unixNano/1e7) % int64(m))
	for i, dc := range a.delaySum {
		if aTime <= dc {
			return i
		}
	}
	return 0
}

func (a Anim) Event(events.Interface) {
}

func (a Anim) Render() *memdraw.Image {
	t := time.Now().UnixNano()
	f := a.CurrentFrame(t)
	//orig := xy

	a.current.Draw(a.images[f].R, a.images[f], image.ZP, color.EmptyMask, image.ZP, draw.SoverD)
	return a.current
}

func (a Anim) Focus() {
}

func (a Anim) Layout() layout.Interface {
	return layout.Inline{}
}

func (a Anim) Geom() (r image.Rectangle, margin space.Sp) {
	return a.images[0].R, a.Margin
}