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.2.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)] ())

extend-none

external

CairoExtend

extend-pad

external

CairoExtend

extend-reflect

external

CairoExtend

extend-repeat

external

CairoExtend

fill

external

(Fn [(Ptr CairoContext)] ())

fill-extents

instantiate

(Fn [(Ptr CairoContext)] CairoExtents)

Compute the bounding box of the area that would be affected by fill.

fill-preserve

external

(Fn [(Ptr CairoContext)] ())

fill-rule-even-odd

external

CairoFillRule

fill-rule-winding

external

CairoFillRule

filter-best

external

CairoFilter

filter-bilinear

external

CairoFilter

filter-fast

external

CairoFilter

filter-good

external

CairoFilter

filter-nearest

external

CairoFilter

font-extents

instantiate

(Fn [(Ptr CairoContext)] CairoFontExtents)

Return a CairoFontExtents for the current font (ascent, descent, height, max advances).

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

get-current-point-x

instantiate

(Fn [(Ptr CairoContext)] Double)

Return the x coordinate of the current point. Undefined if has-current-point? is false.

get-current-point-y

instantiate

(Fn [(Ptr CairoContext)] Double)

Return the y coordinate of the current point. Undefined if has-current-point? is false.

get-dash

instantiate

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

Return the current dash pattern as an array of doubles.

get-dash-count

external

(Fn [(Ptr CairoContext)] Int)

Return the number of dash segments in the current dash pattern (0 means solid).

get-dash-offset

instantiate

(Fn [(Ptr CairoContext)] Double)

Return the offset into the dash pattern set by set-dash.

has-current-point?

instantiate

(Fn [(Ptr CairoContext)] Bool)

Return true if the context has a current point (after move-to or drawing operations).

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] ())

path-extents

instantiate

(Fn [(Ptr CairoContext)] CairoExtents)

Compute the bounding box enclosing the current path, ignoring stroke parameters.

pattern-add-color-stop-rgb

external

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

Add an opaque color stop at offset (0.0–1.0) to a gradient pattern.

pattern-add-color-stop-rgba

external

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

Add a translucent color stop at offset (0.0–1.0) to a gradient pattern.

pattern-create-for-surface

external

(Fn [(Ptr CairoSurface)] (Ptr CairoPattern))

Create a pattern from a surface, useful for tiling or compositing.

pattern-create-linear

external

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

Create a linear gradient pattern along the line from (x0 y0) to (x1 y1).

pattern-create-radial

external

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

Create a radial gradient between two circles: center (cx0 cy0) radius r0 and center (cx1 cy1) radius r1.

pattern-destroy

external

(Fn [(Ptr CairoPattern)] ())

Destroy a pattern created by pattern-create-*. Must be called after the pattern is no longer needed.

pattern-get-extend

external

(Fn [(Ptr CairoPattern)] CairoExtend)

pattern-get-filter

external

(Fn [(Ptr CairoPattern)] CairoFilter)

pattern-set-extend

external

(Fn [(Ptr CairoPattern), CairoExtend] ())

pattern-set-filter

external

(Fn [(Ptr CairoPattern), CairoFilter] ())

pattern-status

external

(Fn [(Ptr CairoPattern)] CairoStatus)

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-dash

instantiate

(Fn [(Ptr CairoContext), (Ref (Array Double) a), Double] ())

Set the dash pattern. dashes is an array of on/off lengths; offset shifts the pattern start.

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

external

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

Set the pattern as the source for subsequent drawing operations.

set-source-rgb

external

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

set-source-rgba

external

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

set-source-surface

external

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

Set a surface as the source pattern, translated to (x y).

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-extents

instantiate

(Fn [(Ptr CairoContext)] CairoExtents)

Compute the bounding box of the area that would be affected by stroke.

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.

text-extents

instantiate

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

Measure text and return a CairoTextExtents with bearing, size, and advance fields.

translate

external

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

weight-bold

external

CairoFontWeight

weight-normal

external

CairoFontWeight