/
regionfacade.go
84 lines (70 loc) · 2.1 KB
/
regionfacade.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
package godelbrot
import (
"github.com/johnny-morrice/godelbrot/config"
"github.com/johnny-morrice/godelbrot/internal/bigregion"
"github.com/johnny-morrice/godelbrot/internal/nativeregion"
"github.com/johnny-morrice/godelbrot/internal/region"
"image"
"log"
)
type regionProvider struct {
regionConfig region.RegionConfig
factory *regionNumericsFactory
}
var _ region.RegionProvider = (*regionProvider)(nil)
func (provider *regionProvider) RegionConfig() region.RegionConfig {
return provider.regionConfig
}
func (provider *regionProvider) RegionNumericsFactory() region.RegionNumericsFactory {
return provider.factory
}
type regionFacade struct {
*regionProvider
*baseFacade
*drawFacade
}
var _ region.RenderApplication = (*regionFacade)(nil)
var _ Renderer = (*regionFacade)(nil)
func makeRegionFacade(desc *Info) *regionFacade {
req := desc.UserRequest
baseApp := makeBaseFacade(desc)
facade := ®ionFacade{
baseFacade: baseApp,
drawFacade: makeDrawFacade(desc),
}
provider := ®ionProvider{}
provider.factory = ®ionNumericsFactory{desc, baseApp, provider}
provider.regionConfig = region.RegionConfig{
Samples: req.RegionSamples,
CollapseSize: req.RegionCollapse,
}
facade.regionProvider = provider
return facade
}
func (facade *regionFacade) RegionNumericsFactory() region.RegionNumericsFactory {
return facade.factory
}
func (facade *regionFacade) Render() (*image.NRGBA, error) {
renderer := region.Make(facade)
return renderer.Render()
}
type regionNumericsFactory struct {
desc *Info
baseApp *baseFacade
provider *regionProvider
}
func (factory *regionNumericsFactory) Build() region.RegionNumerics {
switch factory.desc.NumericsStrategy {
case config.NativeNumericsMode:
app := makeNativeRegionFacade(factory.desc, factory.baseApp, factory.provider)
nativeApp := nativeregion.Make(app)
return &nativeApp
case config.BigFloatNumericsMode:
app := makeBigRegionFacade(factory.desc, factory.baseApp, factory.provider)
bigApp := bigregion.Make(app)
return &bigApp
default:
log.Panic("Invalid NumericsStrategy", factory.desc.NumericsStrategy)
return nil
}
}