File: pango_demo.ml

package info (click to toggle)
ocaml-cairo2 0.6.4%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 716 kB
  • sloc: ml: 2,955; ansic: 2,132; makefile: 24; sh: 17
file content (39 lines) | stat: -rw-r--r-- 1,331 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
open Cairo

let two_pi = 2. *. acos(-1.)

let radius = 150.

(* Based on the example given at
   https://developer.gnome.org/pango/stable/pango-Cairo-Rendering.html *)
let draw_text (cr: context) =
  let n_words = 10 in
  let font = "Sans Bold 26" in
  Cairo.translate cr radius radius;
  let layout = Cairo_pango.create_layout cr in
  Pango.Layout.set_text layout "Text";
  let desc = Pango.Font.from_string font in
  Pango.Layout.set_font_description layout desc;
  (* Draw the layout [n_words] times in a circle. *)
  for i = 1 to n_words do
    let angle = two_pi *. float i /. float n_words in
    Cairo.save cr;
    let red = (1. +. cos(angle -. two_pi /. 6.)) /. 2. in
    Cairo.set_source_rgb cr red 0. (1. -. red);
    Cairo.rotate cr angle;
    (* Inform Pango to re-layout the text with the new transformation. *)
    Cairo_pango.update_layout cr layout;
    let width, _height = Pango.Layout.get_size layout in
    Cairo.move_to cr (-. (float width /. float Pango.scale) /. 2.) (-. radius);
    Cairo_pango.show_layout cr layout;
    Cairo.restore cr;
  done

let () =
  let diam = truncate(2. *. radius) in
  let surface = Cairo.Image.(create ARGB32 ~w:diam ~h:diam) in
  let cr = Cairo.create surface in
  Cairo.set_source_rgb cr 1. 1. 1.;
  Cairo.paint cr;
  draw_text cr;
  Cairo.PNG.write surface "pango_demo.png"