88import Foundation
99import OpenSwiftUICore
1010import Shaft
11+ import SwiftMath
1112
1213/// Converts OpenSwiftUI DisplayList structures into Shaft widgets
1314final class DisplayListConverter {
1415 private var contentsScale : Float = 1.0
15-
16+
1617 init ( ) { }
17-
18+
1819 /// Convert a DisplayList to a Shaft widget tree
1920 func convertDisplayList (
2021 _ displayList : OpenSwiftUICore . DisplayList ,
2122 contentsScale : CGFloat
2223 ) -> Widget {
2324 self . contentsScale = Float ( contentsScale )
24-
25+
2526 // Handle empty display list
2627 guard ! displayList . items . isEmpty else {
2728 return SizedBox ( width : 0 , height : 0 )
2829 }
29-
30+
3031 // Convert all items
3132 let widgets = displayList . items . compactMap { convertItem ( $0 ) }
32-
33+
3334 // If single item, return it directly
34- if widgets . count == 1 {
35- return widgets [ 0 ]
36- }
37-
35+ // if widgets.count == 1 {
36+ // return widgets[0]
37+ // }
38+
3839 // Multiple items - stack them
3940 return Stack { widgets }
4041 }
41-
42+
4243 /// Convert a single DisplayList.Item to a Shaft widget
4344 private func convertItem ( _ item : OpenSwiftUICore . DisplayList . Item ) -> Widget {
4445 // Each item has a frame and a value
4546 let frame = item . frame
46-
47- switch item . value {
48- case . empty :
49- return SizedBox ( )
50-
51- case . content ( let content ) :
52- // Actual renderable content
53- mark ( " frame: \( frame ) " )
54- return Positioned ( left : Float ( frame . minX ) , top : Float ( frame . minY ) , width : Float ( frame . width ) , height : Float ( frame . height ) ) {
47+
48+ let result =
49+ switch item . value {
50+ case . empty :
51+ SizedBox ( )
52+
53+ case . content ( let content ) :
54+ // Actual renderable content
5555 convertContent ( content )
56+
57+ case . effect ( let effect , let childList ) :
58+ // Effect applied to child display list
59+ // let childWidget =
60+ applyEffect ( effect , to : convertDisplayList (
61+ childList , contentsScale : CGFloat ( contentsScale )
62+ ) )
63+
64+ case . states ( let states ) :
65+ // State-dependent display lists
66+ // For now, just render the first state if available
67+ if let firstState = states . first {
68+ convertDisplayList ( firstState . 1 , contentsScale : CGFloat ( contentsScale ) )
69+ } else {
70+ Text ( " states not implemented " )
71+ }
5672 }
57-
58- case . effect ( let effect , let childList ) :
59- // Effect applied to child display list
60- let childWidget = convertDisplayList ( childList , contentsScale : CGFloat ( contentsScale ) )
61- return applyEffect ( effect , to : childWidget )
62-
63- case . states ( let states ) :
64- // State-dependent display lists
65- // For now, just render the first state if available
66- if let firstState = states . first {
67- return convertDisplayList ( firstState . 1 , contentsScale : CGFloat ( contentsScale ) )
68- }
69- return Text ( " states not implemented " )
73+
74+ return Positioned (
75+ left : Float ( frame . minX ) , top : Float ( frame . minY ) ,
76+ width : Float ( frame . width ) , height : Float ( frame . height )
77+ ) {
78+ result
7079 }
7180 }
72-
81+
7382 /// Convert Content to Shaft widget
7483 private func convertContent (
7584 _ content : OpenSwiftUICore . DisplayList . Content ,
7685 ) -> Widget {
7786 switch content . value {
7887 case . color ( let resolvedColor ) :
7988 return convertColor ( resolvedColor )
80-
89+
8190 case . text ( let textView , let size ) :
8291 return convertText ( textView , size : size )
83-
92+
8493 case . shape ( let path , let paint , let fillStyle ) :
8594 return convertShape ( path : path , paint : paint , fillStyle : fillStyle )
86-
95+
8796 case . image ( let graphicsImage ) :
8897 return convertImage ( graphicsImage )
89-
98+
9099 case . flattened ( let displayList , let offset , _) :
91100 // Nested display list
92101 let childWidget = convertDisplayList ( displayList , contentsScale : CGFloat ( contentsScale ) )
@@ -99,12 +108,12 @@ final class DisplayListConverter {
99108 }
100109 }
101110 return childWidget
102-
111+
103112 default :
104113 return Text ( " \( content . value ) not implemented " )
105114 }
106115 }
107-
116+
108117 /// Apply an effect to a widget
109118 private func applyEffect (
110119 _ effect : OpenSwiftUICore . DisplayList . Effect ,
@@ -113,62 +122,64 @@ final class DisplayListConverter {
113122 switch effect {
114123 case . identity :
115124 return widget
116-
125+
117126 case . opacity ( let alpha ) :
118127 // TODO: Shaft doesn't have Opacity widget - need to implement custom
119128 // For now, just return the widget without opacity
120129 return widget
121-
130+
122131 case . transform ( let transform ) :
123132 return applyTransform ( transform , to : widget )
124-
133+
125134 case . clip ( let path , _, _) :
126135 // TODO: Implement clipping with path
127136 return widget
128-
137+
129138 case . mask ( let maskList , _) :
130139 // TODO: Implement masking
131140 return widget
132-
141+
133142 case . geometryGroup , . compositingGroup , . backdropGroup :
134143 // Grouping effects - just return widget for now
135144 return widget
136-
145+
137146 case . properties , . blendMode , . filter :
138147 // Advanced effects - not supported initially
139148 return widget
140-
149+
141150 case . archive , . platformGroup , . animation , . contentTransition , . view , . accessibility ,
142- . platform , . state , . interpolatorRoot , . interpolatorLayer , . interpolatorAnimation :
151+ . platform , . state , . interpolatorRoot , . interpolatorLayer , . interpolatorAnimation :
143152 // Complex features - not supported initially
144153 return widget
145154 }
146155 }
147-
156+
148157 /// Apply transform to widget
149158 private func applyTransform (
150159 _ transform : OpenSwiftUICore . DisplayList . Transform ,
151160 to widget : Widget
152161 ) -> Widget {
162+ mark ( " transform: \( transform ) " )
153163 switch transform {
154164 case . affine ( let affineTransform ) :
155- // Extract translation for now
156- let tx = Float ( affineTransform . tx )
157- let ty = Float ( affineTransform . ty )
158- if tx != 0 || ty != 0 {
159- return Positioned ( left : tx , top : ty ) { widget }
160- }
161- // TODO: Handle rotation and scale
165+ // TODO: affine transform
162166 return widget
163-
164- case . rotation , . rotation3D , . projection :
167+
168+ case . rotation ( let data ) :
169+ return Transform (
170+ transform : Matrix4x4f . rotate ( z : . init ( radians : Float ( data . angle . radians ) ) )
171+ ) {
172+ widget
173+ }
174+
175+ case . rotation3D , . projection :
165176 // TODO: Implement 3D transforms
166177 return widget
167178 }
168179 }
169-
180+
170181 // MARK: - Content Converters
171-
182+
172183 private func convertColor (
173184 _ resolvedColor : OpenSwiftUICore . Color . Resolved ,
174185 ) -> Widget {
@@ -178,10 +189,10 @@ final class DisplayListConverter {
178189 let g = UInt8 ( resolvedColor . linearGreen * 255 )
179190 let b = UInt8 ( resolvedColor . linearBlue * 255 )
180191 let shaftColor = Shaft . Color . argb ( a , r , g , b )
181-
192+
182193 return DecoratedBox ( decoration : . box ( color : shaftColor ) )
183194 }
184-
195+
185196 private func convertText (
186197 _ textView : StyledTextContentView ,
187198 size : CGSize ,
@@ -191,7 +202,7 @@ final class DisplayListConverter {
191202 // For now, return a placeholder
192203 return Text ( " TODO: Extract text " )
193204 }
194-
205+
195206 private func convertShape (
196207 path : OpenSwiftUICore . Path ,
197208 paint : AnyResolvedPaint ,
@@ -201,7 +212,7 @@ final class DisplayListConverter {
201212 // TODO: Handle paint and fill styles
202213 return Text ( " TODO: Extract shape " )
203214 }
204-
215+
205216 private func convertImage (
206217 _ graphicsImage : GraphicsImage ,
207218 ) -> Widget {
0 commit comments