summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog28
-rw-r--r--doc/tutorial/src/Makefile12
-rw-r--r--doc/tutorial/src/README66
-rw-r--r--doc/tutorial/src/circle.c13
-rw-r--r--doc/tutorial/src/expander.c13
-rw-r--r--doc/tutorial/src/include/cairo-tutorial-gtk.h (renamed from doc/tutorial/src/cairo-tutorial-gtk.h)0
-rw-r--r--doc/tutorial/src/include/cairo-tutorial-pdf.h (renamed from doc/tutorial/src/cairo-tutorial-pdf.h)0
-rw-r--r--doc/tutorial/src/include/cairo-tutorial-png.h (renamed from doc/tutorial/src/cairo-tutorial-png.h)0
-rw-r--r--doc/tutorial/src/include/cairo-tutorial-xlib.h (renamed from doc/tutorial/src/cairo-tutorial-xlib.h)44
-rw-r--r--doc/tutorial/src/include/cairo-tutorial.h (renamed from doc/tutorial/src/cairo-tutorial.h)0
-rw-r--r--doc/tutorial/src/lca.c32
11 files changed, 178 insertions, 30 deletions
diff --git a/ChangeLog b/ChangeLog
index 020130fd5..2da949baf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,33 @@
2006-01-26 Carl Worth <cworth@cworth.org>
+ * doc/tutorial/src/cairo-tutorial.h:
+ * doc/tutorial/src/cairo-tutorial-gtk.h:
+ * doc/tutorial/src/cairo-tutorial-pdf.h:
+ * doc/tutorial/src/cairo-tutorial-png.h:
+ * doc/tutorial/src/cairo-tutorial-xlib.h:
+ * doc/tutorial/src/include/cairo-tutorial.h:
+ * doc/tutorial/src/include/cairo-tutorial-gtk.h:
+ * doc/tutorial/src/include/cairo-tutorial-pdf.h:
+ * doc/tutorial/src/include/cairo-tutorial-png.h:
+ * doc/tutorial/src/include/cairo-tutorial-xlib.h:
+ Move the magic header files to be down in an include directory and
+ more out of the way.
+
+ * doc/tutorial/src/Makefile: Look for the headers in -I./include.
+
+ * doc/tutorial/src/circle.c: (draw): Make the circle track the
+ width and height of the window dynamically.
+
+ * doc/tutorial/src/expander.c: Remove boring expander example.
+
+ * doc/tutorial/src/lca.c: (draw): Add more interesting LCA
+ exmaple.
+
+ * doc/tutorial/src/README: Add some notes about how to use this
+ stuff.
+
+2006-01-26 Carl Worth <cworth@cworth.org>
+
* doc/tutorial/slides/cairo-large-content.svg: Here's the actual
template I was referring to in my previous commit.
diff --git a/doc/tutorial/src/Makefile b/doc/tutorial/src/Makefile
index 2aeef4f02..b48a96f0a 100644
--- a/doc/tutorial/src/Makefile
+++ b/doc/tutorial/src/Makefile
@@ -1,4 +1,4 @@
-MYCFLAGS=$(shell pkg-config --cflags --libs cairo gtk+-2.0) -Wall -g -Wpointer-arith -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -fno-strict-aliasing
+MYCFLAGS=-I./include $(shell pkg-config --cflags --libs cairo gtk+-2.0) -Wall -g -Wpointer-arith -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -fno-strict-aliasing
# If you don't want to/can't compile all of these targets, then trim
# this list.
@@ -7,25 +7,25 @@ all: gtk xlib png
GTK_EXAMPLES=$(patsubst %.c,%-gtk,$(wildcard *.c))
gtk: $(GTK_EXAMPLES)
-%-gtk:%.c cairo-tutorial-gtk.h
+%-gtk:%.c ./include/cairo-tutorial-gtk.h
$(CC) -DCAIRO_TUTORIAL_GTK $(CFLAGS) $(MYCFLAGS) -o $@ $<
XLIB_EXAMPLES=$(patsubst %.c,%-xlib,$(wildcard *.c))
xlib: $(XLIB_EXAMPLES)
-%-xlib:%.c cairo-tutorial-xlib.h
+%-xlib:%.c ./include/cairo-tutorial-xlib.h
$(CC) -DCAIRO_TUTORIAL_XLIB $(CFLAGS) $(MYCFLAGS) -o $@ $<
PDF_EXAMPLES=$(patsubst %.c,%-pdf,$(wildcard *.c))
pdf: $(PDF_EXAMPLES)
-%-pdf:%.c cairo-tutorial-pdf.h
+%-pdf:%.c ./include/cairo-tutorial-pdf.h
$(CC) -DCAIRO_TUTORIAL_PDF $(CFLAGS) $(MYCFLAGS) -o $@ $<
PNG_EXAMPLES=$(patsubst %.c,%-png,$(wildcard *.c))
png: $(PNG_EXAMPLES)
-%-png:%.c cairo-tutorial-png.h
+%-png:%.c ./include/cairo-tutorial-png.h
$(CC) -DCAIRO_TUTORIAL_PNG $(CFLAGS) $(MYCFLAGS) -o $@ $<
clean:
- rm -f $(GTK_EXAMPLES) $(XLIB_EXAMPLES) $(PDF_EXAMPLES) $(PNG_EXAMPLES)
+ rm -f $(GTK_EXAMPLES) $(XLIB_EXAMPLES) $(PDF_EXAMPLES) $(PNG_EXAMPLES) *.png
.PHONY: all gtk xlib pdf png clean
diff --git a/doc/tutorial/src/README b/doc/tutorial/src/README
new file mode 100644
index 000000000..5e19e39c2
--- /dev/null
+++ b/doc/tutorial/src/README
@@ -0,0 +1,66 @@
+Welcome to the cairo tutorial:
+
++--------------------------------+
+| How to Recognize Ugly Graphics |
+|(and what you can do about them)|
++--------------------------------+
+
+This directory is your personal playground for following along with
+the examples. In order for you to make use of these files you will
+need to have cairo and its header files installed. You can find
+instructions for doing this at:
+
+ http://cairographics.org/tutorial
+
+Notice that there are a few .c files in this directory.
+
+You should start out by just typing "make" which will turn each .c
+file into several different programs. Go ahead and run each of the
+programs and see what they do. Some of them will open up new X windows
+while others will simply write their output to files (such .png or
+.pdf).
+
+After you play with those a bit, go ahead and take a look at the
+contents of the .c files. You'll see that each file contains a draw()
+function that does all of the drawing.
+
+You might be surprised to notice that there is no main() function in
+any of the files. Instead, main is hidden away by means of
+cairo-tutorial.h. This rather non-conventional style is used to allow
+you to focus on the actual drawing code involved in using cairo, while
+not having to worry about the setup semantics. We don't recommend that
+you follow this style for real projects.
+
+As you follow along during the tutorial and get some ideas for things
+to draw, you'll want to start making your own .c files. You can copy
+an existing file or make your own by following this simple minimal
+template:
+
+ #include "cairo-tutorial.h"
+
+ static void
+ draw (cairo_t *cr, int width, int height)
+ {
+ /* Put your drawing code here. */
+ }
+
+Any new file you create will automatically get picked up by the
+Makefile so that "make" will compile your file into several different
+programs, just like the existing examples.
+
+If you'd like to control the initial size of the output, you may
+define WIDTH and HEIGHT before including cairo-tutorial.h like so:
+
+ #define WIDTH 100
+ #define HEIGHT 100
+
+ #include "cairo-tutorial.h"
+
+If you would like to change the set of cairo-backend target programs
+that are compiled, you may edit the "all" target in the Makefile.
+
+Have fun!
+
+
+
+
diff --git a/doc/tutorial/src/circle.c b/doc/tutorial/src/circle.c
index 655d94c50..6bd02e8ba 100644
--- a/doc/tutorial/src/circle.c
+++ b/doc/tutorial/src/circle.c
@@ -3,17 +3,20 @@
static void
draw (cairo_t *cr, int width, int height)
{
- cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
- cairo_paint (cr);
+ int radius;
- cairo_move_to (cr, 47.5, 25);
- cairo_arc (cr, 25, 25, 22.5,
+ if (width < height)
+ radius = width/2 - 4;
+ else
+ radius = height/2 - 4;
+
+ cairo_move_to (cr, width/2 + radius, height/2);
+ cairo_arc (cr, width/2, height/2, radius,
0.0, 2 * M_PI);
cairo_set_source_rgb (cr, 0.6, 0.8, 1.0);
cairo_fill_preserve (cr);
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
- cairo_set_line_width (cr, 1.0);
cairo_stroke (cr);
}
diff --git a/doc/tutorial/src/expander.c b/doc/tutorial/src/expander.c
deleted file mode 100644
index ce1afdaad..000000000
--- a/doc/tutorial/src/expander.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "cairo-tutorial.h"
-
-static void
-draw (cairo_t *cr, int width, int height)
-{
- cairo_translate (cr, 24.5, 25);
- cairo_move_to (cr, 5, -2.5);
- cairo_line_to (cr, 0, 2.5);
- cairo_line_to (cr, -5, -2.5);
- cairo_close_path (cr);
- cairo_set_line_width (cr, 1);
- cairo_stroke (cr);
-}
diff --git a/doc/tutorial/src/cairo-tutorial-gtk.h b/doc/tutorial/src/include/cairo-tutorial-gtk.h
index 7be74e21d..7be74e21d 100644
--- a/doc/tutorial/src/cairo-tutorial-gtk.h
+++ b/doc/tutorial/src/include/cairo-tutorial-gtk.h
diff --git a/doc/tutorial/src/cairo-tutorial-pdf.h b/doc/tutorial/src/include/cairo-tutorial-pdf.h
index ac2341dcd..ac2341dcd 100644
--- a/doc/tutorial/src/cairo-tutorial-pdf.h
+++ b/doc/tutorial/src/include/cairo-tutorial-pdf.h
diff --git a/doc/tutorial/src/cairo-tutorial-png.h b/doc/tutorial/src/include/cairo-tutorial-png.h
index a78551d5e..a78551d5e 100644
--- a/doc/tutorial/src/cairo-tutorial-png.h
+++ b/doc/tutorial/src/include/cairo-tutorial-png.h
diff --git a/doc/tutorial/src/cairo-tutorial-xlib.h b/doc/tutorial/src/include/cairo-tutorial-xlib.h
index a31f526fd..f50042014 100644
--- a/doc/tutorial/src/cairo-tutorial-xlib.h
+++ b/doc/tutorial/src/include/cairo-tutorial-xlib.h
@@ -54,17 +54,20 @@ Colormap colormap;
Visual *visual;
int depth;
unsigned int width = WIDTH, height = HEIGHT;
+Window win;
+Pixmap pix;
+GC gc;
static void
draw (cairo_t *cr, int width, int height);
static void
-handle_expose (Display *dpy, Drawable d)
+draw_to_pixmap (Display *dpy, Pixmap pix)
{
cairo_surface_t *surface;
cairo_t *cr;
- surface = cairo_xlib_surface_create (dpy, d, visual,
+ surface = cairo_xlib_surface_create (dpy, pix, visual,
width, height);
cr = cairo_create (surface);
@@ -74,13 +77,33 @@ handle_expose (Display *dpy, Drawable d)
cairo_surface_destroy (surface);
}
+static void
+handle_configure (Display *dpy, XConfigureEvent *cev)
+{
+ width = cev->width;
+ height = cev->height;
+
+ XFreePixmap(dpy, pix);
+ pix = XCreatePixmap(dpy, win, width, height, depth);
+ XFillRectangle(dpy, pix, gc, 0, 0, width, height);
+ draw_to_pixmap (dpy, pix);
+}
+
+static void
+handle_expose (Display *dpy, XExposeEvent *eev)
+{
+ XCopyArea (dpy, pix, win, gc,
+ eev->x, eev->y,
+ eev->width, eev->height,
+ eev->x, eev->y);
+}
+
int
main (argc, argv)
int argc;
char **argv;
{
Display *dpy;
- Window win;
Window root = 0;
char **init_argv = argv;
XSetWindowAttributes attr;
@@ -98,6 +121,7 @@ main (argc, argv)
XTextProperty wm_name, icon_name;
Atom wm_delete_window;
unsigned long gc_mask;
+ XGCValues gcv;
char quit_string[10];
unsigned long window_mask;
int has_colormap = 0;
@@ -173,13 +197,18 @@ main (argc, argv)
}
attr.background_pixel = WhitePixel (dpy, scr);
attr.border_pixel = 0;
- attr.event_mask = ExposureMask|KeyPressMask|KeyReleaseMask;
+ attr.event_mask = ExposureMask|KeyPressMask|KeyReleaseMask|StructureNotifyMask;
wm_delete_window = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
win = XCreateWindow (dpy, root, x, y, width, height, border_width,
depth, InputOutput,
visual,
window_mask,
&attr);
+ pix = XCreatePixmap (dpy, win, width, height, depth);
+ gcv.foreground = WhitePixel (dpy, scr);
+ gc = XCreateGC (dpy, pix, GCForeground, &gcv);
+ XFillRectangle(dpy, pix, gc, 0, 0, width, height);
+ draw_to_pixmap (dpy, pix);
XSetWMProperties (dpy, win,
&wm_name, &icon_name,
init_argv, argc,
@@ -190,15 +219,18 @@ main (argc, argv)
XNextEvent (dpy, &ev);
if (HasExpose && ev.type != Expose) {
HasExpose = 0;
- handle_expose (dpy, eev.xexpose.window);
+ handle_expose (dpy, &eev.xexpose);
}
switch (ev.type) {
+ case ConfigureNotify:
+ handle_configure (dpy, &ev.xconfigure);
+ break;
case Expose:
if (QLength(dpy)) {
eev = ev;
HasExpose = 1;
} else if (ev.xexpose.count == 0) {
- handle_expose (dpy, ev.xexpose.window);
+ handle_expose (dpy, &ev.xexpose);
}
break;
case KeyPress:
diff --git a/doc/tutorial/src/cairo-tutorial.h b/doc/tutorial/src/include/cairo-tutorial.h
index 65a431afe..65a431afe 100644
--- a/doc/tutorial/src/cairo-tutorial.h
+++ b/doc/tutorial/src/include/cairo-tutorial.h
diff --git a/doc/tutorial/src/lca.c b/doc/tutorial/src/lca.c
new file mode 100644
index 000000000..9aa2c1303
--- /dev/null
+++ b/doc/tutorial/src/lca.c
@@ -0,0 +1,32 @@
+#define WIDTH 750
+#define HEIGHT 360
+
+#include "cairo-tutorial.h"
+
+static void
+draw (cairo_t *cr, int width, int height)
+{
+ cairo_save (cr);
+
+ cairo_translate (cr, 60, 60);
+ cairo_scale (cr, 3, 3);
+
+ cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
+ cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
+ cairo_set_line_width (cr, 20);
+
+ /* L */
+ cairo_move_to (cr, 0, 0);
+ cairo_line_to (cr, 0, 80);
+ cairo_line_to (cr, 50, 80);
+
+ /* C */
+ cairo_move_to (cr, 110 + 40 * cos (M_PI / 3), 40 + 40 * sin(M_PI / 3));
+ cairo_arc (cr, 110, 40, 40, M_PI / 3, -M_PI / 3);
+
+ /* A */
+ cairo_move_to (cr, 160, 80);
+ cairo_curve_to (cr, 160, -30, 210, -30, 210, 80);
+
+ cairo_stroke (cr);
+}