11. April 2010

2D-Grafik-Ausgabe mit Cairo und OCaml

Feldversuch. Wie funktioniert Cairo in Verbindung mit OCaml?

Das etwas erweiterte Beispiel zeigt, wie man eine Grafik mit einem einfachen Dreieck über Cairo mit OCaml als PDF-, PNG- und als PostScript-Datei abspeichert.

 1 (* OCaml with Cairo bindings. Based on the sample on the Cairo website:
 2  * http://www.cairographics.org/cairo-ocaml/
 3  *
 4  * Compile with:
 5  *  
 6  * ocamlopt -I +cairo cairo.cmxa -o cairosample cairosample.ml
 7  *)
 8 
 9 let draw_triangle cr =
10     Cairo.set_line_width cr 15. ;
11     Cairo.move_to     cr   200.  100. ;
12     Cairo.line_to     cr   300.  300. ;
13     Cairo.rel_line_to cr (-200.)   0. ;
14     Cairo.close_path  cr ;
15     Cairo.stroke cr
16 
17 let create_png filename = 
18     let img = Cairo.image_surface_create Cairo.FORMAT_ARGB32 400 400 in
19     let cr = Cairo.create img in
20     draw_triangle cr;
21     Cairo_png.surface_write_to_file img filename 
22 
23 let create_ps filename = 
24     let out = open_out filename in
25     let ps = Cairo_ps.surface_create_for_channel out 400. 400. in
26     let cr = Cairo.create ps in
27     draw_triangle cr;
28     Cairo.surface_finish ps;
29     close_out out
30 
31 let create_pdf filename = 
32     let out = open_out filename in
33     let ps = Cairo_pdf.surface_create_for_channel out 400. 400. in
34     let cr = Cairo.create ps in
35     draw_triangle cr;
36     Cairo.surface_finish ps;
37     close_out out
38 
39 let main = 
40     create_png "triangle.png";
41     create_ps "triangle.ps";
42     create_pdf "triangle.pdf"

Subtil ist der Aufruf an Cairo.surface_finish. Ohne ihn wird der Puffer nicht in die Datei geschrieben und das PDF/PS-Dokument bleibt leer oder gar korrupt.