1    let max_scissor = Rect2D.create 0 0 8192 8192
2    
3    begin@ drawer
4    
5    type Drawer
6        let scissors = List<Rect2D>.new
7        local mut scissor_intersection = max_scissor
8        let saved_scissors = List<Rect2D>.new
9    
10       let update_scissor_intersection () =
11           if scissors.is_empty then
12               scissor_intersection = max_scissor
13           else
14               let mut rect = scissors[0]
15               for i = 1 until scissors.size do
16                   rect = rect.intersect scissors[i]
17   
18               scissor_intersection = rect
19   
20       local save_scissors () =
21           assert saved_scissors.is_empty
22           for rect in scissors do
23               saved_scissors.add rect
24   
25           scissors.clear
26           update_scissor_intersection
27   
28       local push_scissor (rect : Rect2D) =
29           scissors.add rect
30           update_scissor_intersection
31   
32       local pop_scissor () =
33           scissors.remove_last
34           update_scissor_intersection
35   
36       local restore_scissors () =
37           assert scissors.is_empty
38           for rect in saved_scissors do
39               scissors.add rect
40   
41           saved_scissors.clear
42           update_scissor_intersection
43