/
glitchService.go
67 lines (49 loc) · 1.48 KB
/
glitchService.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package wonderGlitchService
import (
"github.com/mo3golom/wonder-glitch/wonderGlitchDTO"
"image"
"image/draw"
"sort"
)
type GlitchService struct {
dest image.Image
factor float64
handler *Handler
time float64
}
func NewGlitchService(handler *Handler) *GlitchService {
return &GlitchService{
handler: handler,
factor: 5,
}
}
func (gs *GlitchService) SetDest(dest image.Image) *GlitchService {
gs.dest = dest
return gs
}
func (gs *GlitchService) SetFactor(factor float64) *GlitchService {
gs.factor = factor
return gs
}
func (gs *GlitchService) SetTime(time float64) {
gs.time = time
}
func (gs *GlitchService) AddEffect(effectType wonderGlitchDTO.EffectType) *GlitchService {
gs.handler = gs.handler.AddEffect(effectType)
return gs
}
func (gs *GlitchService) Glitchify(inputEffects []wonderGlitchDTO.InputEffect) *image.RGBA {
// Сортируем так, чтобы эффекты с сортировкой 0 и меньше выполнялись первее, чем эффекты с сортировкой 1 и больше
sort.SliceStable(inputEffects, func(i, j int) bool {
return inputEffects[i].Sort < inputEffects[j].Sort
})
bounds := gs.dest.Bounds()
output := image.NewRGBA(bounds)
draw.Draw(output, bounds, gs.dest, bounds.Min, draw.Src)
result := image.NewRGBA(bounds)
draw.Draw(result, bounds, gs.dest, bounds.Min, draw.Src)
for _, effect := range inputEffects {
gs.handler.Handle(&effect, output, int(gs.factor))
}
return output
}