open Caml_xss let dims = ref (180, 80) let mk_color (r, g, b) = (r * 257, g * 257, b * 257) let _color0 = mk_color (255, 255, 255) let _color1 = mk_color (120, 80, 255) let _color2 = mk_color (255, 160, 26) let _color3 = mk_color (20, 250, 62) type shape = | Losange of (int * int * int * int) list | Square of (int * int) * int | Circle of (int * int) * int let coords_losange (x, y) = [ (10 + x, 0 + y, 16 + x, 10 + y); (16 + x, 10 + y, 10 + x, 20 + y); (10 + x, 20 + y, 4 + x, 10 + y); ( 4 + x, 10 + y, 10 + x, 0 + y); ] module UserSaver = struct type state = { colormap: Caml_xss.colormap; color0: pixel; color1: pixel; color2: pixel; color3: pixel; shapes: shape list; } type user_calls = { saver_init: x_elems -> state; saver_draw: x_elems -> state -> int; saver_reshape: x_elems -> state -> int -> int -> unit; saver_free: x_elems -> state -> unit; } let user_saver = { saver_init = (fun xelms -> let colormap = X.default_colormap xelms in let color0 = X.alloc_color xelms colormap _color0 in let color1 = X.alloc_color xelms colormap _color1 in let color2 = X.alloc_color xelms colormap _color2 in let color3 = X.alloc_color xelms colormap _color3 in { colormap; color0; color1; color2; color3; shapes = [ Losange (coords_losange (20, 30)); Losange (coords_losange (36, 32)); Square ((60, 50), 10); Square ((80, 60), 10); (, 10, 10); (80, 60, 10, 10)]; List.iter (X.draw_point xelms) [ (60 + 10, 50 + 10); (80 + 10, 60 + 10)]; ]; } ); saver_reshape = (fun xelms state w h -> dims := (w, h); ); saver_free = (fun xelms state -> print_newline ()); saver_draw = (fun xelms state -> X.set_foreground xelms state.color0; List.iter (X.draw_point xelms) [ (20, 20); (22, 20); (24, 20)]; begin List.iter (fun shape -> match shape with | Losange (losange_coords) -> X.set_foreground xelms state.color1; List.iter (X.draw_line xelms) losange_coords; | Square ((x, y), s) -> X.set_foreground xelms state.color2; List.iter (X.draw_rectangle xelms) [(x, y, s, s)]; List.iter (X.draw_point xelms) [(x + s, y + s)]; | _ -> () ) state.shapes; end; X.set_foreground xelms state.color3; X.draw_arc xelms (40, 60, 20, 20, 0, 360*64); X.draw_arc xelms (0, 0, 30, 30, 0, 360*64); (300_000) ); } end module SomeSaver = MakeSaver(UserSaver)