3
3
// OpenSwiftUICore
4
4
//
5
5
// Audited for RELEASE_2024
6
- // Status: WIP
6
+ // Status: Blocked by ViewUpdater and ViewRasterizer
7
+ // ID: 21FFA3C7D88AC65BB559906758271BFC
7
8
8
9
import Foundation
9
10
11
+ protocol ViewRendererBase {
12
+ var platform : DisplayList . ViewUpdater . Platform { get }
13
+ var exportedObject : AnyObject ? { get }
14
+ func render( rootView: AnyObject , from list: DisplayList , time: Time , version: DisplayList . Version , maxVersion: DisplayList . Version , environment: DisplayList . ViewRenderer . Environment ) -> Time
15
+ func renderAsync( to list: DisplayList , time: Time , targetTimestamp: Time ? , version: DisplayList . Version , maxVersion: DisplayList . Version ) -> Time ?
16
+ func destroy( rootView: AnyObject )
17
+ var viewCacheIsEmpty : Bool { get }
18
+ }
19
+
10
20
@_spi ( ForOpenSwiftUIOnly)
11
21
extension DisplayList {
12
22
final public class ViewRenderer {
@@ -18,5 +28,91 @@ extension DisplayList {
18
28
self . contentScale = contentScale
19
29
}
20
30
}
31
+
32
+ private enum State {
33
+ case none
34
+ case updating
35
+ case rasterizing
36
+ }
37
+
38
+ let platform : DisplayList . ViewUpdater . Platform
39
+ package var configuration : _RendererConfiguration = . init( )
40
+ package weak var host : ViewRendererHost ? = nil
41
+ private var state : State = . none
42
+ var renderer : ( any ViewRendererBase ) ? = nil
43
+ var configChanged : Bool = true
44
+
45
+ package init ( platform: DisplayList . ViewUpdater . Platform ) {
46
+ self . platform = platform
47
+ }
48
+
49
+ private func updateRenderer( rootView: AnyObject ) -> any ViewRendererBase {
50
+ guard configChanged else {
51
+ return renderer!
52
+ }
53
+ configChanged = false
54
+ let renderStateMatchCheck = switch configuration. renderer {
55
+ case . default: state == . updating
56
+ case . rasterized: state == . rasterizing
57
+ }
58
+ if !renderStateMatchCheck {
59
+ if let renderer {
60
+ renderer. destroy ( rootView: rootView)
61
+ }
62
+ renderer = nil
63
+ state = . none
64
+ }
65
+ if let renderer {
66
+ switch configuration. renderer {
67
+ case . default:
68
+ return renderer
69
+ case . rasterized( let options) :
70
+ fatalError ( " Blocked by ViewRasterizer " )
71
+ return renderer
72
+ }
73
+ } else {
74
+ switch configuration. renderer {
75
+ case . default:
76
+ let updater = ViewUpdater ( )
77
+ // TODO: ViewUpdater
78
+ renderer = updater
79
+ state = . updating
80
+ return renderer!
81
+ case . rasterized( let options) :
82
+ fatalError ( " Blocked by ViewRasterizer " )
83
+ }
84
+ }
85
+ }
86
+
87
+ package func exportedObject( rootView: AnyObject ) -> AnyObject ? {
88
+ let renderer = updateRenderer ( rootView: rootView)
89
+ return renderer. exportedObject
90
+ }
91
+
92
+ package func render( rootView: AnyObject , from list: DisplayList , time: Time , nextTime: Time , version: DisplayList . Version , maxVersion: DisplayList . Version , environment: DisplayList . ViewRenderer . Environment ) -> Time {
93
+ let renderer = updateRenderer ( rootView: rootView)
94
+ let result = renderer. render ( rootView: rootView, from: list, time: time, version: version, maxVersion: maxVersion, environment: environment)
95
+ let interval = min ( nextTime, result) - time
96
+ let maxInterval = max ( interval, configuration. minFrameInterval)
97
+ return time + maxInterval
98
+ }
99
+
100
+ package func renderAsync( to list: DisplayList , time: Time , nextTime: Time , targetTimestamp: Time ? , version: DisplayList . Version , maxVersion: DisplayList . Version ) -> Time ? {
101
+ guard !configChanged, let renderer else {
102
+ return nil
103
+ }
104
+ let result = renderer. renderAsync ( to: list, time: time, targetTimestamp: targetTimestamp, version: version, maxVersion: maxVersion)
105
+ if let result {
106
+ let interval = min ( nextTime, result) - time
107
+ let maxInterval = max ( interval, configuration. minFrameInterval)
108
+ return time + maxInterval
109
+ } else {
110
+ return nil
111
+ }
112
+ }
113
+
114
+ package var viewCacheIsEmpty : Bool {
115
+ renderer? . viewCacheIsEmpty ?? true
116
+ }
21
117
}
22
118
}
0 commit comments