@@ -227,41 +227,52 @@ function buildInputs(
227227 devicePixelRatio : deps . devicePixelRatio ?? 1
228228 }
229229
230- for ( const node of group . children ) {
231- if ( ! node . visible || node . opacity <= 0 ) continue
230+ try {
231+ for ( const node of group . children ) {
232+ if ( ! node . visible || node . opacity <= 0 ) continue
232233
233- if ( node . kind === 'group' ) {
234- const g = node as GroupData
235- const sub = buildInputs ( g , doc , deps , used )
236- if ( g . passThrough ) {
237- inputs . push ( ...sub . inputs )
238- cleanups . push ( sub . cleanup )
234+ if ( node . kind === 'group' ) {
235+ const g = node as GroupData
236+ const sub = buildInputs ( g , doc , deps , used )
237+ if ( g . passThrough ) {
238+ inputs . push ( ...sub . inputs )
239+ cleanups . push ( sub . cleanup )
240+ continue
241+ }
242+ const handle = deps . compositor . allocTarget ( doc . width , doc . height )
243+ try {
244+ deps . compositor . composite ( sub . inputs , handle )
245+ } catch ( err ) {
246+ deps . compositor . freeTarget ( handle )
247+ sub . cleanup ( )
248+ throw err
249+ }
250+ sub . cleanup ( )
251+ cleanups . push ( ( ) => deps . compositor . freeTarget ( handle ) )
252+ const groupTexture = deps . compositor . targetTexture ( handle )
253+ if ( groupTexture ) {
254+ inputs . push ( {
255+ texture : { source : groupTexture , rect : region , linear : true } ,
256+ opacity : node . opacity ,
257+ mode : resolveMode ( node . mode ) ,
258+ mask : renderMaskTexture ( node , region , deps , placed , used )
259+ } )
260+ }
239261 continue
240262 }
241- const handle = deps . compositor . allocTarget ( doc . width , doc . height )
242- deps . compositor . composite ( sub . inputs , handle )
243- sub . cleanup ( )
244- cleanups . push ( ( ) => deps . compositor . freeTarget ( handle ) )
245- const groupTexture = deps . compositor . targetTexture ( handle )
246- if ( groupTexture ) {
247- inputs . push ( {
248- texture : { source : groupTexture , rect : region , linear : true } ,
249- opacity : node . opacity ,
250- mode : resolveMode ( node . mode ) ,
251- mask : renderMaskTexture ( node , region , deps , placed , used )
252- } )
253- }
254- continue
255- }
256263
257- const texture = renderLeafTexture ( node , ctx , deps , used )
258- if ( ! texture ) continue
259- inputs . push ( {
260- texture,
261- opacity : node . opacity ,
262- mode : resolveMode ( node . mode ) ,
263- mask : renderMaskTexture ( node , region , deps , placed , used )
264- } )
264+ const texture = renderLeafTexture ( node , ctx , deps , used )
265+ if ( ! texture ) continue
266+ inputs . push ( {
267+ texture,
268+ opacity : node . opacity ,
269+ mode : resolveMode ( node . mode ) ,
270+ mask : renderMaskTexture ( node , region , deps , placed , used )
271+ } )
272+ }
273+ } catch ( err ) {
274+ cleanups . forEach ( ( fn ) => fn ( ) )
275+ throw err
265276 }
266277
267278 return { inputs, cleanup : ( ) => cleanups . forEach ( ( fn ) => fn ( ) ) }
0 commit comments