Guile-Cairo README
Last updated 18 May 2007.


About Guile-Cairo
=================

Guile-Cairo wraps the Cairo graphics library for Guile Scheme.


A pasteable introduction to using Guile-Cairo
=============================================

;; Paste this into your guile interpreter!

;; This wrapset defines a module `(cairo)'

(use-modules (cairo))

;; Cairo procedures all start with `cairo-'

(cairo-version-string)
;; => "1.4.2"

;; For most useful things, you have to make a surface first

(define surf (cairo-image-surface-create 'argb32 140 100))

;; Given a surface, you can create a cairo context, and start drawing

(define cr (cairo-create surf))

;; You then need to make a source

(cairo-select-font-face cr "Bitstream Vera Sans" 'normal 'normal)
(cairo-scale cr 100 100)
(define pat (cairo-pattern-create-linear 0 0 1 1))
(cairo-pattern-add-color-stop-rgba pat 1 1 0 0 1)
(cairo-pattern-add-color-stop-rgba pat 0 0 0 1 1)
(cairo-set-source cr pat)

;; Then you make your mask

(cairo-set-font-size cr 0.4)
(cairo-move-to cr 0.0 0.6)
(cairo-show-text cr "(cairo)")

;; Finally you can write the surface out to a file if you want

(cairo-surface-write-to-png surf "/tmp/guile-cairo.png")

;; Functions that write out to files always take the filename as their
;; last argument, which is optional. If you leave it out, guile-cairo
;; will write to the current output port. So this is another way of
;; doing the same thing:

(with-output-to-file "/tmp/guile-cairo.png"
  (lambda () (cairo-surface-write-to-png surf)))

;; Enumerated types are represented as symbols. The available set of
;; symbols for any given type can be retrieved at runtime

(cairo-format-get-values)
;; => (argb32 rgb24 a8 a1)

;; That's it!


Notes
=====

Guile-Cairo wraps almost all of Cairo's procedures. Notable exceptions
include functions that read or write from streams instead of files and
raw access to image data.

Guile-Cairo wraps all of Cairo's types. As mentioned above, enumerated
values are represented by symbols, but functions accept integers as
well. Struct types like cairo_rectangle_t are represented as vectors.
Constructors of the form cairo-make-rectangle are provided, as well as
accessors like cairo-rectangle:x.


Using Guile-Cairo's C interface
===============================

These days Cairo forms a part of many software stacks; its types are
seen in the APIs of a number of other libraries. Guile-Cairo provides an
interface to represent all cairo C types as scheme values.

To build against this library in your C program, first you will need to
get the CFLAGS and LDFLAGS to link against libguile-cairo. Autoconf
users should use:

PKG_CHECK_MODULES(GUILE_CAIRO, guile-cairo >= 1.3.0)
AC_SUBST(GUILE_CAIRO_CFLAGS)
AC_SUBST(GUILE_CAIRO_LDFLAGS)

In your C files you should then:

  #include <guile-cairo.h>

The type wrapping functions are all in the form scm_to_TYPE and
scm_from_TYPE, where TYPE could be cairo_surface, for example. For
vector types there is also scm_fill_TYPE, which expects you to have an
already-allocated structure to fill. Additionally there are
scm_take_TYPE functions that will take ownership of the pointer in
question, for example for constructors and for non-refcounted opaque
objects like cairo_font_options_t.


Copying Guile-Cairo
===================

Distribution of Guile-Cairo is under the LGPL. See the COPYING file for
more information.


Contact info
============

  Mailing List: guile-user@gnu.org
  Homepage:     http://home.gna.org/guile-cairo/
  Download:     http://home.gna.org/guile-cairo/download/


Build dependencies
==================

* Guile 1.8.0 or newer
  http://www.gnu.org/software/guile/
* Cairo 1.2.0 or newer
  http://cairographics.org/


Installation quickstart
=======================

Install using the standard autotools incantation:
  ./configure --prefix=/opt/guile-cairo && make && make install.

Build from CVS or Arch using ./autogen.sh --prefix=/opt/guile-cairo && make.

You can run without installing, just run './env guile'.


Copying this file
=================

Copyright (C) 2007 Andy Wingo <wingo pobox.com>

Copying and distribution of this file, with or without modification, are
permitted in any medium without royalty provided the copyright notice
and this notice are preserved.
