Skip to content

Commit af2b329

Browse files
committed
Update LeafDisplayList
1 parent d9a02bd commit af2b329

File tree

9 files changed

+153
-19
lines changed

9 files changed

+153
-19
lines changed

Example/HostingExample/ViewController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,6 @@ class ViewController: NSViewController {
6666

6767
struct ContentView: View {
6868
var body: some View {
69-
AppearanceActionModifierExample()
69+
Color(uiColor: .red)
7070
}
7171
}

Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingView.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,9 @@ extension _UIHostingView: ViewRendererHost {
511511
}
512512

513513
package func renderDisplayList(_ list: DisplayList, asynchronously: Bool, time: Time, nextTime: Time, targetTimestamp: Time?, version: DisplayList.Version, maxVersion: DisplayList.Version) -> Time {
514+
#if DEBUG
515+
print(list.description)
516+
#endif
514517
// preconditionFailure("TODO")
515518
return .infinity
516519
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//
2+
// BackdropEffect.swift
3+
// OpenSwiftUICore
4+
//
5+
// Audited for iOS 18.0
6+
// Status: WIP
7+
8+
package struct BackdropEffect {
9+
package var scale: Float
10+
11+
package var color: Color.Resolved
12+
13+
package var filters: [GraphicsFilter]
14+
15+
package init(scale: Float = 1, color: Color.Resolved = .black, filters: [GraphicsFilter] = [], captureOnly: Bool = false) {
16+
self.scale = scale
17+
self.color = color
18+
self.filters = filters
19+
}
20+
}

Sources/OpenSwiftUICore/Graphic/Color/ColorView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ package struct ColorView: RendererLeafView, Animatable {
3131
}
3232

3333
package func content() -> DisplayList.Content.Value {
34-
preconditionFailure("TODO")
34+
.color(color)
3535
}
3636

3737
package var animatableData: Color.Resolved.AnimatableData {

Sources/OpenSwiftUICore/Render/DisplayList/DisplayList.swift

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
//
55
// Audited for iOS 18.0
66
// Status: WIP
7-
// ID: F37E3733E490AA5E3BDC045E3D34D9F8
7+
// ID: F37E3733E490AA5E3BDC045E3D34D9F8 (SwiftUICore)
88

99
package import Foundation
1010

@@ -105,22 +105,31 @@ extension DisplayList.Version: Sendable {}
105105

106106
extension DisplayList {
107107
package typealias Identity = _DisplayList_Identity
108+
108109
package typealias StableIdentity = _DisplayList_StableIdentity
110+
109111
package typealias StableIdentityMap = _DisplayList_StableIdentityMap
112+
110113
package typealias StableIdentityRoot = _DisplayList_StableIdentityRoot
114+
111115
package typealias StableIdentityScope = _DisplayList_StableIdentityScope
112-
116+
113117
package struct Item: Equatable {
114118
package var frame: CGRect
119+
115120
package var version: Version
121+
116122
package var value: Item.Value
123+
117124
package var identity: Identity
125+
118126
package enum Value {
119127
case empty
120128
case content(Content)
121129
case effect(Effect, DisplayList)
122130
case states([(StrongHash, DisplayList)])
123131
}
132+
124133
package init(_ value: Item.Value, frame: CGRect, identity: Identity, version: Version) {
125134
self.frame = frame
126135
self.version = version
@@ -133,16 +142,19 @@ extension DisplayList {
133142
}
134143

135144
package var position: CGPoint { frame.origin }
145+
136146
package var size: CGSize { frame.size }
137147
}
138148

139149
package struct Content {
140150
package var value: Content.Value
151+
141152
package var seed: Seed
153+
142154
package enum Value {
143-
// indirect case backdrop(BackdropEffect)
155+
indirect case backdrop(BackdropEffect)
144156
indirect case color(Color.Resolved)
145-
// indirect case chameleonColor(fallback: Color.Resolved, filters: [GraphicsFilter])
157+
indirect case chameleonColor(fallback: Color.Resolved, filters: [GraphicsFilter])
146158
// indirect case image(GraphicsImage)
147159
// indirect case shape(Path, AnyResolvedPaint, FillStyle)
148160
// indirect case shadow(Path, ResolvedShadowStyle)
@@ -246,8 +258,14 @@ extension DisplayList {
246258
self.value = value
247259
}
248260

249-
package init() { self.init(value: .zero) }
250-
package init(decodedValue value: UInt16) { self.init(value: value) }
261+
package init() {
262+
self.init(value: .zero)
263+
}
264+
265+
package init(decodedValue value: UInt16) {
266+
self.init(value: value)
267+
}
268+
251269
package init(_ version: Version) {
252270
if version.value == .zero {
253271
self.init(value: .zero)
@@ -267,6 +285,7 @@ extension DisplayList {
267285

268286
package static let undefined: Seed = Seed(value: 2)
269287
}
288+
270289
package struct Properties: OptionSet {
271290
package let rawValue: UInt8
272291
package init(rawValue: UInt8) {
@@ -404,3 +423,18 @@ extension DisplayList {
404423
}
405424
}
406425
}
426+
427+
// MARK: - DisplayList.Item + Extension
428+
429+
extension DisplayList.Item {
430+
package mutating func canonicalize(options: DisplayList.Options = .init()) {
431+
// TODO
432+
}
433+
434+
// package func matchesTopLevelStructure(of other: DisplayList.Item) -> Bool
435+
436+
package var features: DisplayList.Features {
437+
// TODO
438+
[]
439+
}
440+
}

Sources/OpenSwiftUICore/Render/DisplayList/DisplayList+String.swift renamed to Sources/OpenSwiftUICore/Render/DisplayList/DisplayListPrinter.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
//
2-
// DisplayList+String.swift
2+
// DisplayListPrinter.swift
33
// OpenSwiftUICore
44
//
55
// Audited for iOS 18.0
66
// Status: WIP
7-
// ID: 11125C146A81D1913BFBD53B89D010C6
7+
// ID: 11125C146A81D1913BFBD53B89D010C6 (SwiftUICore)
88

99
extension DisplayList.Item {
1010
// TODO
11-
var features: DisplayList.Features { [] }
11+
// var features: DisplayList.Features { [] }
1212
var properties: DisplayList.Properties { [] }
1313

1414
fileprivate func print(into printer: inout SExpPrinter) {
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//
2+
// DisplayListTransforms.swift
3+
// OpenSwiftUICore
4+
//
5+
// Audited for iOS 18.0
6+
// Status: WIP
7+
// ID: 8C82E31DBCFF23E23B8937F47207F4D1 (SwiftUICore)
8+
9+
package import OpenGraphShims
10+
11+
extension DisplayList {
12+
// package mutating func insertLayerFilters(matrices: [_ForegroundLayerLevel : _ColorMatrix], version: DisplayList.Version, premultiplied: Bool) {
13+
//
14+
// }
15+
16+
package mutating func applyViewGraphTransform(time: Attribute<Time>, version: DisplayList.Version) {
17+
// TODO
18+
}
19+
}

Sources/OpenSwiftUICore/Render/RendererLeafView.swift

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,21 @@
33
// OpenSwiftUICore
44
//
55
// Audited for iOS 18.0
6-
// ID: 65609C35608651F66D749EB1BD9D2226 (SwiftUICore?)
6+
// ID: 65609C35608651F66D749EB1BD9D2226 (SwiftUICore)
77
// Status: WIP
88

99
package import Foundation
1010
import OpenGraphShims
1111

1212
// MARK: - RendererLeafView [TODO]
1313

14-
package protocol RendererLeafView: /*ContentResponder,*/ PrimitiveView, UnaryView {
14+
package protocol RendererLeafView: ContentResponder, PrimitiveView, UnaryView {
1515
static var requiresMainThread: Bool { get }
1616
func content() -> DisplayList.Content.Value
1717
}
1818

1919
extension RendererLeafView {
20-
package static var requiresMainThread: Swift.Bool {
20+
package static var requiresMainThread: Bool {
2121
false
2222
}
2323

@@ -26,8 +26,21 @@ extension RendererLeafView {
2626
}
2727

2828
package static func makeLeafView(view: _GraphValue<Self>, inputs: _ViewInputs) -> _ViewOutputs {
29-
// preconditionFailure("TODO")
30-
_ViewOutputs()
29+
// TODO
30+
var outputs = _ViewOutputs()
31+
// FIXME
32+
outputs.preferences[DisplayList.Key.self] = Attribute(
33+
LeafDisplayList(
34+
identity: .init(),
35+
view: view.value,
36+
position: inputs.position,
37+
size: inputs.size.cgSize,
38+
containerPosition: inputs.containerPosition,
39+
options: .defaultValue,
40+
contentSeed: .init()
41+
)
42+
)
43+
return outputs
3144
}
3245
}
3346

@@ -90,3 +103,44 @@ package struct LeafLayoutEngine<V>: LayoutEngine where V: LeafViewLayout {
90103
}
91104
}
92105
}
106+
107+
// MARK: - LeafDisplayList [WIP]
108+
109+
private struct LeafDisplayList<V>: StatefulRule, CustomStringConvertible where V: RendererLeafView {
110+
let identity: DisplayList.Identity
111+
@Attribute var view: V
112+
@Attribute var position: ViewOrigin
113+
@Attribute var size: CGSize
114+
@Attribute var containerPosition: ViewOrigin
115+
let options: DisplayList.Options
116+
var contentSeed: DisplayList.Seed
117+
118+
typealias Value = DisplayList
119+
120+
static var flags: OGAttributeTypeFlags {
121+
V.requiresMainThread ? .mainThread : []
122+
}
123+
124+
mutating func updateValue() {
125+
let (view, changed) = $view.changedValue()
126+
let content = view.content()
127+
let version = DisplayList.Version(forUpdate: ())
128+
if changed {
129+
contentSeed = .init(version)
130+
}
131+
var item = DisplayList.Item(
132+
.content(DisplayList.Content(content, seed: contentSeed)),
133+
frame: CGRect(
134+
origin: CGPoint(position.value - containerPosition.value),
135+
size: size
136+
),
137+
identity: identity,
138+
version: version
139+
)
140+
item.canonicalize(options: options)
141+
// TODO
142+
value = DisplayList(item)
143+
}
144+
145+
var description: String { "LeafDisplayList" }
146+
}

Sources/OpenSwiftUICore/View/Graph/ViewGraph.swift

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ package final class ViewGraph: GraphHost {
3434
@inline(__always)
3535
fileprivate func addRequestedPreferences(to inputs: inout _ViewInputs) {
3636
inputs.preferences.add(HostPreferencesKey.self)
37-
if contains(.platformItemList) {
37+
if contains(.displayList) {
3838
inputs.preferences.add(DisplayList.Key.self)
3939
}
4040
if contains(.viewResponders) {
@@ -511,7 +511,10 @@ private struct RootDisplayList: Rule, AsyncAttribute {
511511
@Attribute var time: Time
512512

513513
var value: (DisplayList, DisplayList.Version) {
514-
preconditionFailure("TODO")
514+
var displayList = content
515+
let version = DisplayList.Version(forUpdate: ())
516+
displayList.applyViewGraphTransform(time: $time, version: version)
517+
return (content, version)
515518
}
516519
}
517520

@@ -579,7 +582,8 @@ package struct RootGeometry: Rule, AsyncAttribute {
579582
// | | y: i.t+(p.height-f.height)*0.5=14
580583
// └──────────────────────────────────────────────────────────────────────────────┘
581584
package var value: ViewGeometry {
582-
preconditionFailure("TODO")
585+
.init(origin: .zero, dimensions: .zero)
586+
// preconditionFailure("TODO")
583587
// let layoutComputer = childLayoutComputer ?? .defaultValue
584588
// let insets = safeAreaInsets?.insets ?? EdgeInsets()
585589
// let proposal = proposedSize.value.inset(by: insets)

0 commit comments

Comments
 (0)