-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwonderAnimator.go
128 lines (104 loc) · 3.89 KB
/
wonderAnimator.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package WonderAnimator
import (
"github.com/mo3golom/wonder-animator/internal/dto/enum"
"github.com/mo3golom/wonder-animator/internal/service"
"github.com/mo3golom/wonder-animator/internal/service/frameSetSaver"
"github.com/mo3golom/wonder-animator/internal/service/processor"
"github.com/mo3golom/wonder-animator/pkg/draw2dExtend"
"github.com/mo3golom/wonder-animator/pkg/loader"
WonderEffects "github.com/mo3golom/wonder-effects"
"github.com/mo3golom/wonder-glitch/wonderGlitchDTO"
"github.com/mo3golom/wonder-glitch/wonderGlitchService"
"path"
"runtime"
)
type wonderAnimator struct {
fontName, fontPath string
additionalProcessors []enum.ProcessorType
additionalEffects []WonderEffects.EffectType
additionalGlitches []wonderGlitchDTO.EffectType
}
func WonderAnimator() *wonderAnimator {
return &wonderAnimator{}
}
func (wa *wonderAnimator) SetFont(name, path string) *wonderAnimator {
wa.fontName = name
wa.fontPath = path
return wa
}
func (wa *wonderAnimator) addProcessor(processorType enum.ProcessorType) *wonderAnimator {
wa.additionalProcessors = append(wa.additionalProcessors, processorType)
return wa
}
func (wa *wonderAnimator) addEffect(effectType WonderEffects.EffectType) *wonderAnimator {
wa.additionalEffects = append(wa.additionalEffects, effectType)
return wa
}
func (wa *wonderAnimator) addGlitch(effectType wonderGlitchDTO.EffectType) *wonderAnimator {
wa.additionalGlitches = append(wa.additionalGlitches, effectType)
return wa
}
// Generate фасад для облегчения использования пакета, без необходимости вникать как и какие зависимости собиратьыыы
func (wa *wonderAnimator) Generate(inputObject InputObject, saveType string) frameSetSaver.SaverInterface {
// Если не был установлен шрифт, то пытаемся загрузить шрифт по умолчанию
if "" == wa.fontName || "" == wa.fontPath {
_, file, _, ok := runtime.Caller(0)
if !ok {
panic("Не удалось загрузить шрифт по умолчанию")
}
wa.fontName = "Roboto"
wa.fontPath = path.Dir(file) + "/resources/Roboto-Regular.ttf"
}
fontData := loader.LoadAndRegister(wa.fontName, wa.fontPath)
// Собираем сервис, который генерирует кадры
frameCreatorService := service.NewFrameCreatorService(
inputObject.GetFPS(),
processor.NewProcessorHandlerBus(
append(
enum.GetProcessorTypes(
draw2dExtend.NewDrawBuilder(*fontData),
),
wa.additionalProcessors...,
),
),
WonderEffects.NewEffectHandlerBus(
append(
WonderEffects.GetTypesList(),
wa.additionalEffects...,
),
),
wonderGlitchService.NewGlitchService(
wonderGlitchService.NewEffectHandlerBus(
append(
wonderGlitchDTO.GetTypesList(),
wa.additionalGlitches...,
),
),
),
)
// Собираем фабрику сервисов, которые сохраняют набор кадров
saverFactory := service.NewFrameSaverFactory(enum.GetFrameSetSaveStrategies())
// Получаем конкретного "сохранятеля"
concreteSaver, ok := saverFactory.SaveType(saveType)
if !ok {
panic("saver not selected!")
}
// Пробуем установить картинку как фон
backgroundImage := inputObject.BackgroundImage
if nil != backgroundImage {
frameCreatorService.WithBackgroundImage(*backgroundImage)
}
// Пробуем установить цвет как фон
backgroundColor := inputObject.BackgroundColor
if nil != backgroundColor {
frameCreatorService.WithBackgroundColor(*backgroundColor)
}
// Генерируем набор кадров
frameSet := frameCreatorService.CreateFrameSet(
inputObject.Blocks,
inputObject.Width,
inputObject.Height,
inputObject.Duration,
)
return concreteSaver.SetFramerate(inputObject.GetFPS()).SetFrameSet(&frameSet)
}