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.

(* OCaml with Cairo bindings. Based on the sample on the Cairo website:
 * http://www.cairographics.org/cairo-ocaml/
 *
 * Compile with:
 *  
 * ocamlopt -I +cairo cairo.cmxa -o cairosample cairosample.ml
 *)

let draw_triangle cr =
    Cairo.set_line_width cr 15. ;
    Cairo.move_to     cr   200.  100. ;
    Cairo.line_to     cr   300.  300. ;
    Cairo.rel_line_to cr (-200.)   0. ;
    Cairo.close_path  cr ;
    Cairo.stroke cr

let create_png filename = 
    let img = Cairo.image_surface_create Cairo.FORMAT_ARGB32 400 400 in
    let cr = Cairo.create img in
    draw_triangle cr;
    Cairo_png.surface_write_to_file img filename 

let create_ps filename = 
    let out = open_out filename in
    let ps = Cairo_ps.surface_create_for_channel out 400. 400. in
    let cr = Cairo.create ps in
    draw_triangle cr;
    Cairo.surface_finish ps;
    close_out out

let create_pdf filename = 
    let out = open_out filename in
    let ps = Cairo_pdf.surface_create_for_channel out 400. 400. in
    let cr = Cairo.create ps in
    draw_triangle cr;
    Cairo.surface_finish ps;
    close_out out

let main = 
    create_png "triangle.png";
    create_ps "triangle.ps";
    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.