Cairo

Thin FFI bindings over the Cairo 2D graphics library.

The goal of this module is to expose Cairo's C API with Carp-friendly naming (kebab-case, grouped under Cairo), without adding a higher-level wrapper on top. Higher-level sketching primitives live in anima.carp.

Installation

Cairo must be installed on the system and discoverable via pkg-config:

brew install cairo        # macOS
apt install libcairo2-dev # Debian / Ubuntu

Example

(load "git@github.com:carpentry-org/cairo.carp@0.1.0")

(defn main []
  (let-do [surf (Cairo.image-surface-create Cairo.format-argb32 200 200)
           cr (Cairo.create surf)]
    (Cairo.set-source-rgb cr 1.0 1.0 1.0)
    (Cairo.paint cr)
    (Cairo.set-source-rgb cr 0.0 0.0 0.0)
    (Cairo.set-line-width cr 4.0)
    (Cairo.move-to cr 20.0 20.0)
    (Cairo.line-to cr 180.0 180.0)
    (Cairo.stroke cr)
    (ignore (Cairo.surface-write-to-png surf (cstr "out.png")))
    (Cairo.destroy cr)
    (Cairo.surface-destroy surf)))

Memory management

Cairo uses reference counting internally; this binding does not manage lifetimes for you. Every Cairo.create must be paired with a Cairo.destroy, and every *-surface-create with a Cairo.surface-destroy. See the Cairo manual for details.

=

defn

(Fn [CairoStatus, CairoStatus] Bool)

                        (= a b)
                    

Equality on status codes, implemented by converting to Int first.

antialias-best

external

CairoAntialias

antialias-default

external

CairoAntialias

antialias-fast

external

CairoAntialias

antialias-good

external

CairoAntialias

antialias-gray

external

CairoAntialias

antialias-none

external

CairoAntialias

antialias-subpixel

external

CairoAntialias

arc

external

(Fn [(Ptr CairoContext), Double, Double, Double, Double, Double] ())

Add a circular arc centered at (xc yc) with radius, sweeping from angle1 to angle2 radians (positive = clockwise in Cairo's default orientation).

arc-negative

external

(Fn [(Ptr CairoContext), Double, Double, Double, Double, Double] ())

clip

external

(Fn [(Ptr CairoContext)] ())

clip-preserve

external

(Fn [(Ptr CairoContext)] ())

close-path

external

(Fn [(Ptr CairoContext)] ())

create

external

(Fn [(Ptr CairoSurface)] (Ptr CairoContext))

Create a drawing context targeting the given surface. Must be paired with destroy.

curve-to

external

(Fn [(Ptr CairoContext), Double, Double, Double, Double, Double, Double] ())

Append a cubic Bézier spline through (x1 y1), (x2 y2), (x3 y3).

destroy

external

(Fn [(Ptr CairoContext)] ())

fill

external

(Fn [(Ptr CairoContext)] ())

fill-preserve

external

(Fn [(Ptr CairoContext)] ())

fill-rule-even-odd

external

CairoFillRule

fill-rule-winding

external

CairoFillRule

format-a1

external

CairoFormat

format-a8

external

CairoFormat

format-argb32

external

CairoFormat

32-bit ARGB, native-endian. Matches SDL_PIXELFORMAT_ARGB8888 on little-endian.

format-rgb24

external

CairoFormat

identity-matrix

external

(Fn [(Ptr CairoContext)] ())

image-surface-create

external

(Fn [CairoFormat, Int, Int] (Ptr CairoSurface))

Create an in-memory image surface of the given format, width, and height.

image-surface-get-data

external

(Fn [(Ptr CairoSurface)] (Ptr Byte))

Return a raw pointer to the surface's pixel buffer. Must be preceded by surface-flush.

image-surface-get-height

external

(Fn [(Ptr CairoSurface)] Int)

image-surface-get-stride

external

(Fn [(Ptr CairoSurface)] Int)

image-surface-get-width

external

(Fn [(Ptr CairoSurface)] Int)

line-cap-butt

external

CairoLineCap

line-cap-round

external

CairoLineCap

line-cap-square

external

CairoLineCap

line-join-bevel

external

CairoLineJoin

line-join-miter

external

CairoLineJoin

line-join-round

external

CairoLineJoin

line-to

external

(Fn [(Ptr CairoContext), Double, Double] ())

move-to

external

(Fn [(Ptr CairoContext), Double, Double] ())

new-path

external

(Fn [(Ptr CairoContext)] ())

new-sub-path

external

(Fn [(Ptr CairoContext)] ())

operator-add

external

CairoOperator

operator-atop

external

CairoOperator

operator-clear

external

CairoOperator

operator-dest

external

CairoOperator

operator-dest-atop

external

CairoOperator

operator-dest-in

external

CairoOperator

operator-dest-out

external

CairoOperator

operator-dest-over

external

CairoOperator

operator-in

external

CairoOperator

operator-multiply

external

CairoOperator

operator-out

external

CairoOperator

operator-over

external

CairoOperator

operator-screen

external

CairoOperator

operator-source

external

CairoOperator

operator-xor

external

CairoOperator

paint

external

(Fn [(Ptr CairoContext)] ())

Paint the current source everywhere within the current clip region.

paint-with-alpha

external

(Fn [(Ptr CairoContext), Double] ())

pdf-surface-create

external

(Fn [(Ptr CChar), Double, Double] (Ptr CairoSurface))

Create a PDF surface writing to filename with dimensions in points (1 point = 1/72 inch).

rectangle

external

(Fn [(Ptr CairoContext), Double, Double, Double, Double] ())

rel-curve-to

external

(Fn [(Ptr CairoContext), Double, Double, Double, Double, Double, Double] ())

rel-line-to

external

(Fn [(Ptr CairoContext), Double, Double] ())

rel-move-to

external

(Fn [(Ptr CairoContext), Double, Double] ())

reset-clip

external

(Fn [(Ptr CairoContext)] ())

restore

external

(Fn [(Ptr CairoContext)] ())

Pop the top drawing state off the stack and make it current.

rotate

external

(Fn [(Ptr CairoContext), Double] ())

Rotate the current transformation by angle radians.

save

external

(Fn [(Ptr CairoContext)] ())

Push a copy of the current drawing state onto an internal stack.

scale

external

(Fn [(Ptr CairoContext), Double, Double] ())

select-font-face

external

(Fn [(Ptr CairoContext), (Ptr CChar), CairoFontSlant, CairoFontWeight] ())

Select a font face by family name, slant, and weight. Uses Cairo's built-in toy text API.

set-antialias

external

(Fn [(Ptr CairoContext), CairoAntialias] ())

set-fill-rule

external

(Fn [(Ptr CairoContext), CairoFillRule] ())

set-font-size

external

(Fn [(Ptr CairoContext), Double] ())

set-line-cap

external

(Fn [(Ptr CairoContext), CairoLineCap] ())

set-line-join

external

(Fn [(Ptr CairoContext), CairoLineJoin] ())

set-line-width

external

(Fn [(Ptr CairoContext), Double] ())

set-operator

external

(Fn [(Ptr CairoContext), CairoOperator] ())

set-source-rgb

external

(Fn [(Ptr CairoContext), Double, Double, Double] ())

set-source-rgba

external

(Fn [(Ptr CairoContext), Double, Double, Double, Double] ())

show-text

external

(Fn [(Ptr CairoContext), (Ptr CChar)] ())

slant-italic

external

CairoFontSlant

slant-normal

external

CairoFontSlant

slant-oblique

external

CairoFontSlant

status

external

(Fn [(Ptr CairoContext)] CairoStatus)

status-success

external

CairoStatus

Success status code returned by most Cairo operations.

status-to-string

external

(Fn [CairoStatus] (Ptr CChar))

stroke

external

(Fn [(Ptr CairoContext)] ())

stroke-preserve

external

(Fn [(Ptr CairoContext)] ())

success?

defn

(Fn [CairoStatus] Bool)

                        (success? s)
                    

Returns true if the given status equals status-success.

surface-destroy

external

(Fn [(Ptr CairoSurface)] ())

surface-finish

external

(Fn [(Ptr CairoSurface)] ())

surface-flush

external

(Fn [(Ptr CairoSurface)] ())

Ensure pending drawing for the surface has been applied. Required before reading pixels directly.

surface-status

external

(Fn [(Ptr CairoSurface)] CairoStatus)

surface-write-to-png

external

(Fn [(Ptr CairoSurface), (Ptr CChar)] CairoStatus)

Write the contents of an image surface to a PNG file. Returns a CairoStatus.

svg-surface-create

external

(Fn [(Ptr CChar), Double, Double] (Ptr CairoSurface))

Create an SVG surface writing to filename with dimensions in points.

translate

external

(Fn [(Ptr CairoContext), Double, Double] ())

weight-bold

external

CairoFontWeight

weight-normal

external

CairoFontWeight