Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/chris00/ocaml-cairo

Binding to Cairo, a 2D Vector Graphics Library.
https://github.com/chris00/ocaml-cairo

cairo cairo-drawing drawing dune ocaml ocaml-bindings stroke tutorial

Last synced: 15 days ago
JSON representation

Binding to Cairo, a 2D Vector Graphics Library.

Awesome Lists containing this project

README

        

![Continuous Integration](https://github.com/Chris00/ocaml-cairo/actions/workflows/main.yml/badge.svg)

OCaml interface to Cairo
========================

This is an OCaml binding for the
[Cairo](http://www.cairographics.org/) library, a 2D graphics library
with support for multiple output devices.

You can read the API of
[Cairo](http://chris00.github.io/ocaml-cairo/doc/cairo2/Cairo/),
[Cairo_gtk](http://chris00.github.io/ocaml-cairo/doc/cairo2-gtk/Cairo_gtk/),
and
[Cairo_pango](http://chris00.github.io/ocaml-cairo/doc/cairo2-pango/Cairo_pango/)
online.

Prerequisites
-------------

You need the development files of Cairo (see the
[conf-cairo](https://github.com/ocaml/opam-repository/blob/master/packages/conf-cairo/conf-cairo.1/opam#L7)
package)
and the OCaml package
``lablgtk2`` (in the [OPAM](https://opam.ocaml.org/) package
``lablgtk``).

Compilation & Installation
--------------------------

The easier way to install this library — once the prerequisites are set
up — is to use [opam](http://opam.ocaml.org/):

opam install cairo2

If you would like to compile from the sources, install [Dune][]

opam install dune

and do:

dune build @install

or just `make`. You can then install it with:

dune install

[Dune]: https://github.com/ocaml/dune

Examples
--------

You can read a version of the
[Cairo tutorial](http://chris00.github.io/ocaml-cairo/) using
this module. The code of this tutorial is available in the
``examples/`` directory. To compile it, just do

dune build @examples

All the examples below are available (with some comments) by clicking
on images in the [tutorial](http://cairo.forge.ocamlcore.org/tutorial/).

### Basic examples

- [stroke.ml](examples/stroke.ml) shows how to draw (stroke) a simple
rectangle on a PNG surface.
- [stroke.ml](examples/stroke.ml) shows how to fill a simple
rectangle on a PNG surface.
- [showtext.ml](examples/showtext.ml) illustrates how to select a font
and draw some text on a PNG surface.
- [paint.ml](examples/paint.ml) shows how to paint the current source
everywhere within the current clip region.
- [mask.ml](examples/mask.ml) shows how to apply a radial transparency
mask on top of a linear gradient.
- [setsourcergba.ml](examples/setsourcergba.ml) produces

![Source RGBA](http://cairo.forge.ocamlcore.org/tutorial/setsourcergba.png)

- [setsourcegradient.ml](examples/setsourcegradient.ml) shows how to use
radial and linear patterns. It generates:

![Gradient](http://cairo.forge.ocamlcore.org/tutorial/setsourcegradient.png)

- [path_close.ml](examples/path_close.ml) shows how to draw a closed
path. It produces the PNG:

![close path](http://cairo.forge.ocamlcore.org/tutorial/path-close.png)

- [textextents.ml](examples/textextents.ml) displays graphically the various
dimensions one can request about text. It generates the PNG:

![text](http://cairo.forge.ocamlcore.org/tutorial/textextents.png)

- [text_extents.ml](examples/text_extents.ml) exemplifies drawing
consecutive UTF-8 strings in a PDF file. Some helping lines are
also added to show the text extents.

- [tips_ellipse.ml](examples/tips_ellipse.ml) shows the action of
dilation on the line width and how to properly draw ellipses.
It generates the PNG:

![ellipse](http://cairo.forge.ocamlcore.org/tutorial/tips_ellipse.png)

- [tips_letter.ml](examples/tips_letter.ml) illustrates the wrong way
of centering characters based on their individual extents:

![letters](http://cairo.forge.ocamlcore.org/tutorial/tips_letter.png)

Instead, one should combine them with the font extents as shown in
[tips_font.ml](examples/tips_font.ml) to have:

![fonts](http://cairo.forge.ocamlcore.org/tutorial/tips_font.png)

### Examples generating the images of the tutorial

- [diagram.ml](examples/diagram.ml) draw the images of the section
[Cairo's Drawing Model](http://cairo.forge.ocamlcore.org/tutorial/#drawing_model):

![destination](http://cairo.forge.ocamlcore.org/tutorial/destination.png)
![source](http://cairo.forge.ocamlcore.org/tutorial/source.png)
![the mask](http://cairo.forge.ocamlcore.org/tutorial/the-mask.png)
![stroke](http://cairo.forge.ocamlcore.org/tutorial/stroke.png)
![fill](http://cairo.forge.ocamlcore.org/tutorial/fill.png)
![show text](http://cairo.forge.ocamlcore.org/tutorial/showtext.png)
![paint](http://cairo.forge.ocamlcore.org/tutorial/paint.png)
![mask](http://cairo.forge.ocamlcore.org/tutorial/mask.png)

- [draw.ml](examples/draw.ml) generates the various images in
[Drawing with Cairo](http://cairo.forge.ocamlcore.org/tutorial/#drawing_with_cairo), namely:

![Source RGBA](http://cairo.forge.ocamlcore.org/tutorial/setsourcergba.png)
![Gradient](http://cairo.forge.ocamlcore.org/tutorial/setsourcegradient.png)
![moveto](http://cairo.forge.ocamlcore.org/tutorial/path-moveto.png)
![lineto](http://cairo.forge.ocamlcore.org/tutorial/path-lineto.png)
![arcto](http://cairo.forge.ocamlcore.org/tutorial/path-arcto.png)
![curveto](http://cairo.forge.ocamlcore.org/tutorial/path-curveto.png)
![close path](http://cairo.forge.ocamlcore.org/tutorial/path-close.png)
![text](http://cairo.forge.ocamlcore.org/tutorial/textextents.png)